2010-06-19 18:52:51 +04:00
/*
* Copyright ( C ) 2009 , Lars - Peter Clausen < lars @ metafoo . de >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* 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 . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/timer.h>
# include <linux/interrupt.h>
# include <linux/platform_device.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
2014-04-23 00:46:35 +04:00
# include <linux/gpio/consumer.h>
2010-06-19 18:52:51 +04:00
2014-04-23 00:46:35 +04:00
struct qi_lb60 {
struct gpio_desc * snd_gpio ;
struct gpio_desc * amp_gpio ;
} ;
2010-06-19 18:52:51 +04:00
static int qi_lb60_spk_event ( struct snd_soc_dapm_widget * widget ,
struct snd_kcontrol * ctrl , int event )
{
2014-04-23 00:46:35 +04:00
struct qi_lb60 * qi_lb60 = snd_soc_card_get_drvdata ( widget - > dapm - > card ) ;
2011-04-12 21:31:05 +04:00
int on = ! SND_SOC_DAPM_EVENT_OFF ( event ) ;
2010-06-19 18:52:51 +04:00
2014-04-23 00:46:35 +04:00
gpiod_set_value_cansleep ( qi_lb60 - > snd_gpio , on ) ;
gpiod_set_value_cansleep ( qi_lb60 - > amp_gpio , on ) ;
2010-06-19 18:52:51 +04:00
return 0 ;
}
static const struct snd_soc_dapm_widget qi_lb60_widgets [ ] = {
SND_SOC_DAPM_SPK ( " Speaker " , qi_lb60_spk_event ) ,
SND_SOC_DAPM_MIC ( " Mic " , NULL ) ,
} ;
static const struct snd_soc_dapm_route qi_lb60_routes [ ] = {
{ " Mic " , NULL , " MIC " } ,
{ " Speaker " , NULL , " LOUT " } ,
{ " Speaker " , NULL , " ROUT " } ,
} ;
static struct snd_soc_dai_link qi_lb60_dai = {
. name = " jz4740 " ,
. stream_name = " jz4740 " ,
2010-03-17 23:15:21 +03:00
. cpu_dai_name = " jz4740-i2s " ,
2013-12-03 21:53:03 +04:00
. platform_name = " jz4740-i2s " ,
2010-03-17 23:15:21 +03:00
. codec_dai_name = " jz4740-hifi " ,
. codec_name = " jz4740-codec " ,
2014-04-23 00:46:33 +04:00
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM ,
2010-06-19 18:52:51 +04:00
} ;
2014-04-23 00:46:35 +04:00
static struct snd_soc_card qi_lb60_card = {
2010-06-19 18:52:51 +04:00
. name = " QI LB60 " ,
2011-12-23 10:48:19 +04:00
. owner = THIS_MODULE ,
2010-06-19 18:52:51 +04:00
. dai_link = & qi_lb60_dai ,
. num_links = 1 ,
2011-04-12 21:31:03 +04:00
. dapm_widgets = qi_lb60_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( qi_lb60_widgets ) ,
. dapm_routes = qi_lb60_routes ,
. num_dapm_routes = ARRAY_SIZE ( qi_lb60_routes ) ,
2014-04-23 00:46:32 +04:00
. fully_routed = true ,
2010-06-19 18:52:51 +04:00
} ;
2012-12-07 18:26:24 +04:00
static int qi_lb60_probe ( struct platform_device * pdev )
2010-06-19 18:52:51 +04:00
{
2014-04-23 00:46:35 +04:00
struct qi_lb60 * qi_lb60 ;
struct snd_soc_card * card = & qi_lb60_card ;
2010-06-19 18:52:51 +04:00
2014-04-23 00:46:35 +04:00
qi_lb60 = devm_kzalloc ( & pdev - > dev , sizeof ( * qi_lb60 ) , GFP_KERNEL ) ;
if ( ! qi_lb60 )
return - ENOMEM ;
2014-11-25 22:29:40 +03:00
qi_lb60 - > snd_gpio = devm_gpiod_get ( & pdev - > dev , " snd " , GPIOD_OUT_LOW ) ;
2014-04-23 00:46:35 +04:00
if ( IS_ERR ( qi_lb60 - > snd_gpio ) )
return PTR_ERR ( qi_lb60 - > snd_gpio ) ;
2014-11-25 22:29:40 +03:00
qi_lb60 - > amp_gpio = devm_gpiod_get ( & pdev - > dev , " amp " , GPIOD_OUT_LOW ) ;
2014-04-23 00:46:35 +04:00
if ( IS_ERR ( qi_lb60 - > amp_gpio ) )
return PTR_ERR ( qi_lb60 - > amp_gpio ) ;
2010-06-19 18:52:51 +04:00
2012-01-06 07:30:10 +04:00
card - > dev = & pdev - > dev ;
2010-06-19 18:52:51 +04:00
2014-04-23 00:46:35 +04:00
snd_soc_card_set_drvdata ( card , qi_lb60 ) ;
2010-06-19 18:52:51 +04:00
2014-04-23 00:46:35 +04:00
return devm_snd_soc_register_card ( & pdev - > dev , card ) ;
2010-06-19 18:52:51 +04:00
}
2012-01-06 07:30:10 +04:00
static struct platform_driver qi_lb60_driver = {
. driver = {
. name = " qi-lb60-audio " ,
} ,
. probe = qi_lb60_probe ,
} ;
module_platform_driver ( qi_lb60_driver ) ;
2010-06-19 18:52:51 +04:00
MODULE_AUTHOR ( " Lars-Peter Clausen <lars@metafoo.de> " ) ;
MODULE_DESCRIPTION ( " ALSA SoC QI LB60 Audio support " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
2012-01-06 07:30:10 +04:00
MODULE_ALIAS ( " platform:qi-lb60-audio " ) ;