The RPM clock controller manages clocks shared between the application
processor and the RPM firmware, including fabric and bus clocks required
by several peripherals.

With the RPM clock controller now available in the device tree, the USB
controller must explicitly declare its dependency on
RPM_DAYTONA_FABRIC_CLK. Without this declaration, the clock framework
would consider it unused and disable it, breaking USB functionality.

This also corrects the previous misuse of USB_HS1_XCVR_CLK as the core
clock. The XCVR clock is in fact used for PHY/reset handling rather than
as the main core clock.

A similar issue has been observed on APQ8064, where missing the RPM
fabric clock dependency leads to broken USB.

Signed-off-by: Antony Kurniawan Soemardi <[email protected]>
---
 arch/arm/boot/dts/qcom/qcom-msm8960.dtsi | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi 
b/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
index 
fd28401cebb5e15cf9eb5bfdeff29d7b0c580b1a..1d5e97b6aa4bdfe98469a51d25984429e5c3be5f
 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
@@ -5,6 +5,7 @@
 #include <dt-bindings/clock/qcom,gcc-msm8960.h>
 #include <dt-bindings/reset/qcom,gcc-msm8960.h>
 #include <dt-bindings/clock/qcom,lcc-msm8960.h>
+#include <dt-bindings/clock/qcom,rpmcc.h>
 #include <dt-bindings/mfd/qcom-rpm.h>
 #include <dt-bindings/soc/qcom,gsbi.h>
 
@@ -98,6 +99,13 @@ rpm: rpm@108000 {
                        interrupt-names = "ack",
                                          "err",
                                          "wakeup";
+
+                       rpmcc: clock-controller {
+                               compatible = "qcom,rpmcc-msm8960", "qcom,rpmcc";
+                               #clock-cells = <1>;
+                               clocks = <&pxo_board>, <&cxo_board>;
+                               clock-names = "pxo", "cxo";
+                       };
                };
 
                ssbi: ssbi@500000 {
@@ -507,8 +515,12 @@ usb1: usb@12500000 {
                        reg = <0x12500000 0x200>,
                              <0x12500200 0x200>;
                        interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&gcc USB_HS1_XCVR_CLK>, <&gcc USB_HS1_H_CLK>;
-                       clock-names = "core", "iface";
+                       clocks = <&rpmcc RPM_DAYTONA_FABRIC_CLK>,
+                                <&gcc USB_HS1_H_CLK>,
+                                <&gcc USB_HS1_XCVR_CLK>;
+                       clock-names = "core",
+                                     "iface",
+                                     "fs";
                        assigned-clocks = <&gcc USB_HS1_XCVR_CLK>;
                        assigned-clock-rates = <60000000>;
                        resets = <&gcc USB_HS1_RESET>;

-- 
2.34.1


Reply via email to