2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2008-11-03 15:02:12 +03:00
/*
* linux / sound / soc / pxa / palm27x . c
*
* SoC Audio driver for Palm T | X , T5 and LifeDrive
*
* based on tosa . c
*
* Copyright ( C ) 2008 Marek Vasut < marek . vasut @ gmail . com >
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/device.h>
# include <linux/gpio.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
2009-07-24 00:16:56 +04:00
# include <sound/jack.h>
2008-11-03 15:02:12 +03:00
# include <asm/mach-types.h>
2019-09-02 01:02:08 +03:00
# include <linux/platform_data/asoc-pxa.h>
2012-08-24 17:16:48 +04:00
# include <linux/platform_data/asoc-palm27x.h>
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
static struct snd_soc_jack hs_jack ;
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
/* Headphones jack detection DAPM pins */
static struct snd_soc_jack_pin hs_jack_pins [ ] = {
{
. pin = " Headphone Jack " ,
. mask = SND_JACK_HEADPHONE ,
} ,
2008-11-03 15:02:12 +03:00
} ;
2009-07-24 00:16:56 +04:00
/* Headphones jack detection gpios */
static struct snd_soc_jack_gpio hs_jack_gpios [ ] = {
[ 0 ] = {
/* gpio is set on per-platform basis */
. name = " hp-gpio " ,
. report = SND_JACK_HEADPHONE ,
. debounce_time = 200 ,
} ,
} ;
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
/* Palm27x machine dapm widgets */
2008-11-03 15:02:12 +03:00
static const struct snd_soc_dapm_widget palm27x_dapm_widgets [ ] = {
SND_SOC_DAPM_HP ( " Headphone Jack " , NULL ) ,
2009-07-24 00:16:56 +04:00
SND_SOC_DAPM_SPK ( " Ext. Speaker " , NULL ) ,
SND_SOC_DAPM_MIC ( " Ext. Microphone " , NULL ) ,
2008-11-03 15:02:12 +03:00
} ;
/* PalmTX audio map */
static const struct snd_soc_dapm_route audio_map [ ] = {
/* headphone connected to HPOUTL, HPOUTR */
{ " Headphone Jack " , NULL , " HPOUTL " } ,
{ " Headphone Jack " , NULL , " HPOUTR " } ,
/* ext speaker connected to ROUT2, LOUT2 */
2009-07-24 00:16:56 +04:00
{ " Ext. Speaker " , NULL , " LOUT2 " } ,
{ " Ext. Speaker " , NULL , " ROUT2 " } ,
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
/* mic connected to MIC1 */
2015-01-10 00:03:31 +03:00
{ " MIC1 " , NULL , " Ext. Microphone " } ,
2008-11-03 15:02:12 +03:00
} ;
2009-07-24 00:16:56 +04:00
static struct snd_soc_card palm27x_asoc ;
2008-11-03 15:02:12 +03:00
2010-03-17 23:15:21 +03:00
static int palm27x_ac97_init ( struct snd_soc_pcm_runtime * rtd )
2008-11-03 15:02:12 +03:00
{
2009-03-12 13:07:54 +03:00
int err ;
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
/* Jack detection API stuff */
2022-04-08 07:11:14 +03:00
err = snd_soc_card_jack_new_pins ( rtd - > card , " Headphone Jack " ,
SND_JACK_HEADPHONE , & hs_jack ,
hs_jack_pins ,
ARRAY_SIZE ( hs_jack_pins ) ) ;
2009-07-24 00:16:56 +04:00
if ( err )
return err ;
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
err = snd_soc_jack_add_gpios ( & hs_jack , ARRAY_SIZE ( hs_jack_gpios ) ,
hs_jack_gpios ) ;
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
return err ;
2008-11-03 15:02:12 +03:00
}
2019-06-06 07:12:01 +03:00
SND_SOC_DAILINK_DEFS ( hifi ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " pxa2xx-ac97 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm9712-codec " , " wm9712-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " pxa-pcm-audio " ) ) ) ;
SND_SOC_DAILINK_DEFS ( aux ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " pxa2xx-ac97-aux " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm9712-codec " , " wm9712-aux " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " pxa-pcm-audio " ) ) ) ;
2008-11-03 15:02:12 +03:00
static struct snd_soc_dai_link palm27x_dai [ ] = {
{
. name = " AC97 HiFi " ,
. stream_name = " AC97 HiFi " ,
. init = palm27x_ac97_init ,
2019-06-06 07:12:01 +03:00
SND_SOC_DAILINK_REG ( hifi ) ,
2008-11-03 15:02:12 +03:00
} ,
{
. name = " AC97 Aux " ,
. stream_name = " AC97 Aux " ,
2019-06-06 07:12:01 +03:00
SND_SOC_DAILINK_REG ( aux ) ,
2008-11-03 15:02:12 +03:00
} ,
} ;
2008-11-18 23:50:34 +03:00
static struct snd_soc_card palm27x_asoc = {
2008-11-03 15:02:12 +03:00
. name = " Palm/PXA27x " ,
2011-12-22 05:44:43 +04:00
. owner = THIS_MODULE ,
2008-11-03 15:02:12 +03:00
. dai_link = palm27x_dai ,
. num_links = ARRAY_SIZE ( palm27x_dai ) ,
2012-12-29 22:53:17 +04:00
. dapm_widgets = palm27x_dapm_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( palm27x_dapm_widgets ) ,
. dapm_routes = audio_map ,
2015-01-10 00:03:32 +03:00
. num_dapm_routes = ARRAY_SIZE ( audio_map ) ,
. fully_routed = true ,
2008-11-03 15:02:12 +03:00
} ;
2009-04-17 13:37:35 +04:00
static int palm27x_asoc_probe ( struct platform_device * pdev )
2008-11-03 15:02:12 +03:00
{
int ret ;
if ( ! ( machine_is_palmtx ( ) | | machine_is_palmt5 ( ) | |
2009-04-23 13:27:11 +04:00
machine_is_palmld ( ) | | machine_is_palmte2 ( ) ) )
2008-11-03 15:02:12 +03:00
return - ENODEV ;
2009-07-24 00:16:56 +04:00
if ( ! pdev - > dev . platform_data ) {
dev_err ( & pdev - > dev , " please supply platform_data \n " ) ;
return - ENODEV ;
}
2008-11-03 15:02:12 +03:00
2009-07-24 00:16:56 +04:00
hs_jack_gpios [ 0 ] . gpio = ( ( struct palm27x_asoc_info * )
( pdev - > dev . platform_data ) ) - > jack_gpio ;
2008-11-03 15:02:12 +03:00
2012-12-29 22:53:18 +04:00
palm27x_asoc . dev = & pdev - > dev ;
2008-11-03 15:02:12 +03:00
2015-09-01 05:32:59 +03:00
ret = devm_snd_soc_register_card ( & pdev - > dev , & palm27x_asoc ) ;
2012-12-29 22:53:18 +04:00
if ( ret )
dev_err ( & pdev - > dev , " snd_soc_register_card() failed: %d \n " ,
ret ) ;
2008-11-03 15:02:12 +03:00
return ret ;
}
2009-04-17 13:37:35 +04:00
static struct platform_driver palm27x_wm9712_driver = {
. probe = palm27x_asoc_probe ,
. driver = {
. name = " palm27x-asoc " ,
2013-10-17 14:01:37 +04:00
. pm = & snd_soc_pm_ops ,
2009-04-17 13:37:35 +04:00
} ,
} ;
2011-11-25 06:13:37 +04:00
module_platform_driver ( palm27x_wm9712_driver ) ;
2008-11-03 15:02:12 +03:00
/* Module information */
MODULE_AUTHOR ( " Marek Vasut <marek.vasut@gmail.com> " ) ;
MODULE_DESCRIPTION ( " ALSA SoC Palm T|X, T5 and LifeDrive " ) ;
MODULE_LICENSE ( " GPL " ) ;
2016-05-06 18:27:34 +03:00
MODULE_ALIAS ( " platform:palm27x-asoc " ) ;