diff options
Diffstat (limited to 'sound/soc/sh/rcar/adg.c')
-rw-r--r-- | sound/soc/sh/rcar/adg.c | 57 |
1 files changed, 21 insertions, 36 deletions
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index 69c44269ebdb..fc41a0e8b09f 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c | |||
@@ -57,6 +57,24 @@ static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io) | |||
57 | return (0x6 + ws) << 8; | 57 | return (0x6 + ws) << 8; |
58 | } | 58 | } |
59 | 59 | ||
60 | int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_dai *rdai, | ||
61 | struct rsnd_mod *mod, | ||
62 | struct rsnd_dai_stream *io) | ||
63 | { | ||
64 | int id = rsnd_mod_id(mod); | ||
65 | int shift = (id % 2) ? 16 : 0; | ||
66 | u32 mask, val; | ||
67 | |||
68 | val = rsnd_adg_ssi_ws_timing_gen2(io); | ||
69 | |||
70 | val = val << shift; | ||
71 | mask = 0xffff << shift; | ||
72 | |||
73 | rsnd_mod_bset(mod, CMDOUT_TIMSEL, mask, val); | ||
74 | |||
75 | return 0; | ||
76 | } | ||
77 | |||
60 | static int rsnd_adg_set_src_timsel_gen2(struct rsnd_dai *rdai, | 78 | static int rsnd_adg_set_src_timsel_gen2(struct rsnd_dai *rdai, |
61 | struct rsnd_mod *mod, | 79 | struct rsnd_mod *mod, |
62 | struct rsnd_dai_stream *io, | 80 | struct rsnd_dai_stream *io, |
@@ -397,9 +415,8 @@ int rsnd_adg_probe(struct platform_device *pdev, | |||
397 | { | 415 | { |
398 | struct rsnd_adg *adg; | 416 | struct rsnd_adg *adg; |
399 | struct device *dev = rsnd_priv_to_dev(priv); | 417 | struct device *dev = rsnd_priv_to_dev(priv); |
400 | struct clk *clk, *clk_orig; | 418 | struct clk *clk; |
401 | int i; | 419 | int i; |
402 | bool use_old_style = false; | ||
403 | 420 | ||
404 | adg = devm_kzalloc(dev, sizeof(*adg), GFP_KERNEL); | 421 | adg = devm_kzalloc(dev, sizeof(*adg), GFP_KERNEL); |
405 | if (!adg) { | 422 | if (!adg) { |
@@ -407,45 +424,13 @@ int rsnd_adg_probe(struct platform_device *pdev, | |||
407 | return -ENOMEM; | 424 | return -ENOMEM; |
408 | } | 425 | } |
409 | 426 | ||
410 | clk_orig = devm_clk_get(dev, NULL); | ||
411 | adg->clk[CLKA] = devm_clk_get(dev, "clk_a"); | 427 | adg->clk[CLKA] = devm_clk_get(dev, "clk_a"); |
412 | adg->clk[CLKB] = devm_clk_get(dev, "clk_b"); | 428 | adg->clk[CLKB] = devm_clk_get(dev, "clk_b"); |
413 | adg->clk[CLKC] = devm_clk_get(dev, "clk_c"); | 429 | adg->clk[CLKC] = devm_clk_get(dev, "clk_c"); |
414 | adg->clk[CLKI] = devm_clk_get(dev, "clk_i"); | 430 | adg->clk[CLKI] = devm_clk_get(dev, "clk_i"); |
415 | 431 | ||
416 | /* | 432 | for_each_rsnd_clk(clk, adg, i) |
417 | * It request device dependent audio clock. | 433 | dev_dbg(dev, "clk %d : %p\n", i, clk); |
418 | * But above all clks will indicate rsnd module clock | ||
419 | * if platform doesn't it | ||
420 | */ | ||
421 | for_each_rsnd_clk(clk, adg, i) { | ||
422 | if (clk_orig == clk) { | ||
423 | dev_warn(dev, | ||
424 | "doesn't have device dependent clock, use independent clock\n"); | ||
425 | use_old_style = true; | ||
426 | break; | ||
427 | } | ||
428 | } | ||
429 | |||
430 | /* | ||
431 | * note: | ||
432 | * these exist in order to keep compatible with | ||
433 | * platform which has device independent audio clock, | ||
434 | * but will be removed soon | ||
435 | */ | ||
436 | if (use_old_style) { | ||
437 | adg->clk[CLKA] = devm_clk_get(NULL, "audio_clk_a"); | ||
438 | adg->clk[CLKB] = devm_clk_get(NULL, "audio_clk_b"); | ||
439 | adg->clk[CLKC] = devm_clk_get(NULL, "audio_clk_c"); | ||
440 | adg->clk[CLKI] = devm_clk_get(NULL, "audio_clk_internal"); | ||
441 | } | ||
442 | |||
443 | for_each_rsnd_clk(clk, adg, i) { | ||
444 | if (IS_ERR(clk)) { | ||
445 | dev_err(dev, "Audio clock failed\n"); | ||
446 | return -EIO; | ||
447 | } | ||
448 | } | ||
449 | 434 | ||
450 | rsnd_adg_ssi_clk_init(priv, adg); | 435 | rsnd_adg_ssi_clk_init(priv, adg); |
451 | 436 | ||