/* Used for comstraint setting on the second stream */
        u32     channels;
+       int     max_format_width;
        u8      active_serializers[2];
 
 #ifdef CONFIG_GPIOLIB
 
        if (mcasp->slot_width)
                slot_width = mcasp->slot_width;
+       else if (mcasp->max_format_width)
+               slot_width = mcasp->max_format_width;
        else
                slot_width = sample_width;
        /*
 
        davinci_config_channel_size(mcasp, word_length);
 
-       if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE)
+       if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) {
                mcasp->channels = channels;
+               if (!mcasp->max_format_width)
+                       mcasp->max_format_width = word_length;
+       }
 
        return 0;
 }
        return snd_mask_refine(fmt, &nfmt);
 }
 
+static int davinci_mcasp_hw_rule_format_width(struct snd_pcm_hw_params *params,
+                                             struct snd_pcm_hw_rule *rule)
+{
+       struct davinci_mcasp_ruledata *rd = rule->private;
+       struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
+       struct snd_mask nfmt;
+       int i, format_width;
+
+       snd_mask_none(&nfmt);
+       format_width = rd->mcasp->max_format_width;
+
+       for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) {
+               if (snd_mask_test(fmt, i)) {
+                       if (snd_pcm_format_width(i) == format_width) {
+                               snd_mask_set(&nfmt, i);
+                       }
+               }
+       }
+
+       return snd_mask_refine(fmt, &nfmt);
+}
+
 static const unsigned int davinci_mcasp_dai_rates[] = {
        8000, 11025, 16000, 22050, 32000, 44100, 48000, 64000,
        88200, 96000, 176400, 192000,
                                   0, SNDRV_PCM_HW_PARAM_CHANNELS,
                                   &mcasp->chconstr[substream->stream]);
 
-       if (mcasp->slot_width) {
+       if (mcasp->max_format_width) {
+               /*
+                * Only allow formats which require same amount of bits on the
+                * bus as the currently running stream
+                */
+               ret = snd_pcm_hw_rule_add(substream->runtime, 0,
+                                         SNDRV_PCM_HW_PARAM_FORMAT,
+                                         davinci_mcasp_hw_rule_format_width,
+                                         ruledata,
+                                         SNDRV_PCM_HW_PARAM_FORMAT, -1);
+               if (ret)
+                       return ret;
+       }
+       else if (mcasp->slot_width) {
                /* Only allow formats require <= slot_width bits on the bus */
                ret = snd_pcm_hw_rule_add(substream->runtime, 0,
                                          SNDRV_PCM_HW_PARAM_FORMAT,
        if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
                return;
 
-       if (!cpu_dai->active)
+       if (!cpu_dai->active) {
                mcasp->channels = 0;
+               mcasp->max_format_width = 0;
+       }
 }
 
 static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
                },
                .ops            = &davinci_mcasp_dai_ops,
 
-               .symmetric_samplebits   = 1,
                .symmetric_rates        = 1,
        },
        {