Allow xhci-plat using a second clock
Subsystems (3)
v2 cover Allow xhci-plat using a second clock
Hello,
The purpose of this series is to allow xhci-plat using a second clock. It is needed on the Armada 7K/8K but could be used by other SoCs.
The first patch is just an other fix found while I was working on this feature.
Thanks,
Gregory
Changelog:
v1 -> v2:
- Rebased on v4.17-rc1
Gregory CLEMENT (2):
usb: host: xhci-plat: Remove useless test before clk_disable_unprepare
usb: host: xhci-plat: Fix clock resource by adding a register clock
Documentation/devicetree/bindings/usb/usb-xhci.txt | 5 +++- drivers/usb/host/xhci-plat.c | 31 ++++++++++++++++------ drivers/usb/host/xhci.h | 3 ++- 3 files changed, 29 insertions(+), 10 deletions(-)
Signature · 1 line
2.16.3
PATCH v2 1/2 usb: host: xhci-plat: Remove useless test before clk_disable_unprepare
clk_disable_unprepare() already checks that the clock pointer is valid. No need to test it before calling it.
--- drivers/usb/host/xhci-plat.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-plat.c +2 -4
@@ -320,8 +320,7 @@ static int xhci_plat_probe(struct platform_device *pdev)usb_put_hcd (xhci->shared_hcd); disable_clk: -if (!IS_ERR (clk)) -clk_disable_unprepare (clk); +clk_disable_unprepare (clk); put_hcd:usb_put_hcd (hcd);
@@ -347,8 +346,7 @@ static int xhci_plat_remove(struct platform_device *dev)usb_remove_hcd (hcd);usb_put_hcd (xhci->shared_hcd); -if (!IS_ERR (clk)) -clk_disable_unprepare (clk); +clk_disable_unprepare (clk);usb_put_hcd (hcd);pm_runtime_set_suspended (&dev->dev);
Signature · 1 line
2.16.3
PATCH v2 2/2 usb: host: xhci-plat: Fix clock resource by adding a register clock
In reply to Gregory CLEMENTOn Armada 7K/8K we need to explicitly enable the register clock. This clock is optional because not all the SoCs using this IP need it but at least for Armada 7K/8K it is actually mandatory.
The change was done at xhci-plat level and not at a xhci-mvebu.c because, it is expected that other SoC would have this kind of constraint.
The binding documentation is updating accordingly.
--- Documentation/devicetree/bindings/usb/usb-xhci.txt | 5 ++++- drivers/usb/host/xhci-plat.c | 25 ++++++++++++++++++---- drivers/usb/host/xhci.h | 3 ++- 3 files changed, 27 insertions(+), 6 deletions(-)
Documentation/devicetree/bindings/usb/usb-xhci.txt +4 -1
@@ -28,7 +28,10 @@ Required properties: - interrupts: one XHCI interrupt should be described here. Optional properties: - - clocks: reference to a clock + - clocks: reference to the clocks + - clock-names: mandatory if there is a second clock, in this case + the name must be "core" for the first clock and "reg" for the + second one - usb2-lpm-disable: indicate if we don't want to enable USB2 HW LPM - usb3-lpm-capable: determines if platform is USB3 LPM capable - quirk-broken-port-ped: set if the controller has broken port disable mechanism
drivers/usb/host/xhci-plat.c +21 -4
@@ -157,6 +157,7 @@ static int xhci_plat_probe(struct platform_device *pdev)struct resource *res;struct usb_hcd *hcd;struct clk *clk; +struct clk *reg_clk;int ret;int irq;
@@ -226,17 +227,27 @@ static int xhci_plat_probe(struct platform_device *pdev) hcd->rsrc_len =resource_size (res);/* -* Not all platforms have a clk so it is not an error if the -* clock does not exists. +* Not all platforms have clks so it is not an error if the +* clock do not exist. */ + reg_clk =devm_clk_get (&pdev->dev,"reg" ); +if (!IS_ERR (reg_clk)) { + ret =clk_prepare_enable (reg_clk); +if (ret) + goto put_hcd; + }else if (PTR_ERR (reg_clk) == -EPROBE_DEFER ) { + ret = -EPROBE_DEFER ; + goto put_hcd; + } + clk =devm_clk_get (&pdev->dev,NULL );if (!IS_ERR (clk)) { ret =clk_prepare_enable (clk);if (ret) - goto put_hcd; + goto disable_reg_clk; }else if (PTR_ERR (clk) == -EPROBE_DEFER ) { ret = -EPROBE_DEFER ; - goto put_hcd; + goto disable_reg_clk; } xhci =hcd_to_xhci (hcd);
@@ -252,6 +263,7 @@ static int xhci_plat_probe(struct platform_device *pdev)device_wakeup_enable (hcd->self.controller); xhci->clk = clk; + xhci->reg_clk = reg_clk; xhci->main_hcd = hcd; xhci->shared_hcd =__usb_create_hcd (driver, sysdev, &pdev->dev,dev_name (&pdev->dev), hcd);
@@ -322,6 +334,9 @@ static int xhci_plat_probe(struct platform_device *pdev) disable_clk:clk_disable_unprepare (clk); +disable_reg_clk: +clk_disable_unprepare (reg_clk); + put_hcd:usb_put_hcd (hcd);
@@ -337,6 +352,7 @@ static int xhci_plat_remove(struct platform_device *dev)struct usb_hcd *hcd =platform_get_drvdata (dev);struct xhci_hcd *xhci =hcd_to_xhci (hcd);struct clk *clk = xhci->clk; +struct clk *reg_clk = xhci->reg_clk; xhci->xhc_state |=XHCI_STATE_REMOVING ;
@@ -347,6 +363,7 @@ static int xhci_plat_remove(struct platform_device *dev)usb_put_hcd (xhci->shared_hcd);clk_disable_unprepare (clk); +clk_disable_unprepare (reg_clk);usb_put_hcd (hcd);pm_runtime_set_suspended (&dev->dev);
drivers/usb/host/xhci.h +2 -1
@@ -1729,8 +1729,9 @@ struct xhci_hcd {int page_shift;/* msi-x vectors */ int msix_count; -/* optional clock */ +/* optional clocks */ struct clk *clk; +struct clk *reg_clk;/* data structures */ struct xhci_device_context_array *dcbaa;struct xhci_ring *cmd_ring;
Signature · 1 line
2.16.3