diff options
author | Marek Vasut <marek.vasut+renesas@gmail.com> | 2017-04-20 20:41:20 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-04-21 12:51:48 -0400 |
commit | e8dffe6c2004278c588b3bb441a3dbe998a3f2e4 (patch) | |
tree | 2ae9efc7f10f342bc93ff235facea2ead65a68d3 | |
parent | 75f9e4adb56fbb8ffaab7d316f0c02df00e4b755 (diff) |
ASoC: rsnd: Fix possible NULL pointer dereference
25165f79adc76b812bfb4d8f2ab120aafb28d0e6
("ASoC: rsnd: enable clock-frequency for both 44.1kHz/48kHz")
supports both 44.1kHz/48kHz clock-frequency settings for ADG
which will be used for AUDIO_OLKOUTn.
But some board doesn't need it, thus, it is not mandatory.
But, above patch didn't care about the case of "clock-frequency" DT
property was not present.
This patch ignores ADG settings if AUDIO_OLKOUTn was not used.
Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
[Kuninori: tidyup not to break non AUDIO_OLKOUTn case]
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/sh/rcar/adg.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index faa1a4f09766..66203d107a11 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c | |||
@@ -453,13 +453,18 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, | |||
453 | [CLKI] = 0x2, | 453 | [CLKI] = 0x2, |
454 | }; | 454 | }; |
455 | 455 | ||
456 | of_property_read_u32(np, "#clock-cells", &count); | 456 | ckr = 0; |
457 | rbga = 2; /* default 1/6 */ | ||
458 | rbgb = 2; /* default 1/6 */ | ||
457 | 459 | ||
458 | /* | 460 | /* |
459 | * ADG supports BRRA/BRRB output only | 461 | * ADG supports BRRA/BRRB output only |
460 | * this means all clkout0/1/2/3 will be same rate | 462 | * this means all clkout0/1/2/3 will be same rate |
461 | */ | 463 | */ |
462 | prop = of_find_property(np, "clock-frequency", NULL); | 464 | prop = of_find_property(np, "clock-frequency", NULL); |
465 | if (!prop) | ||
466 | goto rsnd_adg_get_clkout_end; | ||
467 | |||
463 | req_size = prop->length / sizeof(u32); | 468 | req_size = prop->length / sizeof(u32); |
464 | 469 | ||
465 | of_property_read_u32_array(np, "clock-frequency", req_rate, req_size); | 470 | of_property_read_u32_array(np, "clock-frequency", req_rate, req_size); |
@@ -472,6 +477,9 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, | |||
472 | req_48kHz_rate = req_rate[i]; | 477 | req_48kHz_rate = req_rate[i]; |
473 | } | 478 | } |
474 | 479 | ||
480 | if (req_rate[0] % 48000 == 0) | ||
481 | adg->flags = AUDIO_OUT_48; | ||
482 | |||
475 | /* | 483 | /* |
476 | * This driver is assuming that AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC | 484 | * This driver is assuming that AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC |
477 | * have 44.1kHz or 48kHz base clocks for now. | 485 | * have 44.1kHz or 48kHz base clocks for now. |
@@ -481,9 +489,6 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, | |||
481 | * rsnd_adg_ssi_clk_try_start() | 489 | * rsnd_adg_ssi_clk_try_start() |
482 | * rsnd_ssi_master_clk_start() | 490 | * rsnd_ssi_master_clk_start() |
483 | */ | 491 | */ |
484 | ckr = 0; | ||
485 | rbga = 2; /* default 1/6 */ | ||
486 | rbgb = 2; /* default 1/6 */ | ||
487 | adg->rbga_rate_for_441khz = 0; | 492 | adg->rbga_rate_for_441khz = 0; |
488 | adg->rbgb_rate_for_48khz = 0; | 493 | adg->rbgb_rate_for_48khz = 0; |
489 | for_each_rsnd_clk(clk, adg, i) { | 494 | for_each_rsnd_clk(clk, adg, i) { |
@@ -528,6 +533,7 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, | |||
528 | * this means all clkout0/1/2/3 will be * same rate | 533 | * this means all clkout0/1/2/3 will be * same rate |
529 | */ | 534 | */ |
530 | 535 | ||
536 | of_property_read_u32(np, "#clock-cells", &count); | ||
531 | /* | 537 | /* |
532 | * for clkout | 538 | * for clkout |
533 | */ | 539 | */ |
@@ -557,13 +563,11 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, | |||
557 | &adg->onecell); | 563 | &adg->onecell); |
558 | } | 564 | } |
559 | 565 | ||
566 | rsnd_adg_get_clkout_end: | ||
560 | adg->ckr = ckr; | 567 | adg->ckr = ckr; |
561 | adg->rbga = rbga; | 568 | adg->rbga = rbga; |
562 | adg->rbgb = rbgb; | 569 | adg->rbgb = rbgb; |
563 | 570 | ||
564 | if (req_rate[0] % 48000 == 0) | ||
565 | adg->flags = AUDIO_OUT_48; | ||
566 | |||
567 | for_each_rsnd_clkout(clk, adg, i) | 571 | for_each_rsnd_clkout(clk, adg, i) |
568 | dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk)); | 572 | dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk)); |
569 | dev_dbg(dev, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n", | 573 | dev_dbg(dev, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n", |