2011-07-22 10:58:34 -04:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
# include <linux/types.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2013-12-18 23:08:52 +01:00
# include <linux/spinlock.h>
static DEFINE_RAW_SPINLOCK ( __io_lock ) ;
/*
* Generic atomic MMIO modify .
*
* Allows thread - safe access to registers shared by unrelated subsystems .
* The access is protected by a single MMIO - wide lock .
*/
void atomic_io_modify_relaxed ( void __iomem * reg , u32 mask , u32 set )
{
unsigned long flags ;
u32 value ;
raw_spin_lock_irqsave ( & __io_lock , flags ) ;
value = readl_relaxed ( reg ) & ~ mask ;
value | = ( set & mask ) ;
writel_relaxed ( value , reg ) ;
raw_spin_unlock_irqrestore ( & __io_lock , flags ) ;
}
EXPORT_SYMBOL ( atomic_io_modify_relaxed ) ;
void atomic_io_modify ( void __iomem * reg , u32 mask , u32 set )
{
unsigned long flags ;
u32 value ;
raw_spin_lock_irqsave ( & __io_lock , flags ) ;
value = readl_relaxed ( reg ) & ~ mask ;
value | = ( set & mask ) ;
writel ( value , reg ) ;
raw_spin_unlock_irqrestore ( & __io_lock , flags ) ;
}
EXPORT_SYMBOL ( atomic_io_modify ) ;
2005-04-16 15:20:36 -07:00
/*
* Copy data from IO memory space to " real " memory space .
* This needs to be optimized .
*/
2005-09-24 10:42:06 +01:00
void _memcpy_fromio ( void * to , const volatile void __iomem * from , size_t count )
2005-04-16 15:20:36 -07:00
{
unsigned char * t = to ;
while ( count ) {
count - - ;
* t = readb ( from ) ;
t + + ;
from + + ;
}
}
/*
* Copy data from " real " memory space to IO memory space .
* This needs to be optimized .
*/
2005-09-24 10:42:06 +01:00
void _memcpy_toio ( volatile void __iomem * to , const void * from , size_t count )
2005-04-16 15:20:36 -07:00
{
const unsigned char * f = from ;
while ( count ) {
count - - ;
writeb ( * f , to ) ;
f + + ;
to + + ;
}
}
/*
* " memset " on IO memory space .
* This needs to be optimized .
*/
2005-09-24 10:42:06 +01:00
void _memset_io ( volatile void __iomem * dst , int c , size_t count )
2005-04-16 15:20:36 -07:00
{
while ( count ) {
count - - ;
writeb ( c , dst ) ;
dst + + ;
}
}
EXPORT_SYMBOL ( _memcpy_fromio ) ;
EXPORT_SYMBOL ( _memcpy_toio ) ;
EXPORT_SYMBOL ( _memset_io ) ;