2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
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.
*/
2018-03-29 18:06:55 +03:00
# include <linux/dmi.h>
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>
2018-03-29 18:06:55 +03:00
# include <asm/x86_init.h>
2005-09-04 02:56:54 +04:00
/*
* 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
{
2018-03-29 18:06:55 +03:00
/*
* From SKL PCH onwards , the legacy DMA device is removed in which the
* I / O ports ( 81 h - 83 h , 87 h , 89 h - 8 Bh , 8F h ) related to it are removed
* as well . All removed ports must return 0xff for a inb ( ) request .
*
* Note : DMA_PAGE_2 ( port 0x81 ) should not be checked for detecting
* the presence of DMA device since it may be used by BIOS to decode
* LPC traffic for POST codes . Original LPC only decodes one byte of
* port 0x80 but some BIOS may choose to enhance PCH LPC port 0x8 x
* decoding .
*/
if ( dma_inb ( DMA_PAGE_0 ) = = 0xFF )
return - ENODEV ;
/*
* It is not required to load this driver as newer SoC may not
* support 8237 DMA or bus mastering from LPC . Platform firmware
* must announce the support for such legacy devices via
* ACPI_FADT_LEGACY_DEVICES field in FADT table .
*/
if ( x86_pnpbios_disabled ( ) & & dmi_get_bios_year ( ) > = 2017 )
return - ENODEV ;
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 ) ;