pmic_max77693.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (C) 2013 Samsung Electronics
  3. * Piotr Wilczek <p.wilczek@samsung.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <power/pmic.h>
  9. #include <power/max77693_pmic.h>
  10. #include <i2c.h>
  11. #include <errno.h>
  12. static int max77693_charger_state(struct pmic *p, int state, int current)
  13. {
  14. unsigned int val;
  15. if (pmic_probe(p))
  16. return -1;
  17. /* unlock write capability */
  18. val = MAX77693_CHG_UNLOCK;
  19. pmic_reg_write(p, MAX77693_CHG_CNFG_06, val);
  20. if (state == PMIC_CHARGER_DISABLE) {
  21. puts("Disable the charger.\n");
  22. pmic_reg_read(p, MAX77693_CHG_CNFG_00, &val);
  23. val &= ~0x01;
  24. pmic_reg_write(p, MAX77693_CHG_CNFG_00, val);
  25. return -1;
  26. }
  27. if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) {
  28. printf("%s: Wrong charge current: %d [mA]\n",
  29. __func__, current);
  30. return -1;
  31. }
  32. /* set charging current */
  33. pmic_reg_read(p, MAX77693_CHG_CNFG_02, &val);
  34. val &= ~MAX77693_CHG_CC;
  35. val |= current * 10 / 333; /* 0.1A/3 steps */
  36. pmic_reg_write(p, MAX77693_CHG_CNFG_02, val);
  37. /* enable charging */
  38. val = MAX77693_CHG_MODE_ON;
  39. pmic_reg_write(p, MAX77693_CHG_CNFG_00, val);
  40. /* check charging current */
  41. pmic_reg_read(p, MAX77693_CHG_CNFG_02, &val);
  42. val &= 0x3f;
  43. printf("Enable the charger @ %d [mA]\n", val * 333 / 10);
  44. return 0;
  45. }
  46. static int max77693_charger_bat_present(struct pmic *p)
  47. {
  48. unsigned int val;
  49. if (pmic_probe(p))
  50. return -1;
  51. pmic_reg_read(p, MAX77693_CHG_INT_OK, &val);
  52. return !(val & MAX77693_CHG_DETBAT);
  53. }
  54. static struct power_chrg power_chrg_pmic_ops = {
  55. .chrg_bat_present = max77693_charger_bat_present,
  56. .chrg_state = max77693_charger_state,
  57. };
  58. int pmic_init_max77693(unsigned char bus)
  59. {
  60. static const char name[] = "MAX77693_PMIC";
  61. struct pmic *p = pmic_alloc();
  62. if (!p) {
  63. printf("%s: POWER allocation error!\n", __func__);
  64. return -ENOMEM;
  65. }
  66. debug("Board PMIC init\n");
  67. p->name = name;
  68. p->interface = PMIC_I2C;
  69. p->number_of_regs = PMIC_NUM_OF_REGS;
  70. p->hw.i2c.addr = MAX77693_PMIC_I2C_ADDR;
  71. p->hw.i2c.tx_num = 1;
  72. p->bus = bus;
  73. p->chrg = &power_chrg_pmic_ops;
  74. return 0;
  75. }