usb: host: xhci-plat: get optional clock by devm_clk_get_optional()
authorChunfeng Yun <chunfeng.yun@mediatek.com>
Wed, 17 Apr 2019 08:28:17 +0000 (16:28 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 19 Apr 2019 12:24:25 +0000 (14:24 +0200)
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>
drivers/usb/host/xhci-plat.c

index 0ac4ec975547f0e84b59e1c03c5e03ee5f146778..998241f5fce36ce656e5f9de26d1fcf7294d5fd5 100644 (file)
@@ -165,8 +165,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
        struct xhci_hcd         *xhci;
        struct resource         *res;
        struct usb_hcd          *hcd;
-       struct clk              *clk;
-       struct clk              *reg_clk;
        int                     ret;
        int                     irq;
 
@@ -235,31 +233,32 @@ static int xhci_plat_probe(struct platform_device *pdev)
        hcd->rsrc_start = res->start;
        hcd->rsrc_len = resource_size(res);
 
+       xhci = hcd_to_xhci(hcd);
+
        /*
         * 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;
+       xhci->reg_clk = devm_clk_get_optional(&pdev->dev, "reg");
+       if (IS_ERR(xhci->reg_clk)) {
+               ret = PTR_ERR(xhci->reg_clk);
                goto put_hcd;
        }
 
-       clk = devm_clk_get(&pdev->dev, NULL);
-       if (!IS_ERR(clk)) {
-               ret = clk_prepare_enable(clk);
-               if (ret)
-                       goto disable_reg_clk;
-       } else if (PTR_ERR(clk) == -EPROBE_DEFER) {
-               ret = -EPROBE_DEFER;
+       ret = clk_prepare_enable(xhci->reg_clk);
+       if (ret)
+               goto put_hcd;
+
+       xhci->clk = devm_clk_get_optional(&pdev->dev, NULL);
+       if (IS_ERR(xhci->clk)) {
+               ret = PTR_ERR(xhci->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);
        if (priv_match) {
                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);
 
-       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);
@@ -348,10 +345,10 @@ put_usb3_hcd:
        usb_put_hcd(xhci->shared_hcd);
 
 disable_clk:
-       clk_disable_unprepare(clk);
+       clk_disable_unprepare(xhci->clk);
 
 disable_reg_clk:
-       clk_disable_unprepare(reg_clk);
+       clk_disable_unprepare(xhci->reg_clk);
 
 put_hcd:
        usb_put_hcd(hcd);