From 7226aeac4d6826faee7bb3a6d5e7c28453aad2c7 Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Fri, 20 Mar 2020 16:38:36 +0530 Subject: [PATCH] scsi: ufs: Configure Vccq/Vccq2 with supplied load in LPM Configure the ufs vccq/vccq2 regulator with supplied load instead of fixed load in LPM mode. To configure regulator in LPM mode, on some targets explicit load (<10mA or <30mA) has to be supplied. On other targets, clients need to set load exactly as 0. On second category of targets, any load value other than 0, pushes the regulator to NMP mode. Adding support for reading load value for Vccq regulator from device tree. If this property is not present, the regulator would be set with default load (1mA). Change-Id: Ifef004f2ea4d3612bc8410b82011fbcfc293ea6f Signed-off-by: Veerabhadrarao Badiganti Signed-off-by: Nitin Rawat --- drivers/scsi/ufs/ufshcd-pltfrm.c | 6 ++++++ drivers/scsi/ufs/ufshcd.c | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c index c91023e57194..a1c4b3d9b97f 100644 --- a/drivers/scsi/ufs/ufshcd-pltfrm.c +++ b/drivers/scsi/ufs/ufshcd-pltfrm.c @@ -158,6 +158,12 @@ static int ufshcd_populate_vreg(struct device *dev, const char *name, vreg->max_uA = 0; } +#if defined(CONFIG_SCSI_UFSHCD_QTI) + snprintf(prop_name, MAX_PROP_SIZE, "%s-min-microamp", name); + if (of_property_read_u32(np, prop_name, &vreg->min_uA)) + vreg->min_uA = UFS_VREG_LPM_LOAD_UA; +#endif + if (!strcmp(name, "vcc")) { if (of_property_read_bool(np, "vcc-supply-1p8")) { vreg->min_uV = UFS_VREG_VCC_1P8_MIN_UV; diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 42c6d6cd0b56..d6379bcabb3c 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7822,12 +7822,24 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, return ret; } - +#if defined(CONFIG_SCSI_UFSHCD_QTI) static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, struct ufs_vreg *vreg) +{ + if (!vreg) + return 0; + else if (vreg->unused) + return 0; + else + return ufshcd_config_vreg_load(hba->dev, vreg, vreg->min_uA); +} +#else +static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, + struct ufs_vreg *vreg) { return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA); } +#endif static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba, struct ufs_vreg *vreg)