aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut+renesas@gmail.com>2017-04-20 20:41:20 -0400
committerMark Brown <broonie@kernel.org>2017-04-21 12:51:48 -0400
commite8dffe6c2004278c588b3bb441a3dbe998a3f2e4 (patch)
tree2ae9efc7f10f342bc93ff235facea2ead65a68d3
parent75f9e4adb56fbb8ffaab7d316f0c02df00e4b755 (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.c18
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
566rsnd_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",