pfuze100.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2015 Freescale Semiconductor, Inc
  4. * Peng Fan <Peng.Fan@freescale.com>
  5. */
  6. #include <common.h>
  7. #include <fdtdec.h>
  8. #include <errno.h>
  9. #include <dm.h>
  10. #include <i2c.h>
  11. #include <power/pmic.h>
  12. #include <power/regulator.h>
  13. #include <power/pfuze100_pmic.h>
  14. #include <power/pfuze3000_pmic.h>
  15. static const struct pmic_child_info pmic_children_info[] = {
  16. /* sw[x], swbst */
  17. { .prefix = "s", .driver = PFUZE100_REGULATOR_DRIVER },
  18. /* vgen[x], vsnvs, vcc, v33, vcc_sd */
  19. { .prefix = "v", .driver = PFUZE100_REGULATOR_DRIVER },
  20. { },
  21. };
  22. static int pfuze100_reg_count(struct udevice *dev)
  23. {
  24. return dev->driver_data == PFUZE3000 ? PFUZE3000_NUM_OF_REGS : PFUZE100_NUM_OF_REGS;
  25. }
  26. static int pfuze100_write(struct udevice *dev, uint reg, const uint8_t *buff,
  27. int len)
  28. {
  29. if (dm_i2c_write(dev, reg, buff, len)) {
  30. pr_err("write error to device: %p register: %#x!", dev, reg);
  31. return -EIO;
  32. }
  33. return 0;
  34. }
  35. static int pfuze100_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
  36. {
  37. if (dm_i2c_read(dev, reg, buff, len)) {
  38. pr_err("read error from device: %p register: %#x!", dev, reg);
  39. return -EIO;
  40. }
  41. return 0;
  42. }
  43. static int pfuze100_bind(struct udevice *dev)
  44. {
  45. ofnode regulators_node;
  46. int children;
  47. regulators_node = dev_read_subnode(dev, "regulators");
  48. if (!ofnode_valid(regulators_node)) {
  49. debug("%s: %s regulators subnode not found!", __func__,
  50. dev->name);
  51. return -ENXIO;
  52. }
  53. debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
  54. children = pmic_bind_children(dev, regulators_node, pmic_children_info);
  55. if (!children)
  56. debug("%s: %s - no child found\n", __func__, dev->name);
  57. /* Always return success for this device */
  58. return 0;
  59. }
  60. static struct dm_pmic_ops pfuze100_ops = {
  61. .reg_count = pfuze100_reg_count,
  62. .read = pfuze100_read,
  63. .write = pfuze100_write,
  64. };
  65. static const struct udevice_id pfuze100_ids[] = {
  66. { .compatible = "fsl,pfuze100", .data = PFUZE100, },
  67. { .compatible = "fsl,pfuze200", .data = PFUZE200, },
  68. { .compatible = "fsl,pfuze3000", .data = PFUZE3000, },
  69. { }
  70. };
  71. U_BOOT_DRIVER(pmic_pfuze100) = {
  72. .name = "pfuze100 pmic",
  73. .id = UCLASS_PMIC,
  74. .of_match = pfuze100_ids,
  75. .bind = pfuze100_bind,
  76. .ops = &pfuze100_ops,
  77. };