Commit | Line | Data |
---|---|---|
795312e7 | 1 | /* |
835c34a1 | 2 | * 8237A DMA controller suspend functions. |
795312e7 PO |
3 | * |
4 | * Written by Pierre Ossman, 2005. | |
643f720c PO |
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. | |
795312e7 PO |
10 | */ |
11 | ||
12 | #include <linux/init.h> | |
f3c6ea1b | 13 | #include <linux/syscore_ops.h> |
795312e7 PO |
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 | ||
f3c6ea1b | 24 | static void i8237A_resume(void) |
795312e7 PO |
25 | { |
26 | unsigned long flags; | |
27 | int i; | |
28 | ||
29 | flags = claim_dma_lock(); | |
30 | ||
b52af409 CL |
31 | dma_outb(0, DMA1_RESET_REG); |
32 | dma_outb(0, DMA2_RESET_REG); | |
795312e7 | 33 | |
b52af409 | 34 | for (i = 0; i < 8; i++) { |
795312e7 PO |
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); | |
795312e7 PO |
44 | } |
45 | ||
f3c6ea1b | 46 | static struct syscore_ops i8237_syscore_ops = { |
b52af409 | 47 | .resume = i8237A_resume, |
795312e7 PO |
48 | }; |
49 | ||
f3c6ea1b | 50 | static int __init i8237A_init_ops(void) |
795312e7 | 51 | { |
f3c6ea1b RW |
52 | register_syscore_ops(&i8237_syscore_ops); |
53 | return 0; | |
795312e7 | 54 | } |
f3c6ea1b | 55 | device_initcall(i8237A_init_ops); |