struct ufs_clk_info *clki;
        unsigned long irq_flags;
 
+       /*
+        * Skip devfreq if UFS initialization is not finished.
+        * Otherwise ufs could be in a inconsistent state.
+        */
+       if (!smp_load_acquire(&hba->logical_unit_scan_finished))
+               return 0;
+
        if (!ufshcd_is_clkscaling_supported(hba))
                return -EINVAL;
 
        if (ret)
                goto out;
 
-       /* Initialize devfreq after UFS device is detected */
-       if (ufshcd_is_clkscaling_supported(hba)) {
-               memcpy(&hba->clk_scaling.saved_pwr_info.info,
-                       &hba->pwr_info,
-                       sizeof(struct ufs_pa_layer_attr));
-               hba->clk_scaling.saved_pwr_info.is_valid = true;
-               hba->clk_scaling.is_allowed = true;
-
-               ret = ufshcd_devfreq_init(hba);
-               if (ret)
-                       goto out;
-
-               hba->clk_scaling.is_enabled = true;
-               ufshcd_init_clk_scaling_sysfs(hba);
-       }
-
        ufs_bsg_probe(hba);
        ufshpb_init(hba);
        scsi_scan_host(hba->host);
        if (ret) {
                pm_runtime_put_sync(hba->dev);
                ufshcd_hba_exit(hba);
+       } else {
+               /*
+                * Make sure that when reader code sees UFS initialization has finished,
+                * all initialization steps have really been executed.
+                */
+               smp_store_release(&hba->logical_unit_scan_finished, true);
        }
 }
 
         */
        ufshcd_set_ufs_dev_active(hba);
 
+       /* Initialize devfreq */
+       if (ufshcd_is_clkscaling_supported(hba)) {
+               memcpy(&hba->clk_scaling.saved_pwr_info.info,
+                       &hba->pwr_info,
+                       sizeof(struct ufs_pa_layer_attr));
+               hba->clk_scaling.saved_pwr_info.is_valid = true;
+               hba->clk_scaling.is_allowed = true;
+
+               err = ufshcd_devfreq_init(hba);
+               if (err)
+                       goto rpm_put_sync;
+
+               hba->clk_scaling.is_enabled = true;
+               ufshcd_init_clk_scaling_sysfs(hba);
+       }
+
        async_schedule(ufshcd_async_scan, hba);
        ufs_sysfs_add_nodes(hba->dev);
 
        device_enable_async_suspend(dev);
        return 0;
 
+rpm_put_sync:
+       pm_runtime_put_sync(dev);
 free_tmf_queue:
        blk_mq_destroy_queue(hba->tmf_queue);
        blk_put_queue(hba->tmf_queue);