2005-09-04 02:56:54 +04:00
/*
2007-10-13 05:10:53 +04:00
* 8237 A DMA controller suspend functions .
2005-09-04 02:56:54 +04:00
*
* Written by Pierre Ossman , 2005.
2006-10-01 10:27:52 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or ( at
* your option ) any later version .
2005-09-04 02:56:54 +04:00
*/
# include <linux/init.h>
# include <linux/sysdev.h>
# include <asm/dma.h>
/*
* This module just handles suspend / resume issues with the
* 8237 A DMA controller ( used for ISA and LPC ) .
* Allocation is handled in kernel / dma . c and normal usage is
* in asm / dma . h .
*/
static int i8237A_resume ( struct sys_device * dev )
{
unsigned long flags ;
int i ;
flags = claim_dma_lock ( ) ;
dma_outb ( DMA1_RESET_REG , 0 ) ;
dma_outb ( DMA2_RESET_REG , 0 ) ;
for ( i = 0 ; i < 8 ; i + + ) {
set_dma_addr ( i , 0x000000 ) ;
/* DMA count is a bit weird so this is not 0 */
set_dma_count ( i , 1 ) ;
}
/* Enable cascade DMA or channel 0-3 won't work */
enable_dma ( 4 ) ;
release_dma_lock ( flags ) ;
return 0 ;
}
static int i8237A_suspend ( struct sys_device * dev , pm_message_t state )
{
return 0 ;
}
static struct sysdev_class i8237_sysdev_class = {
set_kset_name ( " i8237 " ) ,
. suspend = i8237A_suspend ,
. resume = i8237A_resume ,
} ;
static struct sys_device device_i8237A = {
. id = 0 ,
. cls = & i8237_sysdev_class ,
} ;
static int __init i8237A_init_sysfs ( void )
{
int error = sysdev_class_register ( & i8237_sysdev_class ) ;
if ( ! error )
error = sysdev_register ( & device_i8237A ) ;
return error ;
}
device_initcall ( i8237A_init_sysfs ) ;