提交 7427b4b9 编写于 作者: P Peter Ujfalusi 提交者: Mark Brown

ASoC: tlv320dac33: Change nsample switch to FIFO mode enum

In order to have support for more FIFO modes supported by
tlv320dac33, the switch for enabling/disabling the FIFO
use has to be replaced with an enum.
Signed-off-by: NPeter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: NLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 8998c899
...@@ -59,6 +59,12 @@ enum dac33_state { ...@@ -59,6 +59,12 @@ enum dac33_state {
DAC33_FLUSH, DAC33_FLUSH,
}; };
enum dac33_fifo_modes {
DAC33_FIFO_BYPASS = 0,
DAC33_FIFO_MODE1,
DAC33_FIFO_LAST_MODE,
};
#define DAC33_NUM_SUPPLIES 3 #define DAC33_NUM_SUPPLIES 3
static const char *dac33_supply_names[DAC33_NUM_SUPPLIES] = { static const char *dac33_supply_names[DAC33_NUM_SUPPLIES] = {
"AVDD", "AVDD",
...@@ -82,7 +88,7 @@ struct tlv320dac33_priv { ...@@ -82,7 +88,7 @@ struct tlv320dac33_priv {
* this */ * this */
unsigned int nsample_max; /* nsample should not be higher than unsigned int nsample_max; /* nsample should not be higher than
* this */ * this */
unsigned int nsample_switch; /* Use FIFO or bypass FIFO switch */ enum dac33_fifo_modes fifo_mode;/* FIFO mode selection */
unsigned int nsample; /* burst read amount from host */ unsigned int nsample; /* burst read amount from host */
enum dac33_state state; enum dac33_state state;
...@@ -381,39 +387,48 @@ static int dac33_set_nsample(struct snd_kcontrol *kcontrol, ...@@ -381,39 +387,48 @@ static int dac33_set_nsample(struct snd_kcontrol *kcontrol,
return ret; return ret;
} }
static int dac33_get_nsample_switch(struct snd_kcontrol *kcontrol, static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct tlv320dac33_priv *dac33 = codec->private_data; struct tlv320dac33_priv *dac33 = codec->private_data;
ucontrol->value.integer.value[0] = dac33->nsample_switch; ucontrol->value.integer.value[0] = dac33->fifo_mode;
return 0; return 0;
} }
static int dac33_set_nsample_switch(struct snd_kcontrol *kcontrol, static int dac33_set_fifo_mode(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct tlv320dac33_priv *dac33 = codec->private_data; struct tlv320dac33_priv *dac33 = codec->private_data;
int ret = 0; int ret = 0;
if (dac33->nsample_switch == ucontrol->value.integer.value[0]) if (dac33->fifo_mode == ucontrol->value.integer.value[0])
return 0; return 0;
/* Do not allow changes while stream is running*/ /* Do not allow changes while stream is running*/
if (codec->active) if (codec->active)
return -EPERM; return -EPERM;
if (ucontrol->value.integer.value[0] < 0 || if (ucontrol->value.integer.value[0] < 0 ||
ucontrol->value.integer.value[0] > 1) ucontrol->value.integer.value[0] >= DAC33_FIFO_LAST_MODE)
ret = -EINVAL; ret = -EINVAL;
else else
dac33->nsample_switch = ucontrol->value.integer.value[0]; dac33->fifo_mode = ucontrol->value.integer.value[0];
return ret; return ret;
} }
/* Codec operation modes */
static const char *dac33_fifo_mode_texts[] = {
"Bypass", "Mode 1"
};
static const struct soc_enum dac33_fifo_mode_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dac33_fifo_mode_texts),
dac33_fifo_mode_texts);
/* /*
* DACL/R digital volume control: * DACL/R digital volume control:
* from 0 dB to -63.5 in 0.5 dB steps * from 0 dB to -63.5 in 0.5 dB steps
...@@ -436,8 +451,8 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = { ...@@ -436,8 +451,8 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = {
static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = { static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = {
SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0,
dac33_get_nsample, dac33_set_nsample), dac33_get_nsample, dac33_set_nsample),
SOC_SINGLE_EXT("nSample Switch", 0, 0, 1, 0, SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum,
dac33_get_nsample_switch, dac33_set_nsample_switch), dac33_get_fifo_mode, dac33_set_fifo_mode),
}; };
/* Analog bypass */ /* Analog bypass */
...@@ -586,7 +601,7 @@ static void dac33_shutdown(struct snd_pcm_substream *substream, ...@@ -586,7 +601,7 @@ static void dac33_shutdown(struct snd_pcm_substream *substream,
unsigned int pwr_ctrl; unsigned int pwr_ctrl;
/* Stop pending workqueue */ /* Stop pending workqueue */
if (dac33->nsample_switch) if (dac33->fifo_mode)
cancel_work_sync(&dac33->work); cancel_work_sync(&dac33->work);
mutex_lock(&dac33->mutex); mutex_lock(&dac33->mutex);
...@@ -714,7 +729,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream) ...@@ -714,7 +729,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
dac33_oscwait(codec); dac33_oscwait(codec);
if (dac33->nsample_switch) { if (dac33->fifo_mode) {
/* 50-51 : ASRC Control registers */ /* 50-51 : ASRC Control registers */
dac33_write(codec, DAC33_ASRC_CTRL_A, (1 << 4)); /* div=2 */ dac33_write(codec, DAC33_ASRC_CTRL_A, (1 << 4)); /* div=2 */
dac33_write(codec, DAC33_ASRC_CTRL_B, 1); /* ??? */ dac33_write(codec, DAC33_ASRC_CTRL_B, 1); /* ??? */
...@@ -734,7 +749,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream) ...@@ -734,7 +749,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
dac33_write(codec, DAC33_ASRC_CTRL_B, 0); /* ??? */ dac33_write(codec, DAC33_ASRC_CTRL_B, 0); /* ??? */
} }
if (dac33->nsample_switch) if (dac33->fifo_mode)
fifoctrl_a &= ~DAC33_FBYPAS; fifoctrl_a &= ~DAC33_FBYPAS;
else else
fifoctrl_a |= DAC33_FBYPAS; fifoctrl_a |= DAC33_FBYPAS;
...@@ -742,13 +757,13 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream) ...@@ -742,13 +757,13 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a); dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a);
reg_tmp = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B); reg_tmp = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B);
if (dac33->nsample_switch) if (dac33->fifo_mode)
reg_tmp &= ~DAC33_BCLKON; reg_tmp &= ~DAC33_BCLKON;
else else
reg_tmp |= DAC33_BCLKON; reg_tmp |= DAC33_BCLKON;
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg_tmp); dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg_tmp);
if (dac33->nsample_switch) { if (dac33->fifo_mode) {
/* 20: BCLK divide ratio */ /* 20: BCLK divide ratio */
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, 3); dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, 3);
...@@ -828,7 +843,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -828,7 +843,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (dac33->nsample_switch) { if (dac33->fifo_mode) {
dac33->state = DAC33_PREFILL; dac33->state = DAC33_PREFILL;
queue_work(dac33->dac33_wq, &dac33->work); queue_work(dac33->dac33_wq, &dac33->work);
} }
...@@ -836,7 +851,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -836,7 +851,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (dac33->nsample_switch) { if (dac33->fifo_mode) {
dac33->state = DAC33_FLUSH; dac33->state = DAC33_FLUSH;
queue_work(dac33->dac33_wq, &dac33->work); queue_work(dac33->dac33_wq, &dac33->work);
} }
...@@ -1125,7 +1140,7 @@ static int dac33_i2c_probe(struct i2c_client *client, ...@@ -1125,7 +1140,7 @@ static int dac33_i2c_probe(struct i2c_client *client,
dac33->irq = client->irq; dac33->irq = client->irq;
dac33->nsample = NSAMPLE_MAX; dac33->nsample = NSAMPLE_MAX;
/* Disable FIFO use by default */ /* Disable FIFO use by default */
dac33->nsample_switch = 0; dac33->fifo_mode = DAC33_FIFO_BYPASS;
tlv320dac33_codec = codec; tlv320dac33_codec = codec;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册