diff options
author | Peter Ujfalusi <peter.ujfalusi@nokia.com> | 2009-05-22 10:13:15 +0300 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-05-22 10:23:22 +0100 |
commit | 9da28c7b38170882b1c43d7d133ddce34e25f161 (patch) | |
tree | dd9becd919b9fe743d6cebfbd4e212922bf338f0 /sound/soc | |
parent | 5c82f56736e4c3a9eaf53c94366b056c8622d79e (diff) |
ASoC: TWL4030: Add support for platform dependent configuration
twl4030_setup_data structure can be passed from platform drivers to
the codec via the snd_soc_device->codec_data pointer.
Currently the setup data has support for the Headset pop-removal
related configuration, which differs from board to board.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/codecs/twl4030.c | 22 | ||||
-rw-r--r-- | sound/soc/codecs/twl4030.h | 5 |
2 files changed, 24 insertions, 3 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index f554672f67c1..584507f71efb 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -1997,6 +1997,8 @@ static int twl4030_resume(struct platform_device *pdev) static int twl4030_init(struct snd_soc_device *socdev) { struct snd_soc_codec *codec = socdev->card->codec; + struct twl4030_setup_data *setup = socdev->codec_data; + struct twl4030_priv *twl4030 = codec->private_data; int ret = 0; printk(KERN_INFO "TWL4030 Audio Codec init \n"); @@ -2014,6 +2016,23 @@ static int twl4030_init(struct snd_soc_device *socdev) if (codec->reg_cache == NULL) return -ENOMEM; + /* Configuration for headset ramp delay from setup data */ + if (setup) { + unsigned char hs_pop; + + if (setup->sysclk) + twl4030->sysclk = setup->sysclk; + else + twl4030->sysclk = 26000; + + hs_pop = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); + hs_pop &= ~TWL4030_RAMP_DELAY; + hs_pop |= (setup->ramp_delay_value << 2); + twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + } else { + twl4030->sysclk = 26000; + } + /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); if (ret < 0) { @@ -2063,9 +2082,6 @@ static int twl4030_probe(struct platform_device *pdev) kfree(codec); return -ENOMEM; } - /* Set default sysclk (used by the headsetl/rpga_event callback for - * pop-attenuation) */ - twl4030->sysclk = 26000; codec->private_data = twl4030; socdev->card->codec = codec; diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h index 9668bdf430fb..48326e2bd9de 100644 --- a/sound/soc/codecs/twl4030.h +++ b/sound/soc/codecs/twl4030.h @@ -266,4 +266,9 @@ extern struct snd_soc_dai twl4030_dai[2]; extern struct snd_soc_codec_device soc_codec_dev_twl4030; +struct twl4030_setup_data { + unsigned int ramp_delay_value; + unsigned int sysclk; +}; + #endif /* End of __TWL4030_AUDIO_H__ */ |