MLK-17190 driver: soc: Fix audio bus mode clock rate on imx8mq
authorBai Ping <ping.bai@nxp.com>
Wed, 13 Dec 2017 05:18:42 +0000 (13:18 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Tue, 20 Mar 2018 19:51:26 +0000 (14:51 -0500)
If the system is currently in low bus mode, if the audio device
request the audio bus mode, the NOC, AHB and AXI bus clock rate
will be set wrongly, then bus will run at very low frequency, then
lead to audio playback underrun.

Signed-off-by: Bai Ping <ping.bai@nxp.com>
Tested-by: Anson Huang <anson.huang@nxp.com>
drivers/soc/imx/busfreq-imx8mq.c

index 3f11600..cba7970 100644 (file)
@@ -113,40 +113,44 @@ static void reduce_bus_freq(void)
         * in the future if needed.
         */
        if (audio_bus_count) {
-               clk_prepare_enable(sys1_pll_100m);
-
-               update_bus_freq(LOW_BUS_FREQ_100MTS);
-
-               /* correct the clock tree info */
-               clk_disable_unprepare(sys1_pll_100m);
-               clk_set_parent(dram_alt_src, sys1_pll_100m);
-               clk_set_parent(dram_core_clk, dram_alt_root);
-               clk_set_parent(dram_apb_src, sys1_pll_40m);
-               clk_set_rate(dram_apb_pre_div, 20000000);
-               /* reduce the NOC & bus clock */
-               clk_set_rate(noc_div, clk_get_rate(noc_div) / 8);
-               clk_set_rate(ahb_div, clk_get_rate(ahb_div) / 6);
-               clk_set_parent(main_axi_src, osc_25m);
+               if (cur_bus_freq_mode == BUS_FREQ_HIGH) {
+                       clk_prepare_enable(sys1_pll_100m);
+
+                       update_bus_freq(LOW_BUS_FREQ_100MTS);
+
+                       /* correct the clock tree info */
+                       clk_disable_unprepare(sys1_pll_100m);
+                       clk_set_parent(dram_alt_src, sys1_pll_100m);
+                       clk_set_parent(dram_core_clk, dram_alt_root);
+                       clk_set_parent(dram_apb_src, sys1_pll_40m);
+                       clk_set_rate(dram_apb_pre_div, 20000000);
+                       /* reduce the NOC & bus clock */
+                       clk_set_rate(noc_div, clk_get_rate(noc_div) / 8);
+                       clk_set_rate(ahb_div, clk_get_rate(ahb_div) / 6);
+                       clk_set_parent(main_axi_src, osc_25m);
+               }
 
                low_bus_freq_mode = 0;
                audio_bus_freq_mode = 1;
                cur_bus_freq_mode = BUS_FREQ_AUDIO;
        } else {
-               clk_prepare_enable(sys1_pll_100m);
-
-               update_bus_freq(LOW_BUS_FREQ_100MTS);
-
-               /* correct the clock tree info */
-               clk_disable_unprepare(sys1_pll_100m);
-               clk_set_parent(dram_alt_src, sys1_pll_100m);
-               clk_set_parent(dram_core_clk, dram_alt_root);
-               clk_set_parent(dram_apb_src, sys1_pll_40m);
-               clk_set_rate(dram_apb_pre_div, 20000000);
-               clk_prepare_enable(sys1_pll_400m);
-               /* reduce the NOC & bus clock */
-               clk_set_rate(noc_div, clk_get_rate(noc_div) / 8);
-               clk_set_rate(ahb_div, clk_get_rate(ahb_div) / 6);
-               clk_set_parent(main_axi_src, osc_25m);
+               if (cur_bus_freq_mode == BUS_FREQ_HIGH) {
+                       clk_prepare_enable(sys1_pll_100m);
+
+                       update_bus_freq(LOW_BUS_FREQ_100MTS);
+
+                       /* correct the clock tree info */
+                       clk_disable_unprepare(sys1_pll_100m);
+                       clk_set_parent(dram_alt_src, sys1_pll_100m);
+                       clk_set_parent(dram_core_clk, dram_alt_root);
+                       clk_set_parent(dram_apb_src, sys1_pll_40m);
+                       clk_set_rate(dram_apb_pre_div, 20000000);
+                       clk_prepare_enable(sys1_pll_400m);
+                       /* reduce the NOC & bus clock */
+                       clk_set_rate(noc_div, clk_get_rate(noc_div) / 8);
+                       clk_set_rate(ahb_div, clk_get_rate(ahb_div) / 6);
+                       clk_set_parent(main_axi_src, osc_25m);
+               }
 
                low_bus_freq_mode = 1;
                audio_bus_freq_mode = 0;