cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

max17042_battery.c (33328B)


      1// SPDX-License-Identifier: GPL-2.0+
      2//
      3// Fuel gauge driver for Maxim 17042 / 8966 / 8997
      4//  Note that Maxim 8966 and 8997 are mfd and this is its subdevice.
      5//
      6// Copyright (C) 2011 Samsung Electronics
      7// MyungJoo Ham <myungjoo.ham@samsung.com>
      8//
      9// This driver is based on max17040_battery.c
     10
     11#include <linux/acpi.h>
     12#include <linux/devm-helpers.h>
     13#include <linux/init.h>
     14#include <linux/module.h>
     15#include <linux/slab.h>
     16#include <linux/i2c.h>
     17#include <linux/delay.h>
     18#include <linux/interrupt.h>
     19#include <linux/pm.h>
     20#include <linux/mod_devicetable.h>
     21#include <linux/power_supply.h>
     22#include <linux/power/max17042_battery.h>
     23#include <linux/of.h>
     24#include <linux/regmap.h>
     25
     26/* Status register bits */
     27#define STATUS_POR_BIT         (1 << 1)
     28#define STATUS_BST_BIT         (1 << 3)
     29#define STATUS_VMN_BIT         (1 << 8)
     30#define STATUS_TMN_BIT         (1 << 9)
     31#define STATUS_SMN_BIT         (1 << 10)
     32#define STATUS_BI_BIT          (1 << 11)
     33#define STATUS_VMX_BIT         (1 << 12)
     34#define STATUS_TMX_BIT         (1 << 13)
     35#define STATUS_SMX_BIT         (1 << 14)
     36#define STATUS_BR_BIT          (1 << 15)
     37
     38/* Interrupt mask bits */
     39#define CONFIG_ALRT_BIT_ENBL	(1 << 2)
     40
     41#define VFSOC0_LOCK		0x0000
     42#define VFSOC0_UNLOCK		0x0080
     43#define MODEL_UNLOCK1	0X0059
     44#define MODEL_UNLOCK2	0X00C4
     45#define MODEL_LOCK1		0X0000
     46#define MODEL_LOCK2		0X0000
     47
     48#define dQ_ACC_DIV	0x4
     49#define dP_ACC_100	0x1900
     50#define dP_ACC_200	0x3200
     51
     52#define MAX17042_VMAX_TOLERANCE		50 /* 50 mV */
     53
     54struct max17042_chip {
     55	struct i2c_client *client;
     56	struct regmap *regmap;
     57	struct power_supply *battery;
     58	enum max170xx_chip_type chip_type;
     59	struct max17042_platform_data *pdata;
     60	struct work_struct work;
     61	int    init_complete;
     62};
     63
     64static enum power_supply_property max17042_battery_props[] = {
     65	POWER_SUPPLY_PROP_STATUS,
     66	POWER_SUPPLY_PROP_PRESENT,
     67	POWER_SUPPLY_PROP_TECHNOLOGY,
     68	POWER_SUPPLY_PROP_CYCLE_COUNT,
     69	POWER_SUPPLY_PROP_VOLTAGE_MAX,
     70	POWER_SUPPLY_PROP_VOLTAGE_MIN,
     71	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
     72	POWER_SUPPLY_PROP_VOLTAGE_NOW,
     73	POWER_SUPPLY_PROP_VOLTAGE_AVG,
     74	POWER_SUPPLY_PROP_VOLTAGE_OCV,
     75	POWER_SUPPLY_PROP_CAPACITY,
     76	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
     77	POWER_SUPPLY_PROP_CHARGE_FULL,
     78	POWER_SUPPLY_PROP_CHARGE_NOW,
     79	POWER_SUPPLY_PROP_CHARGE_COUNTER,
     80	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
     81	POWER_SUPPLY_PROP_TEMP,
     82	POWER_SUPPLY_PROP_TEMP_ALERT_MIN,
     83	POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
     84	POWER_SUPPLY_PROP_TEMP_MIN,
     85	POWER_SUPPLY_PROP_TEMP_MAX,
     86	POWER_SUPPLY_PROP_HEALTH,
     87	POWER_SUPPLY_PROP_SCOPE,
     88	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
     89	// these two have to be at the end on the list
     90	POWER_SUPPLY_PROP_CURRENT_NOW,
     91	POWER_SUPPLY_PROP_CURRENT_AVG,
     92};
     93
     94static int max17042_get_temperature(struct max17042_chip *chip, int *temp)
     95{
     96	int ret;
     97	u32 data;
     98	struct regmap *map = chip->regmap;
     99
    100	ret = regmap_read(map, MAX17042_TEMP, &data);
    101	if (ret < 0)
    102		return ret;
    103
    104	*temp = sign_extend32(data, 15);
    105	/* The value is converted into deci-centigrade scale */
    106	/* Units of LSB = 1 / 256 degree Celsius */
    107	*temp = *temp * 10 / 256;
    108	return 0;
    109}
    110
    111static int max17042_get_status(struct max17042_chip *chip, int *status)
    112{
    113	int ret, charge_full, charge_now;
    114	int avg_current;
    115	u32 data;
    116
    117	ret = power_supply_am_i_supplied(chip->battery);
    118	if (ret < 0) {
    119		*status = POWER_SUPPLY_STATUS_UNKNOWN;
    120		return 0;
    121	}
    122	if (ret == 0) {
    123		*status = POWER_SUPPLY_STATUS_DISCHARGING;
    124		return 0;
    125	}
    126
    127	/*
    128	 * The MAX170xx has builtin end-of-charge detection and will update
    129	 * FullCAP to match RepCap when it detects end of charging.
    130	 *
    131	 * When this cycle the battery gets charged to a higher (calculated)
    132	 * capacity then the previous cycle then FullCAP will get updated
    133	 * continuously once end-of-charge detection kicks in, so allow the
    134	 * 2 to differ a bit.
    135	 */
    136
    137	ret = regmap_read(chip->regmap, MAX17042_FullCAP, &charge_full);
    138	if (ret < 0)
    139		return ret;
    140
    141	ret = regmap_read(chip->regmap, MAX17042_RepCap, &charge_now);
    142	if (ret < 0)
    143		return ret;
    144
    145	if ((charge_full - charge_now) <= MAX17042_FULL_THRESHOLD) {
    146		*status = POWER_SUPPLY_STATUS_FULL;
    147		return 0;
    148	}
    149
    150	/*
    151	 * Even though we are supplied, we may still be discharging if the
    152	 * supply is e.g. only delivering 5V 0.5A. Check current if available.
    153	 */
    154	if (!chip->pdata->enable_current_sense) {
    155		*status = POWER_SUPPLY_STATUS_CHARGING;
    156		return 0;
    157	}
    158
    159	ret = regmap_read(chip->regmap, MAX17042_AvgCurrent, &data);
    160	if (ret < 0)
    161		return ret;
    162
    163	avg_current = sign_extend32(data, 15);
    164	avg_current *= 1562500 / chip->pdata->r_sns;
    165
    166	if (avg_current > 0)
    167		*status = POWER_SUPPLY_STATUS_CHARGING;
    168	else
    169		*status = POWER_SUPPLY_STATUS_DISCHARGING;
    170
    171	return 0;
    172}
    173
    174static int max17042_get_battery_health(struct max17042_chip *chip, int *health)
    175{
    176	int temp, vavg, vbatt, ret;
    177	u32 val;
    178
    179	ret = regmap_read(chip->regmap, MAX17042_AvgVCELL, &val);
    180	if (ret < 0)
    181		goto health_error;
    182
    183	/* bits [0-3] unused */
    184	vavg = val * 625 / 8;
    185	/* Convert to millivolts */
    186	vavg /= 1000;
    187
    188	ret = regmap_read(chip->regmap, MAX17042_VCELL, &val);
    189	if (ret < 0)
    190		goto health_error;
    191
    192	/* bits [0-3] unused */
    193	vbatt = val * 625 / 8;
    194	/* Convert to millivolts */
    195	vbatt /= 1000;
    196
    197	if (vavg < chip->pdata->vmin) {
    198		*health = POWER_SUPPLY_HEALTH_DEAD;
    199		goto out;
    200	}
    201
    202	if (vbatt > chip->pdata->vmax + MAX17042_VMAX_TOLERANCE) {
    203		*health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
    204		goto out;
    205	}
    206
    207	ret = max17042_get_temperature(chip, &temp);
    208	if (ret < 0)
    209		goto health_error;
    210
    211	if (temp < chip->pdata->temp_min) {
    212		*health = POWER_SUPPLY_HEALTH_COLD;
    213		goto out;
    214	}
    215
    216	if (temp > chip->pdata->temp_max) {
    217		*health = POWER_SUPPLY_HEALTH_OVERHEAT;
    218		goto out;
    219	}
    220
    221	*health = POWER_SUPPLY_HEALTH_GOOD;
    222
    223out:
    224	return 0;
    225
    226health_error:
    227	return ret;
    228}
    229
    230static int max17042_get_property(struct power_supply *psy,
    231			    enum power_supply_property psp,
    232			    union power_supply_propval *val)
    233{
    234	struct max17042_chip *chip = power_supply_get_drvdata(psy);
    235	struct regmap *map = chip->regmap;
    236	int ret;
    237	u32 data;
    238	u64 data64;
    239
    240	if (!chip->init_complete)
    241		return -EAGAIN;
    242
    243	switch (psp) {
    244	case POWER_SUPPLY_PROP_STATUS:
    245		ret = max17042_get_status(chip, &val->intval);
    246		if (ret < 0)
    247			return ret;
    248		break;
    249	case POWER_SUPPLY_PROP_PRESENT:
    250		ret = regmap_read(map, MAX17042_STATUS, &data);
    251		if (ret < 0)
    252			return ret;
    253
    254		if (data & MAX17042_STATUS_BattAbsent)
    255			val->intval = 0;
    256		else
    257			val->intval = 1;
    258		break;
    259	case POWER_SUPPLY_PROP_TECHNOLOGY:
    260		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
    261		break;
    262	case POWER_SUPPLY_PROP_CYCLE_COUNT:
    263		ret = regmap_read(map, MAX17042_Cycles, &data);
    264		if (ret < 0)
    265			return ret;
    266
    267		val->intval = data;
    268		break;
    269	case POWER_SUPPLY_PROP_VOLTAGE_MAX:
    270		ret = regmap_read(map, MAX17042_MinMaxVolt, &data);
    271		if (ret < 0)
    272			return ret;
    273
    274		val->intval = data >> 8;
    275		val->intval *= 20000; /* Units of LSB = 20mV */
    276		break;
    277	case POWER_SUPPLY_PROP_VOLTAGE_MIN:
    278		ret = regmap_read(map, MAX17042_MinMaxVolt, &data);
    279		if (ret < 0)
    280			return ret;
    281
    282		val->intval = (data & 0xff) * 20000; /* Units of 20mV */
    283		break;
    284	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
    285		if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
    286			ret = regmap_read(map, MAX17042_V_empty, &data);
    287		else
    288			ret = regmap_read(map, MAX17047_V_empty, &data);
    289		if (ret < 0)
    290			return ret;
    291
    292		val->intval = data >> 7;
    293		val->intval *= 10000; /* Units of LSB = 10mV */
    294		break;
    295	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
    296		ret = regmap_read(map, MAX17042_VCELL, &data);
    297		if (ret < 0)
    298			return ret;
    299
    300		val->intval = data * 625 / 8;
    301		break;
    302	case POWER_SUPPLY_PROP_VOLTAGE_AVG:
    303		ret = regmap_read(map, MAX17042_AvgVCELL, &data);
    304		if (ret < 0)
    305			return ret;
    306
    307		val->intval = data * 625 / 8;
    308		break;
    309	case POWER_SUPPLY_PROP_VOLTAGE_OCV:
    310		ret = regmap_read(map, MAX17042_OCVInternal, &data);
    311		if (ret < 0)
    312			return ret;
    313
    314		val->intval = data * 625 / 8;
    315		break;
    316	case POWER_SUPPLY_PROP_CAPACITY:
    317		if (chip->pdata->enable_current_sense)
    318			ret = regmap_read(map, MAX17042_RepSOC, &data);
    319		else
    320			ret = regmap_read(map, MAX17042_VFSOC, &data);
    321		if (ret < 0)
    322			return ret;
    323
    324		val->intval = data >> 8;
    325		break;
    326	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
    327		ret = regmap_read(map, MAX17042_DesignCap, &data);
    328		if (ret < 0)
    329			return ret;
    330
    331		data64 = data * 5000000ll;
    332		do_div(data64, chip->pdata->r_sns);
    333		val->intval = data64;
    334		break;
    335	case POWER_SUPPLY_PROP_CHARGE_FULL:
    336		ret = regmap_read(map, MAX17042_FullCAP, &data);
    337		if (ret < 0)
    338			return ret;
    339
    340		data64 = data * 5000000ll;
    341		do_div(data64, chip->pdata->r_sns);
    342		val->intval = data64;
    343		break;
    344	case POWER_SUPPLY_PROP_CHARGE_NOW:
    345		ret = regmap_read(map, MAX17042_RepCap, &data);
    346		if (ret < 0)
    347			return ret;
    348
    349		data64 = data * 5000000ll;
    350		do_div(data64, chip->pdata->r_sns);
    351		val->intval = data64;
    352		break;
    353	case POWER_SUPPLY_PROP_CHARGE_COUNTER:
    354		ret = regmap_read(map, MAX17042_QH, &data);
    355		if (ret < 0)
    356			return ret;
    357
    358		data64 = sign_extend64(data, 15) * 5000000ll;
    359		val->intval = div_s64(data64, chip->pdata->r_sns);
    360		break;
    361	case POWER_SUPPLY_PROP_TEMP:
    362		ret = max17042_get_temperature(chip, &val->intval);
    363		if (ret < 0)
    364			return ret;
    365		break;
    366	case POWER_SUPPLY_PROP_TEMP_ALERT_MIN:
    367		ret = regmap_read(map, MAX17042_TALRT_Th, &data);
    368		if (ret < 0)
    369			return ret;
    370		/* LSB is Alert Minimum. In deci-centigrade */
    371		val->intval = sign_extend32(data & 0xff, 7) * 10;
    372		break;
    373	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
    374		ret = regmap_read(map, MAX17042_TALRT_Th, &data);
    375		if (ret < 0)
    376			return ret;
    377		/* MSB is Alert Maximum. In deci-centigrade */
    378		val->intval = sign_extend32(data >> 8, 7) * 10;
    379		break;
    380	case POWER_SUPPLY_PROP_TEMP_MIN:
    381		val->intval = chip->pdata->temp_min;
    382		break;
    383	case POWER_SUPPLY_PROP_TEMP_MAX:
    384		val->intval = chip->pdata->temp_max;
    385		break;
    386	case POWER_SUPPLY_PROP_HEALTH:
    387		ret = max17042_get_battery_health(chip, &val->intval);
    388		if (ret < 0)
    389			return ret;
    390		break;
    391	case POWER_SUPPLY_PROP_SCOPE:
    392		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
    393		break;
    394	case POWER_SUPPLY_PROP_CURRENT_NOW:
    395		if (chip->pdata->enable_current_sense) {
    396			ret = regmap_read(map, MAX17042_Current, &data);
    397			if (ret < 0)
    398				return ret;
    399
    400			data64 = sign_extend64(data, 15) * 1562500ll;
    401			val->intval = div_s64(data64, chip->pdata->r_sns);
    402		} else {
    403			return -EINVAL;
    404		}
    405		break;
    406	case POWER_SUPPLY_PROP_CURRENT_AVG:
    407		if (chip->pdata->enable_current_sense) {
    408			ret = regmap_read(map, MAX17042_AvgCurrent, &data);
    409			if (ret < 0)
    410				return ret;
    411
    412			data64 = sign_extend64(data, 15) * 1562500ll;
    413			val->intval = div_s64(data64, chip->pdata->r_sns);
    414		} else {
    415			return -EINVAL;
    416		}
    417		break;
    418	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
    419		ret = regmap_read(map, MAX17042_ICHGTerm, &data);
    420		if (ret < 0)
    421			return ret;
    422
    423		data64 = data * 1562500ll;
    424		val->intval = div_s64(data64, chip->pdata->r_sns);
    425		break;
    426	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
    427		ret = regmap_read(map, MAX17042_TTE, &data);
    428		if (ret < 0)
    429			return ret;
    430
    431		val->intval = data * 5625 / 1000;
    432		break;
    433	default:
    434		return -EINVAL;
    435	}
    436	return 0;
    437}
    438
    439static int max17042_set_property(struct power_supply *psy,
    440			    enum power_supply_property psp,
    441			    const union power_supply_propval *val)
    442{
    443	struct max17042_chip *chip = power_supply_get_drvdata(psy);
    444	struct regmap *map = chip->regmap;
    445	int ret = 0;
    446	u32 data;
    447	int8_t temp;
    448
    449	switch (psp) {
    450	case POWER_SUPPLY_PROP_TEMP_ALERT_MIN:
    451		ret = regmap_read(map, MAX17042_TALRT_Th, &data);
    452		if (ret < 0)
    453			return ret;
    454
    455		/* Input in deci-centigrade, convert to centigrade */
    456		temp = val->intval / 10;
    457		/* force min < max */
    458		if (temp >= (int8_t)(data >> 8))
    459			temp = (int8_t)(data >> 8) - 1;
    460		/* Write both MAX and MIN ALERT */
    461		data = (data & 0xff00) + temp;
    462		ret = regmap_write(map, MAX17042_TALRT_Th, data);
    463		break;
    464	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
    465		ret = regmap_read(map, MAX17042_TALRT_Th, &data);
    466		if (ret < 0)
    467			return ret;
    468
    469		/* Input in Deci-Centigrade, convert to centigrade */
    470		temp = val->intval / 10;
    471		/* force max > min */
    472		if (temp <= (int8_t)(data & 0xff))
    473			temp = (int8_t)(data & 0xff) + 1;
    474		/* Write both MAX and MIN ALERT */
    475		data = (data & 0xff) + (temp << 8);
    476		ret = regmap_write(map, MAX17042_TALRT_Th, data);
    477		break;
    478	default:
    479		ret = -EINVAL;
    480	}
    481
    482	return ret;
    483}
    484
    485static int max17042_property_is_writeable(struct power_supply *psy,
    486		enum power_supply_property psp)
    487{
    488	int ret;
    489
    490	switch (psp) {
    491	case POWER_SUPPLY_PROP_TEMP_ALERT_MIN:
    492	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
    493		ret = 1;
    494		break;
    495	default:
    496		ret = 0;
    497	}
    498
    499	return ret;
    500}
    501
    502static void max17042_external_power_changed(struct power_supply *psy)
    503{
    504	power_supply_changed(psy);
    505}
    506
    507static int max17042_write_verify_reg(struct regmap *map, u8 reg, u32 value)
    508{
    509	int retries = 8;
    510	int ret;
    511	u32 read_value;
    512
    513	do {
    514		ret = regmap_write(map, reg, value);
    515		regmap_read(map, reg, &read_value);
    516		if (read_value != value) {
    517			ret = -EIO;
    518			retries--;
    519		}
    520	} while (retries && read_value != value);
    521
    522	if (ret < 0)
    523		pr_err("%s: err %d\n", __func__, ret);
    524
    525	return ret;
    526}
    527
    528static inline void max17042_override_por(struct regmap *map,
    529					 u8 reg, u16 value)
    530{
    531	if (value)
    532		regmap_write(map, reg, value);
    533}
    534
    535static inline void max17042_unlock_model(struct max17042_chip *chip)
    536{
    537	struct regmap *map = chip->regmap;
    538
    539	regmap_write(map, MAX17042_MLOCKReg1, MODEL_UNLOCK1);
    540	regmap_write(map, MAX17042_MLOCKReg2, MODEL_UNLOCK2);
    541}
    542
    543static inline void max17042_lock_model(struct max17042_chip *chip)
    544{
    545	struct regmap *map = chip->regmap;
    546
    547	regmap_write(map, MAX17042_MLOCKReg1, MODEL_LOCK1);
    548	regmap_write(map, MAX17042_MLOCKReg2, MODEL_LOCK2);
    549}
    550
    551static inline void max17042_write_model_data(struct max17042_chip *chip,
    552					u8 addr, int size)
    553{
    554	struct regmap *map = chip->regmap;
    555	int i;
    556
    557	for (i = 0; i < size; i++)
    558		regmap_write(map, addr + i,
    559			chip->pdata->config_data->cell_char_tbl[i]);
    560}
    561
    562static inline void max17042_read_model_data(struct max17042_chip *chip,
    563					u8 addr, u16 *data, int size)
    564{
    565	struct regmap *map = chip->regmap;
    566	int i;
    567	u32 tmp;
    568
    569	for (i = 0; i < size; i++) {
    570		regmap_read(map, addr + i, &tmp);
    571		data[i] = (u16)tmp;
    572	}
    573}
    574
    575static inline int max17042_model_data_compare(struct max17042_chip *chip,
    576					u16 *data1, u16 *data2, int size)
    577{
    578	int i;
    579
    580	if (memcmp(data1, data2, size)) {
    581		dev_err(&chip->client->dev, "%s compare failed\n", __func__);
    582		for (i = 0; i < size; i++)
    583			dev_info(&chip->client->dev, "0x%x, 0x%x",
    584				data1[i], data2[i]);
    585		dev_info(&chip->client->dev, "\n");
    586		return -EINVAL;
    587	}
    588	return 0;
    589}
    590
    591static int max17042_init_model(struct max17042_chip *chip)
    592{
    593	int ret;
    594	int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
    595	u16 *temp_data;
    596
    597	temp_data = kcalloc(table_size, sizeof(*temp_data), GFP_KERNEL);
    598	if (!temp_data)
    599		return -ENOMEM;
    600
    601	max17042_unlock_model(chip);
    602	max17042_write_model_data(chip, MAX17042_MODELChrTbl,
    603				table_size);
    604	max17042_read_model_data(chip, MAX17042_MODELChrTbl, temp_data,
    605				table_size);
    606
    607	ret = max17042_model_data_compare(
    608		chip,
    609		chip->pdata->config_data->cell_char_tbl,
    610		temp_data,
    611		table_size);
    612
    613	max17042_lock_model(chip);
    614	kfree(temp_data);
    615
    616	return ret;
    617}
    618
    619static int max17042_verify_model_lock(struct max17042_chip *chip)
    620{
    621	int i;
    622	int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
    623	u16 *temp_data;
    624	int ret = 0;
    625
    626	temp_data = kcalloc(table_size, sizeof(*temp_data), GFP_KERNEL);
    627	if (!temp_data)
    628		return -ENOMEM;
    629
    630	max17042_read_model_data(chip, MAX17042_MODELChrTbl, temp_data,
    631				table_size);
    632	for (i = 0; i < table_size; i++)
    633		if (temp_data[i])
    634			ret = -EINVAL;
    635
    636	kfree(temp_data);
    637	return ret;
    638}
    639
    640static void max17042_write_config_regs(struct max17042_chip *chip)
    641{
    642	struct max17042_config_data *config = chip->pdata->config_data;
    643	struct regmap *map = chip->regmap;
    644
    645	regmap_write(map, MAX17042_CONFIG, config->config);
    646	regmap_write(map, MAX17042_LearnCFG, config->learn_cfg);
    647	regmap_write(map, MAX17042_FilterCFG,
    648			config->filter_cfg);
    649	regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg);
    650	if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047 ||
    651			chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050 ||
    652			chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)
    653		regmap_write(map, MAX17047_FullSOCThr,
    654						config->full_soc_thresh);
    655}
    656
    657static void  max17042_write_custom_regs(struct max17042_chip *chip)
    658{
    659	struct max17042_config_data *config = chip->pdata->config_data;
    660	struct regmap *map = chip->regmap;
    661
    662	max17042_write_verify_reg(map, MAX17042_RCOMP0, config->rcomp0);
    663	max17042_write_verify_reg(map, MAX17042_TempCo,	config->tcompc0);
    664	max17042_write_verify_reg(map, MAX17042_ICHGTerm, config->ichgt_term);
    665	if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) {
    666		regmap_write(map, MAX17042_EmptyTempCo,	config->empty_tempco);
    667		max17042_write_verify_reg(map, MAX17042_K_empty0,
    668					config->kempty0);
    669	} else {
    670		max17042_write_verify_reg(map, MAX17047_QRTbl00,
    671						config->qrtbl00);
    672		max17042_write_verify_reg(map, MAX17047_QRTbl10,
    673						config->qrtbl10);
    674		max17042_write_verify_reg(map, MAX17047_QRTbl20,
    675						config->qrtbl20);
    676		max17042_write_verify_reg(map, MAX17047_QRTbl30,
    677						config->qrtbl30);
    678	}
    679}
    680
    681static void max17042_update_capacity_regs(struct max17042_chip *chip)
    682{
    683	struct max17042_config_data *config = chip->pdata->config_data;
    684	struct regmap *map = chip->regmap;
    685
    686	max17042_write_verify_reg(map, MAX17042_FullCAP,
    687				config->fullcap);
    688	regmap_write(map, MAX17042_DesignCap, config->design_cap);
    689	max17042_write_verify_reg(map, MAX17042_FullCAPNom,
    690				config->fullcapnom);
    691}
    692
    693static void max17042_reset_vfsoc0_reg(struct max17042_chip *chip)
    694{
    695	unsigned int vfSoc;
    696	struct regmap *map = chip->regmap;
    697
    698	regmap_read(map, MAX17042_VFSOC, &vfSoc);
    699	regmap_write(map, MAX17042_VFSOC0Enable, VFSOC0_UNLOCK);
    700	max17042_write_verify_reg(map, MAX17042_VFSOC0, vfSoc);
    701	regmap_write(map, MAX17042_VFSOC0Enable, VFSOC0_LOCK);
    702}
    703
    704static void max17042_load_new_capacity_params(struct max17042_chip *chip)
    705{
    706	u32 full_cap0, rep_cap, dq_acc, vfSoc;
    707	u32 rem_cap;
    708
    709	struct max17042_config_data *config = chip->pdata->config_data;
    710	struct regmap *map = chip->regmap;
    711
    712	regmap_read(map, MAX17042_FullCAP0, &full_cap0);
    713	regmap_read(map, MAX17042_VFSOC, &vfSoc);
    714
    715	/* fg_vfSoc needs to shifted by 8 bits to get the
    716	 * perc in 1% accuracy, to get the right rem_cap multiply
    717	 * full_cap0, fg_vfSoc and devide by 100
    718	 */
    719	rem_cap = ((vfSoc >> 8) * full_cap0) / 100;
    720	max17042_write_verify_reg(map, MAX17042_RemCap, rem_cap);
    721
    722	rep_cap = rem_cap;
    723	max17042_write_verify_reg(map, MAX17042_RepCap, rep_cap);
    724
    725	/* Write dQ_acc to 200% of Capacity and dP_acc to 200% */
    726	dq_acc = config->fullcap / dQ_ACC_DIV;
    727	max17042_write_verify_reg(map, MAX17042_dQacc, dq_acc);
    728	max17042_write_verify_reg(map, MAX17042_dPacc, dP_ACC_200);
    729
    730	max17042_write_verify_reg(map, MAX17042_FullCAP,
    731			config->fullcap);
    732	regmap_write(map, MAX17042_DesignCap,
    733			config->design_cap);
    734	max17042_write_verify_reg(map, MAX17042_FullCAPNom,
    735			config->fullcapnom);
    736	/* Update SOC register with new SOC */
    737	regmap_write(map, MAX17042_RepSOC, vfSoc);
    738}
    739
    740/*
    741 * Block write all the override values coming from platform data.
    742 * This function MUST be called before the POR initialization procedure
    743 * specified by maxim.
    744 */
    745static inline void max17042_override_por_values(struct max17042_chip *chip)
    746{
    747	struct regmap *map = chip->regmap;
    748	struct max17042_config_data *config = chip->pdata->config_data;
    749
    750	max17042_override_por(map, MAX17042_TGAIN, config->tgain);
    751	max17042_override_por(map, MAX17042_TOFF, config->toff);
    752	max17042_override_por(map, MAX17042_CGAIN, config->cgain);
    753	max17042_override_por(map, MAX17042_COFF, config->coff);
    754
    755	max17042_override_por(map, MAX17042_VALRT_Th, config->valrt_thresh);
    756	max17042_override_por(map, MAX17042_TALRT_Th, config->talrt_thresh);
    757	max17042_override_por(map, MAX17042_SALRT_Th,
    758						config->soc_alrt_thresh);
    759	max17042_override_por(map, MAX17042_CONFIG, config->config);
    760	max17042_override_por(map, MAX17042_SHDNTIMER, config->shdntimer);
    761
    762	max17042_override_por(map, MAX17042_DesignCap, config->design_cap);
    763	max17042_override_por(map, MAX17042_ICHGTerm, config->ichgt_term);
    764
    765	max17042_override_por(map, MAX17042_AtRate, config->at_rate);
    766	max17042_override_por(map, MAX17042_LearnCFG, config->learn_cfg);
    767	max17042_override_por(map, MAX17042_FilterCFG, config->filter_cfg);
    768	max17042_override_por(map, MAX17042_RelaxCFG, config->relax_cfg);
    769	max17042_override_por(map, MAX17042_MiscCFG, config->misc_cfg);
    770
    771	max17042_override_por(map, MAX17042_FullCAP, config->fullcap);
    772	max17042_override_por(map, MAX17042_FullCAPNom, config->fullcapnom);
    773	max17042_override_por(map, MAX17042_dQacc, config->dqacc);
    774	max17042_override_por(map, MAX17042_dPacc, config->dpacc);
    775
    776	max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0);
    777	max17042_override_por(map, MAX17042_TempCo, config->tcompc0);
    778
    779	if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) {
    780		max17042_override_por(map, MAX17042_MaskSOC, config->masksoc);
    781		max17042_override_por(map, MAX17042_SOC_empty, config->socempty);
    782		max17042_override_por(map, MAX17042_V_empty, config->vempty);
    783		max17042_override_por(map, MAX17042_EmptyTempCo, config->empty_tempco);
    784		max17042_override_por(map, MAX17042_K_empty0, config->kempty0);
    785	}
    786
    787	if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) ||
    788	    (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
    789	    (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) {
    790		max17042_override_por(map, MAX17042_IAvg_empty, config->iavg_empty);
    791		max17042_override_por(map, MAX17042_TempNom, config->temp_nom);
    792		max17042_override_por(map, MAX17042_TempLim, config->temp_lim);
    793		max17042_override_por(map, MAX17042_FCTC, config->fctc);
    794	}
    795
    796	if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
    797	    (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050) ||
    798	    (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)) {
    799		max17042_override_por(map, MAX17047_V_empty, config->vempty);
    800	}
    801}
    802
    803static int max17042_init_chip(struct max17042_chip *chip)
    804{
    805	struct regmap *map = chip->regmap;
    806	int ret;
    807
    808	max17042_override_por_values(chip);
    809	/* After Power up, the MAX17042 requires 500mS in order
    810	 * to perform signal debouncing and initial SOC reporting
    811	 */
    812	msleep(500);
    813
    814	/* Initialize configuration */
    815	max17042_write_config_regs(chip);
    816
    817	/* write cell characterization data */
    818	ret = max17042_init_model(chip);
    819	if (ret) {
    820		dev_err(&chip->client->dev, "%s init failed\n",
    821			__func__);
    822		return -EIO;
    823	}
    824
    825	ret = max17042_verify_model_lock(chip);
    826	if (ret) {
    827		dev_err(&chip->client->dev, "%s lock verify failed\n",
    828			__func__);
    829		return -EIO;
    830	}
    831	/* write custom parameters */
    832	max17042_write_custom_regs(chip);
    833
    834	/* update capacity params */
    835	max17042_update_capacity_regs(chip);
    836
    837	/* delay must be atleast 350mS to allow VFSOC
    838	 * to be calculated from the new configuration
    839	 */
    840	msleep(350);
    841
    842	/* reset vfsoc0 reg */
    843	max17042_reset_vfsoc0_reg(chip);
    844
    845	/* load new capacity params */
    846	max17042_load_new_capacity_params(chip);
    847
    848	/* Init complete, Clear the POR bit */
    849	regmap_update_bits(map, MAX17042_STATUS, STATUS_POR_BIT, 0x0);
    850	return 0;
    851}
    852
    853static void max17042_set_soc_threshold(struct max17042_chip *chip, u16 off)
    854{
    855	struct regmap *map = chip->regmap;
    856	u32 soc, soc_tr;
    857
    858	/* program interrupt thresholds such that we should
    859	 * get interrupt for every 'off' perc change in the soc
    860	 */
    861	regmap_read(map, MAX17042_RepSOC, &soc);
    862	soc >>= 8;
    863	soc_tr = (soc + off) << 8;
    864	if (off < soc)
    865		soc_tr |= soc - off;
    866	regmap_write(map, MAX17042_SALRT_Th, soc_tr);
    867}
    868
    869static irqreturn_t max17042_thread_handler(int id, void *dev)
    870{
    871	struct max17042_chip *chip = dev;
    872	u32 val;
    873	int ret;
    874
    875	ret = regmap_read(chip->regmap, MAX17042_STATUS, &val);
    876	if (ret)
    877		return IRQ_HANDLED;
    878
    879	if ((val & STATUS_SMN_BIT) || (val & STATUS_SMX_BIT)) {
    880		dev_dbg(&chip->client->dev, "SOC threshold INTR\n");
    881		max17042_set_soc_threshold(chip, 1);
    882	}
    883
    884	/* we implicitly handle all alerts via power_supply_changed */
    885	regmap_clear_bits(chip->regmap, MAX17042_STATUS,
    886			  0xFFFF & ~(STATUS_POR_BIT | STATUS_BST_BIT));
    887
    888	power_supply_changed(chip->battery);
    889	return IRQ_HANDLED;
    890}
    891
    892static void max17042_init_worker(struct work_struct *work)
    893{
    894	struct max17042_chip *chip = container_of(work,
    895				struct max17042_chip, work);
    896	int ret;
    897
    898	/* Initialize registers according to values from the platform data */
    899	if (chip->pdata->enable_por_init && chip->pdata->config_data) {
    900		ret = max17042_init_chip(chip);
    901		if (ret)
    902			return;
    903	}
    904
    905	chip->init_complete = 1;
    906}
    907
    908#ifdef CONFIG_OF
    909static struct max17042_platform_data *
    910max17042_get_of_pdata(struct max17042_chip *chip)
    911{
    912	struct device *dev = &chip->client->dev;
    913	struct device_node *np = dev->of_node;
    914	u32 prop;
    915	struct max17042_platform_data *pdata;
    916
    917	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
    918	if (!pdata)
    919		return NULL;
    920
    921	/*
    922	 * Require current sense resistor value to be specified for
    923	 * current-sense functionality to be enabled at all.
    924	 */
    925	if (of_property_read_u32(np, "maxim,rsns-microohm", &prop) == 0) {
    926		pdata->r_sns = prop;
    927		pdata->enable_current_sense = true;
    928	}
    929
    930	if (of_property_read_s32(np, "maxim,cold-temp", &pdata->temp_min))
    931		pdata->temp_min = INT_MIN;
    932	if (of_property_read_s32(np, "maxim,over-heat-temp", &pdata->temp_max))
    933		pdata->temp_max = INT_MAX;
    934	if (of_property_read_s32(np, "maxim,dead-volt", &pdata->vmin))
    935		pdata->vmin = INT_MIN;
    936	if (of_property_read_s32(np, "maxim,over-volt", &pdata->vmax))
    937		pdata->vmax = INT_MAX;
    938
    939	return pdata;
    940}
    941#endif
    942
    943static struct max17042_reg_data max17047_default_pdata_init_regs[] = {
    944	/*
    945	 * Some firmwares do not set FullSOCThr, Enable End-of-Charge Detection
    946	 * when the voltage FG reports 95%, as recommended in the datasheet.
    947	 */
    948	{ MAX17047_FullSOCThr, MAX17042_BATTERY_FULL << 8 },
    949};
    950
    951static struct max17042_platform_data *
    952max17042_get_default_pdata(struct max17042_chip *chip)
    953{
    954	struct device *dev = &chip->client->dev;
    955	struct max17042_platform_data *pdata;
    956	int ret, misc_cfg;
    957
    958	/*
    959	 * The MAX17047 gets used on x86 where we might not have pdata, assume
    960	 * the firmware will already have initialized the fuel-gauge and provide
    961	 * default values for the non init bits to make things work.
    962	 */
    963	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
    964	if (!pdata)
    965		return pdata;
    966
    967	if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
    968	    (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) {
    969		pdata->init_data = max17047_default_pdata_init_regs;
    970		pdata->num_init_data =
    971			ARRAY_SIZE(max17047_default_pdata_init_regs);
    972	}
    973
    974	ret = regmap_read(chip->regmap, MAX17042_MiscCFG, &misc_cfg);
    975	if (ret < 0)
    976		return NULL;
    977
    978	/* If bits 0-1 are set to 3 then only Voltage readings are used */
    979	if ((misc_cfg & 0x3) == 0x3)
    980		pdata->enable_current_sense = false;
    981	else
    982		pdata->enable_current_sense = true;
    983
    984	pdata->vmin = MAX17042_DEFAULT_VMIN;
    985	pdata->vmax = MAX17042_DEFAULT_VMAX;
    986	pdata->temp_min = MAX17042_DEFAULT_TEMP_MIN;
    987	pdata->temp_max = MAX17042_DEFAULT_TEMP_MAX;
    988
    989	return pdata;
    990}
    991
    992static struct max17042_platform_data *
    993max17042_get_pdata(struct max17042_chip *chip)
    994{
    995	struct device *dev = &chip->client->dev;
    996
    997#ifdef CONFIG_OF
    998	if (dev->of_node)
    999		return max17042_get_of_pdata(chip);
   1000#endif
   1001	if (dev->platform_data)
   1002		return dev->platform_data;
   1003
   1004	return max17042_get_default_pdata(chip);
   1005}
   1006
   1007static const struct regmap_config max17042_regmap_config = {
   1008	.reg_bits = 8,
   1009	.val_bits = 16,
   1010	.val_format_endian = REGMAP_ENDIAN_NATIVE,
   1011};
   1012
   1013static const struct power_supply_desc max17042_psy_desc = {
   1014	.name		= "max170xx_battery",
   1015	.type		= POWER_SUPPLY_TYPE_BATTERY,
   1016	.get_property	= max17042_get_property,
   1017	.set_property	= max17042_set_property,
   1018	.property_is_writeable	= max17042_property_is_writeable,
   1019	.external_power_changed	= max17042_external_power_changed,
   1020	.properties	= max17042_battery_props,
   1021	.num_properties	= ARRAY_SIZE(max17042_battery_props),
   1022};
   1023
   1024static const struct power_supply_desc max17042_no_current_sense_psy_desc = {
   1025	.name		= "max170xx_battery",
   1026	.type		= POWER_SUPPLY_TYPE_BATTERY,
   1027	.get_property	= max17042_get_property,
   1028	.set_property	= max17042_set_property,
   1029	.property_is_writeable	= max17042_property_is_writeable,
   1030	.properties	= max17042_battery_props,
   1031	.num_properties	= ARRAY_SIZE(max17042_battery_props) - 2,
   1032};
   1033
   1034static int max17042_probe(struct i2c_client *client,
   1035			const struct i2c_device_id *id)
   1036{
   1037	struct i2c_adapter *adapter = client->adapter;
   1038	const struct power_supply_desc *max17042_desc = &max17042_psy_desc;
   1039	struct power_supply_config psy_cfg = {};
   1040	const struct acpi_device_id *acpi_id = NULL;
   1041	struct device *dev = &client->dev;
   1042	struct max17042_chip *chip;
   1043	int ret;
   1044	int i;
   1045	u32 val;
   1046
   1047	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA))
   1048		return -EIO;
   1049
   1050	chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
   1051	if (!chip)
   1052		return -ENOMEM;
   1053
   1054	chip->client = client;
   1055	if (id) {
   1056		chip->chip_type = id->driver_data;
   1057	} else {
   1058		acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
   1059		if (!acpi_id)
   1060			return -ENODEV;
   1061
   1062		chip->chip_type = acpi_id->driver_data;
   1063	}
   1064	chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config);
   1065	if (IS_ERR(chip->regmap)) {
   1066		dev_err(&client->dev, "Failed to initialize regmap\n");
   1067		return -EINVAL;
   1068	}
   1069
   1070	chip->pdata = max17042_get_pdata(chip);
   1071	if (!chip->pdata) {
   1072		dev_err(&client->dev, "no platform data provided\n");
   1073		return -EINVAL;
   1074	}
   1075
   1076	i2c_set_clientdata(client, chip);
   1077	psy_cfg.drv_data = chip;
   1078	psy_cfg.of_node = dev->of_node;
   1079
   1080	/* When current is not measured,
   1081	 * CURRENT_NOW and CURRENT_AVG properties should be invisible. */
   1082	if (!chip->pdata->enable_current_sense)
   1083		max17042_desc = &max17042_no_current_sense_psy_desc;
   1084
   1085	if (chip->pdata->r_sns == 0)
   1086		chip->pdata->r_sns = MAX17042_DEFAULT_SNS_RESISTOR;
   1087
   1088	if (chip->pdata->init_data)
   1089		for (i = 0; i < chip->pdata->num_init_data; i++)
   1090			regmap_write(chip->regmap,
   1091					chip->pdata->init_data[i].addr,
   1092					chip->pdata->init_data[i].data);
   1093
   1094	if (!chip->pdata->enable_current_sense) {
   1095		regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000);
   1096		regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003);
   1097		regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
   1098	}
   1099
   1100	chip->battery = devm_power_supply_register(&client->dev, max17042_desc,
   1101						   &psy_cfg);
   1102	if (IS_ERR(chip->battery)) {
   1103		dev_err(&client->dev, "failed: power supply register\n");
   1104		return PTR_ERR(chip->battery);
   1105	}
   1106
   1107	if (client->irq) {
   1108		unsigned int flags = IRQF_ONESHOT;
   1109
   1110		/*
   1111		 * On ACPI systems the IRQ may be handled by ACPI-event code,
   1112		 * so we need to share (if the ACPI code is willing to share).
   1113		 */
   1114		if (acpi_id)
   1115			flags |= IRQF_SHARED | IRQF_PROBE_SHARED;
   1116
   1117		ret = devm_request_threaded_irq(&client->dev, client->irq,
   1118						NULL,
   1119						max17042_thread_handler, flags,
   1120						chip->battery->desc->name,
   1121						chip);
   1122		if (!ret) {
   1123			regmap_update_bits(chip->regmap, MAX17042_CONFIG,
   1124					CONFIG_ALRT_BIT_ENBL,
   1125					CONFIG_ALRT_BIT_ENBL);
   1126			max17042_set_soc_threshold(chip, 1);
   1127		} else {
   1128			client->irq = 0;
   1129			if (ret != -EBUSY)
   1130				dev_err(&client->dev, "Failed to get IRQ\n");
   1131		}
   1132	}
   1133	/* Not able to update the charge threshold when exceeded? -> disable */
   1134	if (!client->irq)
   1135		regmap_write(chip->regmap, MAX17042_SALRT_Th, 0xff00);
   1136
   1137	regmap_read(chip->regmap, MAX17042_STATUS, &val);
   1138	if (val & STATUS_POR_BIT) {
   1139		ret = devm_work_autocancel(&client->dev, &chip->work,
   1140					   max17042_init_worker);
   1141		if (ret)
   1142			return ret;
   1143		schedule_work(&chip->work);
   1144	} else {
   1145		chip->init_complete = 1;
   1146	}
   1147
   1148	return 0;
   1149}
   1150
   1151#ifdef CONFIG_PM_SLEEP
   1152static int max17042_suspend(struct device *dev)
   1153{
   1154	struct max17042_chip *chip = dev_get_drvdata(dev);
   1155
   1156	/*
   1157	 * disable the irq and enable irq_wake
   1158	 * capability to the interrupt line.
   1159	 */
   1160	if (chip->client->irq) {
   1161		disable_irq(chip->client->irq);
   1162		enable_irq_wake(chip->client->irq);
   1163	}
   1164
   1165	return 0;
   1166}
   1167
   1168static int max17042_resume(struct device *dev)
   1169{
   1170	struct max17042_chip *chip = dev_get_drvdata(dev);
   1171
   1172	if (chip->client->irq) {
   1173		disable_irq_wake(chip->client->irq);
   1174		enable_irq(chip->client->irq);
   1175		/* re-program the SOC thresholds to 1% change */
   1176		max17042_set_soc_threshold(chip, 1);
   1177	}
   1178
   1179	return 0;
   1180}
   1181#endif
   1182
   1183static SIMPLE_DEV_PM_OPS(max17042_pm_ops, max17042_suspend,
   1184			max17042_resume);
   1185
   1186#ifdef CONFIG_ACPI
   1187static const struct acpi_device_id max17042_acpi_match[] = {
   1188	{ "MAX17047", MAXIM_DEVICE_TYPE_MAX17047 },
   1189	{ }
   1190};
   1191MODULE_DEVICE_TABLE(acpi, max17042_acpi_match);
   1192#endif
   1193
   1194#ifdef CONFIG_OF
   1195static const struct of_device_id max17042_dt_match[] = {
   1196	{ .compatible = "maxim,max17042" },
   1197	{ .compatible = "maxim,max17047" },
   1198	{ .compatible = "maxim,max17050" },
   1199	{ .compatible = "maxim,max17055" },
   1200	{ .compatible = "maxim,max77849-battery" },
   1201	{ },
   1202};
   1203MODULE_DEVICE_TABLE(of, max17042_dt_match);
   1204#endif
   1205
   1206static const struct i2c_device_id max17042_id[] = {
   1207	{ "max17042", MAXIM_DEVICE_TYPE_MAX17042 },
   1208	{ "max17047", MAXIM_DEVICE_TYPE_MAX17047 },
   1209	{ "max17050", MAXIM_DEVICE_TYPE_MAX17050 },
   1210	{ "max17055", MAXIM_DEVICE_TYPE_MAX17055 },
   1211	{ "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 },
   1212	{ }
   1213};
   1214MODULE_DEVICE_TABLE(i2c, max17042_id);
   1215
   1216static struct i2c_driver max17042_i2c_driver = {
   1217	.driver	= {
   1218		.name	= "max17042",
   1219		.acpi_match_table = ACPI_PTR(max17042_acpi_match),
   1220		.of_match_table = of_match_ptr(max17042_dt_match),
   1221		.pm	= &max17042_pm_ops,
   1222	},
   1223	.probe		= max17042_probe,
   1224	.id_table	= max17042_id,
   1225};
   1226module_i2c_driver(max17042_i2c_driver);
   1227
   1228MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
   1229MODULE_DESCRIPTION("MAX17042 Fuel Gauge");
   1230MODULE_LICENSE("GPL");