1 /* 2 * Copyright (C) 2012 Samsung Electronics 3 * Lukasz Majewski <l.majewski@samsung.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <power/pmic.h> 10 #include <power/max8997_pmic.h> 11 #include <i2c.h> 12 #include <errno.h> 13 14 unsigned char max8997_reg_ldo(int uV) 15 { 16 unsigned char ret; 17 if (uV <= 800000) 18 return 0; 19 if (uV >= 3950000) 20 return MAX8997_LDO_MAX_VAL; 21 ret = (uV - 800000) / 50000; 22 if (ret > MAX8997_LDO_MAX_VAL) { 23 printf("MAX8997 LDO SETTING ERROR (%duV) -> %u\n", uV, ret); 24 ret = MAX8997_LDO_MAX_VAL; 25 } 26 27 return ret; 28 } 29 30 static int pmic_charger_state(struct pmic *p, int state, int current) 31 { 32 unsigned char fc; 33 u32 val = 0; 34 35 if (pmic_probe(p)) 36 return -ENODEV; 37 38 if (state == PMIC_CHARGER_DISABLE) { 39 puts("Disable the charger.\n"); 40 pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); 41 val &= ~(MBCHOSTEN | VCHGR_FC); 42 pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); 43 44 return -ENOTSUPP; 45 } 46 47 if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) { 48 printf("%s: Wrong charge current: %d [mA]\n", 49 __func__, current); 50 return -EINVAL; 51 } 52 53 fc = (current - CHARGER_MIN_CURRENT) / CHARGER_CURRENT_RESOLUTION; 54 fc = fc & 0xf; /* up to 950 mA */ 55 56 printf("Enable the charger @ %d [mA]\n", fc * CHARGER_CURRENT_RESOLUTION 57 + CHARGER_MIN_CURRENT); 58 59 val = fc | MBCICHFCSET; 60 pmic_reg_write(p, MAX8997_REG_MBCCTRL4, val); 61 62 pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); 63 val = MBCHOSTEN | VCHGR_FC; /* enable charger & fast charge */ 64 pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); 65 66 return 0; 67 } 68 69 static int pmic_charger_bat_present(struct pmic *p) 70 { 71 u32 val; 72 73 if (pmic_probe(p)) 74 return -ENODEV; 75 76 pmic_reg_read(p, MAX8997_REG_STATUS4, &val); 77 78 return !(val & DETBAT); 79 } 80 81 static struct power_chrg power_chrg_pmic_ops = { 82 .chrg_bat_present = pmic_charger_bat_present, 83 .chrg_state = pmic_charger_state, 84 }; 85 86 int pmic_init(unsigned char bus) 87 { 88 static const char name[] = "MAX8997_PMIC"; 89 struct pmic *p = pmic_alloc(); 90 91 if (!p) { 92 printf("%s: POWER allocation error!\n", __func__); 93 return -ENOMEM; 94 } 95 96 debug("Board PMIC init\n"); 97 98 p->name = name; 99 p->interface = PMIC_I2C; 100 p->number_of_regs = PMIC_NUM_OF_REGS; 101 p->hw.i2c.addr = MAX8997_I2C_ADDR; 102 p->hw.i2c.tx_num = 1; 103 p->bus = bus; 104 105 p->chrg = &power_chrg_pmic_ops; 106 return 0; 107 } 108