axp305.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * AXP305 driver
  4. *
  5. * (C) Copyright 2020 Jernej Skrabec <jernej.skrabec@siol.net>
  6. *
  7. * Based on axp221.c
  8. * (C) Copyright 2014 Hans de Goede <hdegoede@redhat.com>
  9. * (C) Copyright 2013 Oliver Schinagl <oliver@schinagl.nl>
  10. */
  11. #include <common.h>
  12. #include <command.h>
  13. #include <errno.h>
  14. #include <asm/arch/pmic_bus.h>
  15. #include <axp_pmic.h>
  16. #define AXP305_DCDC4_1600MV_OFFSET 46
  17. static u8 axp305_mvolt_to_cfg(int mvolt, int min, int max, int div)
  18. {
  19. if (mvolt < min)
  20. mvolt = min;
  21. else if (mvolt > max)
  22. mvolt = max;
  23. return (mvolt - min) / div;
  24. }
  25. int axp_set_dcdc4(unsigned int mvolt)
  26. {
  27. int ret;
  28. u8 cfg;
  29. if (mvolt >= 1600)
  30. cfg = AXP305_DCDC4_1600MV_OFFSET +
  31. axp305_mvolt_to_cfg(mvolt, 1600, 3300, 100);
  32. else
  33. cfg = axp305_mvolt_to_cfg(mvolt, 600, 1500, 20);
  34. if (mvolt == 0)
  35. return pmic_bus_clrbits(AXP305_OUTPUT_CTRL1,
  36. AXP305_OUTPUT_CTRL1_DCDCD_EN);
  37. ret = pmic_bus_write(AXP305_DCDCD_VOLTAGE, cfg);
  38. if (ret)
  39. return ret;
  40. return pmic_bus_setbits(AXP305_OUTPUT_CTRL1,
  41. AXP305_OUTPUT_CTRL1_DCDCD_EN);
  42. }
  43. int axp_init(void)
  44. {
  45. u8 axp_chip_id;
  46. int ret;
  47. ret = pmic_bus_init();
  48. if (ret)
  49. return ret;
  50. ret = pmic_bus_read(AXP305_CHIP_VERSION, &axp_chip_id);
  51. if (ret)
  52. return ret;
  53. if ((axp_chip_id & AXP305_CHIP_VERSION_MASK) != 0x40)
  54. return -ENODEV;
  55. return ret;
  56. }
  57. #ifndef CONFIG_PSCI_RESET
  58. int do_poweroff(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  59. {
  60. pmic_bus_write(AXP305_SHUTDOWN, AXP305_POWEROFF);
  61. /* infinite loop during shutdown */
  62. while (1) {}
  63. /* not reached */
  64. return 0;
  65. }
  66. #endif