[PATCH v6 05/10] regulator: renesas-usb-vbus-regulator: Add RZ/G3L VBUS regulator support
Biju <[email protected]> Thu, 6 Aug 2026 11:22:24 +0100
| Newsgroups | org.kernel.vger.linux-renesas-soc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Biju Das <[email protected]> Add dual USB VBUS regulator support for the RZ/G3L (r9a08g046) SoC, which has two OTG controllers (one per port), unlike RZ/G3S which has only one. Introduce a RZG3L_USB_VBUS_REG macro and a rzg3l_usb_vbus_regulators array with two descriptors: vbus0 (BIT(0)) and vbus1 (BIT(1)), both sourced from a regulators sub-node as defined in the binding. Add a dedicated rzg3l_usb_vbus_regulator_probe() that iterates over the array and registers both regulators using devm_regulator_register(). Convert the existing platform driver to use an id_table, allowing it to dispatch to either the RZ/G2L or RZ/G3L probe function based on the matched platform device name. Acked-by: Mark Brown <[email protected]> Signed-off-by: Biju Das <[email protected]> --- v5->v6: * Replaced dev_err->dev_err_probe() in error path of rzg3l_usb_vbus_regulator_probe(). * Retained the tag as the change is trivial. v4->v5: * Collected the tag. v3->v4: * Dropped rzg3l specific platform driver. * Dropped the tag as there are new changes. * Added id_table handling by introducing a common probe(). v2->v3: * No change. v1->v2: * Passing pointer to an array of regulators to make it scalable. * Updated commit description. --- .../regulator/renesas-usb-vbus-regulator.c | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/renesas-usb-vbus-regulator.c b/drivers/regulator/renesas-usb-vbus-regulator.c index 22fcf0d10c85..050820a30efb 100644 --- a/drivers/regulator/renesas-usb-vbus-regulator.c +++ b/drivers/regulator/renesas-usb-vbus-regulator.c @@ -55,8 +55,79 @@ static int rzg2l_usb_vbus_regulator_probe(struct platform_device *pdev) return 0; } +#define RZG3L_USB_VBUS_REG(rname, en_mask) \ + { \ + .name = #rname, \ + .of_match = of_match_ptr(#rname), \ + .regulators_node = of_match_ptr("regulators"), \ + .type = REGULATOR_VOLTAGE, \ + .owner = THIS_MODULE, \ + .ops = &rzg2l_usb_vbus_reg_ops, \ + .enable_reg = 0, \ + .enable_mask = (en_mask), \ + .enable_is_inverted = true, \ + .fixed_uV = 5000000, \ + .n_voltages = 1, \ + } + +static const struct regulator_desc rzg3l_usb_vbus_regulators[] = { + RZG3L_USB_VBUS_REG(vbus0, BIT(0)), + RZG3L_USB_VBUS_REG(vbus1, BIT(1)), +}; + +static int rzg3l_usb_vbus_regulator_probe(struct platform_device *pdev) +{ + struct regulator_config config = { }; + struct device *dev = &pdev->dev; + struct regulator_dev *rdev; + + config.dev = pdev->dev.parent; + config.regmap = dev_get_regmap(dev->parent, NULL); + if (!config.regmap) + return dev_err_probe(dev, -ENOENT, "Failed to get regmap\n"); + + for (unsigned int i = 0; i < ARRAY_SIZE(rzg3l_usb_vbus_regulators); i++) { + rdev = devm_regulator_register(dev, &rzg3l_usb_vbus_regulators[i], + &config); + if (IS_ERR(rdev)) + return dev_err_probe(dev, PTR_ERR(rdev), + "failed to register %s regulator\n", + rzg3l_usb_vbus_regulators[i].name); + } + + return 0; +} + +static int rzg2l_usb_vbus_regulator_common_probe(struct platform_device *pdev) +{ + int (*probe_func)(struct platform_device *pdev); + const struct platform_device_id *id; + + id = platform_get_device_id(pdev); + if (!id) + return dev_err_probe(&pdev->dev, -ENODEV, "No ID match found\n"); + + probe_func = (int (*)(struct platform_device *))id->driver_data; + + return probe_func(pdev); +} + +static const struct platform_device_id rzg2l_usb_vbus_regulator_ids[] = { + { + .name = "rzg2l-vbus-regulator", + .driver_data = (kernel_ulong_t)rzg2l_usb_vbus_regulator_probe + }, + { + .name = "rzg3l-vbus-regulator", + .driver_data = (kernel_ulong_t)rzg3l_usb_vbus_regulator_probe + }, + { /* Sentinel */ } +}; +MODULE_DEVICE_TABLE(platform, rzg2l_usb_vbus_regulator_ids); + static struct platform_driver rzg2l_usb_vbus_regulator_driver = { - .probe = rzg2l_usb_vbus_regulator_probe, + .probe = rzg2l_usb_vbus_regulator_common_probe, + .id_table = rzg2l_usb_vbus_regulator_ids, .driver = { .name = "rzg2l-vbus-regulator", .probe_type = PROBE_PREFER_ASYNCHRONOUS, -- 2.43.0