[Sorry for the top-posting. I did not see your message in the mailing list]
Hi Jakob,
arch/arm/boot/dts/imx51-babbage.dts has SYS_MCLK generated by an external fixed oscillator and it works fine.
Do you really need this new property?
________________________________ From: Jakob Unterwurzacher jakob.unterwurzacher@theobroma-systems.com Sent: Friday, October 6, 2017 5:34:44 AM To: linux-kernel@vger.kernel.org Cc: Jakob Unterwurzacher; Klaus Goger; Liam Girdwood; Mark Brown; Rob Herring; Mark Rutland; Jaroslav Kysela; Takashi Iwai; Richard Leitner; Fabio Estevam; Bhumika Goyal; alsa-devel@alsa-project.org; devicetree@vger.kernel.org Subject: [PATCH] ASoC: sgtl5000: add support for a fixed sysclk frequency
The system clock, also called SYS_MCLK in the SGTL5000 datasheet, is usually generated by the I2S master with a frequency proportional to the sample rate.
However, this is not always the case. Compute modules following the Qseven specification, for example, do not even have a pin for I2S SYS_MCLK on their board-to-board connector. Only I2S_WS, I2S_RST# I2S_CLK, I2S_SDI and I2S_SDO are specified.
Instead, SYS_MCLK is usually generated by an external fixed oscillator.
Add support for this scenario, enabled by the new "sysclk-fixed" devicetree property.
Tested on a "Puma" RK3399-Q7 compute module with a "Haikou" baseboard that has a fixed 24.576 MHz oscillator connected to the codec's SYS_MCLK.
Signed-off-by: Jakob Unterwurzacher jakob.unterwurzacher@theobroma-systems.com Cc: Klaus Goger klaus.goger@theobroma-systems.com --- Documentation/devicetree/bindings/sound/sgtl5000.txt | 5 +++++ sound/soc/codecs/sgtl5000.c | 12 ++++++++++++ 2 files changed, 17 insertions(+)
diff --git a/Documentation/devicetree/bindings/sound/sgtl5000.txt b/Documentation/devicetree/bindings/sound/sgtl5000.txt index 7a73a9d62015..0d0dd58b2d4a 100644 --- a/Documentation/devicetree/bindings/sound/sgtl5000.txt +++ b/Documentation/devicetree/bindings/sound/sgtl5000.txt @@ -35,6 +35,11 @@ VDDIO 1.8V 2.5V 3.3V 2 = 3.33 mA 5.74 mA 8.03 mA 3 = 4.99 mA 8.61 mA 12.05 mA
+- sysclk-fixed : If this property exists, the sysclk is considered to be + generated by a fixed-frequency oscillator. The frequency value is read + from the clock defined in the "clocks" property. set_sysclk requests + are ignored. + Example:
codec: sgtl5000@0a { diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index f2bb4feba3b6..be3aea89371c 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -133,6 +133,7 @@ struct sgtl5000_priv { u8 micbias_resistor; u8 micbias_voltage; u8 lrclk_strength; + u8 sysclk_fixed; /* sysclk rate cannot be changed */ };
/* @@ -613,6 +614,10 @@ static int sgtl5000_set_dai_sysclk(struct snd_soc_dai *codec_dai,
switch (clk_id) { case SGTL5000_SYSCLK: + if (sgtl5000->sysclk_fixed) { + dev_dbg(codec->dev, "sysclk-fixed: ignoring set_sysclk request\n"); + return 0; + } sgtl5000->sysclk = freq; break; default: @@ -1444,6 +1449,13 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, } else { sgtl5000->micbias_voltage = 0; } + if (of_property_read_bool(np, "sysclk-fixed")) { + sgtl5000->sysclk = clk_get_rate(sgtl5000->mclk); + sgtl5000->sysclk_fixed = 1; + dev_dbg(&client->dev, + "sysclk-fixed: setting sysclk to fixed value %d\n", + sgtl5000->sysclk); + } }
sgtl5000->lrclk_strength = I2S_LRCLK_STRENGTH_LOW; -- 2.11.0