unsigned long overclock_dsp;
        int mute;
        struct mutex mutex;
+       unsigned int bclk_ratio;
 };
 
 /*
        int fssp;
        int gpio;
 
-       lrclk_div = snd_soc_params_to_frame_size(params);
-       if (lrclk_div == 0) {
-               dev_err(dev, "No LRCLK?\n");
-               return -EINVAL;
+       if (pcm512x->bclk_ratio > 0) {
+               lrclk_div = pcm512x->bclk_ratio;
+       } else {
+               lrclk_div = snd_soc_params_to_frame_size(params);
+
+               if (lrclk_div == 0) {
+                       dev_err(dev, "No LRCLK?\n");
+                       return -EINVAL;
+               }
        }
 
        if (!pcm512x->pll_out) {
        return 0;
 }
 
+static int pcm512x_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
+{
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
+
+       if (ratio > 256)
+               return -EINVAL;
+
+       pcm512x->bclk_ratio = ratio;
+
+       return 0;
+}
+
 static int pcm512x_digital_mute(struct snd_soc_dai *dai, int mute)
 {
        struct snd_soc_component *component = dai->component;
        .hw_params = pcm512x_hw_params,
        .set_fmt = pcm512x_set_fmt,
        .digital_mute = pcm512x_digital_mute,
+       .set_bclk_ratio = pcm512x_set_bclk_ratio,
 };
 
 static struct snd_soc_dai_driver pcm512x_dai = {