These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / sound / soc / codecs / wm8523.c
index b1cc94f..aa287a3 100644 (file)
@@ -113,6 +113,15 @@ static struct {
        { 7, 1152 },
 };
 
+static struct {
+       int value;
+       int ratio;
+} bclk_ratios[WM8523_NUM_RATES] = {
+       { 2, 32 },
+       { 3, 64 },
+       { 4, 128 },
+};
+
 static int wm8523_startup(struct snd_pcm_substream *substream,
                          struct snd_soc_dai *dai)
 {
@@ -162,6 +171,23 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream,
        aifctrl2 &= ~WM8523_SR_MASK;
        aifctrl2 |= lrclk_ratios[i].value;
 
+       if (aifctrl1 & WM8523_AIF_MSTR) {
+               /* Find a fs->bclk ratio */
+               for (i = 0; i < ARRAY_SIZE(bclk_ratios); i++)
+                       if (params_width(params) * 2 <= bclk_ratios[i].ratio)
+                               break;
+
+               if (i == ARRAY_SIZE(bclk_ratios)) {
+                       dev_err(codec->dev,
+                               "No matching BCLK/fs ratio for word length %d\n",
+                               params_width(params));
+                       return -EINVAL;
+               }
+
+               aifctrl2 &= ~WM8523_BCLKDIV_MASK;
+               aifctrl2 |= bclk_ratios[i].value << WM8523_BCLKDIV_SHIFT;
+       }
+
        aifctrl1 &= ~WM8523_WL_MASK;
        switch (params_width(params)) {
        case 16:
@@ -308,7 +334,7 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec,
                break;
 
        case SND_SOC_BIAS_STANDBY:
-               if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
                        ret = regulator_bulk_enable(ARRAY_SIZE(wm8523->supplies),
                                                    wm8523->supplies);
                        if (ret != 0) {
@@ -344,7 +370,6 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec,
                                       wm8523->supplies);
                break;
        }
-       codec->dapm.bias_level = level;
        return 0;
 }
 
@@ -405,6 +430,7 @@ static const struct of_device_id wm8523_of_match[] = {
        { .compatible = "wlf,wm8523" },
        { },
 };
+MODULE_DEVICE_TABLE(of, wm8523_of_match);
 
 static const struct regmap_config wm8523_regmap = {
        .reg_bits = 8,
@@ -509,7 +535,6 @@ MODULE_DEVICE_TABLE(i2c, wm8523_i2c_id);
 static struct i2c_driver wm8523_i2c_driver = {
        .driver = {
                .name = "wm8523",
-               .owner = THIS_MODULE,
                .of_match_table = wm8523_of_match,
        },
        .probe =    wm8523_i2c_probe,