2019-05-27 09:55:05 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
2007-10-15 11:50:19 +04:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
*
2005-10-10 13:59:52 +04:00
* Misc memory accessors
2005-04-17 02:20:36 +04:00
*/
2011-09-22 17:34:58 +04:00
# include <linux/export.h>
2015-01-28 18:49:33 +03:00
# include <linux/io.h>
2015-01-28 19:24:43 +03:00
# include <linux/uaccess.h>
2008-01-08 20:13:27 +03:00
# include <sound/core.h>
2005-04-17 02:20:36 +04:00
/**
* 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 .
*
2013-03-12 01:05:14 +04:00
* Return : Zero if successful , or non - zero on failure .
2005-04-17 02:20:36 +04:00
*/
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
}
2006-04-28 17:13:39 +04:00
EXPORT_SYMBOL ( copy_to_user_fromio ) ;
2005-04-17 02:20:36 +04:00
/**
* 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 .
*
2013-03-12 01:05:14 +04:00
* Return : Zero if successful , or non - zero on failure .
2005-04-17 02:20:36 +04:00
*/
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
}
2006-04-28 17:13:39 +04:00
EXPORT_SYMBOL ( copy_from_user_toio ) ;