Browse Source

ASoC: make clock direction configurable in asoc-simple

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>
Vitaly Wool 8 years ago
parent
commit
a728f56094

+ 3 - 0
Documentation/devicetree/bindings/sound/simple-card.txt

@@ -86,6 +86,9 @@ Optional CPU/CODEC subnodes properties:
 					  in dai startup() and disabled with
 					  in dai startup() and disabled with
 					  clk_disable_unprepare() in dai
 					  clk_disable_unprepare() in dai
 					  shutdown().
 					  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:
 Example 1 - single DAI link:
 
 

+ 1 - 0
include/sound/simple_card_utils.h

@@ -15,6 +15,7 @@
 struct asoc_simple_dai {
 struct asoc_simple_dai {
 	const char *name;
 	const char *name;
 	unsigned int sysclk;
 	unsigned int sysclk;
+	int clk_direction;
 	int slots;
 	int slots;
 	int slot_width;
 	int slot_width;
 	unsigned int tx_slot_mask;
 	unsigned int tx_slot_mask;

+ 7 - 2
sound/soc/generic/simple-card-utils.c

@@ -196,7 +196,11 @@ int asoc_simple_card_parse_clk(struct device *dev,
 			simple_dai->sysclk = clk_get_rate(clk);
 			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;
 	return 0;
 }
 }
@@ -310,7 +314,8 @@ int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
 	int ret;
 	int ret;
 
 
 	if (simple_dai->sysclk) {
 	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) {
 		if (ret && ret != -ENOTSUPP) {
 			dev_err(dai->dev, "simple-card: set_sysclk error\n");
 			dev_err(dai->dev, "simple-card: set_sysclk error\n");
 			return ret;
 			return ret;