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
*
*
* 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
*
*/
# 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 " ) ;
MODULE_SUPPORTED_DEVICE ( " {{Analog Devices,AD1848}, "
" {Analog Devices,AD1847}, "
" {Crystal Semiconductors,CS4248}} " ) ;
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. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( port , long , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( port , " Port # for " CRD_NAME " driver. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( irq , int , NULL , 0444 ) ;
2007-02-14 13:22:41 +01:00
MODULE_PARM_DESC ( irq , " IRQ # for " CRD_NAME " driver. " ) ;
2005-04-16 15:20:36 -07:00
module_param_array ( dma1 , int , 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. " ) ;
2007-02-14 13:22:41 +01:00
static int __devinit snd_ad1848_match ( struct device * dev , unsigned int n )
{
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
2007-02-14 13:22:41 +01:00
static int __devinit 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 ;
2005-11-17 14:29:37 +01:00
struct snd_pcm * pcm ;
2007-02-14 13:22:41 +01:00
int error ;
2005-04-16 15:20:36 -07:00
2008-12-28 16:43:35 +01:00
error = snd_card_create ( index [ n ] , id [ n ] , THIS_MODULE , 0 , & card ) ;
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
2008-07-31 21:09:32 +02:00
error = snd_wss_pcm ( chip , 0 , & pcm ) ;
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
strcpy ( card - > driver , " AD1848 " ) ;
strcpy ( card - > shortname , pcm - > name ) ;
sprintf ( card - > longname , " %s at 0x%lx, irq %d, dma %d " ,
2007-02-14 13:22:41 +01:00
pcm - > name , chip - > port , irq [ n ] , dma1 [ n ] ) ;
if ( thinkpad [ n ] )
2005-04-16 15:20:36 -07:00
strcat ( card - > longname , " [Thinkpad] " ) ;
2007-02-14 13:22:41 +01:00
snd_card_set_dev ( card , dev ) ;
[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
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
}
2007-02-14 13:22:41 +01:00
static int __devexit 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 ) ) ;
dev_set_drvdata ( dev , NULL ) ;
2005-11-17 16:58:26 +01:00
return 0 ;
}
# 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 ,
. remove = __devexit_p ( snd_ad1848_remove ) ,
# 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
2005-11-17 16:58:26 +01:00
static int __init alsa_card_ad1848_init ( void )
{
2007-02-14 13:22:41 +01:00
return isa_register_driver ( & snd_ad1848_driver , SNDRV_CARDS ) ;
2005-04-16 15:20:36 -07:00
}
static void __exit alsa_card_ad1848_exit ( void )
{
2007-02-14 13:22:41 +01:00
isa_unregister_driver ( & snd_ad1848_driver ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-14 13:22:41 +01:00
module_init ( alsa_card_ad1848_init ) ;
module_exit ( alsa_card_ad1848_exit ) ;