pm_runtime_enable(dev);
        pm_runtime_get_sync(dev);
        ret = rcar_i2c_clock_calculate(priv);
-       if (ret < 0)
-               goto out_pm_put;
+       if (ret < 0) {
+               pm_runtime_put(dev);
+               goto out_pm_disable;
+       }
 
        rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
 
 
        ret = platform_get_irq(pdev, 0);
        if (ret < 0)
-               goto out_pm_disable;
+               goto out_pm_put;
        priv->irq = ret;
        ret = devm_request_irq(dev, priv->irq, irqhandler, irqflags, dev_name(dev), priv);
        if (ret < 0) {
                dev_err(dev, "cannot get irq %d\n", priv->irq);
-               goto out_pm_disable;
+               goto out_pm_put;
        }
 
        platform_set_drvdata(pdev, priv);
 
        ret = i2c_add_numbered_adapter(adap);
        if (ret < 0)
-               goto out_pm_disable;
+               goto out_pm_put;
 
        if (priv->flags & ID_P_HOST_NOTIFY) {
                priv->host_notify_client = i2c_new_slave_host_notify_device(adap);
  out_del_device:
        i2c_del_adapter(&priv->adap);
  out_pm_put:
-       pm_runtime_put(dev);
+       if (priv->flags & ID_P_PM_BLOCKED)
+               pm_runtime_put(dev);
  out_pm_disable:
        pm_runtime_disable(dev);
        return ret;