1795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman/*
2835c34a1687f524c37d4fb8bad18d642c74bed8dDave Jones * 8237A DMA controller suspend functions.
3795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman *
4795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman * Written by Pierre Ossman, 2005.
5643f720cea989d2913fc0120a2384fecc1be1f9aPierre Ossman *
6643f720cea989d2913fc0120a2384fecc1be1f9aPierre Ossman * This program is free software; you can redistribute it and/or modify
7643f720cea989d2913fc0120a2384fecc1be1f9aPierre Ossman * it under the terms of the GNU General Public License as published by
8643f720cea989d2913fc0120a2384fecc1be1f9aPierre Ossman * the Free Software Foundation; either version 2 of the License, or (at
9643f720cea989d2913fc0120a2384fecc1be1f9aPierre Ossman * your option) any later version.
10795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman */
11795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
12795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman#include <linux/init.h>
13f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysocki#include <linux/syscore_ops.h>
14795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
15795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman#include <asm/dma.h>
16795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
17795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman/*
18795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman * This module just handles suspend/resume issues with the
19795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman * 8237A DMA controller (used for ISA and LPC).
20795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman * Allocation is handled in kernel/dma.c and normal usage is
21795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman * in asm/dma.h.
22795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman */
23795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
24f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysockistatic void i8237A_resume(void)
25795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman{
26795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	unsigned long flags;
27795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	int i;
28795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
29795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	flags = claim_dma_lock();
30795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
31b52af40923fc91a12e3c7152d833e0c0c6a508f6Clemens Ladisch	dma_outb(0, DMA1_RESET_REG);
32b52af40923fc91a12e3c7152d833e0c0c6a508f6Clemens Ladisch	dma_outb(0, DMA2_RESET_REG);
33795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
34b52af40923fc91a12e3c7152d833e0c0c6a508f6Clemens Ladisch	for (i = 0; i < 8; i++) {
35795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman		set_dma_addr(i, 0x000000);
36795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman		/* DMA count is a bit weird so this is not 0 */
37795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman		set_dma_count(i, 1);
38795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	}
39795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
40795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	/* Enable cascade DMA or channel 0-3 won't work */
41795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	enable_dma(4);
42795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
43795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman	release_dma_lock(flags);
44795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman}
45795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
46f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysockistatic struct syscore_ops i8237_syscore_ops = {
47b52af40923fc91a12e3c7152d833e0c0c6a508f6Clemens Ladisch	.resume		= i8237A_resume,
48795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman};
49795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman
50f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysockistatic int __init i8237A_init_ops(void)
51795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman{
52f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysocki	register_syscore_ops(&i8237_syscore_ops);
53f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysocki	return 0;
54795312e763569ce4df67e7a0ca726a9901358fa2Pierre Ossman}
55f3c6ea1b06c71b43f751b36bd99345369fe911afRafael J. Wysockidevice_initcall(i8237A_init_ops);
56