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