Commit 08048c04 authored by Chunfeng Yun's avatar Chunfeng Yun Committed by Greg Kroah-Hartman

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: default avatarChunfeng Yun <chunfeng.yun@mediatek.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9d918dce
...@@ -165,8 +165,6 @@ static int xhci_plat_probe(struct platform_device *pdev) ...@@ -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) ...@@ -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) ...@@ -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 @@ static int xhci_plat_probe(struct platform_device *pdev) ...@@ -348,10 +345,10 @@ static int xhci_plat_probe(struct platform_device *pdev)
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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment