struct aic32x4_setup_data *setup;
        struct device *dev;
        enum aic32x4_type type;
+
+       unsigned int fmt;
 };
 
 static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
 static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
 {
        struct snd_soc_component *component = codec_dai->component;
+       struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component);
        u8 iface_reg_1 = 0;
        u8 iface_reg_2 = 0;
        u8 iface_reg_3 = 0;
                return -EINVAL;
        }
 
+       aic32x4->fmt = fmt;
+
        snd_soc_component_update_bits(component, AIC32X4_IFACE1,
                                AIC32X4_IFACE1_DATATYPE_MASK |
                                AIC32X4_IFACE1_MASTER_MASK, iface_reg_1);
                return -EINVAL;
        }
 
+       /* PCM over I2S is always 2-channel */
+       if ((aic32x4->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S)
+               channels = 2;
+
        madc = DIV_ROUND_UP((32 * adc_resource_class), aosr);
        max_dosr = (AIC32X4_MAX_DOSR_FREQ / sample_rate / dosr_increment) *
                        dosr_increment;