diff options
author | Shyam Krishnan M <shyam.moni@stericsson.com> | 2011-10-03 13:35:37 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 10:59:46 +0100 |
commit | 14030de8419996af40c9a157d1ee4c988b26946a (patch) | |
tree | b71e7f2f12884739a23e3f519ad7f7674079ba8c /sound/soc/codecs/ab5500.c | |
parent | 653fe5cf3049d332ca4b4e7ddd2a6d0ec6d2f37e (diff) |
ASOC CG29xx: Configure Codec to receive FM
This patch tristates the Interfaces in probe.
The Interface is enable back in prepare function.
ST-Ericsson Linux next: NA
ST-Ericsson ID: 335714
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ia04453f0e3aca1991e135785e9b2772522219347
Signed-off-by: Shyam Krishnan M <shyam.moni@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32802
Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Diffstat (limited to 'sound/soc/codecs/ab5500.c')
-rw-r--r-- | sound/soc/codecs/ab5500.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/sound/soc/codecs/ab5500.c b/sound/soc/codecs/ab5500.c index 79df2a6e812..57fc2ca1c62 100644 --- a/sound/soc/codecs/ab5500.c +++ b/sound/soc/codecs/ab5500.c @@ -1212,26 +1212,35 @@ static int ab5500_pcm_hw_params(struct snd_pcm_substream *substream, static int ab5500_pcm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - dev_dbg(ab5500_dev, "%s called.\n", __func__); + dev_info(ab5500_dev, "%s called.\n", __func__); + u8 value = (dai->id == 1) ? INTERFACE1 : INTERFACE0; + /* Configure registers for either playback or capture */ if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) && !(ab5500_codec_privates[dai->id].playback_active == true)) { power_for_playback(POWER_ON, dai->id); ab5500_codec_privates[dai->id].playback_active = true; + mask_set_reg(value, I2Sx_TRISTATE_MASK, + 0 << I2Sx_TRISTATE_SHIFT); } else if ((substream->stream == SNDRV_PCM_STREAM_CAPTURE) && !(ab5500_codec_privates[dai->id].capture_active == true)) { power_for_capture(POWER_ON, dai->id); ab5500_codec_privates[dai->id].capture_active = true; + mask_set_reg(value, I2Sx_TRISTATE_MASK, + 0 << I2Sx_TRISTATE_SHIFT); + } + dump_registers(__func__, RX1, AUXO1_ADDER, RX2, AUXO2_ADDER, RX1_DPGA, RX2_DPGA, AUXO1, AUXO2, -1); + return 0; } static void ab5500_pcm_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - u8 iface = dai->id == 0 ? INTERFACE0 : INTERFACE1; + u8 iface = (dai->id == 0) ? INTERFACE0 : INTERFACE1; dev_info(ab5500_dev, "%s called.\n", __func__); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { power_for_playback(POWER_OFF, dai->id); @@ -1239,11 +1248,13 @@ static void ab5500_pcm_shutdown(struct snd_pcm_substream *substream, } else { power_for_capture(POWER_OFF, dai->id); ab5500_codec_privates[dai->id].capture_active = false; - } if (!dai->playback_active && !dai->capture_active && - (read_reg(iface) & I2Sx_MODE_MASK) == 0) + (read_reg(iface) & I2Sx_MODE_MASK) == 0) { + mask_set_reg(iface, I2Sx_TRISTATE_MASK, + 1 << I2Sx_TRISTATE_SHIFT); mask_set_reg(iface, MASTER_GENx_PWR_MASK, 0); + } } static int ab5500_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, @@ -1640,6 +1651,8 @@ static int __devinit ab5500_platform_probe(struct platform_device *pdev) set_reg(reg, 0); mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 1 << CLOCK_ENABLE_SHIFT); + mask_set_reg(INTERFACE0, I2Sx_TRISTATE_MASK, 1 << I2Sx_TRISTATE_SHIFT); + mask_set_reg(INTERFACE1, I2Sx_TRISTATE_MASK, 1 << I2Sx_TRISTATE_SHIFT); printk(KERN_ERR "Clock Setting ab5500\n"); init_playback_route(); |