ASoC: make clock direction configurable in asoc-simple
authorVitaly Wool <vitalywool@gmail.com>
Thu, 17 Aug 2017 11:42:36 +0000 (13:42 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 1 Sep 2017 10:34:23 +0000 (11:34 +0100)
Some CPU drivers (e. g. davinci-mcasp) may require the system clock to
be configured as OUT, while there's no good way currently to set
SND_SOC_CLK_OUT in simple-soc driver if the clock is fixed-rate.

This patch makes asoc_simple_card_init_dai() initialize clock to
SND_SOCK_CLK_OUT if explicitly stated in the relevant dts file. This
change is transparent and doesn't change the default behavior.

Signed-off-by: Vitaly Wool <vitaly.wool@konsulko.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/simple-card.txt
include/sound/simple_card_utils.h
sound/soc/generic/simple-card-utils.c

index c7a93931fad27c7d88069925ae5125434f3e8f74..166f2290233b2f55f11dabe42ea9362e0697e30d 100644 (file)
@@ -86,6 +86,9 @@ Optional CPU/CODEC subnodes properties:
                                          in dai startup() and disabled with
                                          clk_disable_unprepare() in dai
                                          shutdown().
+- system-clock-direction-out           : specifies clock direction as 'out' on
+                                         initialization. It is useful for some aCPUs with
+                                         fixed clocks.
 
 Example 1 - single DAI link:
 
index 42c6a6ac3ce60d6ab81fc4e726e6dfe0129804ff..7e25afce6566fe315496979c9da9f6176d3fae20 100644 (file)
@@ -15,6 +15,7 @@
 struct asoc_simple_dai {
        const char *name;
        unsigned int sysclk;
+       int clk_direction;
        int slots;
        int slot_width;
        unsigned int tx_slot_mask;
index 26d64fa40c9cf1438f43a08d8f45b15ac0184fa9..af44c8c52a1954304ce2ffe37516157d9fe91dd5 100644 (file)
@@ -196,7 +196,11 @@ int asoc_simple_card_parse_clk(struct device *dev,
                        simple_dai->sysclk = clk_get_rate(clk);
        }
 
-       dev_dbg(dev, "%s : sysclk = %d\n", name, simple_dai->sysclk);
+       if (of_property_read_bool(node, "system-clock-direction-out"))
+               simple_dai->clk_direction = SND_SOC_CLOCK_OUT;
+
+       dev_dbg(dev, "%s : sysclk = %d, direction %d\n", name,
+               simple_dai->sysclk, simple_dai->clk_direction);
 
        return 0;
 }
@@ -310,7 +314,8 @@ int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
        int ret;
 
        if (simple_dai->sysclk) {
-               ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk, 0);
+               ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk,
+                                            simple_dai->clk_direction);
                if (ret && ret != -ENOTSUPP) {
                        dev_err(dai->dev, "simple-card: set_sysclk error\n");
                        return ret;