Skip to content

Commit a728f56

Browse files
vwoolbroonie
authored andcommitted
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 <[email protected]> Signed-off-by: Mark Brown <[email protected]>
1 parent 0995fb7 commit a728f56

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

Documentation/devicetree/bindings/sound/simple-card.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ Optional CPU/CODEC subnodes properties:
8686
in dai startup() and disabled with
8787
clk_disable_unprepare() in dai
8888
shutdown().
89+
- system-clock-direction-out : specifies clock direction as 'out' on
90+
initialization. It is useful for some aCPUs with
91+
fixed clocks.
8992

9093
Example 1 - single DAI link:
9194

include/sound/simple_card_utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
struct asoc_simple_dai {
1616
const char *name;
1717
unsigned int sysclk;
18+
int clk_direction;
1819
int slots;
1920
int slot_width;
2021
unsigned int tx_slot_mask;

sound/soc/generic/simple-card-utils.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,11 @@ int asoc_simple_card_parse_clk(struct device *dev,
196196
simple_dai->sysclk = clk_get_rate(clk);
197197
}
198198

199-
dev_dbg(dev, "%s : sysclk = %d\n", name, simple_dai->sysclk);
199+
if (of_property_read_bool(node, "system-clock-direction-out"))
200+
simple_dai->clk_direction = SND_SOC_CLOCK_OUT;
201+
202+
dev_dbg(dev, "%s : sysclk = %d, direction %d\n", name,
203+
simple_dai->sysclk, simple_dai->clk_direction);
200204

201205
return 0;
202206
}
@@ -310,7 +314,8 @@ int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
310314
int ret;
311315

312316
if (simple_dai->sysclk) {
313-
ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk, 0);
317+
ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk,
318+
simple_dai->clk_direction);
314319
if (ret && ret != -ENOTSUPP) {
315320
dev_err(dai->dev, "simple-card: set_sysclk error\n");
316321
return ret;

0 commit comments

Comments
 (0)