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>
2011-03-24 00:15:54 +03:00
# include <linux/syscore_ops.h>
2005-09-04 02:56:54 +04:00
# 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 .
*/
2011-03-24 00:15:54 +03:00
static void i8237A_resume ( void )
2005-09-04 02:56:54 +04:00
{
unsigned long flags ;
int i ;
flags = claim_dma_lock ( ) ;
2009-02-10 11:21:07 +03:00
dma_outb ( 0 , DMA1_RESET_REG ) ;
dma_outb ( 0 , DMA2_RESET_REG ) ;
2005-09-04 02:56:54 +04:00
2009-02-10 11:21:07 +03:00
for ( i = 0 ; i < 8 ; i + + ) {
2005-09-04 02:56:54 +04:00
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 ) ;
}
2011-03-24 00:15:54 +03:00
static struct syscore_ops i8237_syscore_ops = {
2009-02-10 11:21:07 +03:00
. resume = i8237A_resume ,
2005-09-04 02:56:54 +04:00
} ;
2011-03-24 00:15:54 +03:00
static int __init i8237A_init_ops ( void )
2005-09-04 02:56:54 +04:00
{
2011-03-24 00:15:54 +03:00
register_syscore_ops ( & i8237_syscore_ops ) ;
return 0 ;
2005-09-04 02:56:54 +04:00
}
2011-03-24 00:15:54 +03:00
device_initcall ( i8237A_init_ops ) ;