Skip to content

Commit

Permalink
ASoC: tlv320dac33: Change nsample switch to FIFO mode enum
Browse files Browse the repository at this point in the history
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: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Peter Ujfalusi authored and Mark Brown committed Dec 31, 2009
1 parent 8998c89 commit 7427b4b
Showing 1 changed file with 32 additions and 17 deletions.
49 changes: 32 additions & 17 deletions sound/soc/codecs/tlv320dac33.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ enum dac33_state {
DAC33_FLUSH,
};

enum dac33_fifo_modes {
DAC33_FIFO_BYPASS = 0,
DAC33_FIFO_MODE1,
DAC33_FIFO_LAST_MODE,
};

#define DAC33_NUM_SUPPLIES 3
static const char *dac33_supply_names[DAC33_NUM_SUPPLIES] = {
"AVDD",
Expand All @@ -82,7 +88,7 @@ struct tlv320dac33_priv {
* this */
unsigned int nsample_max; /* nsample should not be higher than
* 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 */

enum dac33_state state;
Expand Down Expand Up @@ -381,39 +387,48 @@ static int dac33_set_nsample(struct snd_kcontrol *kcontrol,
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_soc_codec *codec = snd_kcontrol_chip(kcontrol);
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;
}

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_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct tlv320dac33_priv *dac33 = codec->private_data;
int ret = 0;

if (dac33->nsample_switch == ucontrol->value.integer.value[0])
if (dac33->fifo_mode == ucontrol->value.integer.value[0])
return 0;
/* Do not allow changes while stream is running*/
if (codec->active)
return -EPERM;

if (ucontrol->value.integer.value[0] < 0 ||
ucontrol->value.integer.value[0] > 1)
ucontrol->value.integer.value[0] >= DAC33_FIFO_LAST_MODE)
ret = -EINVAL;
else
dac33->nsample_switch = ucontrol->value.integer.value[0];
dac33->fifo_mode = ucontrol->value.integer.value[0];

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:
* from 0 dB to -63.5 in 0.5 dB steps
Expand All @@ -436,8 +451,8 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = {
static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = {
SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0,
dac33_get_nsample, dac33_set_nsample),
SOC_SINGLE_EXT("nSample Switch", 0, 0, 1, 0,
dac33_get_nsample_switch, dac33_set_nsample_switch),
SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum,
dac33_get_fifo_mode, dac33_set_fifo_mode),
};

/* Analog bypass */
Expand Down Expand Up @@ -586,7 +601,7 @@ static void dac33_shutdown(struct snd_pcm_substream *substream,
unsigned int pwr_ctrl;

/* Stop pending workqueue */
if (dac33->nsample_switch)
if (dac33->fifo_mode)
cancel_work_sync(&dac33->work);

mutex_lock(&dac33->mutex);
Expand Down Expand Up @@ -714,7 +729,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)

dac33_oscwait(codec);

if (dac33->nsample_switch) {
if (dac33->fifo_mode) {
/* 50-51 : ASRC Control registers */
dac33_write(codec, DAC33_ASRC_CTRL_A, (1 << 4)); /* div=2 */
dac33_write(codec, DAC33_ASRC_CTRL_B, 1); /* ??? */
Expand All @@ -734,21 +749,21 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
dac33_write(codec, DAC33_ASRC_CTRL_B, 0); /* ??? */
}

if (dac33->nsample_switch)
if (dac33->fifo_mode)
fifoctrl_a &= ~DAC33_FBYPAS;
else
fifoctrl_a |= DAC33_FBYPAS;
dac33_write(codec, DAC33_FIFO_CTRL_A, fifoctrl_a);

dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a);
reg_tmp = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B);
if (dac33->nsample_switch)
if (dac33->fifo_mode)
reg_tmp &= ~DAC33_BCLKON;
else
reg_tmp |= DAC33_BCLKON;
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg_tmp);

if (dac33->nsample_switch) {
if (dac33->fifo_mode) {
/* 20: BCLK divide ratio */
dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, 3);

Expand Down Expand Up @@ -828,15 +843,15 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (dac33->nsample_switch) {
if (dac33->fifo_mode) {
dac33->state = DAC33_PREFILL;
queue_work(dac33->dac33_wq, &dac33->work);
}
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (dac33->nsample_switch) {
if (dac33->fifo_mode) {
dac33->state = DAC33_FLUSH;
queue_work(dac33->dac33_wq, &dac33->work);
}
Expand Down Expand Up @@ -1125,7 +1140,7 @@ static int dac33_i2c_probe(struct i2c_client *client,
dac33->irq = client->irq;
dac33->nsample = NSAMPLE_MAX;
/* Disable FIFO use by default */
dac33->nsample_switch = 0;
dac33->fifo_mode = DAC33_FIFO_BYPASS;

tlv320dac33_codec = codec;

Expand Down

0 comments on commit 7427b4b

Please sign in to comment.