2009-04-16 10:53:34 +04:00
/*
* HD audio interface patch for Creative X - Fi CA0110 - IBG chip
*
* Copyright ( c ) 2008 Takashi Iwai < tiwai @ suse . de >
*
* This driver 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 driver 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>
# include <linux/slab.h>
2011-07-15 20:38:28 +04:00
# include <linux/module.h>
2009-04-16 10:53:34 +04:00
# include <sound/core.h>
# include "hda_codec.h"
# include "hda_local.h"
2012-05-07 19:42:31 +04:00
# include "hda_auto_parser.h"
2012-12-19 21:04:37 +04:00
# include "hda_jack.h"
# include "hda_generic.h"
2009-04-16 10:53:34 +04:00
2011-05-02 13:36:00 +04:00
static const struct hda_codec_ops ca0110_patch_ops = {
2012-12-19 21:04:37 +04:00
. build_controls = snd_hda_gen_build_controls ,
. build_pcms = snd_hda_gen_build_pcms ,
. init = snd_hda_gen_init ,
. free = snd_hda_gen_free ,
2013-01-18 10:51:17 +04:00
. unsol_event = snd_hda_jack_unsol_event ,
2009-04-16 10:53:34 +04:00
} ;
static int ca0110_parse_auto_config ( struct hda_codec * codec )
{
2012-12-19 21:04:37 +04:00
struct hda_gen_spec * spec = codec - > spec ;
2009-04-16 10:53:34 +04:00
int err ;
2012-12-19 21:04:37 +04:00
err = snd_hda_parse_pin_defcfg ( codec , & spec - > autocfg , NULL , 0 ) ;
if ( err < 0 )
return err ;
err = snd_hda_gen_parse_auto_config ( codec , & spec - > autocfg ) ;
2009-04-16 10:53:34 +04:00
if ( err < 0 )
return err ;
return 0 ;
}
2009-07-01 10:34:32 +04:00
static int patch_ca0110 ( struct hda_codec * codec )
2009-04-16 10:53:34 +04:00
{
2012-12-19 21:04:37 +04:00
struct hda_gen_spec * spec ;
2009-04-16 10:53:34 +04:00
int err ;
spec = kzalloc ( sizeof ( * spec ) , GFP_KERNEL ) ;
if ( ! spec )
return - ENOMEM ;
2012-12-19 21:04:37 +04:00
snd_hda_gen_spec_init ( spec ) ;
2009-04-16 10:53:34 +04:00
codec - > spec = spec ;
2015-05-29 11:42:14 +03:00
codec - > patch_ops = ca0110_patch_ops ;
2009-04-16 10:53:34 +04:00
2012-12-19 21:04:37 +04:00
spec - > multi_cap_vol = 1 ;
2009-04-16 10:53:34 +04:00
codec - > bus - > needs_damn_long_delay = 1 ;
err = ca0110_parse_auto_config ( codec ) ;
if ( err < 0 )
goto error ;
return 0 ;
error :
2012-12-19 21:04:37 +04:00
snd_hda_gen_free ( codec ) ;
2009-04-16 10:53:34 +04:00
return err ;
}
/*
* patch entries
*/
2011-05-02 13:36:00 +04:00
static const struct hda_codec_preset snd_hda_preset_ca0110 [ ] = {
2009-04-16 10:53:34 +04:00
{ . id = 0x1102000a , . name = " CA0110-IBG " , . patch = patch_ca0110 } ,
{ . id = 0x1102000b , . name = " CA0110-IBG " , . patch = patch_ca0110 } ,
{ . id = 0x1102000d , . name = " SB0880 X-Fi " , . patch = patch_ca0110 } ,
{ } /* terminator */
} ;
MODULE_ALIAS ( " snd-hda-codec-id:1102000a " ) ;
MODULE_ALIAS ( " snd-hda-codec-id:1102000b " ) ;
MODULE_ALIAS ( " snd-hda-codec-id:1102000d " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Creative CA0110-IBG HD-audio codec " ) ;
2015-02-17 17:25:37 +03:00
static struct hda_codec_driver ca0110_driver = {
2009-04-16 10:53:34 +04:00
. preset = snd_hda_preset_ca0110 ,
} ;
2015-02-17 17:25:37 +03:00
module_hda_codec_driver ( ca0110_driver ) ;