···1818 This file is writeable and can be used to set the assumed1919 battery 'full level'. As batteries age, this value has to be2020 amended over time.2121+2222+What: /sys/class/power_supply/max14577-charger/device/fast_charge_timer2323+Date: July 20142424+KernelVersion: 3.18.02525+Contact: Krzysztof Kozlowski <k.kozlowski@samsung.com>2626+Description:2727+ This entry shows and sets the maximum time the max145772828+ charger operates in fast-charge mode. When the timer expires2929+ the device will terminate fast-charge mode (charging current3030+ will drop to 0 A) and will trigger interrupt.3131+3232+ Valid values:3333+ - 5, 6 or 7 (hours),3434+ - 0: disabled.
···11+Maxim MAX14577/77836 Multi-Function Device22+33+MAX14577 is a Multi-Function Device with Micro-USB Interface Circuit, Li+44+Battery Charger and SFOUT LDO output for powering USB devices. It is55+interfaced to host controller using I2C.66+77+MAX77836 additionally contains PMIC (with two LDO regulators) and Fuel Gauge.88+99+1010+Required properties:1111+- compatible : Must be "maxim,max14577" or "maxim,max77836".1212+- reg : I2C slave address for the max14577 chip (0x25 for max14577/max77836)1313+- interrupts : IRQ line for the chip.1414+- interrupt-parent : The parent interrupt controller.1515+1616+1717+Required nodes:1818+ - charger :1919+ Node for configuring the charger driver.2020+ Required properties:2121+ - compatible : "maxim,max14577-charger"2222+ or "maxim,max77836-charger"2323+ - maxim,fast-charge-uamp : Current in uA for Fast Charge;2424+ Valid values:2525+ - for max14577: 90000 - 950000;2626+ - for max77836: 45000 - 475000;2727+ - maxim,eoc-uamp : Current in uA for End-Of-Charge mode;2828+ Valid values:2929+ - for max14577: 50000 - 200000;3030+ - for max77836: 5000 - 100000;3131+ - maxim,ovp-uvolt : OverVoltage Protection Threshold in uV;3232+ In an overvoltage condition, INT asserts and charging3333+ stops. Valid values:3434+ - 6000000, 6500000, 7000000, 7500000;3535+ - maxim,constant-uvolt : Battery Constant Voltage in uV;3636+ Valid values:3737+ - 4000000 - 4280000 (step by 20000);3838+ - 4350000;3939+4040+4141+Optional nodes:4242+- max14577-muic/max77836-muic :4343+ Node used only by extcon consumers.4444+ Required properties:4545+ - compatible : "maxim,max14577-muic" or "maxim,max77836-muic"4646+4747+- regulators :4848+ Required properties:4949+ - compatible : "maxim,max14577-regulator"5050+ or "maxim,max77836-regulator"5151+5252+ May contain a sub-node per regulator from the list below. Each5353+ sub-node should contain the constraints and initialization information5454+ for that regulator. See regulator.txt for a description of standard5555+ properties for these sub-nodes.5656+5757+ List of valid regulator names:5858+ - for max14577: CHARGER, SAFEOUT.5959+ - for max77836: CHARGER, SAFEOUT, LDO1, LDO2.6060+6161+ The SAFEOUT is a fixed voltage regulator so there is no need to specify6262+ voltages for it.6363+6464+6565+Example:6666+6767+#include <dt-bindings/interrupt-controller/irq.h>6868+6969+max14577@25 {7070+ compatible = "maxim,max14577";7171+ reg = <0x25>;7272+ interrupt-parent = <&gpx1>;7373+ interrupts = <5 IRQ_TYPE_NONE>;7474+7575+ muic: max14577-muic {7676+ compatible = "maxim,max14577-muic";7777+ };7878+7979+ regulators {8080+ compatible = "maxim,max14577-regulator";8181+8282+ SAFEOUT {8383+ regulator-name = "SAFEOUT";8484+ };8585+ CHARGER {8686+ regulator-name = "CHARGER";8787+ regulator-min-microamp = <90000>;8888+ regulator-max-microamp = <950000>;8989+ regulator-boot-on;9090+ };9191+ };9292+9393+ charger {9494+ compatible = "maxim,max14577-charger";9595+9696+ maxim,constant-uvolt = <4350000>;9797+ maxim,fast-charge-uamp = <450000>;9898+ maxim,eoc-uamp = <50000>;9999+ maxim,ovp-uvolt = <6500000>;100100+ };101101+};102102+103103+104104+max77836@25 {105105+ compatible = "maxim,max77836";106106+ reg = <0x25>;107107+ interrupt-parent = <&gpx1>;108108+ interrupts = <5 IRQ_TYPE_NONE>;109109+110110+ muic: max77836-muic {111111+ compatible = "maxim,max77836-muic";112112+ };113113+114114+ regulators {115115+ compatible = "maxim,max77836-regulator";116116+117117+ SAFEOUT {118118+ regulator-name = "SAFEOUT";119119+ };120120+ CHARGER {121121+ regulator-name = "CHARGER";122122+ regulator-min-microamp = <90000>;123123+ regulator-max-microamp = <950000>;124124+ regulator-boot-on;125125+ };126126+ LDO1 {127127+ regulator-name = "LDO1";128128+ regulator-min-microvolt = <2700000>;129129+ regulator-max-microvolt = <2700000>;130130+ };131131+ LDO2 {132132+ regulator-name = "LDO2";133133+ regulator-min-microvolt = <800000>;134134+ regulator-max-microvolt = <3950000>;135135+ };136136+ };137137+138138+ charger {139139+ compatible = "maxim,max77836-charger";140140+141141+ maxim,constant-uvolt = <4350000>;142142+ maxim,fast-charge-uamp = <225000>;143143+ maxim,eoc-uamp = <7500>;144144+ maxim,ovp-uvolt = <6500000>;145145+ };146146+};
+99-1
drivers/mfd/max14577.c
···2626#include <linux/mfd/max14577.h>2727#include <linux/mfd/max14577-private.h>28282929+/*3030+ * Table of valid charger currents for different Maxim chipsets.3131+ * It is placed here because it is used by both charger and regulator driver.3232+ */3333+const struct maxim_charger_current maxim_charger_currents[] = {3434+ [MAXIM_DEVICE_TYPE_UNKNOWN] = { 0, 0, 0, 0 },3535+ [MAXIM_DEVICE_TYPE_MAX14577] = {3636+ .min = MAX14577_CHARGER_CURRENT_LIMIT_MIN,3737+ .high_start = MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START,3838+ .high_step = MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP,3939+ .max = MAX14577_CHARGER_CURRENT_LIMIT_MAX,4040+ },4141+ [MAXIM_DEVICE_TYPE_MAX77836] = {4242+ .min = MAX77836_CHARGER_CURRENT_LIMIT_MIN,4343+ .high_start = MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START,4444+ .high_step = MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP,4545+ .max = MAX77836_CHARGER_CURRENT_LIMIT_MAX,4646+ },4747+};4848+EXPORT_SYMBOL_GPL(maxim_charger_currents);4949+5050+/*5151+ * maxim_charger_calc_reg_current - Calculate register value for current5252+ * @limits: constraints for charger, matching the MBCICHWRC register5353+ * @min_ua: minimal requested current, micro Amps5454+ * @max_ua: maximum requested current, micro Amps5555+ * @dst: destination to store calculated register value5656+ *5757+ * Calculates the value of MBCICHWRC (Fast Battery Charge Current) register5858+ * for given current and stores it under pointed 'dst'. The stored value5959+ * combines low bit (MBCICHWRCL) and high bits (MBCICHWRCH). It is also6060+ * properly shifted.6161+ *6262+ * The calculated register value matches the current which:6363+ * - is always between <limits.min, limits.max>;6464+ * - is always less or equal to max_ua;6565+ * - is the highest possible value;6666+ * - may be lower than min_ua.6767+ *6868+ * On success returns 0. On error returns -EINVAL (requested min/max current6969+ * is outside of given charger limits) and 'dst' is not set.7070+ */7171+int maxim_charger_calc_reg_current(const struct maxim_charger_current *limits,7272+ unsigned int min_ua, unsigned int max_ua, u8 *dst)7373+{7474+ unsigned int current_bits = 0xf;7575+7676+ if (min_ua > max_ua)7777+ return -EINVAL;7878+7979+ if (min_ua > limits->max || max_ua < limits->min)8080+ return -EINVAL;8181+8282+ if (max_ua < limits->high_start) {8383+ /*8484+ * Less than high_start, so set the minimal current8585+ * (turn Low Bit off, 0 as high bits).8686+ */8787+ *dst = 0x0;8888+ return 0;8989+ }9090+9191+ /* max_ua is in range: <high_start, infinite>, cut it to limits.max */9292+ max_ua = min(limits->max, max_ua);9393+ max_ua -= limits->high_start;9494+ /*9595+ * There is no risk of overflow 'max_ua' here because:9696+ * - max_ua >= limits.high_start9797+ * - BUILD_BUG checks that 'limits' are: max >= high_start + high_step9898+ */9999+ current_bits = max_ua / limits->high_step;100100+101101+ /* Turn Low Bit on (use range <limits.high_start, limits.max>) ... */102102+ *dst = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT;103103+ /* and set proper High Bits */104104+ *dst |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT;105105+106106+ return 0;107107+}108108+EXPORT_SYMBOL_GPL(maxim_charger_calc_reg_current);109109+29110static const struct mfd_cell max14577_devs[] = {30111 {31112 .name = "max14577-muic",···11635 .name = "max14577-regulator",11736 .of_compatible = "maxim,max14577-regulator",11837 },119119- { .name = "max14577-charger", },3838+ {3939+ .name = "max14577-charger",4040+ .of_compatible = "maxim,max14577-charger",4141+ },12042};1214312244static const struct mfd_cell max77836_devs[] = {···546462{547463 BUILD_BUG_ON(ARRAY_SIZE(max14577_i2c_id) != MAXIM_DEVICE_TYPE_NUM);548464 BUILD_BUG_ON(ARRAY_SIZE(max14577_dt_match) != MAXIM_DEVICE_TYPE_NUM);465465+466466+ /* Valid charger current values must be provided for each chipset */467467+ BUILD_BUG_ON(ARRAY_SIZE(maxim_charger_currents) != MAXIM_DEVICE_TYPE_NUM);468468+469469+ /* Check for valid values for charger */470470+ BUILD_BUG_ON(MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START +471471+ MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP * 0xf !=472472+ MAX14577_CHARGER_CURRENT_LIMIT_MAX);473473+ BUILD_BUG_ON(MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP == 0);474474+475475+ BUILD_BUG_ON(MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START +476476+ MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP * 0xf !=477477+ MAX77836_CHARGER_CURRENT_LIMIT_MAX);478478+ BUILD_BUG_ON(MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP == 0);549479550480 return i2c_add_driver(&max14577_i2c_driver);551481}
+3-2
drivers/power/Kconfig
···325325 with help of suspend_again support.326326327327config CHARGER_MAX14577328328- tristate "Maxim MAX14577 MUIC battery charger driver"328328+ tristate "Maxim MAX14577/77836 battery charger driver"329329 depends on MFD_MAX14577330330+ select SYSFS330331 help331332 Say Y to enable support for the battery charger control sysfs and332332- platform data of MAX14577 MUICs.333333+ platform data of MAX14577/77836 MUICs.333334334335config CHARGER_MAX8997335336 tristate "Maxim MAX8997/MAX8966 PMIC battery charger driver"
+337-35
drivers/power/max14577_charger.c
···11/*22- * Battery charger driver for the Maxim 1457722+ * max14577_charger.c - Battery charger driver for the Maxim 14577/7783633 *44- * Copyright (C) 2013 Samsung Electronics44+ * Copyright (C) 2013,2014 Samsung Electronics55 * Krzysztof Kozlowski <k.kozlowski@samsung.com>66 *77 * This program is free software; you can redistribute it and/or modify···1919#include <linux/platform_device.h>2020#include <linux/power_supply.h>2121#include <linux/mfd/max14577-private.h>2222+#include <linux/mfd/max14577.h>22232324struct max14577_charger {2425 struct device *dev;2526 struct max14577 *max14577;2627 struct power_supply charger;27282828- unsigned int charging_state;2929- unsigned int battery_state;2929+ unsigned int charging_state;3030+ unsigned int battery_state;3131+3232+ struct max14577_charger_platform_data *pdata;3033};3434+3535+/*3636+ * Helper function for mapping values of STATUS2/CHGTYP register on max145773737+ * and max77836 chipsets to enum maxim_muic_charger_type.3838+ */3939+static enum max14577_muic_charger_type maxim_get_charger_type(4040+ enum maxim_device_type dev_type, u8 val) {4141+ switch (val) {4242+ case MAX14577_CHARGER_TYPE_NONE:4343+ case MAX14577_CHARGER_TYPE_USB:4444+ case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:4545+ case MAX14577_CHARGER_TYPE_DEDICATED_CHG:4646+ case MAX14577_CHARGER_TYPE_SPECIAL_500MA:4747+ case MAX14577_CHARGER_TYPE_SPECIAL_1A:4848+ return val;4949+ case MAX14577_CHARGER_TYPE_DEAD_BATTERY:5050+ case MAX14577_CHARGER_TYPE_RESERVED:5151+ if (dev_type == MAXIM_DEVICE_TYPE_MAX77836)5252+ val |= 0x8;5353+ return val;5454+ default:5555+ WARN_ONCE(1, "max14577: Unsupported chgtyp register value 0x%02x", val);5656+ return val;5757+ }5858+}31593260static int max14577_get_charger_state(struct max14577_charger *chg)3361{···11789{11890 struct regmap *rmap = chg->max14577->regmap;11991 u8 reg_data;9292+ enum max14577_muic_charger_type chg_type;1209312194 max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, ®_data);12295 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);123123- switch (reg_data) {9696+ chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);9797+ switch (chg_type) {12498 case MAX14577_CHARGER_TYPE_USB:12599 case MAX14577_CHARGER_TYPE_DEDICATED_CHG:126100 case MAX14577_CHARGER_TYPE_SPECIAL_500MA:127101 case MAX14577_CHARGER_TYPE_SPECIAL_1A:128102 case MAX14577_CHARGER_TYPE_DEAD_BATTERY:103103+ case MAX77836_CHARGER_TYPE_SPECIAL_BIAS:129104 return 1;130105 case MAX14577_CHARGER_TYPE_NONE:131106 case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:132107 case MAX14577_CHARGER_TYPE_RESERVED:108108+ case MAX77836_CHARGER_TYPE_RESERVED:133109 default:134110 return 0;135111 }···150118 struct regmap *rmap = chg->max14577->regmap;151119 int state = POWER_SUPPLY_HEALTH_GOOD;152120 u8 reg_data;121121+ enum max14577_muic_charger_type chg_type;153122154123 max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, ®_data);155124 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);156156- if (reg_data == MAX14577_CHARGER_TYPE_DEAD_BATTERY) {125125+ chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);126126+ if (chg_type == MAX14577_CHARGER_TYPE_DEAD_BATTERY) {157127 state = POWER_SUPPLY_HEALTH_DEAD;158128 goto state_set;159129 }···181147 return 1;182148}183149150150+static int max14577_set_fast_charge_timer(struct max14577_charger *chg,151151+ unsigned long hours)152152+{153153+ u8 reg_data;154154+155155+ switch (hours) {156156+ case 5 ... 7:157157+ reg_data = hours - 3;158158+ break;159159+ case 0:160160+ /* Disable */161161+ reg_data = 0x7;162162+ break;163163+ default:164164+ dev_err(chg->dev, "Wrong value for Fast-Charge Timer: %lu\n",165165+ hours);166166+ return -EINVAL;167167+ }168168+ reg_data <<= CHGCTRL1_TCHW_SHIFT;169169+170170+ return max14577_update_reg(chg->max14577->regmap,171171+ MAX14577_REG_CHGCTRL1, CHGCTRL1_TCHW_MASK, reg_data);172172+}173173+174174+static int max14577_init_constant_voltage(struct max14577_charger *chg,175175+ unsigned int uvolt)176176+{177177+ u8 reg_data;178178+179179+ if (uvolt < MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN ||180180+ uvolt > MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)181181+ return -EINVAL;182182+183183+ if (uvolt == 4200000)184184+ reg_data = 0x0;185185+ else if (uvolt == MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)186186+ reg_data = 0x1f;187187+ else if (uvolt <= 4280000) {188188+ unsigned int val = uvolt;189189+190190+ val -= MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN;191191+ val /= MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP;192192+ if (uvolt <= 4180000)193193+ reg_data = 0x1 + val;194194+ else195195+ reg_data = val; /* Fix for gap between 4.18V and 4.22V */196196+ } else197197+ return -EINVAL;198198+199199+ reg_data <<= CHGCTRL3_MBCCVWRC_SHIFT;200200+201201+ return max14577_write_reg(chg->max14577->regmap,202202+ MAX14577_CHG_REG_CHG_CTRL3, reg_data);203203+}204204+205205+static int max14577_init_eoc(struct max14577_charger *chg,206206+ unsigned int uamp)207207+{208208+ unsigned int current_bits = 0xf;209209+ u8 reg_data;210210+211211+ switch (chg->max14577->dev_type) {212212+ case MAXIM_DEVICE_TYPE_MAX77836:213213+ if (uamp < 5000)214214+ return -EINVAL; /* Requested current is too low */215215+216216+ if (uamp >= 7500 && uamp < 10000)217217+ current_bits = 0x0;218218+ else if (uamp <= 50000) {219219+ /* <5000, 7499> and <10000, 50000> */220220+ current_bits = uamp / 5000;221221+ } else {222222+ uamp = min(uamp, 100000U) - 50000U;223223+ current_bits = 0xa + uamp / 10000;224224+ }225225+ break;226226+227227+ case MAXIM_DEVICE_TYPE_MAX14577:228228+ default:229229+ if (uamp < MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN)230230+ return -EINVAL; /* Requested current is too low */231231+232232+ uamp = min(uamp, MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);233233+ uamp -= MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN;234234+ current_bits = uamp / MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP;235235+ break;236236+ }237237+238238+ reg_data = current_bits << CHGCTRL5_EOCS_SHIFT;239239+240240+ return max14577_update_reg(chg->max14577->regmap,241241+ MAX14577_CHG_REG_CHG_CTRL5, CHGCTRL5_EOCS_MASK,242242+ reg_data);243243+}244244+245245+static int max14577_init_fast_charge(struct max14577_charger *chg,246246+ unsigned int uamp)247247+{248248+ u8 reg_data;249249+ int ret;250250+ const struct maxim_charger_current *limits =251251+ &maxim_charger_currents[chg->max14577->dev_type];252252+253253+ ret = maxim_charger_calc_reg_current(limits, uamp, uamp, ®_data);254254+ if (ret) {255255+ dev_err(chg->dev, "Wrong value for fast charge: %u\n", uamp);256256+ return ret;257257+ }258258+259259+ return max14577_update_reg(chg->max14577->regmap,260260+ MAX14577_CHG_REG_CHG_CTRL4,261261+ CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK,262262+ reg_data);263263+}264264+184265/*185266 * Sets charger registers to proper and safe default values.186267 * Some of these values are equal to defaults in MAX14577E187268 * data sheet but there are minor differences.188269 */189189-static void max14577_charger_reg_init(struct max14577_charger *chg)270270+static int max14577_charger_reg_init(struct max14577_charger *chg)190271{191272 struct regmap *rmap = chg->max14577->regmap;192273 u8 reg_data;274274+ int ret;193275194276 /*195277 * Charger-Type Manual Detection, default off (set CHGTYPMAN to 0)···317167 CDETCTRL1_CHGDETEN_MASK | CDETCTRL1_CHGTYPMAN_MASK,318168 reg_data);319169320320- /* Battery Fast-Charge Timer, from SM-V700: 6hrs */321321- reg_data = 0x3 << CHGCTRL1_TCHW_SHIFT;322322- max14577_write_reg(rmap, MAX14577_REG_CHGCTRL1, reg_data);323323-324170 /*325171 * Wall-Adapter Rapid Charge, default on326172 * Battery-Charger, default on···325179 reg_data |= 0x1 << CHGCTRL2_MBCHOSTEN_SHIFT;326180 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL2, reg_data);327181328328- /* Battery-Charger Constant Voltage (CV) Mode, from SM-V700: 4.35V */329329- reg_data = 0xf << CHGCTRL3_MBCCVWRC_SHIFT;330330- max14577_write_reg(rmap, MAX14577_REG_CHGCTRL3, reg_data);331331-332332- /*333333- * Fast Battery-Charge Current Low, default 200-950mA334334- * Fast Battery-Charge Current High, from SM-V700: 450mA335335- */336336- reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT;337337- reg_data |= 0x5 << CHGCTRL4_MBCICHWRCH_SHIFT;338338- max14577_write_reg(rmap, MAX14577_REG_CHGCTRL4, reg_data);339339-340340- /* End-of-Charge Current, from SM-V700: 50mA */341341- reg_data = 0x0 << CHGCTRL5_EOCS_SHIFT;342342- max14577_write_reg(rmap, MAX14577_REG_CHGCTRL5, reg_data);343343-344182 /* Auto Charging Stop, default off */345183 reg_data = 0x0 << CHGCTRL6_AUTOSTOP_SHIFT;346184 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL6, reg_data);347185348348- /* Overvoltage-Protection Threshold, from SM-V700: 6.5V */349349- reg_data = 0x2 << CHGCTRL7_OTPCGHCVS_SHIFT;186186+ ret = max14577_init_constant_voltage(chg, chg->pdata->constant_uvolt);187187+ if (ret)188188+ return ret;189189+190190+ ret = max14577_init_eoc(chg, chg->pdata->eoc_uamp);191191+ if (ret)192192+ return ret;193193+194194+ ret = max14577_init_fast_charge(chg, chg->pdata->fast_charge_uamp);195195+ if (ret)196196+ return ret;197197+198198+ ret = max14577_set_fast_charge_timer(chg,199199+ MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT);200200+ if (ret)201201+ return ret;202202+203203+ /* Initialize Overvoltage-Protection Threshold */204204+ switch (chg->pdata->ovp_uvolt) {205205+ case 7500000:206206+ reg_data = 0x0;207207+ break;208208+ case 6000000:209209+ case 6500000:210210+ case 7000000:211211+ reg_data = 0x1 + (chg->pdata->ovp_uvolt - 6000000) / 500000;212212+ break;213213+ default:214214+ dev_err(chg->dev, "Wrong value for OVP: %u\n",215215+ chg->pdata->ovp_uvolt);216216+ return -EINVAL;217217+ }218218+ reg_data <<= CHGCTRL7_OTPCGHCVS_SHIFT;350219 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL7, reg_data);220220+221221+ return 0;351222}352223353224/* Support property from charger */···378215 POWER_SUPPLY_PROP_MANUFACTURER,379216};380217381381-static const char *model_name = "MAX14577";218218+static const char * const model_names[] = {219219+ [MAXIM_DEVICE_TYPE_UNKNOWN] = "MAX14577-like",220220+ [MAXIM_DEVICE_TYPE_MAX14577] = "MAX14577",221221+ [MAXIM_DEVICE_TYPE_MAX77836] = "MAX77836",222222+};382223static const char *manufacturer = "Maxim Integrated";383224384225static int max14577_charger_get_property(struct power_supply *psy,···411244 val->intval = max14577_get_online(chg);412245 break;413246 case POWER_SUPPLY_PROP_MODEL_NAME:414414- val->strval = model_name;247247+ BUILD_BUG_ON(ARRAY_SIZE(model_names) != MAXIM_DEVICE_TYPE_NUM);248248+ val->strval = model_names[chg->max14577->dev_type];415249 break;416250 case POWER_SUPPLY_PROP_MANUFACTURER:417251 val->strval = manufacturer;···423255424256 return ret;425257}258258+259259+#ifdef CONFIG_OF260260+static struct max14577_charger_platform_data *max14577_charger_dt_init(261261+ struct platform_device *pdev)262262+{263263+ struct max14577_charger_platform_data *pdata;264264+ struct device_node *np = pdev->dev.of_node;265265+ int ret;266266+267267+ if (!np) {268268+ dev_err(&pdev->dev, "No charger OF node\n");269269+ return ERR_PTR(-EINVAL);270270+ }271271+272272+ pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);273273+ if (!pdata)274274+ return ERR_PTR(-ENOMEM);275275+276276+ ret = of_property_read_u32(np, "maxim,constant-uvolt",277277+ &pdata->constant_uvolt);278278+ if (ret) {279279+ dev_err(&pdev->dev, "Cannot parse maxim,constant-uvolt field from DT\n");280280+ return ERR_PTR(ret);281281+ }282282+283283+ ret = of_property_read_u32(np, "maxim,fast-charge-uamp",284284+ &pdata->fast_charge_uamp);285285+ if (ret) {286286+ dev_err(&pdev->dev, "Cannot parse maxim,fast-charge-uamp field from DT\n");287287+ return ERR_PTR(ret);288288+ }289289+290290+ ret = of_property_read_u32(np, "maxim,eoc-uamp", &pdata->eoc_uamp);291291+ if (ret) {292292+ dev_err(&pdev->dev, "Cannot parse maxim,eoc-uamp field from DT\n");293293+ return ERR_PTR(ret);294294+ }295295+296296+ ret = of_property_read_u32(np, "maxim,ovp-uvolt", &pdata->ovp_uvolt);297297+ if (ret) {298298+ dev_err(&pdev->dev, "Cannot parse maxim,ovp-uvolt field from DT\n");299299+ return ERR_PTR(ret);300300+ }301301+302302+ return pdata;303303+}304304+#else /* CONFIG_OF */305305+static struct max14577_charger_platform_data *max14577_charger_dt_init(306306+ struct platform_device *pdev)307307+{308308+ return NULL;309309+}310310+#endif /* CONFIG_OF */311311+312312+static ssize_t show_fast_charge_timer(struct device *dev,313313+ struct device_attribute *attr, char *buf)314314+{315315+ struct max14577_charger *chg = dev_get_drvdata(dev);316316+ u8 reg_data;317317+ int ret;318318+ unsigned int val;319319+320320+ ret = max14577_read_reg(chg->max14577->regmap, MAX14577_REG_CHGCTRL1,321321+ ®_data);322322+ if (ret)323323+ return ret;324324+325325+ reg_data &= CHGCTRL1_TCHW_MASK;326326+ reg_data >>= CHGCTRL1_TCHW_SHIFT;327327+ switch (reg_data) {328328+ case 0x2 ... 0x4:329329+ val = reg_data + 3;330330+ break;331331+ case 0x7:332332+ val = 0;333333+ break;334334+ default:335335+ val = 5;336336+ break;337337+ }338338+339339+ return scnprintf(buf, PAGE_SIZE, "%u\n", val);340340+}341341+342342+static ssize_t store_fast_charge_timer(struct device *dev,343343+ struct device_attribute *attr, const char *buf, size_t count)344344+{345345+ struct max14577_charger *chg = dev_get_drvdata(dev);346346+ unsigned long val;347347+ int ret;348348+349349+ ret = kstrtoul(buf, 10, &val);350350+ if (ret)351351+ return ret;352352+353353+ ret = max14577_set_fast_charge_timer(chg, val);354354+ if (ret)355355+ return ret;356356+357357+ return count;358358+}359359+360360+static DEVICE_ATTR(fast_charge_timer, S_IRUGO | S_IWUSR,361361+ show_fast_charge_timer, store_fast_charge_timer);426362427363static int max14577_charger_probe(struct platform_device *pdev)428364{···542270 chg->dev = &pdev->dev;543271 chg->max14577 = max14577;544272545545- max14577_charger_reg_init(chg);273273+ chg->pdata = max14577_charger_dt_init(pdev);274274+ if (IS_ERR_OR_NULL(chg->pdata))275275+ return PTR_ERR(chg->pdata);276276+277277+ ret = max14577_charger_reg_init(chg);278278+ if (ret)279279+ return ret;546280547281 chg->charger.name = "max14577-charger",548282 chg->charger.type = POWER_SUPPLY_TYPE_BATTERY,···556278 chg->charger.num_properties = ARRAY_SIZE(max14577_charger_props),557279 chg->charger.get_property = max14577_charger_get_property,558280559559- ret = power_supply_register(&pdev->dev, &chg->charger);281281+ ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);560282 if (ret) {561561- dev_err(&pdev->dev, "failed: power supply register\n");283283+ dev_err(&pdev->dev, "failed: create sysfs entry\n");562284 return ret;563285 }564286287287+ ret = power_supply_register(&pdev->dev, &chg->charger);288288+ if (ret) {289289+ dev_err(&pdev->dev, "failed: power supply register\n");290290+ goto err;291291+ }292292+293293+ /* Check for valid values for charger */294294+ BUILD_BUG_ON(MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN +295295+ MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP * 0xf !=296296+ MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);565297 return 0;298298+299299+err:300300+ device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);301301+302302+ return ret;566303}567304568305static int max14577_charger_remove(struct platform_device *pdev)569306{570307 struct max14577_charger *chg = platform_get_drvdata(pdev);571308309309+ device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);572310 power_supply_unregister(&chg->charger);573311574312 return 0;575313}314314+315315+static const struct platform_device_id max14577_charger_id[] = {316316+ { "max14577-charger", MAXIM_DEVICE_TYPE_MAX14577, },317317+ { "max77836-charger", MAXIM_DEVICE_TYPE_MAX77836, },318318+ { }319319+};320320+MODULE_DEVICE_TABLE(platform, max14577_charger_id);576321577322static struct platform_driver max14577_charger_driver = {578323 .driver = {···604303 },605304 .probe = max14577_charger_probe,606305 .remove = max14577_charger_remove,306306+ .id_table = max14577_charger_id,607307};608308module_platform_driver(max14577_charger_driver);609309610310MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>");611611-MODULE_DESCRIPTION("MAXIM 14577 charger driver");311311+MODULE_DESCRIPTION("Maxim 14577/77836 charger driver");612312MODULE_LICENSE("GPL");
···2222#include <linux/mfd/max14577-private.h>2323#include <linux/regulator/of_regulator.h>24242525-/*2626- * Valid limits of current for max14577 and max77836 chargers.2727- * They must correspond to MBCICHWRCL and MBCICHWRCH fields in CHGCTRL42828- * register for given chipset.2929- */3030-struct maxim_charger_current {3131- /* Minimal current, set in CHGCTRL4/MBCICHWRCL, uA */3232- unsigned int min;3333- /*3434- * Minimal current when high setting is active,3535- * set in CHGCTRL4/MBCICHWRCH, uA3636- */3737- unsigned int high_start;3838- /* Value of one step in high setting, uA */3939- unsigned int high_step;4040- /* Maximum current of high setting, uA */4141- unsigned int max;4242-};4343-4444-/* Table of valid charger currents for different Maxim chipsets */4545-static const struct maxim_charger_current maxim_charger_currents[] = {4646- [MAXIM_DEVICE_TYPE_UNKNOWN] = { 0, 0, 0, 0 },4747- [MAXIM_DEVICE_TYPE_MAX14577] = {4848- .min = MAX14577_REGULATOR_CURRENT_LIMIT_MIN,4949- .high_start = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START,5050- .high_step = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP,5151- .max = MAX14577_REGULATOR_CURRENT_LIMIT_MAX,5252- },5353- [MAXIM_DEVICE_TYPE_MAX77836] = {5454- .min = MAX77836_REGULATOR_CURRENT_LIMIT_MIN,5555- .high_start = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START,5656- .high_step = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP,5757- .max = MAX77836_REGULATOR_CURRENT_LIMIT_MAX,5858- },5959-};6060-6125static int max14577_reg_is_enabled(struct regulator_dev *rdev)6226{6327 int rid = rdev_get_id(rdev);···67103static int max14577_reg_set_current_limit(struct regulator_dev *rdev,68104 int min_uA, int max_uA)69105{7070- int i, current_bits = 0xf;71106 u8 reg_data;107107+ int ret;72108 struct max14577 *max14577 = rdev_get_drvdata(rdev);73109 const struct maxim_charger_current *limits =74110 &maxim_charger_currents[max14577->dev_type];···76112 if (rdev_get_id(rdev) != MAX14577_CHARGER)77113 return -EINVAL;781147979- if (min_uA > limits->max || max_uA < limits->min)8080- return -EINVAL;8181-8282- if (max_uA < limits->high_start) {8383- /*8484- * Less than high_start,8585- * so set the minimal current (turn only Low Bit off)8686- */8787- u8 reg_data = 0x0 << CHGCTRL4_MBCICHWRCL_SHIFT;8888- return max14577_update_reg(rdev->regmap,8989- MAX14577_CHG_REG_CHG_CTRL4,9090- CHGCTRL4_MBCICHWRCL_MASK, reg_data);9191- }9292-9393- /*9494- * max_uA is in range: <high_start, inifinite>, so search for9595- * valid current starting from maximum current.9696- */9797- for (i = limits->max; i >= limits->high_start; i -= limits->high_step) {9898- if (i <= max_uA)9999- break;100100- current_bits--;101101- }102102- BUG_ON(current_bits < 0); /* Cannot happen */103103-104104- /* Turn Low Bit on (use range high_start-max)... */105105- reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT;106106- /* and set proper High Bits */107107- reg_data |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT;115115+ ret = maxim_charger_calc_reg_current(limits, min_uA, max_uA, ®_data);116116+ if (ret)117117+ return ret;108118109119 return max14577_update_reg(rdev->regmap, MAX14577_CHG_REG_CHG_CTRL4,110120 CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK,···380442381443static int __init max14577_regulator_init(void)382444{383383- /* Check for valid values for charger */384384- BUILD_BUG_ON(MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START +385385- MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf !=386386- MAX14577_REGULATOR_CURRENT_LIMIT_MAX);387387- BUILD_BUG_ON(MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START +388388- MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf !=389389- MAX77836_REGULATOR_CURRENT_LIMIT_MAX);390390- /* Valid charger current values must be provided for each chipset */391391- BUILD_BUG_ON(ARRAY_SIZE(maxim_charger_currents) != MAXIM_DEVICE_TYPE_NUM);392392-393445 BUILD_BUG_ON(ARRAY_SIZE(max14577_supported_regulators) != MAX14577_REGULATOR_NUM);394446 BUILD_BUG_ON(ARRAY_SIZE(max77836_supported_regulators) != MAX77836_REGULATOR_NUM);395447
+69-24
include/linux/mfd/max14577-private.h
···7272 MAX14577_MUIC_REG_END,7373};74747575+/*7676+ * Combined charger types for max14577 and max77836.7777+ *7878+ * On max14577 three lower bits map to STATUS2/CHGTYP field.7979+ * However the max77836 has different two last values of STATUS2/CHGTYP.8080+ * To indicate the difference enum has two additional values for max77836.8181+ * These values are just a register value bitwise OR with 0x8.8282+ */7583enum max14577_muic_charger_type {7676- MAX14577_CHARGER_TYPE_NONE = 0,7777- MAX14577_CHARGER_TYPE_USB,7878- MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT,7979- MAX14577_CHARGER_TYPE_DEDICATED_CHG,8080- MAX14577_CHARGER_TYPE_SPECIAL_500MA,8181- MAX14577_CHARGER_TYPE_SPECIAL_1A,8282- MAX14577_CHARGER_TYPE_RESERVED,8383- MAX14577_CHARGER_TYPE_DEAD_BATTERY = 7,8484+ MAX14577_CHARGER_TYPE_NONE = 0x0,8585+ MAX14577_CHARGER_TYPE_USB = 0x1,8686+ MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT = 0x2,8787+ MAX14577_CHARGER_TYPE_DEDICATED_CHG = 0x3,8888+ MAX14577_CHARGER_TYPE_SPECIAL_500MA = 0x4,8989+ /* Special 1A or 2A charger */9090+ MAX14577_CHARGER_TYPE_SPECIAL_1A = 0x5,9191+ /* max14577: reserved, used on max77836 */9292+ MAX14577_CHARGER_TYPE_RESERVED = 0x6,9393+ /* max14577: dead-battery charing with maximum current 100mA */9494+ MAX14577_CHARGER_TYPE_DEAD_BATTERY = 0x7,9595+ /*9696+ * max77836: special charger (bias on D+/D-),9797+ * matches register value of 0x69898+ */9999+ MAX77836_CHARGER_TYPE_SPECIAL_BIAS = 0xe,100100+ /* max77836: reserved, register value 0x7 */101101+ MAX77836_CHARGER_TYPE_RESERVED = 0xf,84102};8510386104/* MAX14577 interrupts */···139121#define STATUS2_CHGTYP_SHIFT 0140122#define STATUS2_CHGDETRUN_SHIFT 3141123#define STATUS2_DCDTMR_SHIFT 4142142-#define STATUS2_DBCHG_SHIFT 5124124+#define MAX14577_STATUS2_DBCHG_SHIFT 5125125+#define MAX77836_STATUS2_DXOVP_SHIFT 5143126#define STATUS2_VBVOLT_SHIFT 6144127#define MAX77836_STATUS2_VIDRM_SHIFT 7145128#define STATUS2_CHGTYP_MASK (0x7 << STATUS2_CHGTYP_SHIFT)146129#define STATUS2_CHGDETRUN_MASK BIT(STATUS2_CHGDETRUN_SHIFT)147130#define STATUS2_DCDTMR_MASK BIT(STATUS2_DCDTMR_SHIFT)148148-#define STATUS2_DBCHG_MASK BIT(STATUS2_DBCHG_SHIFT)131131+#define MAX14577_STATUS2_DBCHG_MASK BIT(MAX14577_STATUS2_DBCHG_SHIFT)132132+#define MAX77836_STATUS2_DXOVP_MASK BIT(MAX77836_STATUS2_DXOVP_SHIFT)149133#define STATUS2_VBVOLT_MASK BIT(STATUS2_VBVOLT_SHIFT)150134#define MAX77836_STATUS2_VIDRM_MASK BIT(MAX77836_STATUS2_VIDRM_SHIFT)151135···197177#define CTRL3_JIGSET_SHIFT 0198178#define CTRL3_BOOTSET_SHIFT 2199179#define CTRL3_ADCDBSET_SHIFT 4180180+#define CTRL3_WBTH_SHIFT 6200181#define CTRL3_JIGSET_MASK (0x3 << CTRL3_JIGSET_SHIFT)201182#define CTRL3_BOOTSET_MASK (0x3 << CTRL3_BOOTSET_SHIFT)202183#define CTRL3_ADCDBSET_MASK (0x3 << CTRL3_ADCDBSET_SHIFT)184184+#define CTRL3_WBTH_MASK (0x3 << CTRL3_WBTH_SHIFT)203185204186/* Slave addr = 0x4A: Charger */205187enum max14577_charger_reg {···232210#define CDETCTRL1_CHGTYPMAN_SHIFT 1233211#define CDETCTRL1_DCDEN_SHIFT 2234212#define CDETCTRL1_DCD2SCT_SHIFT 3235235-#define CDETCTRL1_DCHKTM_SHIFT 4236236-#define CDETCTRL1_DBEXIT_SHIFT 5213213+#define MAX14577_CDETCTRL1_DCHKTM_SHIFT 4214214+#define MAX77836_CDETCTRL1_CDLY_SHIFT 4215215+#define MAX14577_CDETCTRL1_DBEXIT_SHIFT 5216216+#define MAX77836_CDETCTRL1_DCDCPL_SHIFT 5237217#define CDETCTRL1_DBIDLE_SHIFT 6238218#define CDETCTRL1_CDPDET_SHIFT 7239219#define CDETCTRL1_CHGDETEN_MASK BIT(CDETCTRL1_CHGDETEN_SHIFT)240220#define CDETCTRL1_CHGTYPMAN_MASK BIT(CDETCTRL1_CHGTYPMAN_SHIFT)241221#define CDETCTRL1_DCDEN_MASK BIT(CDETCTRL1_DCDEN_SHIFT)242222#define CDETCTRL1_DCD2SCT_MASK BIT(CDETCTRL1_DCD2SCT_SHIFT)243243-#define CDETCTRL1_DCHKTM_MASK BIT(CDETCTRL1_DCHKTM_SHIFT)244244-#define CDETCTRL1_DBEXIT_MASK BIT(CDETCTRL1_DBEXIT_SHIFT)223223+#define MAX14577_CDETCTRL1_DCHKTM_MASK BIT(MAX14577_CDETCTRL1_DCHKTM_SHIFT)224224+#define MAX77836_CDETCTRL1_CDDLY_MASK BIT(MAX77836_CDETCTRL1_CDDLY_SHIFT)225225+#define MAX14577_CDETCTRL1_DBEXIT_MASK BIT(MAX14577_CDETCTRL1_DBEXIT_SHIFT)226226+#define MAX77836_CDETCTRL1_DCDCPL_MASK BIT(MAX77836_CDETCTRL1_DCDCPL_SHIFT)245227#define CDETCTRL1_DBIDLE_MASK BIT(CDETCTRL1_DBIDLE_SHIFT)246228#define CDETCTRL1_CDPDET_MASK BIT(CDETCTRL1_CDPDET_SHIFT)247229···281255#define CHGCTRL7_OTPCGHCVS_SHIFT 0282256#define CHGCTRL7_OTPCGHCVS_MASK (0x3 << CHGCTRL7_OTPCGHCVS_SHIFT)283257284284-/* MAX14577 regulator current limits (as in CHGCTRL4 register), uA */285285-#define MAX14577_REGULATOR_CURRENT_LIMIT_MIN 90000286286-#define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START 200000287287-#define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP 50000288288-#define MAX14577_REGULATOR_CURRENT_LIMIT_MAX 950000258258+/* MAX14577 charger current limits (as in CHGCTRL4 register), uA */259259+#define MAX14577_CHARGER_CURRENT_LIMIT_MIN 90000U260260+#define MAX14577_CHARGER_CURRENT_LIMIT_HIGH_START 200000U261261+#define MAX14577_CHARGER_CURRENT_LIMIT_HIGH_STEP 50000U262262+#define MAX14577_CHARGER_CURRENT_LIMIT_MAX 950000U289263290290-/* MAX77836 regulator current limits (as in CHGCTRL4 register), uA */291291-#define MAX77836_REGULATOR_CURRENT_LIMIT_MIN 45000292292-#define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START 100000293293-#define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP 25000294294-#define MAX77836_REGULATOR_CURRENT_LIMIT_MAX 475000264264+/* MAX77836 charger current limits (as in CHGCTRL4 register), uA */265265+#define MAX77836_CHARGER_CURRENT_LIMIT_MIN 45000U266266+#define MAX77836_CHARGER_CURRENT_LIMIT_HIGH_START 100000U267267+#define MAX77836_CHARGER_CURRENT_LIMIT_HIGH_STEP 25000U268268+#define MAX77836_CHARGER_CURRENT_LIMIT_MAX 475000U269269+270270+/*271271+ * MAX14577 charger End-Of-Charge current limits272272+ * (as in CHGCTRL5 register), uA273273+ */274274+#define MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN 50000U275275+#define MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP 10000U276276+#define MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX 200000U277277+278278+/*279279+ * MAX14577/MAX77836 Battery Constant Voltage280280+ * (as in CHGCTRL3 register), uV281281+ */282282+#define MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN 4000000U283283+#define MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP 20000U284284+#define MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX 4350000U285285+286286+/* Default value for fast charge timer, in hours */287287+#define MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT 5295288296289/* MAX14577 regulator SFOUT LDO voltage, fixed, uV */297290#define MAX14577_REGULATOR_SAFEOUT_VOLTAGE 4900000
+30
include/linux/mfd/max14577.h
···5454 struct device_node *of_node;5555};56565757+struct max14577_charger_platform_data {5858+ u32 constant_uvolt;5959+ u32 fast_charge_uamp;6060+ u32 eoc_uamp;6161+ u32 ovp_uvolt;6262+};6363+5764/*5865 * MAX14577 MFD platform data5966 */···80738174 struct max14577_regulator_platform_data *regulators;8275};7676+7777+/*7878+ * Valid limits of current for max14577 and max77836 chargers.7979+ * They must correspond to MBCICHWRCL and MBCICHWRCH fields in CHGCTRL48080+ * register for given chipset.8181+ */8282+struct maxim_charger_current {8383+ /* Minimal current, set in CHGCTRL4/MBCICHWRCL, uA */8484+ unsigned int min;8585+ /*8686+ * Minimal current when high setting is active,8787+ * set in CHGCTRL4/MBCICHWRCH, uA8888+ */8989+ unsigned int high_start;9090+ /* Value of one step in high setting, uA */9191+ unsigned int high_step;9292+ /* Maximum current of high setting, uA */9393+ unsigned int max;9494+};9595+9696+extern const struct maxim_charger_current maxim_charger_currents[];9797+extern int maxim_charger_calc_reg_current(const struct maxim_charger_current *limits,9898+ unsigned int min_ua, unsigned int max_ua, u8 *dst);839984100#endif /* __MAX14577_H__ */