Merge tag 'mac80211-next-for-john-2014-11-04' of git://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / sound / soc / codecs / sgtl5000.c
index e997d27..6bb77d7 100644 (file)
@@ -626,6 +626,9 @@ static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate)
                } else {
                        dev_err(codec->dev,
                                "PLL not supported in slave mode\n");
+                       dev_err(codec->dev, "%d ratio is not supported. "
+                               "SYS_MCLK needs to be 256, 384 or 512 * fs\n",
+                               sgtl5000->sysclk / sys_fs);
                        return -EINVAL;
                }
        }
@@ -1073,26 +1076,6 @@ static bool sgtl5000_readable(struct device *dev, unsigned int reg)
        }
 }
 
-#ifdef CONFIG_SUSPEND
-static int sgtl5000_suspend(struct snd_soc_codec *codec)
-{
-       sgtl5000_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
-       return 0;
-}
-
-static int sgtl5000_resume(struct snd_soc_codec *codec)
-{
-       /* Bring the codec back up to standby to enable regulators */
-       sgtl5000_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
-       return 0;
-}
-#else
-#define sgtl5000_suspend NULL
-#define sgtl5000_resume  NULL
-#endif /* CONFIG_SUSPEND */
-
 /*
  * sgtl5000 has 3 internal power supplies:
  * 1. VAG, normally set to vdda/2
@@ -1352,11 +1335,6 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
         */
        snd_soc_write(codec, SGTL5000_DAP_CTRL, 0);
 
-       /* leading to standby state */
-       ret = sgtl5000_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-       if (ret)
-               goto err;
-
        return 0;
 
 err:
@@ -1373,8 +1351,6 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
 {
        struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
 
-       sgtl5000_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
        regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
                                                sgtl5000->supplies);
        regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
@@ -1387,9 +1363,8 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
 static struct snd_soc_codec_driver sgtl5000_driver = {
        .probe = sgtl5000_probe,
        .remove = sgtl5000_remove,
-       .suspend = sgtl5000_suspend,
-       .resume = sgtl5000_resume,
        .set_bias_level = sgtl5000_set_bias_level,
+       .suspend_bias_off = true,
        .controls = sgtl5000_snd_controls,
        .num_controls = ARRAY_SIZE(sgtl5000_snd_controls),
        .dapm_widgets = sgtl5000_dapm_widgets,
@@ -1442,6 +1417,7 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
 {
        struct sgtl5000_priv *sgtl5000;
        int ret, reg, rev;
+       unsigned int mclk;
 
        sgtl5000 = devm_kzalloc(&client->dev, sizeof(struct sgtl5000_priv),
                                                                GFP_KERNEL);
@@ -1465,6 +1441,14 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
                return ret;
        }
 
+       /* SGTL5000 SYS_MCLK should be between 8 and 27 MHz */
+       mclk = clk_get_rate(sgtl5000->mclk);
+       if (mclk < 8000000 || mclk > 27000000) {
+               dev_err(&client->dev, "Invalid SYS_CLK frequency: %u.%03uMHz\n",
+                       mclk / 1000000, mclk / 1000 % 1000);
+               return -EINVAL;
+       }
+
        ret = clk_prepare_enable(sgtl5000->mclk);
        if (ret)
                return ret;