summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormason.huo <mason.huo@starfivetech.com>2022-06-23 13:36:40 +0300
committermason.huo <mason.huo@starfivetech.com>2022-06-24 05:46:44 +0300
commitbd7aab33423ada46459c5d60bbbed1991e91316c (patch)
tree1a1f7f7229e1c881450e34fca20552db100ecc11
parenta98088db227a17adee5396f8a171a47d2accf6e5 (diff)
downloadlinux-bd7aab33423ada46459c5d60bbbed1991e91316c.tar.xz
usb: cdns3: Set the USB_125M clock explicitly
Since the USB_125M clock is divided from pll0 clock, and the pll0 clock changes per the cpu frequency. So, needs to set the clock explicitly. Signed-off-by: mason.huo <mason.huo@starfivetech.com>
-rw-r--r--drivers/usb/cdns3/cdns3-starfive.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/usb/cdns3/cdns3-starfive.c b/drivers/usb/cdns3/cdns3-starfive.c
index a2cfefea0130..7adadc59d20e 100644
--- a/drivers/usb/cdns3/cdns3-starfive.c
+++ b/drivers/usb/cdns3/cdns3-starfive.c
@@ -53,6 +53,8 @@
#define PCIE_USB3_PHY_ENABLE_SHIFT 0x4U
#define PCIE_USB3_PHY_ENABLE_MASK 0x10U
+#define USB_125M_CLK_RATE 125000000
+
struct cdns_starfive {
struct device *dev;
struct regmap *stg_syscon;
@@ -60,6 +62,7 @@ struct cdns_starfive {
struct reset_control *resets;
struct clk_bulk_data *clks;
int num_clks;
+ struct clk *usb_125m_clk;
u32 sys_offset;
u32 stg_offset_4;
u32 stg_offset_196;
@@ -142,12 +145,29 @@ static int cdns_clk_rst_init(struct cdns_starfive *data)
{
int ret;
+ data->usb_125m_clk = devm_clk_get(data->dev, "125m");
+ if (IS_ERR(data->usb_125m_clk)) {
+ dev_err(data->dev, "Failed to get usb 125m clock\n");
+ ret = PTR_ERR(data->usb_125m_clk);
+ goto exit;
+ }
+
data->num_clks = devm_clk_bulk_get_all(data->dev, &data->clks);
if (data->num_clks < 0) {
dev_err(data->dev, "Failed to get usb clocks\n");
ret = -ENODEV;
goto exit;
}
+
+ /* Needs to set the USB_125M clock explicitly,
+ * since it's divided from pll0 clock, and the pll0 clock
+ * changes per the cpu frequency.
+ */
+ ret = clk_set_rate(data->usb_125m_clk, USB_125M_CLK_RATE);
+ if (ret) {
+ dev_err(data->dev, "Failed to set usb 125m clock\n");
+ goto exit;
+ }
ret = clk_bulk_prepare_enable(data->num_clks, data->clks);
if (ret) {
dev_err(data->dev, "Failed to enable clocks\n");