Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/kernel/i8237.c
10818 views
1
/*
2
* 8237A DMA controller suspend functions.
3
*
4
* Written by Pierre Ossman, 2005.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or (at
9
* your option) any later version.
10
*/
11
12
#include <linux/init.h>
13
#include <linux/syscore_ops.h>
14
15
#include <asm/dma.h>
16
17
/*
18
* This module just handles suspend/resume issues with the
19
* 8237A DMA controller (used for ISA and LPC).
20
* Allocation is handled in kernel/dma.c and normal usage is
21
* in asm/dma.h.
22
*/
23
24
static void i8237A_resume(void)
25
{
26
unsigned long flags;
27
int i;
28
29
flags = claim_dma_lock();
30
31
dma_outb(0, DMA1_RESET_REG);
32
dma_outb(0, DMA2_RESET_REG);
33
34
for (i = 0; i < 8; i++) {
35
set_dma_addr(i, 0x000000);
36
/* DMA count is a bit weird so this is not 0 */
37
set_dma_count(i, 1);
38
}
39
40
/* Enable cascade DMA or channel 0-3 won't work */
41
enable_dma(4);
42
43
release_dma_lock(flags);
44
}
45
46
static struct syscore_ops i8237_syscore_ops = {
47
.resume = i8237A_resume,
48
};
49
50
static int __init i8237A_init_ops(void)
51
{
52
register_syscore_ops(&i8237_syscore_ops);
53
return 0;
54
}
55
device_initcall(i8237A_init_ops);
56
57