if (of_property_read_u32(np, "clock-frequency", &clk)) {
 
                /* Get clk rate through clk driver if present */
-               info->clk = devm_clk_get(&ofdev->dev, NULL);
+               info->clk = devm_clk_get_enabled(dev, NULL);
                if (IS_ERR(info->clk)) {
                        ret = dev_err_probe(dev, PTR_ERR(info->clk), "failed to get clock\n");
                        goto err_pmruntime;
                }
 
-               ret = clk_prepare_enable(info->clk);
-               if (ret < 0)
-                       goto err_pmruntime;
-
                clk = clk_get_rate(info->clk);
        }
        /* If current-speed was set, then try not to change it. */
        ret = of_address_to_resource(np, 0, &resource);
        if (ret) {
                dev_err_probe(dev, ret, "invalid address\n");
-               goto err_unprepare;
+               goto err_pmruntime;
        }
 
        port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_FIXED_PORT |
                        if (prop >= port->mapsize) {
                                ret = dev_err_probe(dev, -EINVAL, "reg-offset %u exceeds region size %pa\n",
                                                    prop, &port->mapsize);
-                               goto err_unprepare;
+                               goto err_pmruntime;
                        }
 
                        port->mapbase += prop;
                        default:
                                ret = dev_err_probe(dev, -EINVAL, "unsupported reg-io-width (%u)\n",
                                                    prop);
-                               goto err_unprepare;
+                               goto err_pmruntime;
                        }
                }
                port->flags |= UPF_IOREMAP;
        if (irq < 0) {
                if (irq == -EPROBE_DEFER) {
                        ret = -EPROBE_DEFER;
-                       goto err_unprepare;
+                       goto err_pmruntime;
                }
                /* IRQ support not mandatory */
                irq = 0;
        info->rst = devm_reset_control_get_optional_shared(&ofdev->dev, NULL);
        if (IS_ERR(info->rst)) {
                ret = PTR_ERR(info->rst);
-               goto err_unprepare;
+               goto err_pmruntime;
        }
 
        ret = reset_control_deassert(info->rst);
        if (ret)
-               goto err_unprepare;
+               goto err_pmruntime;
 
        port->type = type;
        port->uartclk = clk;
        case PORT_RT2880:
                ret = rt288x_setup(port);
                if (ret)
-                       goto err_unprepare;
+                       goto err_pmruntime;
                break;
        }
 
        }
 
        return 0;
-err_unprepare:
-       clk_disable_unprepare(info->clk);
 err_pmruntime:
        pm_runtime_put_sync(&ofdev->dev);
        pm_runtime_disable(&ofdev->dev);
        irq_dispose_mapping(port8250.port.irq);
        pm_runtime_put_sync(&ofdev->dev);
        pm_runtime_disable(&ofdev->dev);
-       clk_disable_unprepare(info->clk);
 err_free:
        kfree(info);
        return ret;
        reset_control_assert(info->rst);
        pm_runtime_put_sync(&ofdev->dev);
        pm_runtime_disable(&ofdev->dev);
-       clk_disable_unprepare(info->clk);
        kfree(info);
        return 0;
 }