2005-04-17 02:20:36 +04:00
/*
* 32 bit - > 64 bit ioctl wrapper for timer API
* Copyright ( c ) by Takashi Iwai < tiwai @ suse . de >
*
* 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
*
*/
/* This file included from timer.c */
# include <linux/compat.h>
2005-11-17 15:56:05 +03:00
struct snd_timer_info32 {
2005-04-17 02:20:36 +04:00
u32 flags ;
s32 card ;
unsigned char id [ 64 ] ;
unsigned char name [ 80 ] ;
u32 reserved0 ;
u32 resolution ;
unsigned char reserved [ 64 ] ;
} ;
static int snd_timer_user_info_compat ( struct file * file ,
2005-11-17 15:56:05 +03:00
struct snd_timer_info32 __user * _info )
2005-04-17 02:20:36 +04:00
{
2005-11-17 15:56:05 +03:00
struct snd_timer_user * tu ;
struct snd_timer_info32 info ;
struct snd_timer * t ;
2005-04-17 02:20:36 +04:00
tu = file - > private_data ;
2008-08-08 19:09:09 +04:00
if ( snd_BUG_ON ( ! tu - > timeri ) )
return - ENXIO ;
2005-04-17 02:20:36 +04:00
t = tu - > timeri - > timer ;
2008-08-08 19:09:09 +04:00
if ( snd_BUG_ON ( ! t ) )
return - ENXIO ;
2005-04-17 02:20:36 +04:00
memset ( & info , 0 , sizeof ( info ) ) ;
info . card = t - > card ? t - > card - > number : - 1 ;
if ( t - > hw . flags & SNDRV_TIMER_HW_SLAVE )
info . flags | = SNDRV_TIMER_FLG_SLAVE ;
strlcpy ( info . id , t - > id , sizeof ( info . id ) ) ;
strlcpy ( info . name , t - > name , sizeof ( info . name ) ) ;
info . resolution = t - > hw . resolution ;
if ( copy_to_user ( _info , & info , sizeof ( * _info ) ) )
return - EFAULT ;
return 0 ;
}
2005-11-17 15:56:05 +03:00
struct snd_timer_status32 {
2005-04-17 02:20:36 +04:00
struct compat_timespec tstamp ;
u32 resolution ;
u32 lost ;
u32 overrun ;
u32 queue ;
unsigned char reserved [ 64 ] ;
} ;
static int snd_timer_user_status_compat ( struct file * file ,
2005-11-17 15:56:05 +03:00
struct snd_timer_status32 __user * _status )
2005-04-17 02:20:36 +04:00
{
2005-11-17 15:56:05 +03:00
struct snd_timer_user * tu ;
struct snd_timer_status status ;
2005-04-17 02:20:36 +04:00
tu = file - > private_data ;
2008-08-08 19:09:09 +04:00
if ( snd_BUG_ON ( ! tu - > timeri ) )
return - ENXIO ;
2005-04-17 02:20:36 +04:00
memset ( & status , 0 , sizeof ( status ) ) ;
status . tstamp = tu - > tstamp ;
status . resolution = snd_timer_resolution ( tu - > timeri ) ;
status . lost = tu - > timeri - > lost ;
status . overrun = tu - > overrun ;
spin_lock_irq ( & tu - > qlock ) ;
status . queue = tu - > qused ;
spin_unlock_irq ( & tu - > qlock ) ;
if ( copy_to_user ( _status , & status , sizeof ( status ) ) )
return - EFAULT ;
return 0 ;
}
/*
*/
enum {
2005-11-17 15:56:05 +03:00
SNDRV_TIMER_IOCTL_INFO32 = _IOR ( ' T ' , 0x11 , struct snd_timer_info32 ) ,
SNDRV_TIMER_IOCTL_STATUS32 = _IOW ( ' T ' , 0x14 , struct snd_timer_status32 ) ,
2005-04-17 02:20:36 +04:00
} ;
static long snd_timer_user_ioctl_compat ( struct file * file , unsigned int cmd , unsigned long arg )
{
void __user * argp = compat_ptr ( arg ) ;
switch ( cmd ) {
case SNDRV_TIMER_IOCTL_PVERSION :
case SNDRV_TIMER_IOCTL_TREAD :
case SNDRV_TIMER_IOCTL_GINFO :
case SNDRV_TIMER_IOCTL_GPARAMS :
case SNDRV_TIMER_IOCTL_GSTATUS :
case SNDRV_TIMER_IOCTL_SELECT :
case SNDRV_TIMER_IOCTL_PARAMS :
case SNDRV_TIMER_IOCTL_START :
2005-05-15 17:43:54 +04:00
case SNDRV_TIMER_IOCTL_START_OLD :
2005-04-17 02:20:36 +04:00
case SNDRV_TIMER_IOCTL_STOP :
2005-05-15 17:43:54 +04:00
case SNDRV_TIMER_IOCTL_STOP_OLD :
2005-04-17 02:20:36 +04:00
case SNDRV_TIMER_IOCTL_CONTINUE :
2005-05-15 17:43:54 +04:00
case SNDRV_TIMER_IOCTL_CONTINUE_OLD :
2005-05-15 17:04:14 +04:00
case SNDRV_TIMER_IOCTL_PAUSE :
2005-05-15 17:43:54 +04:00
case SNDRV_TIMER_IOCTL_PAUSE_OLD :
2005-04-17 02:20:36 +04:00
case SNDRV_TIMER_IOCTL_NEXT_DEVICE :
return snd_timer_user_ioctl ( file , cmd , ( unsigned long ) argp ) ;
case SNDRV_TIMER_IOCTL_INFO32 :
return snd_timer_user_info_compat ( file , argp ) ;
case SNDRV_TIMER_IOCTL_STATUS32 :
return snd_timer_user_status_compat ( file , argp ) ;
}
return - ENOIOCTLCMD ;
}