Skip to content

Commit 5127be4

Browse files
nitinrawat123martinkpetersen
authored andcommitted
scsi: ufs: ufs-qcom: Fix UFS OCP issue during UFS power down (PC=3)
According to UFS specifications, the power-off sequence for a UFS device includes: - Sending an SSU command with Power_Condition=3 and await a response. - Asserting RST_N low. - Turning off REF_CLK. - Turning off VCC. - Turning off VCCQ/VCCQ2. As part of ufs shutdown, after the SSU command completion, asserting hardware reset (HWRST) triggers the device firmware to wake up and execute its reset routine. This routine initializes hardware blocks and takes a few milliseconds to complete. During this time, the ICCQ draws a large current. This large ICCQ current may cause issues for the regulator which is supplying power to UFS, because the turn off request from UFS driver to the regulator framework will be immediately followed by low power mode(LPM) request by regulator framework. This is done by framework because UFS which is the only client is requesting for disable. So if the rail is still in the process of shutting down while ICCQ exceeds LPM current thresholds, and LPM mode is activated in hardware during this state, it may trigger an overcurrent protection (OCP) fault in the regulator. To prevent this, a 10ms delay is added after asserting HWRST. This allows the reset operation to complete while power rails remain active and in high-power mode. Currently there is no way for Host to query whether the reset is completed or not and hence this the delay is based on experiments with Qualcomm UFS controllers across multiple UFS vendors. Signed-off-by: Nitin Rawat <nitin.rawat@oss.qualcomm.com> Reviewed-by: Manivannan Sadhasivam <mani@kernel.org> Link: https://patch.msgid.link/20251012173828.9880-1-nitin.rawat@oss.qualcomm.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent d54c676 commit 5127be4

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

drivers/ufs/host/ufs-qcom.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,8 +740,21 @@ static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
740740

741741

742742
/* reset the connected UFS device during power down */
743-
if (ufs_qcom_is_link_off(hba) && host->device_reset)
743+
if (ufs_qcom_is_link_off(hba) && host->device_reset) {
744744
ufs_qcom_device_reset_ctrl(hba, true);
745+
/*
746+
* After sending the SSU command, asserting the rst_n
747+
* line causes the device firmware to wake up and
748+
* execute its reset routine.
749+
*
750+
* During this process, the device may draw current
751+
* beyond the permissible limit for low-power mode (LPM).
752+
* A 10ms delay, based on experimental observations,
753+
* allows the UFS device to complete its hardware reset
754+
* before transitioning the power rail to LPM.
755+
*/
756+
usleep_range(10000, 11000);
757+
}
745758

746759
return ufs_qcom_ice_suspend(host);
747760
}

0 commit comments

Comments
 (0)