diff options
author | William Lai <b04597@freescale.com> | 2010-09-19 16:05:38 +0800 |
---|---|---|
committer | Alan Tull <r80115@freescale.com> | 2010-09-25 09:53:12 -0500 |
commit | 21edc6a2599ab928ccfa380c880a5e52f8711792 (patch) | |
tree | 5d909460c6d9399b86b9047beff813664f606a67 /sound | |
parent | 4eeabc7836c578c00b3c8e66ae16c7e100e1339d (diff) |
ENGR00131711-4 CS42888: Driver enhancement
Retrieve the mclk feed to CS42888, the regulator supplied to
CS42888, and pwdn function via platform data, eliminating
machine specific infor in the driver.
Signed-off-by: William Lai <b04597@freescale.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/cs42888.c | 20 | ||||
-rw-r--r-- | sound/soc/imx/imx-3stack-cs42888.c | 36 |
2 files changed, 37 insertions, 19 deletions
diff --git a/sound/soc/codecs/cs42888.c b/sound/soc/codecs/cs42888.c index 7b9233142c41..93f6dba5d5da 100644 --- a/sound/soc/codecs/cs42888.c +++ b/sound/soc/codecs/cs42888.c @@ -21,6 +21,7 @@ #include <linux/spi/spi.h> #include <linux/platform_device.h> #include <linux/regulator/consumer.h> +#include <linux/fsl_devices.h> #include <sound/core.h> #include <sound/pcm.h> @@ -745,6 +746,8 @@ static int cs42888_hw_params(struct snd_pcm_substream *substream, val = cs42888_read_reg_cache(codec, CS42888_MODE); val &= ~CS42888_MODE_SPEED_MASK; val |= CS42888_MODE_SLAVE; + val &= ~CS42888_MODE_DIV_MASK; + val |= cs42888_mode_ratios[i].mclk; } ret = cs42888_i2c_write(codec, CS42888_MODE, val); if (ret < 0) { @@ -929,7 +932,8 @@ static int cs42888_i2c_probe(struct i2c_client *i2c_client, struct snd_soc_codec *codec; struct cs42888_private *cs42888; int ret; - struct regulator *regulator_vsd; + struct mxc_audio_codec_platform_data *plat_data = + i2c_client->dev.platform_data; u8 val; if (cs42888_codec) { @@ -949,13 +953,12 @@ static int cs42888_i2c_probe(struct i2c_client *i2c_client, } /* hold on reset */ - gpio_cs42888_pdwn(1); - - regulator_vsd = regulator_get(&i2c_client->dev, "VSD"); - if (!IS_ERR(regulator_vsd)) - cs42888->regulator_vsd = regulator_vsd; + if (plat_data->pwdn) + plat_data->pwdn(1); - if (cs42888->regulator_vsd) { + cs42888->regulator_vsd = + regulator_get(&i2c_client->dev, plat_data->analog_regulator); + if (!IS_ERR(cs42888->regulator_vsd)) { regulator_set_voltage(cs42888->regulator_vsd, 2800000, 2800000); if (regulator_enable(cs42888->regulator_vsd) != 0) { @@ -968,7 +971,8 @@ static int cs42888_i2c_probe(struct i2c_client *i2c_client, msleep(1); /* out of reset state */ - gpio_cs42888_pdwn(0); + if (plat_data->pwdn) + plat_data->pwdn(0); /* Verify that we have a CS42888 */ ret = cs42888_read_reg(CS42888_CHIPID, &val); diff --git a/sound/soc/imx/imx-3stack-cs42888.c b/sound/soc/imx/imx-3stack-cs42888.c index 5f4af680d812..c37b23af46d0 100644 --- a/sound/soc/imx/imx-3stack-cs42888.c +++ b/sound/soc/imx/imx-3stack-cs42888.c @@ -19,6 +19,7 @@ #include <linux/clk.h> #include <linux/delay.h> #include <linux/regulator/consumer.h> +#include <linux/fsl_devices.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/soc.h> @@ -70,6 +71,7 @@ struct imx_3stack_pcm_state { }; static struct imx_3stack_pcm_state clk_state; +unsigned int mclk_freq; static int imx_3stack_startup(struct snd_pcm_substream *substream) { @@ -118,7 +120,7 @@ static int imx_3stack_surround_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai = pcm_link->codec_dai; unsigned int rate = params_rate(params); u32 dai_format; - unsigned int mclk_freq = 0, lrclk_ratio = 0; + unsigned int lrclk_ratio = 0; #if defined(CONFIG_MXC_ASRC) || defined(CONFIG_MXC_ASRC_MODULE) unsigned int channel = params_channels(params); #endif @@ -162,39 +164,30 @@ static int imx_3stack_surround_hw_params(struct snd_pcm_substream *substream, switch (rate) { case 32000: lrclk_ratio = 3; - mclk_freq = 12288000; break; case 48000: lrclk_ratio = 3; - mclk_freq = 12288000; break; case 64000: lrclk_ratio = 1; - mclk_freq = 12288000; break; case 96000: lrclk_ratio = 1; - mclk_freq = 12288000; break; case 128000: lrclk_ratio = 1; - mclk_freq = 12288000; break; case 44100: lrclk_ratio = 3; - mclk_freq = 11289600; break; case 88200: lrclk_ratio = 1; - mclk_freq = 11289600; break; case 176400: lrclk_ratio = 0; - mclk_freq = 11289600; break; case 192000: lrclk_ratio = 0; - mclk_freq = 12288000; break; default: pr_info("Rate not support.\n"); @@ -222,7 +215,6 @@ static int imx_3stack_surround_hw_params(struct snd_pcm_substream *substream, snd_soc_dai_set_clkdiv(cpu_dai, ESAI_RX_DIV_PM, 0); snd_soc_dai_set_clkdiv(cpu_dai, ESAI_RX_DIV_FP, lrclk_ratio); - /* set codec DAI configuration */ snd_soc_dai_set_fmt(codec_dai, dai_format); /* set codec Master clock */ @@ -354,8 +346,30 @@ static struct snd_soc_device imx_3stack_snd_devdata = { */ static int __devinit imx_3stack_cs42888_probe(struct platform_device *pdev) { + struct mxc_audio_platform_data *plat_data = pdev->dev.platform_data; imx_3stack_dai.cpu_dai = &imx_esai_dai[2]; imx_3stack_dai.cpu_dai->dev = &pdev->dev; + mclk_freq = plat_data->sysclk; + if (!(mclk_freq % 44100)) { + imx_3stack_dai.codec_dai->playback.rates = + SNDRV_PCM_RATE_44100 |\ + SNDRV_PCM_RATE_88200 |\ + SNDRV_PCM_RATE_176400; + imx_3stack_dai.codec_dai->capture.rates = + SNDRV_PCM_RATE_44100 |\ + SNDRV_PCM_RATE_88200 |\ + SNDRV_PCM_RATE_176400; + } + if (!(mclk_freq % 48000)) { + imx_3stack_dai.codec_dai->playback.rates = + SNDRV_PCM_RATE_48000 |\ + SNDRV_PCM_RATE_96000 |\ + SNDRV_PCM_RATE_192000; + imx_3stack_dai.codec_dai->capture.rates = + SNDRV_PCM_RATE_48000 |\ + SNDRV_PCM_RATE_96000 |\ + SNDRV_PCM_RATE_192000; + } return 0; } |