[PATCH 1/2] PCI: rockchip: Make some regulators non-optional

Qu Wenruo wqu at suse.com
Sat Nov 7 08:30:59 EST 2020



On 2020/11/7 下午8:54, Qu Wenruo wrote:
> 
> 
> On 2020/11/7 下午8:47, Robin Murphy wrote:
>> On 2020-11-07 11:36, Qu Wenruo wrote:
>>>
>>>
>>> On 2019/11/21 上午1:05, Lorenzo Pieralisi wrote:
>>>> On Sat, Nov 16, 2019 at 12:54:19PM +0000, Robin Murphy wrote:
>>>>> The 0V9 and 1V8 supplies power the PCIe block in the SoC itself, and
>>>>> are thus fundamental to PCIe being usable at all. As such, it makes
>>>>> sense to treat them as non-optional and rely on dummy regulators if
>>>>> not explicitly described.
>>>>>
>>>>> Signed-off-by: Robin Murphy <robin.murphy at arm.com>
>>>>> ---
>>>>>   drivers/pci/controller/pcie-rockchip-host.c | 69
>>>>> ++++++++-------------
>>>>>   1 file changed, 25 insertions(+), 44 deletions(-)
>>>>
>>>> Applied to pci/rockchip, thanks.
>>>
>>> Sorry, this commit is cause regression for RK3399 boards unable to
>>> detect the controller anymore.
>>>
>>> The 1v8 (and 0v9) is causing -517 and reject the controller
>>> initialization.
>>
>> That's -EPROBE_DEFER, which must mean that a regulator *is* described,
>> but you're missing the relevant driver - that's an issue with your
>> config/initrd. Being optional should only change the behaviour if the
>> supply is totally absent (i.e. you get -ENODEV instead of a dummy
>> regulator), so I don't see that it would make any difference in this
>> situation anyway :/
>>
>>> I'm not a PCI guy, but a quick google search shows these two voltages
>>> are not related to PCIE core functionality, especially considering the
>>> controller used in RK3399 are mostly to provide NVME support.
>>
>> Unlike the 12V and 3V3 supplies to the slot, these supplies are to the
>> PCIE_AVDD_0V9 and PCIE_AVDD_1V8 pins on the SoC itself, which the
>> datasheet describe as "Supply voltage for PCIE". Having power is kind of
>> important for the I/O circuits on all the signal pins to work.
>>
>> Now it's almost certainly true that these supplies technically belong to
>> the phy rather than the controller, but it's a bit late to change the
>> bindings for the sake of semantics.
>>
>>> This bug makes all RK3399 users who put root fs into NVME driver unable
>>> to boot the device.
>>>
>>> I really hope some one could test the patch before affecting the end
>>> users or at least try to understand how most users would use the PCIE
>>> interface for.
>>
>> I *am* that end user in this case - I use an M.2 NVME on my board, which
>> prompted me to take a look at the regulator handling here in the first
>> place, to see if it might be possible to shut up the annoying message
>> about a 12V supply that is entirely irrelevant to a board without a
>> full-size PCIe slot. I use a mainline-based distro, so I've been running
>> this change for nearly a year since it landed in v5.5, and I'm sure many
>> others have too. I've not heard of any other complaints in that time...
> 
> Sorry for the wrong wording, thank you for your contribution first.
> 
> It really makes RK3399 the primary testing bed for 64K page size, and
> save me a lot of time.
> 
> I'm wondering how the -EPROBE_DEFER happens.
> I have only tested two kernel versions, v5.9-rc4 and v5.10-rc2.
> The config works for rc4, unless something big changed in rc2, it
> shouldn't change much, right?
> 
> The 1v8 and 0v9 is just alwayson regulator, IMHO it doesn't really need
> special driver.
> Or does it?

Not a regulator guys by all means, but the dtsi shows the 1v8 and 0v9
are all provided by rk808, while the dmesg shows:

[    0.195604] reg-fixed-voltage vcc3v3-pcie-regulator: Looking up
vin-supply from device tree
[    0.196096] reg-fixed-voltage vcc3v3-pcie-regulator: vcc3v3_pcie
supplying 3300000uV
[    0.197724] reg-fixed-voltage vcc5v0-host-regulator: Looking up
vin-supply from device tree
[    0.198211] reg-fixed-voltage vcc5v0-host-regulator: vcc5v0_host
supplying 0uV
[    0.198581] reg-fixed-voltage vcc5v0-typec-regulator: Looking up
vin-supply from device tree
[    0.199082] reg-fixed-voltage vcc5v0-typec-regulator: vcc5v0_typec
supplying 0uV
[    0.199395] reg-fixed-voltage vcc3v3-phy-regulator: vcc_lan supplying
3300000uV
[    1.074253] rockchip-pcie f8000000.pcie: no vpcie12v regulator found
[    1.086470] pwm-regulator vdd-log: Looking up pwm-supply from device tree
[    1.086484] pwm-regulator vdd-log: Looking up pwm-supply property in
node /vdd-log failed
[    1.086501] vdd_log: supplied by regulator-dummy
[    1.402500] rk808-regulator rk808-regulator: there is no dvs0 gpio
[    1.403104] rk808-regulator rk808-regulator: there is no dvs1 gpio
[    1.419856] rk808 0-001b: failed to register 12 regulator
[    1.422801] rk808-regulator: probe of rk808-regulator failed with
error -22

So this means something wrong with the rk808, resulting no voltage
provided from rk808 and screwing up the pcie controller?

Thanks,
Qu
> 
> Thanks,
> Qu
> 
>>
>> Robin.
>>
>>>
>>> Thanks,
>>> Qu
>>>
>>>>
>>>> Lorenzo
>>>>
>>>>> diff --git a/drivers/pci/controller/pcie-rockchip-host.c
>>>>> b/drivers/pci/controller/pcie-rockchip-host.c
>>>>> index ef8e677ce9d1..68525f8ac4d9 100644
>>>>> --- a/drivers/pci/controller/pcie-rockchip-host.c
>>>>> +++ b/drivers/pci/controller/pcie-rockchip-host.c
>>>>> @@ -620,19 +620,13 @@ static int rockchip_pcie_parse_host_dt(struct
>>>>> rockchip_pcie *rockchip)
>>>>>           dev_info(dev, "no vpcie3v3 regulator found\n");
>>>>>       }
>>>>>   -    rockchip->vpcie1v8 = devm_regulator_get_optional(dev,
>>>>> "vpcie1v8");
>>>>> -    if (IS_ERR(rockchip->vpcie1v8)) {
>>>>> -        if (PTR_ERR(rockchip->vpcie1v8) != -ENODEV)
>>>>> -            return PTR_ERR(rockchip->vpcie1v8);
>>>>> -        dev_info(dev, "no vpcie1v8 regulator found\n");
>>>>> -    }
>>>>> +    rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8");
>>>>> +    if (IS_ERR(rockchip->vpcie1v8))
>>>>> +        return PTR_ERR(rockchip->vpcie1v8);
>>>>>   -    rockchip->vpcie0v9 = devm_regulator_get_optional(dev,
>>>>> "vpcie0v9");
>>>>> -    if (IS_ERR(rockchip->vpcie0v9)) {
>>>>> -        if (PTR_ERR(rockchip->vpcie0v9) != -ENODEV)
>>>>> -            return PTR_ERR(rockchip->vpcie0v9);
>>>>> -        dev_info(dev, "no vpcie0v9 regulator found\n");
>>>>> -    }
>>>>> +    rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9");
>>>>> +    if (IS_ERR(rockchip->vpcie0v9))
>>>>> +        return PTR_ERR(rockchip->vpcie0v9);
>>>>>         return 0;
>>>>>   }
>>>>> @@ -658,27 +652,22 @@ static int rockchip_pcie_set_vpcie(struct
>>>>> rockchip_pcie *rockchip)
>>>>>           }
>>>>>       }
>>>>>   -    if (!IS_ERR(rockchip->vpcie1v8)) {
>>>>> -        err = regulator_enable(rockchip->vpcie1v8);
>>>>> -        if (err) {
>>>>> -            dev_err(dev, "fail to enable vpcie1v8 regulator\n");
>>>>> -            goto err_disable_3v3;
>>>>> -        }
>>>>> +    err = regulator_enable(rockchip->vpcie1v8);
>>>>> +    if (err) {
>>>>> +        dev_err(dev, "fail to enable vpcie1v8 regulator\n");
>>>>> +        goto err_disable_3v3;
>>>>>       }
>>>>>   -    if (!IS_ERR(rockchip->vpcie0v9)) {
>>>>> -        err = regulator_enable(rockchip->vpcie0v9);
>>>>> -        if (err) {
>>>>> -            dev_err(dev, "fail to enable vpcie0v9 regulator\n");
>>>>> -            goto err_disable_1v8;
>>>>> -        }
>>>>> +    err = regulator_enable(rockchip->vpcie0v9);
>>>>> +    if (err) {
>>>>> +        dev_err(dev, "fail to enable vpcie0v9 regulator\n");
>>>>> +        goto err_disable_1v8;
>>>>>       }
>>>>>         return 0;
>>>>>     err_disable_1v8:
>>>>> -    if (!IS_ERR(rockchip->vpcie1v8))
>>>>> -        regulator_disable(rockchip->vpcie1v8);
>>>>> +    regulator_disable(rockchip->vpcie1v8);
>>>>>   err_disable_3v3:
>>>>>       if (!IS_ERR(rockchip->vpcie3v3))
>>>>>           regulator_disable(rockchip->vpcie3v3);
>>>>> @@ -897,8 +886,7 @@ static int __maybe_unused
>>>>> rockchip_pcie_suspend_noirq(struct device *dev)
>>>>>         rockchip_pcie_disable_clocks(rockchip);
>>>>>   -    if (!IS_ERR(rockchip->vpcie0v9))
>>>>> -        regulator_disable(rockchip->vpcie0v9);
>>>>> +    regulator_disable(rockchip->vpcie0v9);
>>>>>         return ret;
>>>>>   }
>>>>> @@ -908,12 +896,10 @@ static int __maybe_unused
>>>>> rockchip_pcie_resume_noirq(struct device *dev)
>>>>>       struct rockchip_pcie *rockchip = dev_get_drvdata(dev);
>>>>>       int err;
>>>>>   -    if (!IS_ERR(rockchip->vpcie0v9)) {
>>>>> -        err = regulator_enable(rockchip->vpcie0v9);
>>>>> -        if (err) {
>>>>> -            dev_err(dev, "fail to enable vpcie0v9 regulator\n");
>>>>> -            return err;
>>>>> -        }
>>>>> +    err = regulator_enable(rockchip->vpcie0v9);
>>>>> +    if (err) {
>>>>> +        dev_err(dev, "fail to enable vpcie0v9 regulator\n");
>>>>> +        return err;
>>>>>       }
>>>>>         err = rockchip_pcie_enable_clocks(rockchip);
>>>>> @@ -939,8 +925,7 @@ static int __maybe_unused
>>>>> rockchip_pcie_resume_noirq(struct device *dev)
>>>>>   err_pcie_resume:
>>>>>       rockchip_pcie_disable_clocks(rockchip);
>>>>>   err_disable_0v9:
>>>>> -    if (!IS_ERR(rockchip->vpcie0v9))
>>>>> -        regulator_disable(rockchip->vpcie0v9);
>>>>> +    regulator_disable(rockchip->vpcie0v9);
>>>>>       return err;
>>>>>   }
>>>>>   @@ -1081,10 +1066,8 @@ static int rockchip_pcie_probe(struct
>>>>> platform_device *pdev)
>>>>>           regulator_disable(rockchip->vpcie12v);
>>>>>       if (!IS_ERR(rockchip->vpcie3v3))
>>>>>           regulator_disable(rockchip->vpcie3v3);
>>>>> -    if (!IS_ERR(rockchip->vpcie1v8))
>>>>> -        regulator_disable(rockchip->vpcie1v8);
>>>>> -    if (!IS_ERR(rockchip->vpcie0v9))
>>>>> -        regulator_disable(rockchip->vpcie0v9);
>>>>> +    regulator_disable(rockchip->vpcie1v8);
>>>>> +    regulator_disable(rockchip->vpcie0v9);
>>>>>   err_set_vpcie:
>>>>>       rockchip_pcie_disable_clocks(rockchip);
>>>>>       return err;
>>>>> @@ -1108,10 +1091,8 @@ static int rockchip_pcie_remove(struct
>>>>> platform_device *pdev)
>>>>>           regulator_disable(rockchip->vpcie12v);
>>>>>       if (!IS_ERR(rockchip->vpcie3v3))
>>>>>           regulator_disable(rockchip->vpcie3v3);
>>>>> -    if (!IS_ERR(rockchip->vpcie1v8))
>>>>> -        regulator_disable(rockchip->vpcie1v8);
>>>>> -    if (!IS_ERR(rockchip->vpcie0v9))
>>>>> -        regulator_disable(rockchip->vpcie0v9);
>>>>> +    regulator_disable(rockchip->vpcie1v8);
>>>>> +    regulator_disable(rockchip->vpcie0v9);
>>>>>         return 0;
>>>>>   }
>>>>> -- 
>>>>> 2.17.1
>>>>>
>>>>
>>>> _______________________________________________
>>>> linux-arm-kernel mailing list
>>>> linux-arm-kernel at lists.infradead.org
>>>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>>>>
>>>
>>
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 




More information about the linux-arm-kernel mailing list