diff mbox

[4/6] ASoC: ak4642: Add support for extended sysclk frequencies of the ak4648

Message ID 1400053058-1115-5-git-send-email-s.hauer@pengutronix.de (mailing list archive)
State Accepted
Commit 5cd15e29a45a18b9a744af61a7d90f26f730eb97
Headers show

Commit Message

Sascha Hauer May 14, 2014, 7:37 a.m. UTC
Additionally to the ak4642 pll frequencies the ak4648 also supports 13MHz,
19.2MHz and 26MHz. This adds support for these frequencies.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 sound/soc/codecs/ak4642.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Mark Brown May 14, 2014, 11:34 a.m. UTC | #1
On Wed, May 14, 2014 at 09:37:36AM +0200, Sascha Hauer wrote:
> Additionally to the ak4642 pll frequencies the ak4648 also supports 13MHz,
> 19.2MHz and 26MHz. This adds support for these frequencies.

Applied, thanks.  However...

> +	case 19200000:
> +		pll = PLL3;
> +		extended_freq = 1;
> +		break;
> +	case 13000000:
> +		pll = PLL3 | PLL2 | PLL1;
> +		extended_freq = 1;
> +		break;
> +	case 26000000:

...the sorting here is a bit odd - we do 19.2MHz then 13MHz then 26MHz.
diff mbox

Patch

diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
index b568692..3ba4c0f 100644
--- a/sound/soc/codecs/ak4642.c
+++ b/sound/soc/codecs/ak4642.c
@@ -136,6 +136,7 @@ 
 
 struct ak4642_drvdata {
 	const struct regmap_config *regmap_config;
+	int extended_frequencies;
 };
 
 struct ak4642_priv {
@@ -297,7 +298,9 @@  static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
 	int clk_id, unsigned int freq, int dir)
 {
 	struct snd_soc_codec *codec = codec_dai->codec;
+	struct ak4642_priv *priv = snd_soc_codec_get_drvdata(codec);
 	u8 pll;
+	int extended_freq = 0;
 
 	switch (freq) {
 	case 11289600:
@@ -318,9 +321,25 @@  static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
 	case 27000000:
 		pll = PLL3 | PLL2 | PLL0;
 		break;
+	case 19200000:
+		pll = PLL3;
+		extended_freq = 1;
+		break;
+	case 13000000:
+		pll = PLL3 | PLL2 | PLL1;
+		extended_freq = 1;
+		break;
+	case 26000000:
+		pll = PLL3 | PLL2 | PLL1 | PLL0;
+		extended_freq = 1;
+		break;
 	default:
 		return -EINVAL;
 	}
+
+	if (extended_freq && !priv->drvdata->extended_frequencies)
+		return -EINVAL;
+
 	snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll);
 
 	return 0;
@@ -525,6 +544,7 @@  static const struct ak4642_drvdata ak4643_drvdata = {
 
 static const struct ak4642_drvdata ak4648_drvdata = {
 	.regmap_config = &ak4648_regmap,
+	.extended_frequencies = 1,
 };
 
 static struct of_device_id ak4642_of_match[];