2019-05-27 08:55:05 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07:00
/*
* Generic driver for AD1848 / AD1847 / CS4248 chips ( 0.1 Alpha )
* Copyright ( c ) by Tugrul Galatali < galatalt @ stuy . edu > ,
2007-10-15 09:50:19 +02:00
* Jaroslav Kysela < perex @ perex . cz >
* Based on card - 4232. c by Jaroslav Kysela < perex @ perex . cz >
2005-04-16 15:20:36 -07:00
*/
# include <linux/init.h>
2005-11-17 16:58:26 +01:00
# include <linux/err.h>
2007-02-14 13:22:41 +01:00
# include <linux/isa.h>
2005-04-16 15:20:36 -07:00
# include <linux/time.h>
# include <linux/wait.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>
2008-07-31 21:10:47 +02:00
# include <sound/wss.h>
2005-04-16 15:20:36 -07:00
# include <sound/initval.h>
2007-02-14 13:22:41 +01:00
# define CRD_NAME "Generic AD1848 / AD1847 / CS4248"
# define DEV_NAME "ad1848"
MODULE_DESCRIPTION ( CRD_NAME ) ;
2007-10-15 09:50:19 +02:00
MODULE_AUTHOR ( " Tugrul Galatali <galatalt@stuy.edu>, Jaroslav Kysela <perex@perex.cz> " ) ;
2005-04-16 15:20:36 -07:00
MODULE_LICENSE ( " GPL " ) ;
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 ; /* Enable this card */
2005-04-16 15:20:36 -07:00
static long port [ SNDRV_CARDS ] = SNDRV_DEFAULT_PORT ; /* PnP setup */
static int irq [ SNDRV_CARDS ] = SNDRV_DEFAULT_IRQ ; /* 5,7,9,11,12,15 */
static int dma1 [ SNDRV_CARDS ] = SNDRV_DEFAULT_DMA ; /* 0,1,3,5,6,7 */
2011-12-15 13:49:36 +10:30
static bool thinkpad [ SNDRV_CARDS ] ; /* Thinkpad special case */
2005-04-16 15:20:36 -07:00
module_param_array ( index , int , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( index , " Index value for " CRD_NAME " soundcard. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( id , charp , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( id , " ID string for " CRD_NAME " soundcard. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( enable , bool , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( enable , " Enable " CRD_NAME " soundcard. " ) ;
2017-04-04 16:54:30 +01:00
module_param_hw_array ( port , long , ioport , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( port , " Port # for " CRD_NAME " driver. " ) ;
2017-04-04 16:54:30 +01:00
module_param_hw_array ( irq , int , irq , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( irq , " IRQ # for " CRD_NAME " driver. " ) ;
2017-04-04 16:54:30 +01:00
module_param_hw_array ( dma1 , int , dma , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( dma1 , " DMA1 # for " CRD_NAME " driver. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( thinkpad , bool , NULL , 0444 ) ;
MODULE_PARM_DESC ( thinkpad , " Enable only for the onboard CS4248 of IBM Thinkpad 360/750/755 series. " ) ;
2012-12-06 12:35:21 -05:00
static int snd_ad1848_match ( struct device * dev , unsigned int n )
2007-02-14 13:22:41 +01:00
{
if ( ! enable [ n ] )
return 0 ;
2005-12-07 09:13:42 +01:00
2007-02-14 13:22:41 +01:00
if ( port [ n ] = = SNDRV_AUTO_PORT ) {
2008-11-03 08:51:33 +01:00
dev_err ( dev , " please specify port \n " ) ;
2007-02-14 13:22:41 +01:00
return 0 ;
}
if ( irq [ n ] = = SNDRV_AUTO_IRQ ) {
2008-11-03 08:51:33 +01:00
dev_err ( dev , " please specify irq \n " ) ;
2007-02-14 13:22:41 +01:00
return 0 ;
}
if ( dma1 [ n ] = = SNDRV_AUTO_DMA ) {
2008-11-03 08:51:33 +01:00
dev_err ( dev , " please specify dma1 \n " ) ;
2007-02-14 13:22:41 +01:00
return 0 ;
}
return 1 ;
}
2005-04-16 15:20:36 -07:00
2012-12-06 12:35:21 -05:00
static int snd_ad1848_probe ( struct device * dev , unsigned int n )
2005-04-16 15:20:36 -07:00
{
2005-11-17 14:29:37 +01:00
struct snd_card * card ;
2008-07-31 21:04:37 +02:00
struct snd_wss * chip ;
2007-02-14 13:22:41 +01:00
int error ;
2005-04-16 15:20:36 -07:00
2014-01-29 13:03:56 +01:00
error = snd_card_new ( dev , index [ n ] , id [ n ] , THIS_MODULE , 0 , & card ) ;
2008-12-28 16:43:35 +01:00
if ( error < 0 )
return error ;
2005-04-16 15:20:36 -07:00
2008-07-31 21:10:47 +02:00
error = snd_wss_create ( card , port [ n ] , - 1 , irq [ n ] , dma1 [ n ] , - 1 ,
thinkpad [ n ] ? WSS_HW_THINKPAD : WSS_HW_DETECT ,
0 , & chip ) ;
2007-02-14 13:22:41 +01:00
if ( error < 0 )
goto out ;
2005-04-16 15:20:36 -07:00
2005-11-17 16:58:26 +01:00
card - > private_data = chip ;
[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver
ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver
AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver
Wavefront drivers
- Added snd_card_set_generic_dev() call.
- Added SND_GENERIC_DRIVER to Kconfig.
- Clean up the error path in probe if necessary.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2005-09-05 17:19:20 +02:00
2015-01-02 12:24:43 +01:00
error = snd_wss_pcm ( chip , 0 ) ;
2007-02-14 13:22:41 +01:00
if ( error < 0 )
goto out ;
[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver
ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver
AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver
Wavefront drivers
- Added snd_card_set_generic_dev() call.
- Added SND_GENERIC_DRIVER to Kconfig.
- Clean up the error path in probe if necessary.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2005-09-05 17:19:20 +02:00
2008-07-31 21:08:32 +02:00
error = snd_wss_mixer ( chip ) ;
2007-02-14 13:22:41 +01:00
if ( error < 0 )
goto out ;
2005-04-16 15:20:36 -07:00
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 , " AD1848 " , sizeof ( card - > driver ) ) ;
strscpy ( card - > shortname , chip - > pcm - > name , sizeof ( card - > shortname ) ) ;
ALSA: ad1848: fix format string overflow warning
The snd_pcm name is too long to fit into the card shortname
or a part of the longname:
sound/isa/ad1848/ad1848.c: In function 'snd_ad1848_probe':
sound/isa/ad1848/ad1848.c:116:26: error: ' at 0x' directive writing 6 bytes into a region of size between 1 and 80 [-Werror=format-overflow=]
sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sound/isa/ad1848/ad1848.c:116:2: note: 'sprintf' output between 22 and 128 bytes into a destination of size 80
sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
chip->pcm->name, chip->port, irq[n], dma1[n]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This changes the code to use length-checking functions that truncate
if necessary. The "[Thinkpad]" substring is now also part of the
snprintf(), as that could also overflow the buffer.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-07-18 13:48:06 +02:00
if ( ! thinkpad [ n ] )
snprintf ( card - > longname , sizeof ( card - > longname ) ,
" %s at 0x%lx, irq %d, dma %d " ,
chip - > pcm - > name , chip - > port , irq [ n ] , dma1 [ n ] ) ;
else
snprintf ( card - > longname , sizeof ( card - > longname ) ,
" %s at 0x%lx, irq %d, dma %d [Thinkpad] " ,
chip - > pcm - > name , chip - > port , irq [ n ] , dma1 [ n ] ) ;
2005-04-16 15:20:36 -07:00
2007-02-14 13:22:41 +01:00
error = snd_card_register ( card ) ;
if ( error < 0 )
goto out ;
[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver
ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver
AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver
Wavefront drivers
- Added snd_card_set_generic_dev() call.
- Added SND_GENERIC_DRIVER to Kconfig.
- Clean up the error path in probe if necessary.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2005-09-05 17:19:20 +02:00
2007-02-14 13:22:41 +01:00
dev_set_drvdata ( dev , card ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver
ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver
AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver
Wavefront drivers
- Added snd_card_set_generic_dev() call.
- Added SND_GENERIC_DRIVER to Kconfig.
- Clean up the error path in probe if necessary.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2005-09-05 17:19:20 +02:00
2007-02-14 13:22:41 +01:00
out : snd_card_free ( card ) ;
return error ;
2005-04-16 15:20:36 -07:00
}
2021-01-22 10:24:49 +01:00
static void snd_ad1848_remove ( struct device * dev , unsigned int n )
2005-11-17 16:58:26 +01:00
{
2007-02-14 13:22:41 +01:00
snd_card_free ( dev_get_drvdata ( dev ) ) ;
2005-11-17 16:58:26 +01:00
}
# ifdef CONFIG_PM
2007-02-14 13:22:41 +01:00
static int snd_ad1848_suspend ( struct device * dev , unsigned int n , pm_message_t state )
2005-11-17 16:58:26 +01:00
{
2007-02-14 13:22:41 +01:00
struct snd_card * card = dev_get_drvdata ( dev ) ;
2008-07-31 21:04:37 +02:00
struct snd_wss * chip = card - > private_data ;
2005-11-17 16:58:26 +01:00
snd_power_change_state ( card , SNDRV_CTL_POWER_D3hot ) ;
chip - > suspend ( chip ) ;
return 0 ;
}
2007-02-14 13:22:41 +01:00
static int snd_ad1848_resume ( struct device * dev , unsigned int n )
2005-04-16 15:20:36 -07:00
{
2007-02-14 13:22:41 +01:00
struct snd_card * card = dev_get_drvdata ( dev ) ;
2008-07-31 21:04:37 +02:00
struct snd_wss * chip = card - > private_data ;
2005-04-16 15:20:36 -07:00
2005-11-17 16:58:26 +01:00
chip - > resume ( chip ) ;
snd_power_change_state ( card , SNDRV_CTL_POWER_D0 ) ;
return 0 ;
}
# endif
2007-02-14 13:22:41 +01:00
static struct isa_driver snd_ad1848_driver = {
. match = snd_ad1848_match ,
2005-11-17 16:58:26 +01:00
. probe = snd_ad1848_probe ,
2012-12-06 12:35:21 -05:00
. remove = snd_ad1848_remove ,
2005-11-17 16:58:26 +01:00
# ifdef CONFIG_PM
. suspend = snd_ad1848_suspend ,
. resume = snd_ad1848_resume ,
# endif
. driver = {
2007-02-14 13:22:41 +01:00
. name = DEV_NAME
}
2005-11-17 16:58:26 +01:00
} ;
2005-04-16 15:20:36 -07:00
2016-05-31 11:55:01 -04:00
module_isa_driver ( snd_ad1848_driver , SNDRV_CARDS ) ;