summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorWilliam Lai <b04597@freescale.com>2010-09-19 16:05:38 +0800
committerAlan Tull <r80115@freescale.com>2010-09-25 09:53:12 -0500
commit21edc6a2599ab928ccfa380c880a5e52f8711792 (patch)
tree5d909460c6d9399b86b9047beff813664f606a67 /sound
parent4eeabc7836c578c00b3c8e66ae16c7e100e1339d (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.c20
-rw-r--r--sound/soc/imx/imx-3stack-cs42888.c36
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;
}