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> | |
13 | #include <linux/sysdev.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 int i8237A_resume(struct sys_device *dev) | |
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); | |
44 | ||
45 | return 0; | |
46 | } | |
47 | ||
48 | static int i8237A_suspend(struct sys_device *dev, pm_message_t state) | |
49 | { | |
50 | return 0; | |
51 | } | |
52 | ||
53 | static struct sysdev_class i8237_sysdev_class = { | |
b52af409 CL |
54 | .name = "i8237", |
55 | .suspend = i8237A_suspend, | |
56 | .resume = i8237A_resume, | |
795312e7 PO |
57 | }; |
58 | ||
59 | static struct sys_device device_i8237A = { | |
b52af409 CL |
60 | .id = 0, |
61 | .cls = &i8237_sysdev_class, | |
795312e7 PO |
62 | }; |
63 | ||
64 | static int __init i8237A_init_sysfs(void) | |
65 | { | |
66 | int error = sysdev_class_register(&i8237_sysdev_class); | |
67 | if (!error) | |
68 | error = sysdev_register(&device_i8237A); | |
69 | return error; | |
70 | } | |
795312e7 | 71 | device_initcall(i8237A_init_sysfs); |