Message ID | 347bc3ef8399577e4cef3fdbf3af34d20b4ad27e.1573908530.git.robin.murphy@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] PCI: rockchip: Make some regulators non-optional | expand |
On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: > Null checks are both cheaper and more readable than having !IS_ERR() > splattered everywhere. > - if (IS_ERR(rockchip->vpcie3v3)) > + if (!rockchip->vpcie3v3) > return; > > /* > @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) > if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) > return PTR_ERR(rockchip->vpcie12v); > dev_info(dev, "no vpcie12v regulator found\n"); > + rockchip->vpcie12v = NULL; According to the API NULL is a valid regulator. We don't currently actually do this but it's storing up surprises if you treat it as invalid.
On 18/11/2019 11:59 am, Mark Brown wrote: > On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: >> Null checks are both cheaper and more readable than having !IS_ERR() >> splattered everywhere. > >> - if (IS_ERR(rockchip->vpcie3v3)) >> + if (!rockchip->vpcie3v3) >> return; >> >> /* >> @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) >> if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) >> return PTR_ERR(rockchip->vpcie12v); >> dev_info(dev, "no vpcie12v regulator found\n"); >> + rockchip->vpcie12v = NULL; > > According to the API NULL is a valid regulator. We don't currently > actually do this but it's storing up surprises if you treat it as > invalid. Ah, OK - I'd assumed NULL wasn't valid based on regulator_enable() immediately dereferencing its argument without any checks. If we'd rather not bake in that assumption then this patch can happily be ignored. Thanks, Robin.
On Mon, Nov 18, 2019 at 12:20:10PM +0000, Robin Murphy wrote: > On 18/11/2019 11:59 am, Mark Brown wrote: > > On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: > > > Null checks are both cheaper and more readable than having !IS_ERR() > > > splattered everywhere. > > > > > - if (IS_ERR(rockchip->vpcie3v3)) > > > + if (!rockchip->vpcie3v3) > > > return; > > > /* > > > @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) > > > if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) > > > return PTR_ERR(rockchip->vpcie12v); > > > dev_info(dev, "no vpcie12v regulator found\n"); > > > + rockchip->vpcie12v = NULL; > > > > According to the API NULL is a valid regulator. We don't currently > > actually do this but it's storing up surprises if you treat it as > > invalid. > > Ah, OK - I'd assumed NULL wasn't valid based on regulator_enable() > immediately dereferencing its argument without any checks. If we'd rather > not bake in that assumption then this patch can happily be ignored. I'd suggest we drop this patch. "IS_ERR(ptr)" is not the same as "!ptr", for values of ptr between 0 and -4095 inclusive. Regardless the effect of this patch with the regulator framework, I don't think we want to create an example that others may follow. Thanks, Andrew Murray > > Thanks, > Robin.
On 18/11/2019 12:39 pm, Andrew Murray wrote: > On Mon, Nov 18, 2019 at 12:20:10PM +0000, Robin Murphy wrote: >> On 18/11/2019 11:59 am, Mark Brown wrote: >>> On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: >>>> Null checks are both cheaper and more readable than having !IS_ERR() >>>> splattered everywhere. >>> >>>> - if (IS_ERR(rockchip->vpcie3v3)) >>>> + if (!rockchip->vpcie3v3) >>>> return; >>>> /* >>>> @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) >>>> if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) >>>> return PTR_ERR(rockchip->vpcie12v); >>>> dev_info(dev, "no vpcie12v regulator found\n"); >>>> + rockchip->vpcie12v = NULL; >>> >>> According to the API NULL is a valid regulator. We don't currently >>> actually do this but it's storing up surprises if you treat it as >>> invalid. >> >> Ah, OK - I'd assumed NULL wasn't valid based on regulator_enable() >> immediately dereferencing its argument without any checks. If we'd rather >> not bake in that assumption then this patch can happily be ignored. > > I'd suggest we drop this patch. > > "IS_ERR(ptr)" is not the same as "!ptr", for values of ptr between 0 and > -4095 inclusive. Hence the explicit initial "if (IS_ERR(ptr)) ptr = NULL;" condition quoted above ;) But yeah, it was merely an attempt at a minor cosmetic cleanup, so let's just forget about it to avoid any possible confusion. Cheers, Robin.
On Mon, Nov 18, 2019 at 01:10:58PM +0000, Robin Murphy wrote: > On 18/11/2019 12:39 pm, Andrew Murray wrote: > > On Mon, Nov 18, 2019 at 12:20:10PM +0000, Robin Murphy wrote: > > > On 18/11/2019 11:59 am, Mark Brown wrote: > > > > On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: > > > > > Null checks are both cheaper and more readable than having !IS_ERR() > > > > > splattered everywhere. > > > > > > > > > - if (IS_ERR(rockchip->vpcie3v3)) > > > > > + if (!rockchip->vpcie3v3) > > > > > return; > > > > > /* > > > > > @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) > > > > > if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) > > > > > return PTR_ERR(rockchip->vpcie12v); > > > > > dev_info(dev, "no vpcie12v regulator found\n"); > > > > > + rockchip->vpcie12v = NULL; > > > > > > > > According to the API NULL is a valid regulator. We don't currently > > > > actually do this but it's storing up surprises if you treat it as > > > > invalid. > > > > > > Ah, OK - I'd assumed NULL wasn't valid based on regulator_enable() > > > immediately dereferencing its argument without any checks. If we'd rather > > > not bake in that assumption then this patch can happily be ignored. > > > > I'd suggest we drop this patch. > > > > "IS_ERR(ptr)" is not the same as "!ptr", for values of ptr between 0 and > > -4095 inclusive. > > Hence the explicit initial "if (IS_ERR(ptr)) ptr = NULL;" condition quoted > above ;) Doh. Andrew Murray > > But yeah, it was merely an attempt at a minor cosmetic cleanup, so let's > just forget about it to avoid any possible confusion. > > Cheers, > Robin.
On Mon, Nov 18, 2019 at 11:59:30AM +0000, Mark Brown wrote: > On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: > > Null checks are both cheaper and more readable than having !IS_ERR() > > splattered everywhere. > > > - if (IS_ERR(rockchip->vpcie3v3)) > > + if (!rockchip->vpcie3v3) > > return; > > > > /* > > @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) > > if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) > > return PTR_ERR(rockchip->vpcie12v); > > dev_info(dev, "no vpcie12v regulator found\n"); > > + rockchip->vpcie12v = NULL; > > According to the API NULL is a valid regulator. We don't currently > actually do this but it's storing up surprises if you treat it as > invalid. I don't know anything about the regulator API, but the fact that NULL can be a valid regulator is itself a little surprising :)
On Mon, Nov 18, 2019 at 08:24:28AM -0600, Bjorn Helgaas wrote: > On Mon, Nov 18, 2019 at 11:59:30AM +0000, Mark Brown wrote: > > On Sat, Nov 16, 2019 at 12:54:20PM +0000, Robin Murphy wrote: > > > Null checks are both cheaper and more readable than having !IS_ERR() > > > splattered everywhere. > > > > > - if (IS_ERR(rockchip->vpcie3v3)) > > > + if (!rockchip->vpcie3v3) > > > return; > > > > > > /* > > > @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) > > > if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) > > > return PTR_ERR(rockchip->vpcie12v); > > > dev_info(dev, "no vpcie12v regulator found\n"); > > > + rockchip->vpcie12v = NULL; > > > > According to the API NULL is a valid regulator. We don't currently > > actually do this but it's storing up surprises if you treat it as > > invalid. > > I don't know anything about the regulator API, but the fact that NULL > can be a valid regulator is itself a little surprising :) if (rockchip->vpcie3v3 == NULL) is true the driver would currently panic the kernel AFAICS. rockchip_pcie_set_power_limit() ->regulator_get_current_limit(NULL) -> _regulator_get_current_limit(NULL) -> regulator_lock(NULL) -> regulator_lock_nested(NULL, NULL) -> ww_mutex_trylock(&NULL->mutex) Also, by making NULL a valid regulator, it means that regulators (ie pointers) with default values are valid whether we call devm_regulator_get* or not. I understand this patch can be dropped but that per-se does not make this driver code any more robust AFAICS. Lorenzo
On Mon, Nov 18, 2019 at 06:15:38PM +0000, Lorenzo Pieralisi wrote: > On Mon, Nov 18, 2019 at 08:24:28AM -0600, Bjorn Helgaas wrote: > > I don't know anything about the regulator API, but the fact that NULL > > can be a valid regulator is itself a little surprising :) regulator_get() has always been documented as returning a valid regulator or an ERR_PTR(). > if (rockchip->vpcie3v3 == NULL) is true the driver would currently > panic the kernel AFAICS. We don't currently use this, it's just something we could do. > Also, by making NULL a valid regulator, it means that regulators > (ie pointers) with default values are valid whether we call > devm_regulator_get* or not. I understand this patch can be dropped > but that per-se does not make this driver code any more robust AFAICS. That's one reason we've not done this.
diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c index 68525f8ac4d9..a61819efc0c1 100644 --- a/drivers/pci/controller/pcie-rockchip-host.c +++ b/drivers/pci/controller/pcie-rockchip-host.c @@ -262,7 +262,7 @@ static void rockchip_pcie_set_power_limit(struct rockchip_pcie *rockchip) int curr; u32 status, scale, power; - if (IS_ERR(rockchip->vpcie3v3)) + if (!rockchip->vpcie3v3) return; /* @@ -611,6 +611,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) return PTR_ERR(rockchip->vpcie12v); dev_info(dev, "no vpcie12v regulator found\n"); + rockchip->vpcie12v = NULL; } rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); @@ -618,6 +619,7 @@ static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) return PTR_ERR(rockchip->vpcie3v3); dev_info(dev, "no vpcie3v3 regulator found\n"); + rockchip->vpcie3v3 = NULL; } rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); @@ -636,7 +638,7 @@ static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) struct device *dev = rockchip->dev; int err; - if (!IS_ERR(rockchip->vpcie12v)) { + if (rockchip->vpcie12v) { err = regulator_enable(rockchip->vpcie12v); if (err) { dev_err(dev, "fail to enable vpcie12v regulator\n"); @@ -644,7 +646,7 @@ static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) } } - if (!IS_ERR(rockchip->vpcie3v3)) { + if (rockchip->vpcie3v3) { err = regulator_enable(rockchip->vpcie3v3); if (err) { dev_err(dev, "fail to enable vpcie3v3 regulator\n"); @@ -669,10 +671,10 @@ static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) err_disable_1v8: regulator_disable(rockchip->vpcie1v8); err_disable_3v3: - if (!IS_ERR(rockchip->vpcie3v3)) + if (rockchip->vpcie3v3) regulator_disable(rockchip->vpcie3v3); err_disable_12v: - if (!IS_ERR(rockchip->vpcie12v)) + if (rockchip->vpcie12v) regulator_disable(rockchip->vpcie12v); err_out: return err; @@ -1062,9 +1064,9 @@ static int rockchip_pcie_probe(struct platform_device *pdev) err_deinit_port: rockchip_pcie_deinit_phys(rockchip); err_vpcie: - if (!IS_ERR(rockchip->vpcie12v)) + if (rockchip->vpcie12v) regulator_disable(rockchip->vpcie12v); - if (!IS_ERR(rockchip->vpcie3v3)) + if (rockchip->vpcie3v3) regulator_disable(rockchip->vpcie3v3); regulator_disable(rockchip->vpcie1v8); regulator_disable(rockchip->vpcie0v9); @@ -1087,9 +1089,9 @@ static int rockchip_pcie_remove(struct platform_device *pdev) rockchip_pcie_disable_clocks(rockchip); - if (!IS_ERR(rockchip->vpcie12v)) + if (rockchip->vpcie12v) regulator_disable(rockchip->vpcie12v); - if (!IS_ERR(rockchip->vpcie3v3)) + if (rockchip->vpcie3v3) regulator_disable(rockchip->vpcie3v3); regulator_disable(rockchip->vpcie1v8); regulator_disable(rockchip->vpcie0v9);
Null checks are both cheaper and more readable than having !IS_ERR() splattered everywhere. Signed-off-by: Robin Murphy <robin.murphy@arm.com> --- drivers/pci/controller/pcie-rockchip-host.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)