static int sun4i_i2s_get_bclk_div(struct sun4i_i2s *i2s,
                                  unsigned long parent_rate,
                                  unsigned int sampling_rate,
+                                 unsigned int channels,
                                  unsigned int word_size)
 {
        const struct sun4i_i2s_clk_div *dividers = i2s->variant->bclk_dividers;
-       int div = parent_rate / sampling_rate / word_size / 2;
+       int div = parent_rate / sampling_rate / word_size / channels;
        int i;
 
        for (i = 0; i < i2s->variant->num_bclk_dividers; i++) {
 
 static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai,
                                  unsigned int rate,
+                                 unsigned int channels,
                                  unsigned int word_size)
 {
        struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
 
        bclk_parent_rate = i2s->variant->get_bclk_parent_rate(i2s);
        bclk_div = sun4i_i2s_get_bclk_div(i2s, bclk_parent_rate,
-                                         rate, word_size);
+                                         rate, channels, word_size);
        if (bclk_div < 0) {
                dev_err(dai->dev, "Unsupported BCLK divider: %d\n", bclk_div);
                return -EINVAL;
        regmap_field_write(i2s->field_fmt_sr, sr);
 
        return sun4i_i2s_set_clk_rate(dai, params_rate(params),
-                                     params_width(params));
+                                     2, params_width(params));
 }
 
 static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,