renesas-usb-vbus-regulator.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Renesas USB VBUS output regulator driver
  4. //
  5. // Copyright (C) 2024 Renesas Electronics Corporation
  6. //
  7. #include <linux/module.h>
  8. #include <linux/err.h>
  9. #include <linux/kernel.h>
  10. #include <linux/of.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/regmap.h>
  13. #include <linux/regulator/driver.h>
  14. #include <linux/regulator/of_regulator.h>
  15. static const struct regulator_ops rzg2l_usb_vbus_reg_ops = {
  16. .enable = regulator_enable_regmap,
  17. .disable = regulator_disable_regmap,
  18. .is_enabled = regulator_is_enabled_regmap,
  19. };
  20. static const struct regulator_desc rzg2l_usb_vbus_rdesc = {
  21. .name = "vbus",
  22. .of_match = of_match_ptr("regulator-vbus"),
  23. .ops = &rzg2l_usb_vbus_reg_ops,
  24. .type = REGULATOR_VOLTAGE,
  25. .owner = THIS_MODULE,
  26. .enable_reg = 0,
  27. .enable_mask = BIT(0),
  28. .enable_is_inverted = true,
  29. .fixed_uV = 5000000,
  30. .n_voltages = 1,
  31. };
  32. static int rzg2l_usb_vbus_regulator_probe(struct platform_device *pdev)
  33. {
  34. struct regulator_config config = { };
  35. struct device *dev = &pdev->dev;
  36. struct regulator_dev *rdev;
  37. config.regmap = dev_get_regmap(dev->parent, NULL);
  38. if (!config.regmap)
  39. return dev_err_probe(dev, -ENOENT, "Failed to get regmap\n");
  40. config.dev = dev;
  41. config.of_node = of_get_child_by_name(dev->parent->of_node, "regulator-vbus");
  42. if (!config.of_node)
  43. return dev_err_probe(dev, -ENODEV, "regulator node not found\n");
  44. rdev = devm_regulator_register(dev, &rzg2l_usb_vbus_rdesc, &config);
  45. if (IS_ERR(rdev)) {
  46. of_node_put(config.of_node);
  47. return dev_err_probe(dev, PTR_ERR(rdev),
  48. "not able to register vbus regulator\n");
  49. }
  50. of_node_put(config.of_node);
  51. return 0;
  52. }
  53. static struct platform_driver rzg2l_usb_vbus_regulator_driver = {
  54. .probe = rzg2l_usb_vbus_regulator_probe,
  55. .driver = {
  56. .name = "rzg2l-usb-vbus-regulator",
  57. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  58. },
  59. };
  60. module_platform_driver(rzg2l_usb_vbus_regulator_driver);
  61. MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
  62. MODULE_DESCRIPTION("Renesas RZ/G2L USB Vbus Regulator Driver");
  63. MODULE_LICENSE("GPL");