2019-05-27 08:55:05 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07:00
/*
* The driver for the EMU10K1 ( SB Live ! ) based soundcards
2007-10-15 09:50:19 +02:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-16 15:20:36 -07:00
*
* Copyright ( c ) by James Courtier - Dutton < James @ superbug . demon . co . uk >
* Added support for Audigy 2 Value .
*/
# include <linux/init.h>
# include <linux/pci.h>
# include <linux/time.h>
2011-07-15 13:13:37 -04:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include <sound/core.h>
# include <sound/emu10k1.h>
# include <sound/initval.h>
2007-10-15 09:50:19 +02:00
MODULE_AUTHOR ( " Jaroslav Kysela <perex@perex.cz> " ) ;
2005-04-16 15:20:36 -07:00
MODULE_DESCRIPTION ( " EMU10K1 " ) ;
MODULE_LICENSE ( " GPL " ) ;
ALSA: seq: Allow the modular sequencer registration
Many drivers bind the sequencer stuff in off-load by another driver
module, so that it's loaded only on demand. In the current code, this
mechanism doesn't work when the driver is built-in while the sequencer
is module. We check with IS_REACHABLE() and enable only when the
sequencer is in the same level of build.
However, this is basically a overshoot. The binder code
(snd-seq-device) is an individual module from the sequencer core
(snd-seq), and we just have to make the former a built-in while
keeping the latter a module for allowing the scenario like the above.
This patch achieves that by rewriting Kconfig slightly. Now, a driver
that provides the manual sequencer device binding should select
CONFIG_SND_SEQ_DEVICE in a way as
select SND_SEQ_DEVICE if SND_SEQUENCER != n
Note that the "!=n" is needed here to avoid the influence of the
sequencer core is module while the driver is built-in.
Also, since rawmidi.o may be linked with snd_seq_device.o when
built-in, we have to shuffle the code to make the linker happy.
(the kernel linker isn't smart enough yet to handle such a case.)
That is, snd_seq_device.c is moved to sound/core from sound/core/seq,
as well as Makefile.
Last but not least, the patch replaces the code using IS_REACHABLE()
with IS_ENABLED(), since now the condition meets always when enabled.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-06-09 15:11:58 +02:00
# if IS_ENABLED(CONFIG_SND_SEQUENCER)
2005-04-16 15:20:36 -07:00
# define ENABLE_SYNTH
# include <sound/emu10k1_synth.h>
# endif
static int index [ SNDRV_CARDS ] = SNDRV_DEFAULT_IDX ; /* Index 0-MAX */
static char * id [ SNDRV_CARDS ] = SNDRV_DEFAULT_STR ; /* ID for this card */
2011-12-15 13:49:36 +10:30
static bool enable [ SNDRV_CARDS ] = SNDRV_DEFAULT_ENABLE_PNP ; /* Enable this card */
2006-05-17 17:14:51 +02:00
static int extin [ SNDRV_CARDS ] ;
static int extout [ SNDRV_CARDS ] ;
2005-04-16 15:20:36 -07:00
static int seq_ports [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 4 } ;
static int max_synth_voices [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 64 } ;
static int max_buffer_size [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 128 } ;
2011-12-15 13:49:36 +10:30
static bool enable_ir [ SNDRV_CARDS ] ;
2006-05-17 17:14:51 +02:00
static uint subsystem [ SNDRV_CARDS ] ; /* Force card subsystem model */
2010-08-18 14:08:17 +02:00
static uint delay_pcm_irq [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 2 } ;
2005-04-16 15:20:36 -07:00
module_param_array ( index , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( index , " Index value for the EMU10K1 soundcard. " ) ;
module_param_array ( id , charp , NULL , 0444 ) ;
MODULE_PARM_DESC ( id , " ID string for the EMU10K1 soundcard. " ) ;
module_param_array ( enable , bool , NULL , 0444 ) ;
MODULE_PARM_DESC ( enable , " Enable the EMU10K1 soundcard. " ) ;
module_param_array ( extin , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( extin , " Available external inputs for FX8010. Zero=default. " ) ;
module_param_array ( extout , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( extout , " Available external outputs for FX8010. Zero=default. " ) ;
module_param_array ( seq_ports , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( seq_ports , " Allocated sequencer ports for internal synthesizer. " ) ;
module_param_array ( max_synth_voices , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( max_synth_voices , " Maximum number of voices for WaveTable. " ) ;
module_param_array ( max_buffer_size , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( max_buffer_size , " Maximum sample buffer size in MB. " ) ;
module_param_array ( enable_ir , bool , NULL , 0444 ) ;
MODULE_PARM_DESC ( enable_ir , " Enable IR. " ) ;
2005-07-06 22:21:51 +02:00
module_param_array ( subsystem , uint , NULL , 0444 ) ;
MODULE_PARM_DESC ( subsystem , " Force card subsystem model. " ) ;
2010-08-18 14:08:17 +02:00
module_param_array ( delay_pcm_irq , uint , NULL , 0444 ) ;
MODULE_PARM_DESC ( delay_pcm_irq , " Delay PCM interrupt by specified number of samples (default 0). " ) ;
2005-04-16 15:20:36 -07:00
/*
* Class 0401 : 1102 : 000 8 ( rev 00 ) Subsystem : 1102 : 1001 - > Audigy2 Value Model : SB0400
*/
2014-08-08 15:56:03 +02:00
static const struct pci_device_id snd_emu10k1_ids [ ] = {
2009-06-24 23:18:02 -07:00
{ PCI_VDEVICE ( CREATIVE , 0x0002 ) , 0 } , /* EMU10K1 */
{ PCI_VDEVICE ( CREATIVE , 0x0004 ) , 1 } , /* Audigy */
{ PCI_VDEVICE ( CREATIVE , 0x0008 ) , 1 } , /* Audigy 2 Value SB0400 */
2005-04-16 15:20:36 -07:00
{ 0 , }
} ;
/*
* Audigy 2 Value notes :
* A_IOCFG Input ( GPIO )
* 0x400 = Front analog jack plugged in . ( Green socket )
* 0x1000 = Read analog jack plugged in . ( Black socket )
* 0x2000 = Center / LFE analog jack plugged in . ( Orange socket )
* A_IOCFG Output ( GPIO )
* 0x60 = Sound out of front Left .
* Win sets it to 0 xXX61
*/
MODULE_DEVICE_TABLE ( pci , snd_emu10k1_ids ) ;
2012-12-06 12:35:10 -05:00
static int snd_card_emu10k1_probe ( struct pci_dev * pci ,
const struct pci_device_id * pci_id )
2005-04-16 15:20:36 -07:00
{
static int dev ;
2005-11-17 14:50:13 +01:00
struct snd_card * card ;
struct snd_emu10k1 * emu ;
2005-04-16 15:20:36 -07:00
# ifdef ENABLE_SYNTH
2005-11-17 14:50:13 +01:00
struct snd_seq_device * wave = NULL ;
2005-04-16 15:20:36 -07:00
# endif
int err ;
if ( dev > = SNDRV_CARDS )
return - ENODEV ;
if ( ! enable [ dev ] ) {
dev + + ;
return - ENOENT ;
}
2021-07-15 09:58:55 +02:00
err = snd_devm_card_new ( & pci - > dev , index [ dev ] , id [ dev ] , THIS_MODULE ,
sizeof ( * emu ) , & card ) ;
2008-12-28 16:44:30 +01:00
if ( err < 0 )
return err ;
2021-07-15 09:58:55 +02:00
emu = card - > private_data ;
2005-04-16 15:20:36 -07:00
if ( max_buffer_size [ dev ] < 32 )
max_buffer_size [ dev ] = 32 ;
else if ( max_buffer_size [ dev ] > 1024 )
max_buffer_size [ dev ] = 1024 ;
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_create ( card , pci , extin [ dev ] , extout [ dev ] ,
( long ) max_buffer_size [ dev ] * 1024 * 1024 ,
2021-07-15 09:58:55 +02:00
enable_ir [ dev ] , subsystem [ dev ] ) ;
2021-06-08 16:05:14 +02:00
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2010-08-18 14:08:17 +02:00
emu - > delay_pcm_irq = delay_pcm_irq [ dev ] & 0x1f ;
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_pcm ( emu , 0 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_pcm_mic ( emu , 1 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_pcm_efx ( emu , 2 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
/* This stores the periods table. */
2005-07-02 16:33:34 +02:00
if ( emu - > card_capabilities - > ca0151_chip ) { /* P16V */
2021-07-15 09:58:55 +02:00
emu - > p16v_buffer =
snd_devm_alloc_pages ( & pci - > dev , SNDRV_DMA_TYPE_DEV , 1024 ) ;
if ( ! emu - > p16v_buffer )
return - ENOMEM ;
2005-04-16 15:20:36 -07:00
}
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_mixer ( emu , 0 , 3 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_timer ( emu , 0 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_pcm_multi ( emu , 3 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-11-17 16:14:10 +01:00
if ( emu - > card_capabilities - > ca0151_chip ) { /* P16V */
2021-06-08 16:05:14 +02:00
err = snd_p16v_pcm ( emu , 4 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
}
if ( emu - > audigy ) {
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_audigy_midi ( emu ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
} else {
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_midi ( emu ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
}
2021-06-08 16:05:14 +02:00
err = snd_emu10k1_fx8010_new ( emu , 0 ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-04-16 15:20:36 -07:00
# ifdef ENABLE_SYNTH
if ( snd_seq_device_new ( card , 1 , SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH ,
2005-11-17 14:50:13 +01:00
sizeof ( struct snd_emu10k1_synth_arg ) , & wave ) < 0 | |
2005-04-16 15:20:36 -07:00
wave = = NULL ) {
2014-02-25 17:02:09 +01:00
dev_warn ( emu - > card - > dev ,
" can't initialize Emu10k1 wavetable synth \n " ) ;
2005-04-16 15:20:36 -07:00
} else {
2005-11-17 14:50:13 +01:00
struct snd_emu10k1_synth_arg * arg ;
2005-04-16 15:20:36 -07:00
arg = SNDRV_SEQ_DEVICE_ARGPTR ( wave ) ;
strcpy ( wave - > name , " Emu-10k1 Synth " ) ;
arg - > hwptr = emu ;
arg - > index = 1 ;
arg - > seq_ports = seq_ports [ dev ] ;
arg - > max_voices = max_synth_voices [ dev ] ;
}
# endif
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 09:17:34 -08:00
strscpy ( card - > driver , emu - > card_capabilities - > driver ,
2015-04-27 13:00:09 +02:00
sizeof ( card - > driver ) ) ;
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 09:17:34 -08:00
strscpy ( card - > shortname , emu - > card_capabilities - > name ,
2015-04-27 13:00:09 +02:00
sizeof ( card - > shortname ) ) ;
2005-04-16 15:20:36 -07:00
snprintf ( card - > longname , sizeof ( card - > longname ) ,
" %s (rev.%d, serial:0x%x) at 0x%lx, irq %i " ,
card - > shortname , emu - > revision , emu - > serial , emu - > port , emu - > irq ) ;
2021-06-08 16:05:14 +02:00
err = snd_card_register ( card ) ;
if ( err < 0 )
2021-07-15 09:58:55 +02:00
return err ;
2005-11-17 16:14:10 +01:00
2016-11-02 18:38:39 +01:00
if ( emu - > card_capabilities - > emu_model )
schedule_delayed_work ( & emu - > emu1010 . firmware_work , 0 ) ;
2005-04-16 15:20:36 -07:00
pci_set_drvdata ( pci , card ) ;
dev + + ;
return 0 ;
}
2012-08-14 18:12:04 +02:00
# ifdef CONFIG_PM_SLEEP
2012-07-02 15:20:37 +02:00
static int snd_emu10k1_suspend ( struct device * dev )
2005-11-17 16:14:10 +01:00
{
2012-07-02 15:20:37 +02:00
struct snd_card * card = dev_get_drvdata ( dev ) ;
2005-11-17 16:14:10 +01:00
struct snd_emu10k1 * emu = card - > private_data ;
snd_power_change_state ( card , SNDRV_CTL_POWER_D3hot ) ;
2012-11-22 17:18:49 +01:00
emu - > suspend = 1 ;
2016-11-02 18:38:39 +01:00
cancel_delayed_work_sync ( & emu - > emu1010 . firmware_work ) ;
2005-11-17 16:14:10 +01:00
snd_ac97_suspend ( emu - > ac97 ) ;
snd_emu10k1_efx_suspend ( emu ) ;
snd_emu10k1_suspend_regs ( emu ) ;
if ( emu - > card_capabilities - > ca0151_chip )
snd_p16v_suspend ( emu ) ;
snd_emu10k1_done ( emu ) ;
return 0 ;
}
2012-07-02 15:20:37 +02:00
static int snd_emu10k1_resume ( struct device * dev )
2005-11-17 16:14:10 +01:00
{
2012-07-02 15:20:37 +02:00
struct snd_card * card = dev_get_drvdata ( dev ) ;
2005-11-17 16:14:10 +01:00
struct snd_emu10k1 * emu = card - > private_data ;
snd_emu10k1_resume_init ( emu ) ;
snd_emu10k1_efx_resume ( emu ) ;
snd_ac97_resume ( emu - > ac97 ) ;
snd_emu10k1_resume_regs ( emu ) ;
if ( emu - > card_capabilities - > ca0151_chip )
snd_p16v_resume ( emu ) ;
2012-11-22 17:18:49 +01:00
emu - > suspend = 0 ;
2005-11-17 16:14:10 +01:00
snd_power_change_state ( card , SNDRV_CTL_POWER_D0 ) ;
2016-11-02 18:38:39 +01:00
if ( emu - > card_capabilities - > emu_model )
schedule_delayed_work ( & emu - > emu1010 . firmware_work , 0 ) ;
2005-11-17 16:14:10 +01:00
return 0 ;
}
2012-07-02 15:20:37 +02:00
static SIMPLE_DEV_PM_OPS ( snd_emu10k1_pm , snd_emu10k1_suspend , snd_emu10k1_resume ) ;
# define SND_EMU10K1_PM_OPS &snd_emu10k1_pm
# else
# define SND_EMU10K1_PM_OPS NULL
2012-08-14 18:12:04 +02:00
# endif /* CONFIG_PM_SLEEP */
2005-11-17 16:14:10 +01:00
2012-04-24 12:25:00 +02:00
static struct pci_driver emu10k1_driver = {
2011-06-10 16:20:20 +02:00
. name = KBUILD_MODNAME ,
2005-04-16 15:20:36 -07:00
. id_table = snd_emu10k1_ids ,
. probe = snd_card_emu10k1_probe ,
2012-07-02 15:20:37 +02:00
. driver = {
. pm = SND_EMU10K1_PM_OPS ,
} ,
2005-04-16 15:20:36 -07:00
} ;
2012-04-24 12:25:00 +02:00
module_pci_driver ( emu10k1_driver ) ;