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",
                                         * 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;
        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
 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 */
        unsigned int pwr_ctrl;
 
        /* Stop pending workqueue */
-       if (dac33->nsample_switch)
+       if (dac33->fifo_mode)
                cancel_work_sync(&dac33->work);
 
        mutex_lock(&dac33->mutex);
 
        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); /* ??? */
                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_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);
 
        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);
                }
        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);
                }
        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;