mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
UPSTREAM: usb: dwc3: add optional PHY interface clocks
On Rockchip RK3588 one of the DWC3 cores is integrated weirdly and requires two extra clocks to be enabled. Without these extra clocks hot-plugging USB devices is broken. Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Link: https://lore.kernel.org/r/20231020150022.48725-3-sebastian.reichel@collabora.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: William Wu <william.wu@rock-chips.com> (cherry picked from commit 97789b93b792fc97ad4476b79e0f38ffa8e7e0ee) Change-Id: Ib6268cb1de3560c4a5f1f1af898cb8869bb3ca4f
This commit is contained in:
committed by
Wu Liang feng
parent
ffe673b0e5
commit
ef32b29caa
@@ -853,8 +853,20 @@ static int dwc3_clk_enable(struct dwc3 *dwc)
|
||||
if (ret)
|
||||
goto disable_ref_clk;
|
||||
|
||||
ret = clk_prepare_enable(dwc->utmi_clk);
|
||||
if (ret)
|
||||
goto disable_susp_clk;
|
||||
|
||||
ret = clk_prepare_enable(dwc->pipe_clk);
|
||||
if (ret)
|
||||
goto disable_utmi_clk;
|
||||
|
||||
return 0;
|
||||
|
||||
disable_utmi_clk:
|
||||
clk_disable_unprepare(dwc->utmi_clk);
|
||||
disable_susp_clk:
|
||||
clk_disable_unprepare(dwc->susp_clk);
|
||||
disable_ref_clk:
|
||||
clk_disable_unprepare(dwc->ref_clk);
|
||||
disable_bus_clk:
|
||||
@@ -864,6 +876,8 @@ disable_bus_clk:
|
||||
|
||||
static void dwc3_clk_disable(struct dwc3 *dwc)
|
||||
{
|
||||
clk_disable_unprepare(dwc->pipe_clk);
|
||||
clk_disable_unprepare(dwc->utmi_clk);
|
||||
clk_disable_unprepare(dwc->susp_clk);
|
||||
clk_disable_unprepare(dwc->ref_clk);
|
||||
clk_disable_unprepare(dwc->bus_clk);
|
||||
@@ -1826,6 +1840,20 @@ static int dwc3_get_clocks(struct dwc3 *dwc)
|
||||
}
|
||||
}
|
||||
|
||||
/* specific to Rockchip RK3588 */
|
||||
dwc->utmi_clk = devm_clk_get_optional(dev, "utmi");
|
||||
if (IS_ERR(dwc->utmi_clk)) {
|
||||
return dev_err_probe(dev, PTR_ERR(dwc->utmi_clk),
|
||||
"could not get utmi clock\n");
|
||||
}
|
||||
|
||||
/* specific to Rockchip RK3588 */
|
||||
dwc->pipe_clk = devm_clk_get_optional(dev, "pipe");
|
||||
if (IS_ERR(dwc->pipe_clk)) {
|
||||
return dev_err_probe(dev, PTR_ERR(dwc->pipe_clk),
|
||||
"could not get pipe clock\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -990,6 +990,8 @@ struct dwc3_scratchpad_array {
|
||||
* @bus_clk: clock for accessing the registers
|
||||
* @ref_clk: reference clock
|
||||
* @susp_clk: clock used when the SS phy is in low power (S3) state
|
||||
* @utmi_clk: clock used for USB2 PHY communication
|
||||
* @pipe_clk: clock used for USB3 PHY communication
|
||||
* @reset: reset control
|
||||
* @regs: base address for our registers
|
||||
* @regs_size: address space size
|
||||
@@ -1158,6 +1160,8 @@ struct dwc3 {
|
||||
struct clk *bus_clk;
|
||||
struct clk *ref_clk;
|
||||
struct clk *susp_clk;
|
||||
struct clk *utmi_clk;
|
||||
struct clk *pipe_clk;
|
||||
|
||||
struct reset_control *reset;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user