diff options
author | mason.huo <mason.huo@starfivetech.com> | 2022-06-23 13:36:40 +0300 |
---|---|---|
committer | mason.huo <mason.huo@starfivetech.com> | 2022-06-24 05:46:44 +0300 |
commit | bd7aab33423ada46459c5d60bbbed1991e91316c (patch) | |
tree | 1a1f7f7229e1c881450e34fca20552db100ecc11 | |
parent | a98088db227a17adee5396f8a171a47d2accf6e5 (diff) | |
download | linux-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.c | 20 |
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"); |