usb: host: xhci-plat: get optional clock by devm_clk_get_optional()
When the driver tries to get optional clock, it ignores all errors except -EPROBE_DEFER, but if only ignores -ENOENT, it will cover some real errors, such as -ENOMEM, so use devm_clk_get_optional() to get optional clock. Cc: Mathias Nyman <mathias.nyman@intel.com> Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
9d918dcea0
commit
08048c04cc
@@ -165,8 +165,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
|||||||
struct xhci_hcd *xhci;
|
struct xhci_hcd *xhci;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
struct usb_hcd *hcd;
|
struct usb_hcd *hcd;
|
||||||
struct clk *clk;
|
|
||||||
struct clk *reg_clk;
|
|
||||||
int ret;
|
int ret;
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
@@ -235,31 +233,32 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
|||||||
hcd->rsrc_start = res->start;
|
hcd->rsrc_start = res->start;
|
||||||
hcd->rsrc_len = resource_size(res);
|
hcd->rsrc_len = resource_size(res);
|
||||||
|
|
||||||
|
xhci = hcd_to_xhci(hcd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not all platforms have clks so it is not an error if the
|
* Not all platforms have clks so it is not an error if the
|
||||||
* clock do not exist.
|
* clock do not exist.
|
||||||
*/
|
*/
|
||||||
reg_clk = devm_clk_get(&pdev->dev, "reg");
|
xhci->reg_clk = devm_clk_get_optional(&pdev->dev, "reg");
|
||||||
if (!IS_ERR(reg_clk)) {
|
if (IS_ERR(xhci->reg_clk)) {
|
||||||
ret = clk_prepare_enable(reg_clk);
|
ret = PTR_ERR(xhci->reg_clk);
|
||||||
if (ret)
|
|
||||||
goto put_hcd;
|
|
||||||
} else if (PTR_ERR(reg_clk) == -EPROBE_DEFER) {
|
|
||||||
ret = -EPROBE_DEFER;
|
|
||||||
goto put_hcd;
|
goto put_hcd;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = devm_clk_get(&pdev->dev, NULL);
|
ret = clk_prepare_enable(xhci->reg_clk);
|
||||||
if (!IS_ERR(clk)) {
|
if (ret)
|
||||||
ret = clk_prepare_enable(clk);
|
goto put_hcd;
|
||||||
if (ret)
|
|
||||||
goto disable_reg_clk;
|
xhci->clk = devm_clk_get_optional(&pdev->dev, NULL);
|
||||||
} else if (PTR_ERR(clk) == -EPROBE_DEFER) {
|
if (IS_ERR(xhci->clk)) {
|
||||||
ret = -EPROBE_DEFER;
|
ret = PTR_ERR(xhci->clk);
|
||||||
goto disable_reg_clk;
|
goto disable_reg_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
xhci = hcd_to_xhci(hcd);
|
ret = clk_prepare_enable(xhci->clk);
|
||||||
|
if (ret)
|
||||||
|
goto disable_reg_clk;
|
||||||
|
|
||||||
priv_match = of_device_get_match_data(&pdev->dev);
|
priv_match = of_device_get_match_data(&pdev->dev);
|
||||||
if (priv_match) {
|
if (priv_match) {
|
||||||
struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
|
struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
|
||||||
@@ -271,8 +270,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
device_wakeup_enable(hcd->self.controller);
|
device_wakeup_enable(hcd->self.controller);
|
||||||
|
|
||||||
xhci->clk = clk;
|
|
||||||
xhci->reg_clk = reg_clk;
|
|
||||||
xhci->main_hcd = hcd;
|
xhci->main_hcd = hcd;
|
||||||
xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
|
xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
|
||||||
dev_name(&pdev->dev), hcd);
|
dev_name(&pdev->dev), hcd);
|
||||||
@@ -348,10 +345,10 @@ put_usb3_hcd:
|
|||||||
usb_put_hcd(xhci->shared_hcd);
|
usb_put_hcd(xhci->shared_hcd);
|
||||||
|
|
||||||
disable_clk:
|
disable_clk:
|
||||||
clk_disable_unprepare(clk);
|
clk_disable_unprepare(xhci->clk);
|
||||||
|
|
||||||
disable_reg_clk:
|
disable_reg_clk:
|
||||||
clk_disable_unprepare(reg_clk);
|
clk_disable_unprepare(xhci->reg_clk);
|
||||||
|
|
||||||
put_hcd:
|
put_hcd:
|
||||||
usb_put_hcd(hcd);
|
usb_put_hcd(hcd);
|
||||||
|
Reference in New Issue
Block a user