axp152.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * (C) Copyright 2012
  3. * Henrik Nordstrom <henrik@henriknordstrom.net>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <i2c.h>
  9. #include <axp152.h>
  10. enum axp152_reg {
  11. AXP152_CHIP_VERSION = 0x3,
  12. AXP152_DCDC2_VOLTAGE = 0x23,
  13. AXP152_DCDC3_VOLTAGE = 0x27,
  14. AXP152_DCDC4_VOLTAGE = 0x2B,
  15. AXP152_LDO2_VOLTAGE = 0x2A,
  16. AXP152_SHUTDOWN = 0x32,
  17. };
  18. #define AXP152_POWEROFF (1 << 7)
  19. static int axp152_write(enum axp152_reg reg, u8 val)
  20. {
  21. return i2c_write(0x30, reg, 1, &val, 1);
  22. }
  23. static int axp152_read(enum axp152_reg reg, u8 *val)
  24. {
  25. return i2c_read(0x30, reg, 1, val, 1);
  26. }
  27. static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div)
  28. {
  29. if (mvolt < min)
  30. mvolt = min;
  31. else if (mvolt > max)
  32. mvolt = max;
  33. return (mvolt - min) / div;
  34. }
  35. int axp152_set_dcdc2(int mvolt)
  36. {
  37. int rc;
  38. u8 current, target;
  39. target = axp152_mvolt_to_target(mvolt, 700, 2275, 25);
  40. /* Do we really need to be this gentle? It has built-in voltage slope */
  41. while ((rc = axp152_read(AXP152_DCDC2_VOLTAGE, &current)) == 0 &&
  42. current != target) {
  43. if (current < target)
  44. current++;
  45. else
  46. current--;
  47. rc = axp152_write(AXP152_DCDC2_VOLTAGE, current);
  48. if (rc)
  49. break;
  50. }
  51. return rc;
  52. }
  53. int axp152_set_dcdc3(int mvolt)
  54. {
  55. u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 50);
  56. return axp152_write(AXP152_DCDC3_VOLTAGE, target);
  57. }
  58. int axp152_set_dcdc4(int mvolt)
  59. {
  60. u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 25);
  61. return axp152_write(AXP152_DCDC4_VOLTAGE, target);
  62. }
  63. int axp152_set_ldo2(int mvolt)
  64. {
  65. u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100);
  66. return axp152_write(AXP152_LDO2_VOLTAGE, target);
  67. }
  68. int axp152_init(void)
  69. {
  70. u8 ver;
  71. int rc;
  72. rc = axp152_read(AXP152_CHIP_VERSION, &ver);
  73. if (rc)
  74. return rc;
  75. if (ver != 0x05)
  76. return -1;
  77. return 0;
  78. }