Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'tags/mfd-power-charger-regulator-v3.18' into next

Immutable branch between MFD, Power, Charger and Regulator for v3.18

+704 -139
+14
Documentation/ABI/testing/sysfs-class-power
··· 18 18 This file is writeable and can be used to set the assumed 19 19 battery 'full level'. As batteries age, this value has to be 20 20 amended over time. 21 + 22 + What: /sys/class/power_supply/max14577-charger/device/fast_charge_timer 23 + Date: July 2014 24 + KernelVersion: 3.18.0 25 + Contact: Krzysztof Kozlowski <k.kozlowski@samsung.com> 26 + Description: 27 + This entry shows and sets the maximum time the max14577 28 + charger operates in fast-charge mode. When the timer expires 29 + the device will terminate fast-charge mode (charging current 30 + will drop to 0 A) and will trigger interrupt. 31 + 32 + Valid values: 33 + - 5, 6 or 7 (hours), 34 + - 0: disabled.
+146
Documentation/devicetree/bindings/mfd/max14577.txt
··· 1 + Maxim MAX14577/77836 Multi-Function Device 2 + 3 + MAX14577 is a Multi-Function Device with Micro-USB Interface Circuit, Li+ 4 + Battery Charger and SFOUT LDO output for powering USB devices. It is 5 + interfaced to host controller using I2C. 6 + 7 + MAX77836 additionally contains PMIC (with two LDO regulators) and Fuel Gauge. 8 + 9 + 10 + Required properties: 11 + - compatible : Must be "maxim,max14577" or "maxim,max77836". 12 + - reg : I2C slave address for the max14577 chip (0x25 for max14577/max77836) 13 + - interrupts : IRQ line for the chip. 14 + - interrupt-parent : The parent interrupt controller. 15 + 16 + 17 + Required nodes: 18 + - charger : 19 + Node for configuring the charger driver. 20 + Required properties: 21 + - compatible : "maxim,max14577-charger" 22 + or "maxim,max77836-charger" 23 + - maxim,fast-charge-uamp : Current in uA for Fast Charge; 24 + Valid values: 25 + - for max14577: 90000 - 950000; 26 + - for max77836: 45000 - 475000; 27 + - maxim,eoc-uamp : Current in uA for End-Of-Charge mode; 28 + Valid values: 29 + - for max14577: 50000 - 200000; 30 + - for max77836: 5000 - 100000; 31 + - maxim,ovp-uvolt : OverVoltage Protection Threshold in uV; 32 + In an overvoltage condition, INT asserts and charging 33 + stops. Valid values: 34 + - 6000000, 6500000, 7000000, 7500000; 35 + - maxim,constant-uvolt : Battery Constant Voltage in uV; 36 + Valid values: 37 + - 4000000 - 4280000 (step by 20000); 38 + - 4350000; 39 + 40 + 41 + Optional nodes: 42 + - max14577-muic/max77836-muic : 43 + Node used only by extcon consumers. 44 + Required properties: 45 + - compatible : "maxim,max14577-muic" or "maxim,max77836-muic" 46 + 47 + - regulators : 48 + Required properties: 49 + - compatible : "maxim,max14577-regulator" 50 + or "maxim,max77836-regulator" 51 + 52 + May contain a sub-node per regulator from the list below. Each 53 + sub-node should contain the constraints and initialization information 54 + for that regulator. See regulator.txt for a description of standard 55 + properties for these sub-nodes. 56 + 57 + List of valid regulator names: 58 + - for max14577: CHARGER, SAFEOUT. 59 + - for max77836: CHARGER, SAFEOUT, LDO1, LDO2. 60 + 61 + The SAFEOUT is a fixed voltage regulator so there is no need to specify 62 + voltages for it. 63 + 64 + 65 + Example: 66 + 67 + #include <dt-bindings/interrupt-controller/irq.h> 68 + 69 + max14577@25 { 70 + compatible = "maxim,max14577"; 71 + reg = <0x25>; 72 + interrupt-parent = <&gpx1>; 73 + interrupts = <5 IRQ_TYPE_NONE>; 74 + 75 + muic: max14577-muic { 76 + compatible = "maxim,max14577-muic"; 77 + }; 78 + 79 + regulators { 80 + compatible = "maxim,max14577-regulator"; 81 + 82 + SAFEOUT { 83 + regulator-name = "SAFEOUT"; 84 + }; 85 + CHARGER { 86 + regulator-name = "CHARGER"; 87 + regulator-min-microamp = <90000>; 88 + regulator-max-microamp = <950000>; 89 + regulator-boot-on; 90 + }; 91 + }; 92 + 93 + charger { 94 + compatible = "maxim,max14577-charger"; 95 + 96 + maxim,constant-uvolt = <4350000>; 97 + maxim,fast-charge-uamp = <450000>; 98 + maxim,eoc-uamp = <50000>; 99 + maxim,ovp-uvolt = <6500000>; 100 + }; 101 + }; 102 + 103 + 104 + max77836@25 { 105 + compatible = "maxim,max77836"; 106 + reg = <0x25>; 107 + interrupt-parent = <&gpx1>; 108 + interrupts = <5 IRQ_TYPE_NONE>; 109 + 110 + muic: max77836-muic { 111 + compatible = "maxim,max77836-muic"; 112 + }; 113 + 114 + regulators { 115 + compatible = "maxim,max77836-regulator"; 116 + 117 + SAFEOUT { 118 + regulator-name = "SAFEOUT"; 119 + }; 120 + CHARGER { 121 + regulator-name = "CHARGER"; 122 + regulator-min-microamp = <90000>; 123 + regulator-max-microamp = <950000>; 124 + regulator-boot-on; 125 + }; 126 + LDO1 { 127 + regulator-name = "LDO1"; 128 + regulator-min-microvolt = <2700000>; 129 + regulator-max-microvolt = <2700000>; 130 + }; 131 + LDO2 { 132 + regulator-name = "LDO2"; 133 + regulator-min-microvolt = <800000>; 134 + regulator-max-microvolt = <3950000>; 135 + }; 136 + }; 137 + 138 + charger { 139 + compatible = "maxim,max77836-charger"; 140 + 141 + maxim,constant-uvolt = <4350000>; 142 + maxim,fast-charge-uamp = <225000>; 143 + maxim,eoc-uamp = <7500>; 144 + maxim,ovp-uvolt = <6500000>; 145 + }; 146 + };
+99 -1
drivers/mfd/max14577.c
··· 26 26 #include <linux/mfd/max14577.h> 27 27 #include <linux/mfd/max14577-private.h> 28 28 29 + /* 30 + * Table of valid charger currents for different Maxim chipsets. 31 + * It is placed here because it is used by both charger and regulator driver. 32 + */ 33 + const struct maxim_charger_current maxim_charger_currents[] = { 34 + [MAXIM_DEVICE_TYPE_UNKNOWN] = { 0, 0, 0, 0 }, 35 + [MAXIM_DEVICE_TYPE_MAX14577] = { 36 + .min = MAX14577_CHARGER_CURRENT_LIMIT_MIN, 37 + .high_start = MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START, 38 + .high_step = MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP, 39 + .max = MAX14577_CHARGER_CURRENT_LIMIT_MAX, 40 + }, 41 + [MAXIM_DEVICE_TYPE_MAX77836] = { 42 + .min = MAX77836_CHARGER_CURRENT_LIMIT_MIN, 43 + .high_start = MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START, 44 + .high_step = MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP, 45 + .max = MAX77836_CHARGER_CURRENT_LIMIT_MAX, 46 + }, 47 + }; 48 + EXPORT_SYMBOL_GPL(maxim_charger_currents); 49 + 50 + /* 51 + * maxim_charger_calc_reg_current - Calculate register value for current 52 + * @limits: constraints for charger, matching the MBCICHWRC register 53 + * @min_ua: minimal requested current, micro Amps 54 + * @max_ua: maximum requested current, micro Amps 55 + * @dst: destination to store calculated register value 56 + * 57 + * Calculates the value of MBCICHWRC (Fast Battery Charge Current) register 58 + * for given current and stores it under pointed 'dst'. The stored value 59 + * combines low bit (MBCICHWRCL) and high bits (MBCICHWRCH). It is also 60 + * properly shifted. 61 + * 62 + * The calculated register value matches the current which: 63 + * - is always between <limits.min, limits.max>; 64 + * - is always less or equal to max_ua; 65 + * - is the highest possible value; 66 + * - may be lower than min_ua. 67 + * 68 + * On success returns 0. On error returns -EINVAL (requested min/max current 69 + * is outside of given charger limits) and 'dst' is not set. 70 + */ 71 + int maxim_charger_calc_reg_current(const struct maxim_charger_current *limits, 72 + unsigned int min_ua, unsigned int max_ua, u8 *dst) 73 + { 74 + unsigned int current_bits = 0xf; 75 + 76 + if (min_ua > max_ua) 77 + return -EINVAL; 78 + 79 + if (min_ua > limits->max || max_ua < limits->min) 80 + return -EINVAL; 81 + 82 + if (max_ua < limits->high_start) { 83 + /* 84 + * Less than high_start, so set the minimal current 85 + * (turn Low Bit off, 0 as high bits). 86 + */ 87 + *dst = 0x0; 88 + return 0; 89 + } 90 + 91 + /* max_ua is in range: <high_start, infinite>, cut it to limits.max */ 92 + max_ua = min(limits->max, max_ua); 93 + max_ua -= limits->high_start; 94 + /* 95 + * There is no risk of overflow 'max_ua' here because: 96 + * - max_ua >= limits.high_start 97 + * - BUILD_BUG checks that 'limits' are: max >= high_start + high_step 98 + */ 99 + current_bits = max_ua / limits->high_step; 100 + 101 + /* Turn Low Bit on (use range <limits.high_start, limits.max>) ... */ 102 + *dst = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT; 103 + /* and set proper High Bits */ 104 + *dst |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT; 105 + 106 + return 0; 107 + } 108 + EXPORT_SYMBOL_GPL(maxim_charger_calc_reg_current); 109 + 29 110 static const struct mfd_cell max14577_devs[] = { 30 111 { 31 112 .name = "max14577-muic", ··· 116 35 .name = "max14577-regulator", 117 36 .of_compatible = "maxim,max14577-regulator", 118 37 }, 119 - { .name = "max14577-charger", }, 38 + { 39 + .name = "max14577-charger", 40 + .of_compatible = "maxim,max14577-charger", 41 + }, 120 42 }; 121 43 122 44 static const struct mfd_cell max77836_devs[] = { ··· 546 462 { 547 463 BUILD_BUG_ON(ARRAY_SIZE(max14577_i2c_id) != MAXIM_DEVICE_TYPE_NUM); 548 464 BUILD_BUG_ON(ARRAY_SIZE(max14577_dt_match) != MAXIM_DEVICE_TYPE_NUM); 465 + 466 + /* Valid charger current values must be provided for each chipset */ 467 + BUILD_BUG_ON(ARRAY_SIZE(maxim_charger_currents) != MAXIM_DEVICE_TYPE_NUM); 468 + 469 + /* Check for valid values for charger */ 470 + BUILD_BUG_ON(MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START + 471 + MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP * 0xf != 472 + MAX14577_CHARGER_CURRENT_LIMIT_MAX); 473 + BUILD_BUG_ON(MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP == 0); 474 + 475 + BUILD_BUG_ON(MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START + 476 + MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP * 0xf != 477 + MAX77836_CHARGER_CURRENT_LIMIT_MAX); 478 + BUILD_BUG_ON(MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP == 0); 549 479 550 480 return i2c_add_driver(&max14577_i2c_driver); 551 481 }
+3 -2
drivers/power/Kconfig
··· 325 325 with help of suspend_again support. 326 326 327 327 config CHARGER_MAX14577 328 - tristate "Maxim MAX14577 MUIC battery charger driver" 328 + tristate "Maxim MAX14577/77836 battery charger driver" 329 329 depends on MFD_MAX14577 330 + select SYSFS 330 331 help 331 332 Say Y to enable support for the battery charger control sysfs and 332 - platform data of MAX14577 MUICs. 333 + platform data of MAX14577/77836 MUICs. 333 334 334 335 config CHARGER_MAX8997 335 336 tristate "Maxim MAX8997/MAX8966 PMIC battery charger driver"
+337 -35
drivers/power/max14577_charger.c
··· 1 1 /* 2 - * Battery charger driver for the Maxim 14577 2 + * max14577_charger.c - Battery charger driver for the Maxim 14577/77836 3 3 * 4 - * Copyright (C) 2013 Samsung Electronics 4 + * Copyright (C) 2013,2014 Samsung Electronics 5 5 * Krzysztof Kozlowski <k.kozlowski@samsung.com> 6 6 * 7 7 * This program is free software; you can redistribute it and/or modify ··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/power_supply.h> 21 21 #include <linux/mfd/max14577-private.h> 22 + #include <linux/mfd/max14577.h> 22 23 23 24 struct max14577_charger { 24 25 struct device *dev; 25 26 struct max14577 *max14577; 26 27 struct power_supply charger; 27 28 28 - unsigned int charging_state; 29 - unsigned int battery_state; 29 + unsigned int charging_state; 30 + unsigned int battery_state; 31 + 32 + struct max14577_charger_platform_data *pdata; 30 33 }; 34 + 35 + /* 36 + * Helper function for mapping values of STATUS2/CHGTYP register on max14577 37 + * and max77836 chipsets to enum maxim_muic_charger_type. 38 + */ 39 + static enum max14577_muic_charger_type maxim_get_charger_type( 40 + enum maxim_device_type dev_type, u8 val) { 41 + switch (val) { 42 + case MAX14577_CHARGER_TYPE_NONE: 43 + case MAX14577_CHARGER_TYPE_USB: 44 + case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT: 45 + case MAX14577_CHARGER_TYPE_DEDICATED_CHG: 46 + case MAX14577_CHARGER_TYPE_SPECIAL_500MA: 47 + case MAX14577_CHARGER_TYPE_SPECIAL_1A: 48 + return val; 49 + case MAX14577_CHARGER_TYPE_DEAD_BATTERY: 50 + case MAX14577_CHARGER_TYPE_RESERVED: 51 + if (dev_type == MAXIM_DEVICE_TYPE_MAX77836) 52 + val |= 0x8; 53 + return val; 54 + default: 55 + WARN_ONCE(1, "max14577: Unsupported chgtyp register value 0x%02x", val); 56 + return val; 57 + } 58 + } 31 59 32 60 static int max14577_get_charger_state(struct max14577_charger *chg) 33 61 { ··· 117 89 { 118 90 struct regmap *rmap = chg->max14577->regmap; 119 91 u8 reg_data; 92 + enum max14577_muic_charger_type chg_type; 120 93 121 94 max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data); 122 95 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT); 123 - switch (reg_data) { 96 + chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data); 97 + switch (chg_type) { 124 98 case MAX14577_CHARGER_TYPE_USB: 125 99 case MAX14577_CHARGER_TYPE_DEDICATED_CHG: 126 100 case MAX14577_CHARGER_TYPE_SPECIAL_500MA: 127 101 case MAX14577_CHARGER_TYPE_SPECIAL_1A: 128 102 case MAX14577_CHARGER_TYPE_DEAD_BATTERY: 103 + case MAX77836_CHARGER_TYPE_SPECIAL_BIAS: 129 104 return 1; 130 105 case MAX14577_CHARGER_TYPE_NONE: 131 106 case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT: 132 107 case MAX14577_CHARGER_TYPE_RESERVED: 108 + case MAX77836_CHARGER_TYPE_RESERVED: 133 109 default: 134 110 return 0; 135 111 } ··· 150 118 struct regmap *rmap = chg->max14577->regmap; 151 119 int state = POWER_SUPPLY_HEALTH_GOOD; 152 120 u8 reg_data; 121 + enum max14577_muic_charger_type chg_type; 153 122 154 123 max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data); 155 124 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT); 156 - if (reg_data == MAX14577_CHARGER_TYPE_DEAD_BATTERY) { 125 + chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data); 126 + if (chg_type == MAX14577_CHARGER_TYPE_DEAD_BATTERY) { 157 127 state = POWER_SUPPLY_HEALTH_DEAD; 158 128 goto state_set; 159 129 } ··· 181 147 return 1; 182 148 } 183 149 150 + static int max14577_set_fast_charge_timer(struct max14577_charger *chg, 151 + unsigned long hours) 152 + { 153 + u8 reg_data; 154 + 155 + switch (hours) { 156 + case 5 ... 7: 157 + reg_data = hours - 3; 158 + break; 159 + case 0: 160 + /* Disable */ 161 + reg_data = 0x7; 162 + break; 163 + default: 164 + dev_err(chg->dev, "Wrong value for Fast-Charge Timer: %lu\n", 165 + hours); 166 + return -EINVAL; 167 + } 168 + reg_data <<= CHGCTRL1_TCHW_SHIFT; 169 + 170 + return max14577_update_reg(chg->max14577->regmap, 171 + MAX14577_REG_CHGCTRL1, CHGCTRL1_TCHW_MASK, reg_data); 172 + } 173 + 174 + static int max14577_init_constant_voltage(struct max14577_charger *chg, 175 + unsigned int uvolt) 176 + { 177 + u8 reg_data; 178 + 179 + if (uvolt < MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN || 180 + uvolt > MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX) 181 + return -EINVAL; 182 + 183 + if (uvolt == 4200000) 184 + reg_data = 0x0; 185 + else if (uvolt == MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX) 186 + reg_data = 0x1f; 187 + else if (uvolt <= 4280000) { 188 + unsigned int val = uvolt; 189 + 190 + val -= MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN; 191 + val /= MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP; 192 + if (uvolt <= 4180000) 193 + reg_data = 0x1 + val; 194 + else 195 + reg_data = val; /* Fix for gap between 4.18V and 4.22V */ 196 + } else 197 + return -EINVAL; 198 + 199 + reg_data <<= CHGCTRL3_MBCCVWRC_SHIFT; 200 + 201 + return max14577_write_reg(chg->max14577->regmap, 202 + MAX14577_CHG_REG_CHG_CTRL3, reg_data); 203 + } 204 + 205 + static int max14577_init_eoc(struct max14577_charger *chg, 206 + unsigned int uamp) 207 + { 208 + unsigned int current_bits = 0xf; 209 + u8 reg_data; 210 + 211 + switch (chg->max14577->dev_type) { 212 + case MAXIM_DEVICE_TYPE_MAX77836: 213 + if (uamp < 5000) 214 + return -EINVAL; /* Requested current is too low */ 215 + 216 + if (uamp >= 7500 && uamp < 10000) 217 + current_bits = 0x0; 218 + else if (uamp <= 50000) { 219 + /* <5000, 7499> and <10000, 50000> */ 220 + current_bits = uamp / 5000; 221 + } else { 222 + uamp = min(uamp, 100000U) - 50000U; 223 + current_bits = 0xa + uamp / 10000; 224 + } 225 + break; 226 + 227 + case MAXIM_DEVICE_TYPE_MAX14577: 228 + default: 229 + if (uamp < MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN) 230 + return -EINVAL; /* Requested current is too low */ 231 + 232 + uamp = min(uamp, MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX); 233 + uamp -= MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN; 234 + current_bits = uamp / MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP; 235 + break; 236 + } 237 + 238 + reg_data = current_bits << CHGCTRL5_EOCS_SHIFT; 239 + 240 + return max14577_update_reg(chg->max14577->regmap, 241 + MAX14577_CHG_REG_CHG_CTRL5, CHGCTRL5_EOCS_MASK, 242 + reg_data); 243 + } 244 + 245 + static int max14577_init_fast_charge(struct max14577_charger *chg, 246 + unsigned int uamp) 247 + { 248 + u8 reg_data; 249 + int ret; 250 + const struct maxim_charger_current *limits = 251 + &maxim_charger_currents[chg->max14577->dev_type]; 252 + 253 + ret = maxim_charger_calc_reg_current(limits, uamp, uamp, &reg_data); 254 + if (ret) { 255 + dev_err(chg->dev, "Wrong value for fast charge: %u\n", uamp); 256 + return ret; 257 + } 258 + 259 + return max14577_update_reg(chg->max14577->regmap, 260 + MAX14577_CHG_REG_CHG_CTRL4, 261 + CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK, 262 + reg_data); 263 + } 264 + 184 265 /* 185 266 * Sets charger registers to proper and safe default values. 186 267 * Some of these values are equal to defaults in MAX14577E 187 268 * data sheet but there are minor differences. 188 269 */ 189 - static void max14577_charger_reg_init(struct max14577_charger *chg) 270 + static int max14577_charger_reg_init(struct max14577_charger *chg) 190 271 { 191 272 struct regmap *rmap = chg->max14577->regmap; 192 273 u8 reg_data; 274 + int ret; 193 275 194 276 /* 195 277 * Charger-Type Manual Detection, default off (set CHGTYPMAN to 0) ··· 317 167 CDETCTRL1_CHGDETEN_MASK | CDETCTRL1_CHGTYPMAN_MASK, 318 168 reg_data); 319 169 320 - /* Battery Fast-Charge Timer, from SM-V700: 6hrs */ 321 - reg_data = 0x3 << CHGCTRL1_TCHW_SHIFT; 322 - max14577_write_reg(rmap, MAX14577_REG_CHGCTRL1, reg_data); 323 - 324 170 /* 325 171 * Wall-Adapter Rapid Charge, default on 326 172 * Battery-Charger, default on ··· 325 179 reg_data |= 0x1 << CHGCTRL2_MBCHOSTEN_SHIFT; 326 180 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL2, reg_data); 327 181 328 - /* Battery-Charger Constant Voltage (CV) Mode, from SM-V700: 4.35V */ 329 - reg_data = 0xf << CHGCTRL3_MBCCVWRC_SHIFT; 330 - max14577_write_reg(rmap, MAX14577_REG_CHGCTRL3, reg_data); 331 - 332 - /* 333 - * Fast Battery-Charge Current Low, default 200-950mA 334 - * Fast Battery-Charge Current High, from SM-V700: 450mA 335 - */ 336 - reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT; 337 - reg_data |= 0x5 << CHGCTRL4_MBCICHWRCH_SHIFT; 338 - max14577_write_reg(rmap, MAX14577_REG_CHGCTRL4, reg_data); 339 - 340 - /* End-of-Charge Current, from SM-V700: 50mA */ 341 - reg_data = 0x0 << CHGCTRL5_EOCS_SHIFT; 342 - max14577_write_reg(rmap, MAX14577_REG_CHGCTRL5, reg_data); 343 - 344 182 /* Auto Charging Stop, default off */ 345 183 reg_data = 0x0 << CHGCTRL6_AUTOSTOP_SHIFT; 346 184 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL6, reg_data); 347 185 348 - /* Overvoltage-Protection Threshold, from SM-V700: 6.5V */ 349 - reg_data = 0x2 << CHGCTRL7_OTPCGHCVS_SHIFT; 186 + ret = max14577_init_constant_voltage(chg, chg->pdata->constant_uvolt); 187 + if (ret) 188 + return ret; 189 + 190 + ret = max14577_init_eoc(chg, chg->pdata->eoc_uamp); 191 + if (ret) 192 + return ret; 193 + 194 + ret = max14577_init_fast_charge(chg, chg->pdata->fast_charge_uamp); 195 + if (ret) 196 + return ret; 197 + 198 + ret = max14577_set_fast_charge_timer(chg, 199 + MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT); 200 + if (ret) 201 + return ret; 202 + 203 + /* Initialize Overvoltage-Protection Threshold */ 204 + switch (chg->pdata->ovp_uvolt) { 205 + case 7500000: 206 + reg_data = 0x0; 207 + break; 208 + case 6000000: 209 + case 6500000: 210 + case 7000000: 211 + reg_data = 0x1 + (chg->pdata->ovp_uvolt - 6000000) / 500000; 212 + break; 213 + default: 214 + dev_err(chg->dev, "Wrong value for OVP: %u\n", 215 + chg->pdata->ovp_uvolt); 216 + return -EINVAL; 217 + } 218 + reg_data <<= CHGCTRL7_OTPCGHCVS_SHIFT; 350 219 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL7, reg_data); 220 + 221 + return 0; 351 222 } 352 223 353 224 /* Support property from charger */ ··· 378 215 POWER_SUPPLY_PROP_MANUFACTURER, 379 216 }; 380 217 381 - static const char *model_name = "MAX14577"; 218 + static const char * const model_names[] = { 219 + [MAXIM_DEVICE_TYPE_UNKNOWN] = "MAX14577-like", 220 + [MAXIM_DEVICE_TYPE_MAX14577] = "MAX14577", 221 + [MAXIM_DEVICE_TYPE_MAX77836] = "MAX77836", 222 + }; 382 223 static const char *manufacturer = "Maxim Integrated"; 383 224 384 225 static int max14577_charger_get_property(struct power_supply *psy, ··· 411 244 val->intval = max14577_get_online(chg); 412 245 break; 413 246 case POWER_SUPPLY_PROP_MODEL_NAME: 414 - val->strval = model_name; 247 + BUILD_BUG_ON(ARRAY_SIZE(model_names) != MAXIM_DEVICE_TYPE_NUM); 248 + val->strval = model_names[chg->max14577->dev_type]; 415 249 break; 416 250 case POWER_SUPPLY_PROP_MANUFACTURER: 417 251 val->strval = manufacturer; ··· 423 255 424 256 return ret; 425 257 } 258 + 259 + #ifdef CONFIG_OF 260 + static struct max14577_charger_platform_data *max14577_charger_dt_init( 261 + struct platform_device *pdev) 262 + { 263 + struct max14577_charger_platform_data *pdata; 264 + struct device_node *np = pdev->dev.of_node; 265 + int ret; 266 + 267 + if (!np) { 268 + dev_err(&pdev->dev, "No charger OF node\n"); 269 + return ERR_PTR(-EINVAL); 270 + } 271 + 272 + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); 273 + if (!pdata) 274 + return ERR_PTR(-ENOMEM); 275 + 276 + ret = of_property_read_u32(np, "maxim,constant-uvolt", 277 + &pdata->constant_uvolt); 278 + if (ret) { 279 + dev_err(&pdev->dev, "Cannot parse maxim,constant-uvolt field from DT\n"); 280 + return ERR_PTR(ret); 281 + } 282 + 283 + ret = of_property_read_u32(np, "maxim,fast-charge-uamp", 284 + &pdata->fast_charge_uamp); 285 + if (ret) { 286 + dev_err(&pdev->dev, "Cannot parse maxim,fast-charge-uamp field from DT\n"); 287 + return ERR_PTR(ret); 288 + } 289 + 290 + ret = of_property_read_u32(np, "maxim,eoc-uamp", &pdata->eoc_uamp); 291 + if (ret) { 292 + dev_err(&pdev->dev, "Cannot parse maxim,eoc-uamp field from DT\n"); 293 + return ERR_PTR(ret); 294 + } 295 + 296 + ret = of_property_read_u32(np, "maxim,ovp-uvolt", &pdata->ovp_uvolt); 297 + if (ret) { 298 + dev_err(&pdev->dev, "Cannot parse maxim,ovp-uvolt field from DT\n"); 299 + return ERR_PTR(ret); 300 + } 301 + 302 + return pdata; 303 + } 304 + #else /* CONFIG_OF */ 305 + static struct max14577_charger_platform_data *max14577_charger_dt_init( 306 + struct platform_device *pdev) 307 + { 308 + return NULL; 309 + } 310 + #endif /* CONFIG_OF */ 311 + 312 + static ssize_t show_fast_charge_timer(struct device *dev, 313 + struct device_attribute *attr, char *buf) 314 + { 315 + struct max14577_charger *chg = dev_get_drvdata(dev); 316 + u8 reg_data; 317 + int ret; 318 + unsigned int val; 319 + 320 + ret = max14577_read_reg(chg->max14577->regmap, MAX14577_REG_CHGCTRL1, 321 + &reg_data); 322 + if (ret) 323 + return ret; 324 + 325 + reg_data &= CHGCTRL1_TCHW_MASK; 326 + reg_data >>= CHGCTRL1_TCHW_SHIFT; 327 + switch (reg_data) { 328 + case 0x2 ... 0x4: 329 + val = reg_data + 3; 330 + break; 331 + case 0x7: 332 + val = 0; 333 + break; 334 + default: 335 + val = 5; 336 + break; 337 + } 338 + 339 + return scnprintf(buf, PAGE_SIZE, "%u\n", val); 340 + } 341 + 342 + static ssize_t store_fast_charge_timer(struct device *dev, 343 + struct device_attribute *attr, const char *buf, size_t count) 344 + { 345 + struct max14577_charger *chg = dev_get_drvdata(dev); 346 + unsigned long val; 347 + int ret; 348 + 349 + ret = kstrtoul(buf, 10, &val); 350 + if (ret) 351 + return ret; 352 + 353 + ret = max14577_set_fast_charge_timer(chg, val); 354 + if (ret) 355 + return ret; 356 + 357 + return count; 358 + } 359 + 360 + static DEVICE_ATTR(fast_charge_timer, S_IRUGO | S_IWUSR, 361 + show_fast_charge_timer, store_fast_charge_timer); 426 362 427 363 static int max14577_charger_probe(struct platform_device *pdev) 428 364 { ··· 542 270 chg->dev = &pdev->dev; 543 271 chg->max14577 = max14577; 544 272 545 - max14577_charger_reg_init(chg); 273 + chg->pdata = max14577_charger_dt_init(pdev); 274 + if (IS_ERR_OR_NULL(chg->pdata)) 275 + return PTR_ERR(chg->pdata); 276 + 277 + ret = max14577_charger_reg_init(chg); 278 + if (ret) 279 + return ret; 546 280 547 281 chg->charger.name = "max14577-charger", 548 282 chg->charger.type = POWER_SUPPLY_TYPE_BATTERY, ··· 556 278 chg->charger.num_properties = ARRAY_SIZE(max14577_charger_props), 557 279 chg->charger.get_property = max14577_charger_get_property, 558 280 559 - ret = power_supply_register(&pdev->dev, &chg->charger); 281 + ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer); 560 282 if (ret) { 561 - dev_err(&pdev->dev, "failed: power supply register\n"); 283 + dev_err(&pdev->dev, "failed: create sysfs entry\n"); 562 284 return ret; 563 285 } 564 286 287 + ret = power_supply_register(&pdev->dev, &chg->charger); 288 + if (ret) { 289 + dev_err(&pdev->dev, "failed: power supply register\n"); 290 + goto err; 291 + } 292 + 293 + /* Check for valid values for charger */ 294 + BUILD_BUG_ON(MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN + 295 + MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP * 0xf != 296 + MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX); 565 297 return 0; 298 + 299 + err: 300 + device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer); 301 + 302 + return ret; 566 303 } 567 304 568 305 static int max14577_charger_remove(struct platform_device *pdev) 569 306 { 570 307 struct max14577_charger *chg = platform_get_drvdata(pdev); 571 308 309 + device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer); 572 310 power_supply_unregister(&chg->charger); 573 311 574 312 return 0; 575 313 } 314 + 315 + static const struct platform_device_id max14577_charger_id[] = { 316 + { "max14577-charger", MAXIM_DEVICE_TYPE_MAX14577, }, 317 + { "max77836-charger", MAXIM_DEVICE_TYPE_MAX77836, }, 318 + { } 319 + }; 320 + MODULE_DEVICE_TABLE(platform, max14577_charger_id); 576 321 577 322 static struct platform_driver max14577_charger_driver = { 578 323 .driver = { ··· 604 303 }, 605 304 .probe = max14577_charger_probe, 606 305 .remove = max14577_charger_remove, 306 + .id_table = max14577_charger_id, 607 307 }; 608 308 module_platform_driver(max14577_charger_driver); 609 309 610 310 MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>"); 611 - MODULE_DESCRIPTION("MAXIM 14577 charger driver"); 311 + MODULE_DESCRIPTION("Maxim 14577/77836 charger driver"); 612 312 MODULE_LICENSE("GPL");
+2 -1
drivers/power/max17040_battery.c
··· 277 277 #endif /* CONFIG_PM_SLEEP */ 278 278 279 279 static const struct i2c_device_id max17040_id[] = { 280 - { "max17040", 0 }, 280 + { "max17040" }, 281 + { "max77836-battery" }, 281 282 { } 282 283 }; 283 284 MODULE_DEVICE_TABLE(i2c, max17040_id);
+4 -76
drivers/regulator/max14577.c
··· 22 22 #include <linux/mfd/max14577-private.h> 23 23 #include <linux/regulator/of_regulator.h> 24 24 25 - /* 26 - * Valid limits of current for max14577 and max77836 chargers. 27 - * They must correspond to MBCICHWRCL and MBCICHWRCH fields in CHGCTRL4 28 - * register for given chipset. 29 - */ 30 - struct maxim_charger_current { 31 - /* Minimal current, set in CHGCTRL4/MBCICHWRCL, uA */ 32 - unsigned int min; 33 - /* 34 - * Minimal current when high setting is active, 35 - * set in CHGCTRL4/MBCICHWRCH, uA 36 - */ 37 - unsigned int high_start; 38 - /* Value of one step in high setting, uA */ 39 - unsigned int high_step; 40 - /* Maximum current of high setting, uA */ 41 - unsigned int max; 42 - }; 43 - 44 - /* Table of valid charger currents for different Maxim chipsets */ 45 - static const struct maxim_charger_current maxim_charger_currents[] = { 46 - [MAXIM_DEVICE_TYPE_UNKNOWN] = { 0, 0, 0, 0 }, 47 - [MAXIM_DEVICE_TYPE_MAX14577] = { 48 - .min = MAX14577_REGULATOR_CURRENT_LIMIT_MIN, 49 - .high_start = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START, 50 - .high_step = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP, 51 - .max = MAX14577_REGULATOR_CURRENT_LIMIT_MAX, 52 - }, 53 - [MAXIM_DEVICE_TYPE_MAX77836] = { 54 - .min = MAX77836_REGULATOR_CURRENT_LIMIT_MIN, 55 - .high_start = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START, 56 - .high_step = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP, 57 - .max = MAX77836_REGULATOR_CURRENT_LIMIT_MAX, 58 - }, 59 - }; 60 - 61 25 static int max14577_reg_is_enabled(struct regulator_dev *rdev) 62 26 { 63 27 int rid = rdev_get_id(rdev); ··· 67 103 static int max14577_reg_set_current_limit(struct regulator_dev *rdev, 68 104 int min_uA, int max_uA) 69 105 { 70 - int i, current_bits = 0xf; 71 106 u8 reg_data; 107 + int ret; 72 108 struct max14577 *max14577 = rdev_get_drvdata(rdev); 73 109 const struct maxim_charger_current *limits = 74 110 &maxim_charger_currents[max14577->dev_type]; ··· 76 112 if (rdev_get_id(rdev) != MAX14577_CHARGER) 77 113 return -EINVAL; 78 114 79 - if (min_uA > limits->max || max_uA < limits->min) 80 - return -EINVAL; 81 - 82 - if (max_uA < limits->high_start) { 83 - /* 84 - * Less than high_start, 85 - * so set the minimal current (turn only Low Bit off) 86 - */ 87 - u8 reg_data = 0x0 << CHGCTRL4_MBCICHWRCL_SHIFT; 88 - return max14577_update_reg(rdev->regmap, 89 - MAX14577_CHG_REG_CHG_CTRL4, 90 - CHGCTRL4_MBCICHWRCL_MASK, reg_data); 91 - } 92 - 93 - /* 94 - * max_uA is in range: <high_start, inifinite>, so search for 95 - * valid current starting from maximum current. 96 - */ 97 - for (i = limits->max; i >= limits->high_start; i -= limits->high_step) { 98 - if (i <= max_uA) 99 - break; 100 - current_bits--; 101 - } 102 - BUG_ON(current_bits < 0); /* Cannot happen */ 103 - 104 - /* Turn Low Bit on (use range high_start-max)... */ 105 - reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT; 106 - /* and set proper High Bits */ 107 - reg_data |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT; 115 + ret = maxim_charger_calc_reg_current(limits, min_uA, max_uA, &reg_data); 116 + if (ret) 117 + return ret; 108 118 109 119 return max14577_update_reg(rdev->regmap, MAX14577_CHG_REG_CHG_CTRL4, 110 120 CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK, ··· 380 442 381 443 static int __init max14577_regulator_init(void) 382 444 { 383 - /* Check for valid values for charger */ 384 - BUILD_BUG_ON(MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START + 385 - MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf != 386 - MAX14577_REGULATOR_CURRENT_LIMIT_MAX); 387 - BUILD_BUG_ON(MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START + 388 - MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf != 389 - MAX77836_REGULATOR_CURRENT_LIMIT_MAX); 390 - /* Valid charger current values must be provided for each chipset */ 391 - BUILD_BUG_ON(ARRAY_SIZE(maxim_charger_currents) != MAXIM_DEVICE_TYPE_NUM); 392 - 393 445 BUILD_BUG_ON(ARRAY_SIZE(max14577_supported_regulators) != MAX14577_REGULATOR_NUM); 394 446 BUILD_BUG_ON(ARRAY_SIZE(max77836_supported_regulators) != MAX77836_REGULATOR_NUM); 395 447
+69 -24
include/linux/mfd/max14577-private.h
··· 72 72 MAX14577_MUIC_REG_END, 73 73 }; 74 74 75 + /* 76 + * Combined charger types for max14577 and max77836. 77 + * 78 + * On max14577 three lower bits map to STATUS2/CHGTYP field. 79 + * However the max77836 has different two last values of STATUS2/CHGTYP. 80 + * To indicate the difference enum has two additional values for max77836. 81 + * These values are just a register value bitwise OR with 0x8. 82 + */ 75 83 enum max14577_muic_charger_type { 76 - MAX14577_CHARGER_TYPE_NONE = 0, 77 - MAX14577_CHARGER_TYPE_USB, 78 - MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT, 79 - MAX14577_CHARGER_TYPE_DEDICATED_CHG, 80 - MAX14577_CHARGER_TYPE_SPECIAL_500MA, 81 - MAX14577_CHARGER_TYPE_SPECIAL_1A, 82 - MAX14577_CHARGER_TYPE_RESERVED, 83 - MAX14577_CHARGER_TYPE_DEAD_BATTERY = 7, 84 + MAX14577_CHARGER_TYPE_NONE = 0x0, 85 + MAX14577_CHARGER_TYPE_USB = 0x1, 86 + MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT = 0x2, 87 + MAX14577_CHARGER_TYPE_DEDICATED_CHG = 0x3, 88 + MAX14577_CHARGER_TYPE_SPECIAL_500MA = 0x4, 89 + /* Special 1A or 2A charger */ 90 + MAX14577_CHARGER_TYPE_SPECIAL_1A = 0x5, 91 + /* max14577: reserved, used on max77836 */ 92 + MAX14577_CHARGER_TYPE_RESERVED = 0x6, 93 + /* max14577: dead-battery charing with maximum current 100mA */ 94 + MAX14577_CHARGER_TYPE_DEAD_BATTERY = 0x7, 95 + /* 96 + * max77836: special charger (bias on D+/D-), 97 + * matches register value of 0x6 98 + */ 99 + MAX77836_CHARGER_TYPE_SPECIAL_BIAS = 0xe, 100 + /* max77836: reserved, register value 0x7 */ 101 + MAX77836_CHARGER_TYPE_RESERVED = 0xf, 84 102 }; 85 103 86 104 /* MAX14577 interrupts */ ··· 139 121 #define STATUS2_CHGTYP_SHIFT 0 140 122 #define STATUS2_CHGDETRUN_SHIFT 3 141 123 #define STATUS2_DCDTMR_SHIFT 4 142 - #define STATUS2_DBCHG_SHIFT 5 124 + #define MAX14577_STATUS2_DBCHG_SHIFT 5 125 + #define MAX77836_STATUS2_DXOVP_SHIFT 5 143 126 #define STATUS2_VBVOLT_SHIFT 6 144 127 #define MAX77836_STATUS2_VIDRM_SHIFT 7 145 128 #define STATUS2_CHGTYP_MASK (0x7 << STATUS2_CHGTYP_SHIFT) 146 129 #define STATUS2_CHGDETRUN_MASK BIT(STATUS2_CHGDETRUN_SHIFT) 147 130 #define STATUS2_DCDTMR_MASK BIT(STATUS2_DCDTMR_SHIFT) 148 - #define STATUS2_DBCHG_MASK BIT(STATUS2_DBCHG_SHIFT) 131 + #define MAX14577_STATUS2_DBCHG_MASK BIT(MAX14577_STATUS2_DBCHG_SHIFT) 132 + #define MAX77836_STATUS2_DXOVP_MASK BIT(MAX77836_STATUS2_DXOVP_SHIFT) 149 133 #define STATUS2_VBVOLT_MASK BIT(STATUS2_VBVOLT_SHIFT) 150 134 #define MAX77836_STATUS2_VIDRM_MASK BIT(MAX77836_STATUS2_VIDRM_SHIFT) 151 135 ··· 197 177 #define CTRL3_JIGSET_SHIFT 0 198 178 #define CTRL3_BOOTSET_SHIFT 2 199 179 #define CTRL3_ADCDBSET_SHIFT 4 180 + #define CTRL3_WBTH_SHIFT 6 200 181 #define CTRL3_JIGSET_MASK (0x3 << CTRL3_JIGSET_SHIFT) 201 182 #define CTRL3_BOOTSET_MASK (0x3 << CTRL3_BOOTSET_SHIFT) 202 183 #define CTRL3_ADCDBSET_MASK (0x3 << CTRL3_ADCDBSET_SHIFT) 184 + #define CTRL3_WBTH_MASK (0x3 << CTRL3_WBTH_SHIFT) 203 185 204 186 /* Slave addr = 0x4A: Charger */ 205 187 enum max14577_charger_reg { ··· 232 210 #define CDETCTRL1_CHGTYPMAN_SHIFT 1 233 211 #define CDETCTRL1_DCDEN_SHIFT 2 234 212 #define CDETCTRL1_DCD2SCT_SHIFT 3 235 - #define CDETCTRL1_DCHKTM_SHIFT 4 236 - #define CDETCTRL1_DBEXIT_SHIFT 5 213 + #define MAX14577_CDETCTRL1_DCHKTM_SHIFT 4 214 + #define MAX77836_CDETCTRL1_CDLY_SHIFT 4 215 + #define MAX14577_CDETCTRL1_DBEXIT_SHIFT 5 216 + #define MAX77836_CDETCTRL1_DCDCPL_SHIFT 5 237 217 #define CDETCTRL1_DBIDLE_SHIFT 6 238 218 #define CDETCTRL1_CDPDET_SHIFT 7 239 219 #define CDETCTRL1_CHGDETEN_MASK BIT(CDETCTRL1_CHGDETEN_SHIFT) 240 220 #define CDETCTRL1_CHGTYPMAN_MASK BIT(CDETCTRL1_CHGTYPMAN_SHIFT) 241 221 #define CDETCTRL1_DCDEN_MASK BIT(CDETCTRL1_DCDEN_SHIFT) 242 222 #define CDETCTRL1_DCD2SCT_MASK BIT(CDETCTRL1_DCD2SCT_SHIFT) 243 - #define CDETCTRL1_DCHKTM_MASK BIT(CDETCTRL1_DCHKTM_SHIFT) 244 - #define CDETCTRL1_DBEXIT_MASK BIT(CDETCTRL1_DBEXIT_SHIFT) 223 + #define MAX14577_CDETCTRL1_DCHKTM_MASK BIT(MAX14577_CDETCTRL1_DCHKTM_SHIFT) 224 + #define MAX77836_CDETCTRL1_CDDLY_MASK BIT(MAX77836_CDETCTRL1_CDDLY_SHIFT) 225 + #define MAX14577_CDETCTRL1_DBEXIT_MASK BIT(MAX14577_CDETCTRL1_DBEXIT_SHIFT) 226 + #define MAX77836_CDETCTRL1_DCDCPL_MASK BIT(MAX77836_CDETCTRL1_DCDCPL_SHIFT) 245 227 #define CDETCTRL1_DBIDLE_MASK BIT(CDETCTRL1_DBIDLE_SHIFT) 246 228 #define CDETCTRL1_CDPDET_MASK BIT(CDETCTRL1_CDPDET_SHIFT) 247 229 ··· 281 255 #define CHGCTRL7_OTPCGHCVS_SHIFT 0 282 256 #define CHGCTRL7_OTPCGHCVS_MASK (0x3 << CHGCTRL7_OTPCGHCVS_SHIFT) 283 257 284 - /* MAX14577 regulator current limits (as in CHGCTRL4 register), uA */ 285 - #define MAX14577_REGULATOR_CURRENT_LIMIT_MIN 90000 286 - #define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START 200000 287 - #define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP 50000 288 - #define MAX14577_REGULATOR_CURRENT_LIMIT_MAX 950000 258 + /* MAX14577 charger current limits (as in CHGCTRL4 register), uA */ 259 + #define MAX14577_CHARGER_CURRENT_LIMIT_MIN 90000U 260 + #define MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START 200000U 261 + #define MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP 50000U 262 + #define MAX14577_CHARGER_CURRENT_LIMIT_MAX 950000U 289 263 290 - /* MAX77836 regulator current limits (as in CHGCTRL4 register), uA */ 291 - #define MAX77836_REGULATOR_CURRENT_LIMIT_MIN 45000 292 - #define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START 100000 293 - #define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP 25000 294 - #define MAX77836_REGULATOR_CURRENT_LIMIT_MAX 475000 264 + /* MAX77836 charger current limits (as in CHGCTRL4 register), uA */ 265 + #define MAX77836_CHARGER_CURRENT_LIMIT_MIN 45000U 266 + #define MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START 100000U 267 + #define MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP 25000U 268 + #define MAX77836_CHARGER_CURRENT_LIMIT_MAX 475000U 269 + 270 + /* 271 + * MAX14577 charger End-Of-Charge current limits 272 + * (as in CHGCTRL5 register), uA 273 + */ 274 + #define MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN 50000U 275 + #define MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP 10000U 276 + #define MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX 200000U 277 + 278 + /* 279 + * MAX14577/MAX77836 Battery Constant Voltage 280 + * (as in CHGCTRL3 register), uV 281 + */ 282 + #define MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN 4000000U 283 + #define MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP 20000U 284 + #define MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX 4350000U 285 + 286 + /* Default value for fast charge timer, in hours */ 287 + #define MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT 5 295 288 296 289 /* MAX14577 regulator SFOUT LDO voltage, fixed, uV */ 297 290 #define MAX14577_REGULATOR_SAFEOUT_VOLTAGE 4900000
+30
include/linux/mfd/max14577.h
··· 54 54 struct device_node *of_node; 55 55 }; 56 56 57 + struct max14577_charger_platform_data { 58 + u32 constant_uvolt; 59 + u32 fast_charge_uamp; 60 + u32 eoc_uamp; 61 + u32 ovp_uvolt; 62 + }; 63 + 57 64 /* 58 65 * MAX14577 MFD platform data 59 66 */ ··· 80 73 81 74 struct max14577_regulator_platform_data *regulators; 82 75 }; 76 + 77 + /* 78 + * Valid limits of current for max14577 and max77836 chargers. 79 + * They must correspond to MBCICHWRCL and MBCICHWRCH fields in CHGCTRL4 80 + * register for given chipset. 81 + */ 82 + struct maxim_charger_current { 83 + /* Minimal current, set in CHGCTRL4/MBCICHWRCL, uA */ 84 + unsigned int min; 85 + /* 86 + * Minimal current when high setting is active, 87 + * set in CHGCTRL4/MBCICHWRCH, uA 88 + */ 89 + unsigned int high_start; 90 + /* Value of one step in high setting, uA */ 91 + unsigned int high_step; 92 + /* Maximum current of high setting, uA */ 93 + unsigned int max; 94 + }; 95 + 96 + extern const struct maxim_charger_current maxim_charger_currents[]; 97 + extern int maxim_charger_calc_reg_current(const struct maxim_charger_current *limits, 98 + unsigned int min_ua, unsigned int max_ua, u8 *dst); 83 99 84 100 #endif /* __MAX14577_H__ */