aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorMisael Lopez Cruz <x0052729@ti.com>2009-05-17 21:02:31 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-05-18 06:13:12 -0400
commitb7a755a8a145a7e34e735bda9c452317de7a538a (patch)
treeabaa331ce51f9096f7f9d0e2eb738f0b28eedaf1 /sound/soc
parent5b740ea975c4ce3da12ac21b56f9e43354ca4327 (diff)
ASoC: TWL4030: Enable/disable voice digital filters
Enable TWL4030 VTXL/VTXR and VRX digital filters for uplink and downlink paths, respectively. This patch also corrects voice 8/16kHz mode selection bit (SEL_16K) of CODEC_MODE register. Signed-off-by: Misael Lopez Cruz <x0052729@ti.com> Acked-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.c37
-rw-r--r--sound/soc/codecs/twl4030.h2
2 files changed, 38 insertions, 1 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index eaf91ab465b4..e4d683daa450 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -1629,6 +1629,28 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai,
1629 return 0; 1629 return 0;
1630} 1630}
1631 1631
1632/* In case of voice mode, the RX1 L(VRX) for downlink and the TX2 L/R
1633 * (VTXL, VTXR) for uplink has to be enabled/disabled. */
1634static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction,
1635 int enable)
1636{
1637 u8 reg, mask;
1638
1639 reg = twl4030_read_reg_cache(codec, TWL4030_REG_OPTION);
1640
1641 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
1642 mask = TWL4030_ARXL1_VRX_EN;
1643 else
1644 mask = TWL4030_ATXL2_VTXL_EN | TWL4030_ATXR2_VTXR_EN;
1645
1646 if (enable)
1647 reg |= mask;
1648 else
1649 reg &= ~mask;
1650
1651 twl4030_write(codec, TWL4030_REG_OPTION, reg);
1652}
1653
1632static int twl4030_voice_startup(struct snd_pcm_substream *substream, 1654static int twl4030_voice_startup(struct snd_pcm_substream *substream,
1633 struct snd_soc_dai *dai) 1655 struct snd_soc_dai *dai)
1634{ 1656{
@@ -1665,6 +1687,17 @@ static int twl4030_voice_startup(struct snd_pcm_substream *substream,
1665 return 0; 1687 return 0;
1666} 1688}
1667 1689
1690static void twl4030_voice_shutdown(struct snd_pcm_substream *substream,
1691 struct snd_soc_dai *dai)
1692{
1693 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1694 struct snd_soc_device *socdev = rtd->socdev;
1695 struct snd_soc_codec *codec = socdev->card->codec;
1696
1697 /* Enable voice digital filters */
1698 twl4030_voice_enable(codec, substream->stream, 0);
1699}
1700
1668static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, 1701static int twl4030_voice_hw_params(struct snd_pcm_substream *substream,
1669 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 1702 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
1670{ 1703{
@@ -1673,6 +1706,9 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream,
1673 struct snd_soc_codec *codec = socdev->card->codec; 1706 struct snd_soc_codec *codec = socdev->card->codec;
1674 u8 old_mode, mode; 1707 u8 old_mode, mode;
1675 1708
1709 /* Enable voice digital filters */
1710 twl4030_voice_enable(codec, substream->stream, 1);
1711
1676 /* bit rate */ 1712 /* bit rate */
1677 old_mode = twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE) 1713 old_mode = twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE)
1678 & ~(TWL4030_CODECPDZ); 1714 & ~(TWL4030_CODECPDZ);
@@ -1780,6 +1816,7 @@ static struct snd_soc_dai_ops twl4030_dai_ops = {
1780 1816
1781static struct snd_soc_dai_ops twl4030_dai_voice_ops = { 1817static struct snd_soc_dai_ops twl4030_dai_voice_ops = {
1782 .startup = twl4030_voice_startup, 1818 .startup = twl4030_voice_startup,
1819 .shutdown = twl4030_voice_shutdown,
1783 .hw_params = twl4030_voice_hw_params, 1820 .hw_params = twl4030_voice_hw_params,
1784 .set_sysclk = twl4030_voice_set_dai_sysclk, 1821 .set_sysclk = twl4030_voice_set_dai_sysclk,
1785 .set_fmt = twl4030_voice_set_dai_fmt, 1822 .set_fmt = twl4030_voice_set_dai_fmt,
diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h
index 3441115136f6..9668bdf430fb 100644
--- a/sound/soc/codecs/twl4030.h
+++ b/sound/soc/codecs/twl4030.h
@@ -110,7 +110,7 @@
110#define TWL4030_APLL_RATE_44100 0x90 110#define TWL4030_APLL_RATE_44100 0x90
111#define TWL4030_APLL_RATE_48000 0xA0 111#define TWL4030_APLL_RATE_48000 0xA0
112#define TWL4030_APLL_RATE_96000 0xE0 112#define TWL4030_APLL_RATE_96000 0xE0
113#define TWL4030_SEL_16K 0x04 113#define TWL4030_SEL_16K 0x08
114#define TWL4030_CODECPDZ 0x02 114#define TWL4030_CODECPDZ 0x02
115#define TWL4030_OPT_MODE 0x01 115#define TWL4030_OPT_MODE 0x01
116#define TWL4030_OPTION_1 (1 << 0) 116#define TWL4030_OPTION_1 (1 << 0)