2005-04-17 02:20:36 +04:00
/*
* Copyright ( c ) by Jaroslav Kysela < perex @ suse . cz >
*
2005-10-10 13:59:52 +04:00
* Misc memory accessors
2005-04-17 02:20:36 +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 .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
2005-10-10 13:59:52 +04:00
# include <linux/config.h>
2005-04-17 02:20:36 +04:00
# include <asm/io.h>
# include <asm/uaccess.h>
/**
* copy_to_user_fromio - copy data from mmio - space to user - space
* @ dst : the destination pointer on user - space
* @ src : the source pointer on mmio
* @ count : the data size to copy in bytes
*
* Copies the data from mmio - space to user - space .
*
* Returns zero if successful , or non - zero on failure .
*/
int copy_to_user_fromio ( void __user * dst , const volatile void __iomem * src , size_t count )
{
# if defined(__i386__) || defined(CONFIG_SPARC32)
2005-09-05 12:35:20 +04:00
return copy_to_user ( dst , ( const void __force * ) src , count ) ? - EFAULT : 0 ;
2005-04-17 02:20:36 +04:00
# else
char buf [ 256 ] ;
while ( count ) {
size_t c = count ;
if ( c > sizeof ( buf ) )
c = sizeof ( buf ) ;
memcpy_fromio ( buf , ( void __iomem * ) src , c ) ;
if ( copy_to_user ( dst , buf , c ) )
return - EFAULT ;
count - = c ;
dst + = c ;
src + = c ;
}
return 0 ;
# endif
}
/**
* copy_from_user_toio - copy data from user - space to mmio - space
* @ dst : the destination pointer on mmio - space
* @ src : the source pointer on user - space
* @ count : the data size to copy in bytes
*
* Copies the data from user - space to mmio - space .
*
* Returns zero if successful , or non - zero on failure .
*/
int copy_from_user_toio ( volatile void __iomem * dst , const void __user * src , size_t count )
{
# if defined(__i386__) || defined(CONFIG_SPARC32)
2005-09-05 12:35:20 +04:00
return copy_from_user ( ( void __force * ) dst , src , count ) ? - EFAULT : 0 ;
2005-04-17 02:20:36 +04:00
# else
char buf [ 256 ] ;
while ( count ) {
size_t c = count ;
if ( c > sizeof ( buf ) )
c = sizeof ( buf ) ;
if ( copy_from_user ( buf , src , c ) )
return - EFAULT ;
memcpy_toio ( dst , buf , c ) ;
count - = c ;
dst + = c ;
src + = c ;
}
return 0 ;
# endif
}