scsi: ufs: Avoid configuring regulator with undefined voltage range
authorStanley Chu <stanley.chu@mediatek.com>
Thu, 28 Mar 2019 09:16:24 +0000 (17:16 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Apr 2019 03:11:35 +0000 (23:11 -0400)
For regulators used by UFS, vcc, vccq and vccq2 will have voltage range
initialized by ufshcd_populate_vreg(), however other regulators may have
undefined voltage range if dt-bindings have no such definition.

In above undefined case, both "min_uV" and "max_uV" fields in ufs_vreg
struct will be zero values and these values will be configured on
regulators in different power modes.

Currently this may have no harm if both "min_uV" and "max_uV" always keep
"zero values" because regulator_set_voltage() will always bypass such
invalid values and return "good" results.

However improper values shall be fixed to avoid potential bugs.  Simply
bypass voltage configuration if voltage range is not defined.

Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Acked-by: Alim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c

index e040f9dd9ff32a215a4a9add74a004af03aa9f64..81d99aebb8679a28467d7cfe19821460d0290d60 100644 (file)
@@ -7039,12 +7039,15 @@ static int ufshcd_config_vreg(struct device *dev,
        name = vreg->name;
 
        if (regulator_count_voltages(reg) > 0) {
-               min_uV = on ? vreg->min_uV : 0;
-               ret = regulator_set_voltage(reg, min_uV, vreg->max_uV);
-               if (ret) {
-                       dev_err(dev, "%s: %s set voltage failed, err=%d\n",
+               if (vreg->min_uV && vreg->max_uV) {
+                       min_uV = on ? vreg->min_uV : 0;
+                       ret = regulator_set_voltage(reg, min_uV, vreg->max_uV);
+                       if (ret) {
+                               dev_err(dev,
+                                       "%s: %s set voltage failed, err=%d\n",
                                        __func__, name, ret);
-                       goto out;
+                               goto out;
+                       }
                }
 
                uA_load = on ? vreg->max_uA : 0;