| From 6e4eef09833d7124c66d9cef10a16242eca5d9ec Mon Sep 17 00:00:00 2001 |
| From: Stanley Chu <stanley.chu@mediatek.com> |
| Date: Thu, 28 Mar 2019 17:16:24 +0800 |
| Subject: scsi: ufs: Avoid configuring regulator with undefined voltage range |
| |
| [ Upstream commit 3b141e8cfd54ba3e5c610717295b2a02aab26a05 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/ufs/ufshcd.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c |
| index 58e0bd1dac9b4..5ba49c8cd2a36 100644 |
| --- a/drivers/scsi/ufs/ufshcd.c |
| +++ b/drivers/scsi/ufs/ufshcd.c |
| @@ -7048,12 +7048,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; |
| -- |
| 2.20.1 |
| |