pm8916.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 <power/pmic.h>
  11. #include <spmi/spmi.h>
  12. DECLARE_GLOBAL_DATA_PTR;
  13. #define PID_SHIFT 8
  14. #define PID_MASK (0xFF << PID_SHIFT)
  15. #define REG_MASK 0xFF
  16. struct pm8916_priv {
  17. uint32_t usid; /* Slave ID on SPMI bus */
  18. };
  19. static int pm8916_reg_count(struct udevice *dev)
  20. {
  21. return 0xFFFF;
  22. }
  23. static int pm8916_write(struct udevice *dev, uint reg, const uint8_t *buff,
  24. int len)
  25. {
  26. struct pm8916_priv *priv = dev_get_priv(dev);
  27. if (len != 1)
  28. return -EINVAL;
  29. return spmi_reg_write(dev->parent, priv->usid,
  30. (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK,
  31. *buff);
  32. }
  33. static int pm8916_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
  34. {
  35. struct pm8916_priv *priv = dev_get_priv(dev);
  36. int val;
  37. if (len != 1)
  38. return -EINVAL;
  39. val = spmi_reg_read(dev->parent, priv->usid,
  40. (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK);
  41. if (val < 0)
  42. return val;
  43. *buff = val;
  44. return 0;
  45. }
  46. static struct dm_pmic_ops pm8916_ops = {
  47. .reg_count = pm8916_reg_count,
  48. .read = pm8916_read,
  49. .write = pm8916_write,
  50. };
  51. static const struct udevice_id pm8916_ids[] = {
  52. { .compatible = "qcom,spmi-pmic" },
  53. { }
  54. };
  55. static int pm8916_probe(struct udevice *dev)
  56. {
  57. struct pm8916_priv *priv = dev_get_priv(dev);
  58. priv->usid = dev_get_addr(dev);
  59. if (priv->usid == FDT_ADDR_T_NONE)
  60. return -EINVAL;
  61. return 0;
  62. }
  63. U_BOOT_DRIVER(pmic_pm8916) = {
  64. .name = "pmic_pm8916",
  65. .id = UCLASS_PMIC,
  66. .of_match = pm8916_ids,
  67. .bind = dm_scan_fdt_dev,
  68. .probe = pm8916_probe,
  69. .ops = &pm8916_ops,
  70. .priv_auto_alloc_size = sizeof(struct pm8916_priv),
  71. };