2005-04-16 15:20:36 -07:00
/*
* ppc64 " iomap " interface implementation .
*
* ( C ) Copyright 2004 Linus Torvalds
*/
# include <linux/init.h>
# 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>
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
{
return in_be16 ( addr ) ;
}
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
{
return in_be32 ( addr ) ;
}
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 ) ;
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
{
out_be16 ( addr , val ) ;
}
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
{
out_be32 ( addr , val ) ;
}
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 ) ;
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 )
{
2005-09-09 16:50:43 +01:00
_insb ( ( u8 __iomem * ) addr , dst , count ) ;
2005-04-16 15:20:36 -07:00
}
void ioread16_rep ( void __iomem * addr , void * dst , unsigned long count )
{
2005-09-09 16:50:43 +01:00
_insw_ns ( ( u16 __iomem * ) addr , dst , count ) ;
2005-04-16 15:20:36 -07:00
}
void ioread32_rep ( void __iomem * addr , void * dst , unsigned long count )
{
2005-09-09 16:50:43 +01:00
_insl_ns ( ( u32 __iomem * ) 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 )
{
2005-09-09 16:50:43 +01:00
_outsb ( ( u8 __iomem * ) addr , src , count ) ;
2005-04-16 15:20:36 -07:00
}
void iowrite16_rep ( void __iomem * addr , const void * src , unsigned long count )
{
2005-09-09 16:50:43 +01:00
_outsw_ns ( ( u16 __iomem * ) addr , src , count ) ;
2005-04-16 15:20:36 -07:00
}
void iowrite32_rep ( void __iomem * addr , const void * src , unsigned long count )
{
2005-09-09 16:50:43 +01:00
_outsl_ns ( ( u32 __iomem * ) 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 */