pm8916.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Qualcomm pm8916 pmic driver
  3. *
  4. * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <common.h>
  9. #include <dm.h>
  10. #include <dm/root.h>
  11. #include <power/pmic.h>
  12. #include <spmi/spmi.h>
  13. DECLARE_GLOBAL_DATA_PTR;
  14. #define PID_SHIFT 8
  15. #define PID_MASK (0xFF << PID_SHIFT)
  16. #define REG_MASK 0xFF
  17. struct pm8916_priv {
  18. uint32_t usid; /* Slave ID on SPMI bus */
  19. };
  20. static int pm8916_reg_count(struct udevice *dev)
  21. {
  22. return 0xFFFF;
  23. }
  24. static int pm8916_write(struct udevice *dev, uint reg, const uint8_t *buff,
  25. int len)
  26. {
  27. struct pm8916_priv *priv = dev_get_priv(dev);
  28. if (len != 1)
  29. return -EINVAL;
  30. return spmi_reg_write(dev->parent, priv->usid,
  31. (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK,
  32. *buff);
  33. }
  34. static int pm8916_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
  35. {
  36. struct pm8916_priv *priv = dev_get_priv(dev);
  37. int val;
  38. if (len != 1)
  39. return -EINVAL;
  40. val = spmi_reg_read(dev->parent, priv->usid,
  41. (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK);
  42. if (val < 0)
  43. return val;
  44. *buff = val;
  45. return 0;
  46. }
  47. static struct dm_pmic_ops pm8916_ops = {
  48. .reg_count = pm8916_reg_count,
  49. .read = pm8916_read,
  50. .write = pm8916_write,
  51. };
  52. static const struct udevice_id pm8916_ids[] = {
  53. { .compatible = "qcom,spmi-pmic" },
  54. { }
  55. };
  56. static int pm8916_probe(struct udevice *dev)
  57. {
  58. struct pm8916_priv *priv = dev_get_priv(dev);
  59. priv->usid = dev_get_addr(dev);
  60. if (priv->usid == FDT_ADDR_T_NONE)
  61. return -EINVAL;
  62. return 0;
  63. }
  64. static int pm8916_bind(struct udevice *dev)
  65. {
  66. return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
  67. }
  68. U_BOOT_DRIVER(pmic_pm8916) = {
  69. .name = "pmic_pm8916",
  70. .id = UCLASS_PMIC,
  71. .of_match = pm8916_ids,
  72. .bind = pm8916_bind,
  73. .probe = pm8916_probe,
  74. .ops = &pm8916_ops,
  75. .priv_auto_alloc_size = sizeof(struct pm8916_priv),
  76. };