long rate;
        int ret;
 
-       if (IS_ERR(d->clk))
-               goto out;
-
        clk_disable_unprepare(d->clk);
        rate = clk_round_rate(d->clk, baud * 16);
        if (rate < 0)
                ret = clk_set_rate(d->clk, rate);
        clk_prepare_enable(d->clk);
 
-       if (!ret)
-               p->uartclk = rate;
+       if (ret)
+               goto out;
+
+       p->uartclk = rate;
 
 out:
        p->status &= ~UPSTAT_AUTOCTS;
        device_property_read_u32(dev, "clock-frequency", &p->uartclk);
 
        /* If there is separate baudclk, get the rate from it. */
-       data->clk = devm_clk_get(dev, "baudclk");
-       if (IS_ERR(data->clk) && PTR_ERR(data->clk) != -EPROBE_DEFER)
-               data->clk = devm_clk_get(dev, NULL);
-       if (IS_ERR(data->clk) && PTR_ERR(data->clk) == -EPROBE_DEFER)
-               return -EPROBE_DEFER;
-       if (!IS_ERR_OR_NULL(data->clk)) {
-               err = clk_prepare_enable(data->clk);
-               if (err)
-                       dev_warn(dev, "could not enable optional baudclk: %d\n",
-                                err);
-               else
-                       p->uartclk = clk_get_rate(data->clk);
-       }
+       data->clk = devm_clk_get_optional(dev, "baudclk");
+       if (data->clk == NULL)
+               data->clk = devm_clk_get_optional(dev, NULL);
+       if (IS_ERR(data->clk))
+               return PTR_ERR(data->clk);
+
+       err = clk_prepare_enable(data->clk);
+       if (err)
+               dev_warn(dev, "could not enable optional baudclk: %d\n", err);
+
+       if (data->clk)
+               p->uartclk = clk_get_rate(data->clk);
 
        /* If no clock rate is defined, fail. */
        if (!p->uartclk) {
                goto err_clk;
        }
 
-       data->pclk = devm_clk_get(dev, "apb_pclk");
-       if (IS_ERR(data->pclk) && PTR_ERR(data->pclk) == -EPROBE_DEFER) {
-               err = -EPROBE_DEFER;
+       data->pclk = devm_clk_get_optional(dev, "apb_pclk");
+       if (IS_ERR(data->pclk)) {
+               err = PTR_ERR(data->pclk);
                goto err_clk;
        }
-       if (!IS_ERR(data->pclk)) {
-               err = clk_prepare_enable(data->pclk);
-               if (err) {
-                       dev_err(dev, "could not enable apb_pclk\n");
-                       goto err_clk;
-               }
+
+       err = clk_prepare_enable(data->pclk);
+       if (err) {
+               dev_err(dev, "could not enable apb_pclk\n");
+               goto err_clk;
        }
 
        data->rst = devm_reset_control_get_optional_exclusive(dev, NULL);
        reset_control_assert(data->rst);
 
 err_pclk:
-       if (!IS_ERR(data->pclk))
-               clk_disable_unprepare(data->pclk);
+       clk_disable_unprepare(data->pclk);
 
 err_clk:
-       if (!IS_ERR(data->clk))
-               clk_disable_unprepare(data->clk);
+       clk_disable_unprepare(data->clk);
 
        return err;
 }
 
        reset_control_assert(data->rst);
 
-       if (!IS_ERR(data->pclk))
-               clk_disable_unprepare(data->pclk);
+       clk_disable_unprepare(data->pclk);
 
-       if (!IS_ERR(data->clk))
-               clk_disable_unprepare(data->clk);
+       clk_disable_unprepare(data->clk);
 
        pm_runtime_disable(dev);
        pm_runtime_put_noidle(dev);
 {
        struct dw8250_data *data = dev_get_drvdata(dev);
 
-       if (!IS_ERR(data->clk))
-               clk_disable_unprepare(data->clk);
+       clk_disable_unprepare(data->clk);
 
-       if (!IS_ERR(data->pclk))
-               clk_disable_unprepare(data->pclk);
+       clk_disable_unprepare(data->pclk);
 
        return 0;
 }
 {
        struct dw8250_data *data = dev_get_drvdata(dev);
 
-       if (!IS_ERR(data->pclk))
-               clk_prepare_enable(data->pclk);
+       clk_prepare_enable(data->pclk);
 
-       if (!IS_ERR(data->clk))
-               clk_prepare_enable(data->clk);
+       clk_prepare_enable(data->clk);
 
        return 0;
 }