pm8916.c 1.7 KB

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