Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: ufs: ufs-mediatek: Support host power control

Add interfaces for controlling the host power to optimize the power
consumption in MediaTek UFS platforms.

Link: https://lore.kernel.org/r/20220623035052.18802-7-stanley.chu@mediatek.com
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Po-Wen Kao <powen.kao@mediatek.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Po-Wen Kao and committed by
Martin K. Petersen
2cf5cb2b 4918694c

+17
+5
drivers/ufs/host/ufs-mediatek.c
··· 1190 1190 if (ufshcd_is_link_off(hba)) 1191 1191 ufs_mtk_device_reset_ctrl(0, res); 1192 1192 1193 + ufs_mtk_host_pwr_ctrl(HOST_PWR_HCI, false, res); 1194 + 1193 1195 return 0; 1194 1196 fail: 1195 1197 /* ··· 1206 1204 static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) 1207 1205 { 1208 1206 int err; 1207 + struct arm_smccc_res res; 1209 1208 1210 1209 if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) 1211 1210 ufs_mtk_dev_vreg_set_lpm(hba, false); 1211 + 1212 + ufs_mtk_host_pwr_ctrl(HOST_PWR_HCI, true, res); 1212 1213 1213 1214 err = ufs_mtk_mphy_power_on(hba, true); 1214 1215 if (err)
+12
drivers/ufs/host/ufs-mediatek.h
··· 84 84 #define UFS_MTK_SIP_DEVICE_RESET BIT(1) 85 85 #define UFS_MTK_SIP_CRYPTO_CTRL BIT(2) 86 86 #define UFS_MTK_SIP_REF_CLK_NOTIFICATION BIT(3) 87 + #define UFS_MTK_SIP_HOST_PWR_CTRL BIT(5) 87 88 #define UFS_MTK_SIP_GET_VCC_NUM BIT(6) 88 89 #define UFS_MTK_SIP_DEVICE_PWR_CTRL BIT(7) 89 90 ··· 158 157 }; 159 158 160 159 /* 160 + * Host Power Control options 161 + */ 162 + enum { 163 + HOST_PWR_HCI = 0, 164 + HOST_PWR_MPHY 165 + }; 166 + 167 + /* 161 168 * SMC call wrapper function 162 169 */ 163 170 struct ufs_mtk_smc_arg { ··· 203 194 204 195 #define ufs_mtk_device_reset_ctrl(high, res) \ 205 196 ufs_mtk_smc(UFS_MTK_SIP_DEVICE_RESET, &(res), high) 197 + 198 + #define ufs_mtk_host_pwr_ctrl(opt, on, res) \ 199 + ufs_mtk_smc(UFS_MTK_SIP_HOST_PWR_CTRL, &(res), opt, on) 206 200 207 201 #define ufs_mtk_get_vcc_num(res) \ 208 202 ufs_mtk_smc(UFS_MTK_SIP_GET_VCC_NUM, &(res))