2005-04-16 15:20:36 -07:00
/*
* ppc64 " iomap " interface implementation .
*
* ( C ) Copyright 2004 Linus Torvalds
*/
# include <linux/pci.h>
# include <linux/mm.h>
2011-07-29 16:19:31 +10:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
# include <asm/io.h>
2007-07-26 14:07:13 +10:00
# include <asm/pci-bridge.h>
2017-01-30 18:11:55 +11:00
# include <asm/isa-bridge.h>
2005-04-16 15:20:36 -07:00
/*
* Here comes the ppc64 implementation of the IOMAP
* interfaces .
*/
2007-01-26 01:52:27 -06:00
unsigned int ioread8 ( void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
return readb ( addr ) ;
}
2007-01-26 01:52:27 -06:00
unsigned int ioread16 ( void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
return readw ( addr ) ;
}
2007-01-26 01:52:27 -06:00
unsigned int ioread16be ( void __iomem * addr )
2005-08-20 21:48:47 -04:00
{
2014-06-23 10:56:22 +10:00
return readw_be ( addr ) ;
2005-08-20 21:48:47 -04:00
}
2007-01-26 01:52:27 -06:00
unsigned int ioread32 ( void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
return readl ( addr ) ;
}
2007-01-26 01:52:27 -06:00
unsigned int ioread32be ( void __iomem * addr )
2005-08-20 21:48:47 -04:00
{
2014-06-23 10:56:22 +10:00
return readl_be ( addr ) ;
2005-08-20 21:48:47 -04:00
}
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( ioread8 ) ;
EXPORT_SYMBOL ( ioread16 ) ;
2005-08-20 21:48:47 -04:00
EXPORT_SYMBOL ( ioread16be ) ;
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( ioread32 ) ;
2005-08-20 21:48:47 -04:00
EXPORT_SYMBOL ( ioread32be ) ;
2016-05-19 18:11:10 +03:00
# ifdef __powerpc64__
u64 ioread64 ( void __iomem * addr )
{
return readq ( addr ) ;
}
u64 ioread64be ( void __iomem * addr )
{
return readq_be ( addr ) ;
}
EXPORT_SYMBOL ( ioread64 ) ;
EXPORT_SYMBOL ( ioread64be ) ;
# endif /* __powerpc64__ */
2005-04-16 15:20:36 -07:00
2007-01-26 01:52:27 -06:00
void iowrite8 ( u8 val , void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
writeb ( val , addr ) ;
}
2007-01-26 01:52:27 -06:00
void iowrite16 ( u16 val , void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
writew ( val , addr ) ;
}
2007-01-26 01:52:27 -06:00
void iowrite16be ( u16 val , void __iomem * addr )
2005-08-20 21:48:47 -04:00
{
2014-06-23 10:56:22 +10:00
writew_be ( val , addr ) ;
2005-08-20 21:48:47 -04:00
}
2007-01-26 01:52:27 -06:00
void iowrite32 ( u32 val , void __iomem * addr )
2005-04-16 15:20:36 -07:00
{
writel ( val , addr ) ;
}
2007-01-26 01:52:27 -06:00
void iowrite32be ( u32 val , void __iomem * addr )
2005-08-20 21:48:47 -04:00
{
2014-06-23 10:56:22 +10:00
writel_be ( val , addr ) ;
2005-08-20 21:48:47 -04:00
}
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( iowrite8 ) ;
EXPORT_SYMBOL ( iowrite16 ) ;
2005-08-20 21:48:47 -04:00
EXPORT_SYMBOL ( iowrite16be ) ;
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( iowrite32 ) ;
2005-08-20 21:48:47 -04:00
EXPORT_SYMBOL ( iowrite32be ) ;
2016-05-19 18:11:10 +03:00
# ifdef __powerpc64__
void iowrite64 ( u64 val , void __iomem * addr )
{
writeq ( val , addr ) ;
}
void iowrite64be ( u64 val , void __iomem * addr )
{
writeq_be ( val , addr ) ;
}
EXPORT_SYMBOL ( iowrite64 ) ;
EXPORT_SYMBOL ( iowrite64be ) ;
# endif /* __powerpc64__ */
2005-04-16 15:20:36 -07:00
/*
* These are the " repeat read/write " functions . Note the
* non - CPU byte order . We do things in " IO byteorder "
* here .
*
* FIXME ! We could make these do EEH handling if we really
* wanted . Not clear if we do .
*/
void ioread8_rep ( void __iomem * addr , void * dst , unsigned long count )
{
2014-06-23 10:56:22 +10:00
readsb ( addr , dst , count ) ;
2005-04-16 15:20:36 -07:00
}
void ioread16_rep ( void __iomem * addr , void * dst , unsigned long count )
{
2014-06-23 10:56:22 +10:00
readsw ( addr , dst , count ) ;
2005-04-16 15:20:36 -07:00
}
void ioread32_rep ( void __iomem * addr , void * dst , unsigned long count )
{
2014-06-23 10:56:22 +10:00
readsl ( addr , dst , count ) ;
2005-04-16 15:20:36 -07:00
}
EXPORT_SYMBOL ( ioread8_rep ) ;
EXPORT_SYMBOL ( ioread16_rep ) ;
EXPORT_SYMBOL ( ioread32_rep ) ;
void iowrite8_rep ( void __iomem * addr , const void * src , unsigned long count )
{
2014-06-23 10:56:22 +10:00
writesb ( addr , src , count ) ;
2005-04-16 15:20:36 -07:00
}
void iowrite16_rep ( void __iomem * addr , const void * src , unsigned long count )
{
2014-06-23 10:56:22 +10:00
writesw ( addr , src , count ) ;
2005-04-16 15:20:36 -07:00
}
void iowrite32_rep ( void __iomem * addr , const void * src , unsigned long count )
{
2014-06-23 10:56:22 +10:00
writesl ( addr , src , count ) ;
2005-04-16 15:20:36 -07:00
}
EXPORT_SYMBOL ( iowrite8_rep ) ;
EXPORT_SYMBOL ( iowrite16_rep ) ;
EXPORT_SYMBOL ( iowrite32_rep ) ;
void __iomem * ioport_map ( unsigned long port , unsigned int len )
{
2006-11-13 09:27:39 +11:00
return ( void __iomem * ) ( port + _IO_BASE ) ;
2005-04-16 15:20:36 -07:00
}
void ioport_unmap ( void __iomem * addr )
{
/* Nothing to do */
}
EXPORT_SYMBOL ( ioport_map ) ;
EXPORT_SYMBOL ( ioport_unmap ) ;
2011-08-05 16:01:20 +10:00
# ifdef CONFIG_PCI
2005-04-16 15:20:36 -07:00
void pci_iounmap ( struct pci_dev * dev , void __iomem * addr )
{
2007-07-26 14:07:13 +10:00
if ( isa_vaddr_is_ioport ( addr ) )
return ;
if ( pcibios_vaddr_is_ioport ( addr ) )
return ;
iounmap ( addr ) ;
2005-04-16 15:20:36 -07:00
}
2007-07-26 14:07:13 +10:00
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( pci_iounmap ) ;
2011-08-11 01:15:44 +10:00
# endif /* CONFIG_PCI */