2019-05-30 02:57:59 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2014-04-25 17:45:20 +04:00
/*
* bebob_hwdep . c - a part of driver for BeBoB based devices
*
* Copyright ( c ) 2013 - 2014 Takashi Sakamoto
*/
/*
* This codes give three functionality .
*
* 1. get firewire node infomation
* 2. get notification about starting / stopping stream
* 3. lock / unlock stream
*/
# include "bebob.h"
static long
hwdep_read ( struct snd_hwdep * hwdep , char __user * buf , long count ,
loff_t * offset )
{
struct snd_bebob * bebob = hwdep - > private_data ;
DEFINE_WAIT ( wait ) ;
union snd_firewire_event event ;
spin_lock_irq ( & bebob - > lock ) ;
while ( ! bebob - > dev_lock_changed ) {
prepare_to_wait ( & bebob - > hwdep_wait , & wait , TASK_INTERRUPTIBLE ) ;
spin_unlock_irq ( & bebob - > lock ) ;
schedule ( ) ;
finish_wait ( & bebob - > hwdep_wait , & wait ) ;
if ( signal_pending ( current ) )
return - ERESTARTSYS ;
spin_lock_irq ( & bebob - > lock ) ;
}
memset ( & event , 0 , sizeof ( event ) ) ;
2020-10-07 10:49:28 +03:00
count = min_t ( long , count , sizeof ( event . lock_status ) ) ;
2021-01-25 17:02:08 +03:00
event . lock_status . type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS ;
event . lock_status . status = ( bebob - > dev_lock_count > 0 ) ;
bebob - > dev_lock_changed = false ;
2014-04-25 17:45:20 +04:00
spin_unlock_irq ( & bebob - > lock ) ;
if ( copy_to_user ( buf , & event , count ) )
return - EFAULT ;
return count ;
}
2017-07-03 06:27:36 +03:00
static __poll_t
2014-04-25 17:45:20 +04:00
hwdep_poll ( struct snd_hwdep * hwdep , struct file * file , poll_table * wait )
{
struct snd_bebob * bebob = hwdep - > private_data ;
2017-07-03 06:27:36 +03:00
__poll_t events ;
2014-04-25 17:45:20 +04:00
poll_wait ( file , & bebob - > hwdep_wait , wait ) ;
spin_lock_irq ( & bebob - > lock ) ;
if ( bebob - > dev_lock_changed )
2018-02-12 01:34:03 +03:00
events = EPOLLIN | EPOLLRDNORM ;
2014-04-25 17:45:20 +04:00
else
events = 0 ;
spin_unlock_irq ( & bebob - > lock ) ;
return events ;
}
static int
hwdep_get_info ( struct snd_bebob * bebob , void __user * arg )
{
struct fw_device * dev = fw_parent_device ( bebob - > unit ) ;
struct snd_firewire_get_info info ;
memset ( & info , 0 , sizeof ( info ) ) ;
info . type = SNDRV_FIREWIRE_TYPE_BEBOB ;
info . card = dev - > card - > index ;
* ( __be32 * ) & info . guid [ 0 ] = cpu_to_be32 ( dev - > config_rom [ 3 ] ) ;
* ( __be32 * ) & info . guid [ 4 ] = cpu_to_be32 ( dev - > config_rom [ 4 ] ) ;
ALSA: Convert strlcpy to strscpy when return value is unused
strlcpy is deprecated. see: Documentation/process/deprecated.rst
Change the calls that do not use the strlcpy return value to the
preferred strscpy.
Done with cocci script:
@@
expression e1, e2, e3;
@@
- strlcpy(
+ strscpy(
e1, e2, e3);
This cocci script leaves the instances where the return value is
used unchanged.
After this patch, sound/ has 3 uses of strlcpy() that need to be
manually inspected for conversion and changed one day.
$ git grep -w strlcpy sound/
sound/usb/card.c: len = strlcpy(card->longname, s, sizeof(card->longname));
sound/usb/mixer.c: return strlcpy(buf, p->name, buflen);
sound/usb/mixer.c: return strlcpy(buf, p->names[index], buflen);
Miscellenea:
o Remove trailing whitespace in conversion of sound/core/hwdep.c
Link: https://lore.kernel.org/lkml/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=V6A6G1oUZcprmknw@mail.gmail.com/
Signed-off-by: Joe Perches <joe@perches.com>
Acked-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/22b393d1790bb268769d0bab7bacf0866dcb0c14.camel@perches.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2021-01-04 20:17:34 +03:00
strscpy ( info . device_name , dev_name ( & dev - > device ) ,
2014-04-25 17:45:20 +04:00
sizeof ( info . device_name ) ) ;
if ( copy_to_user ( arg , & info , sizeof ( info ) ) )
return - EFAULT ;
return 0 ;
}
static int
hwdep_lock ( struct snd_bebob * bebob )
{
int err ;
spin_lock_irq ( & bebob - > lock ) ;
if ( bebob - > dev_lock_count = = 0 ) {
bebob - > dev_lock_count = - 1 ;
err = 0 ;
} else {
err = - EBUSY ;
}
spin_unlock_irq ( & bebob - > lock ) ;
return err ;
}
static int
hwdep_unlock ( struct snd_bebob * bebob )
{
int err ;
spin_lock_irq ( & bebob - > lock ) ;
if ( bebob - > dev_lock_count = = - 1 ) {
bebob - > dev_lock_count = 0 ;
err = 0 ;
} else {
err = - EBADFD ;
}
spin_unlock_irq ( & bebob - > lock ) ;
return err ;
}
static int
hwdep_release ( struct snd_hwdep * hwdep , struct file * file )
{
struct snd_bebob * bebob = hwdep - > private_data ;
spin_lock_irq ( & bebob - > lock ) ;
if ( bebob - > dev_lock_count = = - 1 )
bebob - > dev_lock_count = 0 ;
spin_unlock_irq ( & bebob - > lock ) ;
return 0 ;
}
static int
hwdep_ioctl ( struct snd_hwdep * hwdep , struct file * file ,
unsigned int cmd , unsigned long arg )
{
struct snd_bebob * bebob = hwdep - > private_data ;
switch ( cmd ) {
case SNDRV_FIREWIRE_IOCTL_GET_INFO :
return hwdep_get_info ( bebob , ( void __user * ) arg ) ;
case SNDRV_FIREWIRE_IOCTL_LOCK :
return hwdep_lock ( bebob ) ;
case SNDRV_FIREWIRE_IOCTL_UNLOCK :
return hwdep_unlock ( bebob ) ;
default :
return - ENOIOCTLCMD ;
}
}
# ifdef CONFIG_COMPAT
static int
hwdep_compat_ioctl ( struct snd_hwdep * hwdep , struct file * file ,
unsigned int cmd , unsigned long arg )
{
return hwdep_ioctl ( hwdep , file , cmd ,
( unsigned long ) compat_ptr ( arg ) ) ;
}
# else
# define hwdep_compat_ioctl NULL
# endif
int snd_bebob_create_hwdep_device ( struct snd_bebob * bebob )
{
2017-01-05 15:48:07 +03:00
static const struct snd_hwdep_ops ops = {
. read = hwdep_read ,
. release = hwdep_release ,
. poll = hwdep_poll ,
. ioctl = hwdep_ioctl ,
. ioctl_compat = hwdep_compat_ioctl ,
} ;
2014-04-25 17:45:20 +04:00
struct snd_hwdep * hwdep ;
int err ;
err = snd_hwdep_new ( bebob - > card , " BeBoB " , 0 , & hwdep ) ;
if ( err < 0 )
goto end ;
strcpy ( hwdep - > name , " BeBoB " ) ;
hwdep - > iface = SNDRV_HWDEP_IFACE_FW_BEBOB ;
2017-01-05 15:48:07 +03:00
hwdep - > ops = ops ;
2014-04-25 17:45:20 +04:00
hwdep - > private_data = bebob ;
hwdep - > exclusive = true ;
end :
return err ;
}