1 // SPDX-License-Identifier: GPL-2.0
3 // Renesas USB VBUS output regulator driver
5 // Copyright (C) 2024 Renesas Electronics Corporation
8 #include <linux/module.h>
10 #include <linux/kernel.h>
12 #include <linux/platform_device.h>
13 #include <linux/regmap.h>
14 #include <linux/regulator/driver.h>
15 #include <linux/regulator/of_regulator.h>
17 static const struct regulator_ops rzg2l_usb_vbus_reg_ops
= {
18 .enable
= regulator_enable_regmap
,
19 .disable
= regulator_disable_regmap
,
20 .is_enabled
= regulator_is_enabled_regmap
,
23 static const struct regulator_desc rzg2l_usb_vbus_rdesc
= {
25 .of_match
= of_match_ptr("regulator-vbus"),
26 .ops
= &rzg2l_usb_vbus_reg_ops
,
27 .type
= REGULATOR_VOLTAGE
,
30 .enable_mask
= BIT(0),
31 .enable_is_inverted
= true,
36 static int rzg2l_usb_vbus_regulator_probe(struct platform_device
*pdev
)
38 struct regulator_config config
= { };
39 struct device
*dev
= &pdev
->dev
;
40 struct regulator_dev
*rdev
;
42 config
.regmap
= dev_get_regmap(dev
->parent
, NULL
);
44 return dev_err_probe(dev
, -ENOENT
, "Failed to get regmap\n");
47 config
.of_node
= of_get_child_by_name(dev
->parent
->of_node
, "regulator-vbus");
49 return dev_err_probe(dev
, -ENODEV
, "regulator node not found\n");
51 rdev
= devm_regulator_register(dev
, &rzg2l_usb_vbus_rdesc
, &config
);
52 of_node_put(config
.of_node
);
54 return dev_err_probe(dev
, PTR_ERR(rdev
),
55 "not able to register vbus regulator\n");
60 static struct platform_driver rzg2l_usb_vbus_regulator_driver
= {
61 .probe
= rzg2l_usb_vbus_regulator_probe
,
63 .name
= "rzg2l-usb-vbus-regulator",
64 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
67 module_platform_driver(rzg2l_usb_vbus_regulator_driver
);
69 MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
70 MODULE_DESCRIPTION("Renesas RZ/G2L USB Vbus Regulator Driver");
71 MODULE_LICENSE("GPL");