MLK-23783-1 imx8: clock: Set rate for USB3 clocks
authorYe Li <ye.li@nxp.com>
Mon, 13 Apr 2020 15:10:41 +0000 (08:10 -0700)
committerYe Li <ye.li@nxp.com>
Thu, 29 Apr 2021 10:25:57 +0000 (03:25 -0700)
Current codes depend on default clock setting on SCFW, but on QXP c0, the
USB3 BUS clock requires a lower clock at 250Mhz. Found USB TRB error on
8DX (QXP c0), if we use default 500Mhz bus clock.

Per SCFW suggestion, SW should be responsible for setting up these clocks
not depending on SCFW. So adding the clock set rate for all USB3 clocks

Signed-off-by: Ye Li <ye.li@nxp.com>
Reviewe-by: Peng Fan <peng.fan@nxp.com>
(cherry picked from commit 601da3c130fc6b0a864645009cf50c2d4a884d39)
(cherry picked from commit 04cf5746dc0dd8c31902c783c93d2031caf17a6f)

arch/arm/mach-imx/imx8/clock.c

index d63f6e8..4eb22ce 100644 (file)
@@ -223,6 +223,40 @@ void enable_usboh3_clk(unsigned char enable)
 void init_clk_usb3(int index)
 {
        sc_err_t err;
+       sc_pm_clock_rate_t rate;
+
+       err = sc_pm_clock_enable(-1, SC_R_USB_2, SC_PM_CLK_MISC, false, false);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set clock failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
+
+       err = sc_pm_clock_enable(-1, SC_R_USB_2, SC_PM_CLK_MST_BUS, false, false);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set clock failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
+
+       err = sc_pm_clock_enable(-1, SC_R_USB_2, SC_PM_CLK_PER, false, false);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set clock failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
+
+       rate = 12000000;
+       err = sc_pm_set_clock_rate(-1, SC_R_USB_2, SC_PM_CLK_MISC, &rate);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set MISC clock rate failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
+
+       rate = 250000000;
+       err = sc_pm_set_clock_rate(-1, SC_R_USB_2, SC_PM_CLK_MST_BUS, &rate);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set BUS clock rate failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
+
+       rate = 125000000;
+       err = sc_pm_set_clock_rate(-1, SC_R_USB_2, SC_PM_CLK_PER, &rate);
+       if (err != SC_ERR_NONE)
+               printf("USB3 set PER clock rate failed!, line=%d (error = %d)\n",
+                       __LINE__, err);
 
        err = sc_pm_clock_enable(-1, SC_R_USB_2, SC_PM_CLK_MISC, true, false);
        if (err != SC_ERR_NONE)