2012-06-11 18:04:41 +08:00
/*
* linux / sound / soc / pxa / ttc_dkb . c
*
* Copyright ( C ) 2012 Marvell International Ltd .
*
* 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/module.h>
# include <linux/moduleparam.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
# include <sound/jack.h>
# include <asm/mach-types.h>
# include <sound/pcm_params.h>
# include "../codecs/88pm860x-codec.h"
static struct snd_soc_jack hs_jack , mic_jack ;
static struct snd_soc_jack_pin hs_jack_pins [ ] = {
{ . pin = " Headset Stereophone " , . mask = SND_JACK_HEADPHONE , } ,
} ;
static struct snd_soc_jack_pin mic_jack_pins [ ] = {
{ . pin = " Headset Mic 2 " , . mask = SND_JACK_MICROPHONE , } ,
} ;
/* ttc machine dapm widgets */
static const struct snd_soc_dapm_widget ttc_dapm_widgets [ ] = {
SND_SOC_DAPM_HP ( " Headset Stereophone " , NULL ) ,
SND_SOC_DAPM_LINE ( " Lineout Out 1 " , NULL ) ,
SND_SOC_DAPM_LINE ( " Lineout Out 2 " , NULL ) ,
SND_SOC_DAPM_SPK ( " Ext Speaker " , NULL ) ,
SND_SOC_DAPM_MIC ( " Ext Mic 1 " , NULL ) ,
SND_SOC_DAPM_MIC ( " Headset Mic 2 " , NULL ) ,
SND_SOC_DAPM_MIC ( " Ext Mic 3 " , NULL ) ,
} ;
/* ttc machine audio map */
static const struct snd_soc_dapm_route ttc_audio_map [ ] = {
{ " Headset Stereophone " , NULL , " HS1 " } ,
{ " Headset Stereophone " , NULL , " HS2 " } ,
{ " Ext Speaker " , NULL , " LSP " } ,
{ " Ext Speaker " , NULL , " LSN " } ,
{ " Lineout Out 1 " , NULL , " LINEOUT1 " } ,
{ " Lineout Out 2 " , NULL , " LINEOUT2 " } ,
{ " MIC1P " , NULL , " Mic1 Bias " } ,
{ " MIC1N " , NULL , " Mic1 Bias " } ,
{ " Mic1 Bias " , NULL , " Ext Mic 1 " } ,
{ " MIC2P " , NULL , " Mic1 Bias " } ,
{ " MIC2N " , NULL , " Mic1 Bias " } ,
{ " Mic1 Bias " , NULL , " Headset Mic 2 " } ,
{ " MIC3P " , NULL , " Mic3 Bias " } ,
{ " MIC3N " , NULL , " Mic3 Bias " } ,
{ " Mic3 Bias " , NULL , " Ext Mic 3 " } ,
} ;
static int ttc_pm860x_init ( struct snd_soc_pcm_runtime * rtd )
{
struct snd_soc_codec * codec = rtd - > codec ;
/* Headset jack detection */
2015-03-04 10:33:31 +01:00
snd_soc_card_jack_new ( rtd - > card , " Headphone Jack " , SND_JACK_HEADPHONE |
SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 ,
& hs_jack , hs_jack_pins , ARRAY_SIZE ( hs_jack_pins ) ) ;
snd_soc_card_jack_new ( rtd - > card , " Microphone Jack " , SND_JACK_MICROPHONE ,
& mic_jack , mic_jack_pins ,
ARRAY_SIZE ( mic_jack_pins ) ) ;
2012-06-11 18:04:41 +08:00
/* headphone, microphone detection & headset short detection */
pm860x_hs_jack_detect ( codec , & hs_jack , SND_JACK_HEADPHONE ,
SND_JACK_BTN_0 , SND_JACK_BTN_1 , SND_JACK_BTN_2 ) ;
pm860x_mic_jack_detect ( codec , & hs_jack , SND_JACK_MICROPHONE ) ;
return 0 ;
}
/* ttc/td-dkb digital audio interface glue - connects codec <--> CPU */
static struct snd_soc_dai_link ttc_pm860x_hifi_dai [ ] = {
{
. name = " 88pm860x i2s " ,
. stream_name = " audio playback " ,
. codec_name = " 88pm860x-codec " ,
. platform_name = " mmp-pcm-audio " ,
. cpu_dai_name = " pxa-ssp-dai.1 " ,
. codec_dai_name = " 88pm860x-i2s " ,
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM ,
. init = ttc_pm860x_init ,
} ,
} ;
/* ttc/td audio machine driver */
static struct snd_soc_card ttc_dkb_card = {
. name = " ttc-dkb-hifi " ,
2013-07-02 17:26:40 +08:00
. owner = THIS_MODULE ,
2012-06-11 18:04:41 +08:00
. dai_link = ttc_pm860x_hifi_dai ,
. num_links = ARRAY_SIZE ( ttc_pm860x_hifi_dai ) ,
. dapm_widgets = ttc_dapm_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( ttc_dapm_widgets ) ,
. dapm_routes = ttc_audio_map ,
. num_dapm_routes = ARRAY_SIZE ( ttc_audio_map ) ,
} ;
2012-12-07 09:26:17 -05:00
static int ttc_dkb_probe ( struct platform_device * pdev )
2012-06-11 18:04:41 +08:00
{
struct snd_soc_card * card = & ttc_dkb_card ;
int ret ;
card - > dev = & pdev - > dev ;
2015-09-01 10:32:59 +08:00
ret = devm_snd_soc_register_card ( & pdev - > dev , card ) ;
2012-06-11 18:04:41 +08:00
if ( ret )
dev_err ( & pdev - > dev , " snd_soc_register_card() failed: %d \n " ,
ret ) ;
return ret ;
}
static struct platform_driver ttc_dkb_driver = {
. driver = {
. name = " ttc-dkb-audio " ,
2013-10-17 14:01:37 +04:00
. pm = & snd_soc_pm_ops ,
2012-06-11 18:04:41 +08:00
} ,
. probe = ttc_dkb_probe ,
} ;
module_platform_driver ( ttc_dkb_driver ) ;
/* Module information */
MODULE_AUTHOR ( " Qiao Zhou, <zhouqiao@marvell.com> " ) ;
MODULE_DESCRIPTION ( " ALSA SoC TTC DKB " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:ttc-dkb-audio " ) ;