brintos

brintos / linux-shallow public Read only

0
0
Text · 48.1 KiB · 64a23e3 Raw
1755 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Driver for Richtek RT9455WSC battery charger.4 *5 * Copyright (C) 2015 Intel Corporation6 */7 8#include <linux/module.h>9#include <linux/interrupt.h>10#include <linux/delay.h>11#include <linux/of.h>12#include <linux/pm_runtime.h>13#include <linux/power_supply.h>14#include <linux/i2c.h>15#include <linux/acpi.h>16#include <linux/usb/phy.h>17#include <linux/regmap.h>18 19#define RT9455_MANUFACTURER			"Richtek"20#define RT9455_MODEL_NAME			"RT9455"21#define RT9455_DRIVER_NAME			"rt9455-charger"22 23#define RT9455_IRQ_NAME				"interrupt"24 25#define RT9455_PWR_RDY_DELAY			1 /* 1 second */26#define RT9455_MAX_CHARGING_TIME		21600 /* 6 hrs */27#define RT9455_BATT_PRESENCE_DELAY		60 /* 60 seconds */28 29#define RT9455_CHARGE_MODE			0x0030#define RT9455_BOOST_MODE			0x0131 32#define RT9455_FAULT				0x0333 34#define RT9455_IAICR_100MA			0x0035#define RT9455_IAICR_500MA			0x0136#define RT9455_IAICR_NO_LIMIT			0x0337 38#define RT9455_CHARGE_DISABLE			0x0039#define RT9455_CHARGE_ENABLE			0x0140 41#define RT9455_PWR_FAULT			0x0042#define RT9455_PWR_GOOD				0x0143 44#define RT9455_REG_CTRL1			0x00 /* CTRL1 reg address */45#define RT9455_REG_CTRL2			0x01 /* CTRL2 reg address */46#define RT9455_REG_CTRL3			0x02 /* CTRL3 reg address */47#define RT9455_REG_DEV_ID			0x03 /* DEV_ID reg address */48#define RT9455_REG_CTRL4			0x04 /* CTRL4 reg address */49#define RT9455_REG_CTRL5			0x05 /* CTRL5 reg address */50#define RT9455_REG_CTRL6			0x06 /* CTRL6 reg address */51#define RT9455_REG_CTRL7			0x07 /* CTRL7 reg address */52#define RT9455_REG_IRQ1				0x08 /* IRQ1 reg address */53#define RT9455_REG_IRQ2				0x09 /* IRQ2 reg address */54#define RT9455_REG_IRQ3				0x0A /* IRQ3 reg address */55#define RT9455_REG_MASK1			0x0B /* MASK1 reg address */56#define RT9455_REG_MASK2			0x0C /* MASK2 reg address */57#define RT9455_REG_MASK3			0x0D /* MASK3 reg address */58 59enum rt9455_fields {60	F_STAT, F_BOOST, F_PWR_RDY, F_OTG_PIN_POLARITY, /* CTRL1 reg fields */61 62	F_IAICR, F_TE_SHDN_EN, F_HIGHER_OCP, F_TE, F_IAICR_INT, F_HIZ,63	F_OPA_MODE, /* CTRL2 reg fields */64 65	F_VOREG, F_OTG_PL, F_OTG_EN, /* CTRL3 reg fields */66 67	F_VENDOR_ID, F_CHIP_REV, /* DEV_ID reg fields */68 69	F_RST, /* CTRL4 reg fields */70 71	F_TMR_EN, F_MIVR, F_IPREC, F_IEOC_PERCENTAGE, /* CTRL5 reg fields*/72 73	F_IAICR_SEL, F_ICHRG, F_VPREC, /* CTRL6 reg fields */74 75	F_BATD_EN, F_CHG_EN, F_VMREG, /* CTRL7 reg fields */76 77	F_TSDI, F_VINOVPI, F_BATAB, /* IRQ1 reg fields */78 79	F_CHRVPI, F_CHBATOVI, F_CHTERMI, F_CHRCHGI, F_CH32MI, F_CHTREGI,80	F_CHMIVRI, /* IRQ2 reg fields */81 82	F_BSTBUSOVI, F_BSTOLI, F_BSTLOWVI, F_BST32SI, /* IRQ3 reg fields */83 84	F_TSDM, F_VINOVPIM, F_BATABM, /* MASK1 reg fields */85 86	F_CHRVPIM, F_CHBATOVIM, F_CHTERMIM, F_CHRCHGIM, F_CH32MIM, F_CHTREGIM,87	F_CHMIVRIM, /* MASK2 reg fields */88 89	F_BSTVINOVIM, F_BSTOLIM, F_BSTLOWVIM, F_BST32SIM, /* MASK3 reg fields */90 91	F_MAX_FIELDS92};93 94static const struct reg_field rt9455_reg_fields[] = {95	[F_STAT]		= REG_FIELD(RT9455_REG_CTRL1, 4, 5),96	[F_BOOST]		= REG_FIELD(RT9455_REG_CTRL1, 3, 3),97	[F_PWR_RDY]		= REG_FIELD(RT9455_REG_CTRL1, 2, 2),98	[F_OTG_PIN_POLARITY]	= REG_FIELD(RT9455_REG_CTRL1, 1, 1),99 100	[F_IAICR]		= REG_FIELD(RT9455_REG_CTRL2, 6, 7),101	[F_TE_SHDN_EN]		= REG_FIELD(RT9455_REG_CTRL2, 5, 5),102	[F_HIGHER_OCP]		= REG_FIELD(RT9455_REG_CTRL2, 4, 4),103	[F_TE]			= REG_FIELD(RT9455_REG_CTRL2, 3, 3),104	[F_IAICR_INT]		= REG_FIELD(RT9455_REG_CTRL2, 2, 2),105	[F_HIZ]			= REG_FIELD(RT9455_REG_CTRL2, 1, 1),106	[F_OPA_MODE]		= REG_FIELD(RT9455_REG_CTRL2, 0, 0),107 108	[F_VOREG]		= REG_FIELD(RT9455_REG_CTRL3, 2, 7),109	[F_OTG_PL]		= REG_FIELD(RT9455_REG_CTRL3, 1, 1),110	[F_OTG_EN]		= REG_FIELD(RT9455_REG_CTRL3, 0, 0),111 112	[F_VENDOR_ID]		= REG_FIELD(RT9455_REG_DEV_ID, 4, 7),113	[F_CHIP_REV]		= REG_FIELD(RT9455_REG_DEV_ID, 0, 3),114 115	[F_RST]			= REG_FIELD(RT9455_REG_CTRL4, 7, 7),116 117	[F_TMR_EN]		= REG_FIELD(RT9455_REG_CTRL5, 7, 7),118	[F_MIVR]		= REG_FIELD(RT9455_REG_CTRL5, 4, 5),119	[F_IPREC]		= REG_FIELD(RT9455_REG_CTRL5, 2, 3),120	[F_IEOC_PERCENTAGE]	= REG_FIELD(RT9455_REG_CTRL5, 0, 1),121 122	[F_IAICR_SEL]		= REG_FIELD(RT9455_REG_CTRL6, 7, 7),123	[F_ICHRG]		= REG_FIELD(RT9455_REG_CTRL6, 4, 6),124	[F_VPREC]		= REG_FIELD(RT9455_REG_CTRL6, 0, 2),125 126	[F_BATD_EN]		= REG_FIELD(RT9455_REG_CTRL7, 6, 6),127	[F_CHG_EN]		= REG_FIELD(RT9455_REG_CTRL7, 4, 4),128	[F_VMREG]		= REG_FIELD(RT9455_REG_CTRL7, 0, 3),129 130	[F_TSDI]		= REG_FIELD(RT9455_REG_IRQ1, 7, 7),131	[F_VINOVPI]		= REG_FIELD(RT9455_REG_IRQ1, 6, 6),132	[F_BATAB]		= REG_FIELD(RT9455_REG_IRQ1, 0, 0),133 134	[F_CHRVPI]		= REG_FIELD(RT9455_REG_IRQ2, 7, 7),135	[F_CHBATOVI]		= REG_FIELD(RT9455_REG_IRQ2, 5, 5),136	[F_CHTERMI]		= REG_FIELD(RT9455_REG_IRQ2, 4, 4),137	[F_CHRCHGI]		= REG_FIELD(RT9455_REG_IRQ2, 3, 3),138	[F_CH32MI]		= REG_FIELD(RT9455_REG_IRQ2, 2, 2),139	[F_CHTREGI]		= REG_FIELD(RT9455_REG_IRQ2, 1, 1),140	[F_CHMIVRI]		= REG_FIELD(RT9455_REG_IRQ2, 0, 0),141 142	[F_BSTBUSOVI]		= REG_FIELD(RT9455_REG_IRQ3, 7, 7),143	[F_BSTOLI]		= REG_FIELD(RT9455_REG_IRQ3, 6, 6),144	[F_BSTLOWVI]		= REG_FIELD(RT9455_REG_IRQ3, 5, 5),145	[F_BST32SI]		= REG_FIELD(RT9455_REG_IRQ3, 3, 3),146 147	[F_TSDM]		= REG_FIELD(RT9455_REG_MASK1, 7, 7),148	[F_VINOVPIM]		= REG_FIELD(RT9455_REG_MASK1, 6, 6),149	[F_BATABM]		= REG_FIELD(RT9455_REG_MASK1, 0, 0),150 151	[F_CHRVPIM]		= REG_FIELD(RT9455_REG_MASK2, 7, 7),152	[F_CHBATOVIM]		= REG_FIELD(RT9455_REG_MASK2, 5, 5),153	[F_CHTERMIM]		= REG_FIELD(RT9455_REG_MASK2, 4, 4),154	[F_CHRCHGIM]		= REG_FIELD(RT9455_REG_MASK2, 3, 3),155	[F_CH32MIM]		= REG_FIELD(RT9455_REG_MASK2, 2, 2),156	[F_CHTREGIM]		= REG_FIELD(RT9455_REG_MASK2, 1, 1),157	[F_CHMIVRIM]		= REG_FIELD(RT9455_REG_MASK2, 0, 0),158 159	[F_BSTVINOVIM]		= REG_FIELD(RT9455_REG_MASK3, 7, 7),160	[F_BSTOLIM]		= REG_FIELD(RT9455_REG_MASK3, 6, 6),161	[F_BSTLOWVIM]		= REG_FIELD(RT9455_REG_MASK3, 5, 5),162	[F_BST32SIM]		= REG_FIELD(RT9455_REG_MASK3, 3, 3),163};164 165#define GET_MASK(fid)	(BIT(rt9455_reg_fields[fid].msb + 1) - \166			 BIT(rt9455_reg_fields[fid].lsb))167 168/*169 * Each array initialised below shows the possible real-world values for a170 * group of bits belonging to RT9455 registers. The arrays are sorted in171 * ascending order. The index of each real-world value represents the value172 * that is encoded in the group of bits belonging to RT9455 registers.173 */174/* REG06[6:4] (ICHRG) in uAh */175static const int rt9455_ichrg_values[] = {176	 500000,  650000,  800000,  950000, 1100000, 1250000, 1400000, 1550000177};178 179/*180 * When the charger is in charge mode, REG02[7:2] represent battery regulation181 * voltage.182 */183/* REG02[7:2] (VOREG) in uV */184static const int rt9455_voreg_values[] = {185	3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,186	3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,187	3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,188	3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,189	4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,190	4300000, 4330000, 4350000, 4370000, 4390000, 4410000, 4430000, 4450000,191	4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000,192	4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000193};194 195#if IS_ENABLED(CONFIG_USB_PHY)196/*197 * When the charger is in boost mode, REG02[7:2] represent boost output198 * voltage.199 */200/* REG02[7:2] (Boost output voltage) in uV */201static const int rt9455_boost_voltage_values[] = {202	4425000, 4450000, 4475000, 4500000, 4525000, 4550000, 4575000, 4600000,203	4625000, 4650000, 4675000, 4700000, 4725000, 4750000, 4775000, 4800000,204	4825000, 4850000, 4875000, 4900000, 4925000, 4950000, 4975000, 5000000,205	5025000, 5050000, 5075000, 5100000, 5125000, 5150000, 5175000, 5200000,206	5225000, 5250000, 5275000, 5300000, 5325000, 5350000, 5375000, 5400000,207	5425000, 5450000, 5475000, 5500000, 5525000, 5550000, 5575000, 5600000,208	5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,209	5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,210};211#endif212 213/* REG07[3:0] (VMREG) in uV */214static const int rt9455_vmreg_values[] = {215	4200000, 4220000, 4240000, 4260000, 4280000, 4300000, 4320000, 4340000,216	4360000, 4380000, 4400000, 4430000, 4450000, 4450000, 4450000, 4450000217};218 219/* REG05[5:4] (IEOC_PERCENTAGE) */220static const int rt9455_ieoc_percentage_values[] = {221	10, 30, 20, 30222};223 224/* REG05[1:0] (MIVR) in uV */225static const int rt9455_mivr_values[] = {226	4000000, 4250000, 4500000, 5000000227};228 229/* REG05[1:0] (IAICR) in uA */230static const int rt9455_iaicr_values[] = {231	100000, 500000, 1000000, 2000000232};233 234struct rt9455_info {235	struct i2c_client		*client;236	struct regmap			*regmap;237	struct regmap_field		*regmap_fields[F_MAX_FIELDS];238	struct power_supply		*charger;239#if IS_ENABLED(CONFIG_USB_PHY)240	struct usb_phy			*usb_phy;241	struct notifier_block		nb;242#endif243	struct delayed_work		pwr_rdy_work;244	struct delayed_work		max_charging_time_work;245	struct delayed_work		batt_presence_work;246	u32				voreg;247	u32				boost_voltage;248};249 250/*251 * Iterate through each element of the 'tbl' array until an element whose value252 * is greater than v is found. Return the index of the respective element,253 * or the index of the last element in the array, if no such element is found.254 */255static unsigned int rt9455_find_idx(const int tbl[], int tbl_size, int v)256{257	int i;258 259	/*260	 * No need to iterate until the last index in the table because261	 * if no element greater than v is found in the table,262	 * or if only the last element is greater than v,263	 * function returns the index of the last element.264	 */265	for (i = 0; i < tbl_size - 1; i++)266		if (v <= tbl[i])267			return i;268 269	return (tbl_size - 1);270}271 272static int rt9455_get_field_val(struct rt9455_info *info,273				enum rt9455_fields field,274				const int tbl[], int tbl_size, int *val)275{276	unsigned int v;277	int ret;278 279	ret = regmap_field_read(info->regmap_fields[field], &v);280	if (ret)281		return ret;282 283	v = (v >= tbl_size) ? (tbl_size - 1) : v;284	*val = tbl[v];285 286	return 0;287}288 289static int rt9455_set_field_val(struct rt9455_info *info,290				enum rt9455_fields field,291				const int tbl[], int tbl_size, int val)292{293	unsigned int idx = rt9455_find_idx(tbl, tbl_size, val);294 295	return regmap_field_write(info->regmap_fields[field], idx);296}297 298static int rt9455_register_reset(struct rt9455_info *info)299{300	struct device *dev = &info->client->dev;301	unsigned int v;302	int ret, limit = 100;303 304	ret = regmap_field_write(info->regmap_fields[F_RST], 0x01);305	if (ret) {306		dev_err(dev, "Failed to set RST bit\n");307		return ret;308	}309 310	/*311	 * To make sure that reset operation has finished, loop until RST bit312	 * is set to 0.313	 */314	do {315		ret = regmap_field_read(info->regmap_fields[F_RST], &v);316		if (ret) {317			dev_err(dev, "Failed to read RST bit\n");318			return ret;319		}320 321		if (!v)322			break;323 324		usleep_range(10, 100);325	} while (--limit);326 327	if (!limit)328		return -EIO;329 330	return 0;331}332 333/* Charger power supply property routines */334static enum power_supply_property rt9455_charger_properties[] = {335	POWER_SUPPLY_PROP_STATUS,336	POWER_SUPPLY_PROP_HEALTH,337	POWER_SUPPLY_PROP_PRESENT,338	POWER_SUPPLY_PROP_ONLINE,339	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,340	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,341	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,342	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,343	POWER_SUPPLY_PROP_SCOPE,344	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,345	POWER_SUPPLY_PROP_MODEL_NAME,346	POWER_SUPPLY_PROP_MANUFACTURER,347};348 349static char *rt9455_charger_supplied_to[] = {350	"main-battery",351};352 353static int rt9455_charger_get_status(struct rt9455_info *info,354				     union power_supply_propval *val)355{356	unsigned int v, pwr_rdy;357	int ret;358 359	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY],360				&pwr_rdy);361	if (ret) {362		dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");363		return ret;364	}365 366	/*367	 * If PWR_RDY bit is unset, the battery is discharging. Otherwise,368	 * STAT bits value must be checked.369	 */370	if (!pwr_rdy) {371		val->intval = POWER_SUPPLY_STATUS_DISCHARGING;372		return 0;373	}374 375	ret = regmap_field_read(info->regmap_fields[F_STAT], &v);376	if (ret) {377		dev_err(&info->client->dev, "Failed to read STAT bits\n");378		return ret;379	}380 381	switch (v) {382	case 0:383		/*384		 * If PWR_RDY bit is set, but STAT bits value is 0, the charger385		 * may be in one of the following cases:386		 * 1. CHG_EN bit is 0.387		 * 2. CHG_EN bit is 1 but the battery is not connected.388		 * In any of these cases, POWER_SUPPLY_STATUS_NOT_CHARGING is389		 * returned.390		 */391		val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;392		return 0;393	case 1:394		val->intval = POWER_SUPPLY_STATUS_CHARGING;395		return 0;396	case 2:397		val->intval = POWER_SUPPLY_STATUS_FULL;398		return 0;399	default:400		val->intval = POWER_SUPPLY_STATUS_UNKNOWN;401		return 0;402	}403}404 405static int rt9455_charger_get_health(struct rt9455_info *info,406				     union power_supply_propval *val)407{408	struct device *dev = &info->client->dev;409	unsigned int v;410	int ret;411 412	val->intval = POWER_SUPPLY_HEALTH_GOOD;413 414	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &v);415	if (ret) {416		dev_err(dev, "Failed to read IRQ1 register\n");417		return ret;418	}419 420	if (v & GET_MASK(F_TSDI)) {421		val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;422		return 0;423	}424	if (v & GET_MASK(F_VINOVPI)) {425		val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;426		return 0;427	}428	if (v & GET_MASK(F_BATAB)) {429		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;430		return 0;431	}432 433	ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &v);434	if (ret) {435		dev_err(dev, "Failed to read IRQ2 register\n");436		return ret;437	}438 439	if (v & GET_MASK(F_CHBATOVI)) {440		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;441		return 0;442	}443	if (v & GET_MASK(F_CH32MI)) {444		val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;445		return 0;446	}447 448	ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &v);449	if (ret) {450		dev_err(dev, "Failed to read IRQ3 register\n");451		return ret;452	}453 454	if (v & GET_MASK(F_BSTBUSOVI)) {455		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;456		return 0;457	}458	if (v & GET_MASK(F_BSTOLI)) {459		val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;460		return 0;461	}462	if (v & GET_MASK(F_BSTLOWVI)) {463		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;464		return 0;465	}466	if (v & GET_MASK(F_BST32SI)) {467		val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;468		return 0;469	}470 471	ret = regmap_field_read(info->regmap_fields[F_STAT], &v);472	if (ret) {473		dev_err(dev, "Failed to read STAT bits\n");474		return ret;475	}476 477	if (v == RT9455_FAULT) {478		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;479		return 0;480	}481 482	return 0;483}484 485static int rt9455_charger_get_battery_presence(struct rt9455_info *info,486					       union power_supply_propval *val)487{488	unsigned int v;489	int ret;490 491	ret = regmap_field_read(info->regmap_fields[F_BATAB], &v);492	if (ret) {493		dev_err(&info->client->dev, "Failed to read BATAB bit\n");494		return ret;495	}496 497	/*498	 * Since BATAB is 1 when battery is NOT present and 0 otherwise,499	 * !BATAB is returned.500	 */501	val->intval = !v;502 503	return 0;504}505 506static int rt9455_charger_get_online(struct rt9455_info *info,507				     union power_supply_propval *val)508{509	unsigned int v;510	int ret;511 512	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &v);513	if (ret) {514		dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");515		return ret;516	}517 518	val->intval = (int)v;519 520	return 0;521}522 523static int rt9455_charger_get_current(struct rt9455_info *info,524				      union power_supply_propval *val)525{526	int curr;527	int ret;528 529	ret = rt9455_get_field_val(info, F_ICHRG,530				   rt9455_ichrg_values,531				   ARRAY_SIZE(rt9455_ichrg_values),532				   &curr);533	if (ret) {534		dev_err(&info->client->dev, "Failed to read ICHRG value\n");535		return ret;536	}537 538	val->intval = curr;539 540	return 0;541}542 543static int rt9455_charger_get_current_max(struct rt9455_info *info,544					  union power_supply_propval *val)545{546	int idx = ARRAY_SIZE(rt9455_ichrg_values) - 1;547 548	val->intval = rt9455_ichrg_values[idx];549 550	return 0;551}552 553static int rt9455_charger_get_voltage(struct rt9455_info *info,554				      union power_supply_propval *val)555{556	int voltage;557	int ret;558 559	ret = rt9455_get_field_val(info, F_VOREG,560				   rt9455_voreg_values,561				   ARRAY_SIZE(rt9455_voreg_values),562				   &voltage);563	if (ret) {564		dev_err(&info->client->dev, "Failed to read VOREG value\n");565		return ret;566	}567 568	val->intval = voltage;569 570	return 0;571}572 573static int rt9455_charger_get_voltage_max(struct rt9455_info *info,574					  union power_supply_propval *val)575{576	int idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;577 578	val->intval = rt9455_vmreg_values[idx];579 580	return 0;581}582 583static int rt9455_charger_get_term_current(struct rt9455_info *info,584					   union power_supply_propval *val)585{586	struct device *dev = &info->client->dev;587	int ichrg, ieoc_percentage, ret;588 589	ret = rt9455_get_field_val(info, F_ICHRG,590				   rt9455_ichrg_values,591				   ARRAY_SIZE(rt9455_ichrg_values),592				   &ichrg);593	if (ret) {594		dev_err(dev, "Failed to read ICHRG value\n");595		return ret;596	}597 598	ret = rt9455_get_field_val(info, F_IEOC_PERCENTAGE,599				   rt9455_ieoc_percentage_values,600				   ARRAY_SIZE(rt9455_ieoc_percentage_values),601				   &ieoc_percentage);602	if (ret) {603		dev_err(dev, "Failed to read IEOC value\n");604		return ret;605	}606 607	val->intval = ichrg * ieoc_percentage / 100;608 609	return 0;610}611 612static int rt9455_charger_get_property(struct power_supply *psy,613				       enum power_supply_property psp,614				       union power_supply_propval *val)615{616	struct rt9455_info *info = power_supply_get_drvdata(psy);617 618	switch (psp) {619	case POWER_SUPPLY_PROP_STATUS:620		return rt9455_charger_get_status(info, val);621	case POWER_SUPPLY_PROP_HEALTH:622		return rt9455_charger_get_health(info, val);623	case POWER_SUPPLY_PROP_PRESENT:624		return rt9455_charger_get_battery_presence(info, val);625	case POWER_SUPPLY_PROP_ONLINE:626		return rt9455_charger_get_online(info, val);627	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:628		return rt9455_charger_get_current(info, val);629	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:630		return rt9455_charger_get_current_max(info, val);631	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:632		return rt9455_charger_get_voltage(info, val);633	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:634		return rt9455_charger_get_voltage_max(info, val);635	case POWER_SUPPLY_PROP_SCOPE:636		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;637		return 0;638	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:639		return rt9455_charger_get_term_current(info, val);640	case POWER_SUPPLY_PROP_MODEL_NAME:641		val->strval = RT9455_MODEL_NAME;642		return 0;643	case POWER_SUPPLY_PROP_MANUFACTURER:644		val->strval = RT9455_MANUFACTURER;645		return 0;646	default:647		return -ENODATA;648	}649}650 651static int rt9455_hw_init(struct rt9455_info *info, u32 ichrg,652			  u32 ieoc_percentage,653			  u32 mivr, u32 iaicr)654{655	struct device *dev = &info->client->dev;656	int idx, ret;657 658	ret = rt9455_register_reset(info);659	if (ret) {660		dev_err(dev, "Power On Reset failed\n");661		return ret;662	}663 664	/* Set TE bit in order to enable end of charge detection */665	ret = regmap_field_write(info->regmap_fields[F_TE], 1);666	if (ret) {667		dev_err(dev, "Failed to set TE bit\n");668		return ret;669	}670 671	/* Set TE_SHDN_EN bit in order to enable end of charge detection */672	ret = regmap_field_write(info->regmap_fields[F_TE_SHDN_EN], 1);673	if (ret) {674		dev_err(dev, "Failed to set TE_SHDN_EN bit\n");675		return ret;676	}677 678	/*679	 * Set BATD_EN bit in order to enable battery detection680	 * when charging is done681	 */682	ret = regmap_field_write(info->regmap_fields[F_BATD_EN], 1);683	if (ret) {684		dev_err(dev, "Failed to set BATD_EN bit\n");685		return ret;686	}687 688	/*689	 * Disable Safety Timer. In charge mode, this timer terminates charging690	 * if no read or write via I2C is done within 32 minutes. This timer691	 * avoids overcharging the baterry when the OS is not loaded and the692	 * charger is connected to a power source.693	 * In boost mode, this timer triggers BST32SI interrupt if no read or694	 * write via I2C is done within 32 seconds.695	 * When the OS is loaded and the charger driver is inserted, it is used696	 * delayed_work, named max_charging_time_work, to avoid overcharging697	 * the battery.698	 */699	ret = regmap_field_write(info->regmap_fields[F_TMR_EN], 0x00);700	if (ret) {701		dev_err(dev, "Failed to disable Safety Timer\n");702		return ret;703	}704 705	/* Set ICHRG to value retrieved from device-specific data */706	ret = rt9455_set_field_val(info, F_ICHRG,707				   rt9455_ichrg_values,708				   ARRAY_SIZE(rt9455_ichrg_values), ichrg);709	if (ret) {710		dev_err(dev, "Failed to set ICHRG value\n");711		return ret;712	}713 714	/* Set IEOC Percentage to value retrieved from device-specific data */715	ret = rt9455_set_field_val(info, F_IEOC_PERCENTAGE,716				   rt9455_ieoc_percentage_values,717				   ARRAY_SIZE(rt9455_ieoc_percentage_values),718				   ieoc_percentage);719	if (ret) {720		dev_err(dev, "Failed to set IEOC Percentage value\n");721		return ret;722	}723 724	/* Set VOREG to value retrieved from device-specific data */725	ret = rt9455_set_field_val(info, F_VOREG,726				   rt9455_voreg_values,727				   ARRAY_SIZE(rt9455_voreg_values),728				   info->voreg);729	if (ret) {730		dev_err(dev, "Failed to set VOREG value\n");731		return ret;732	}733 734	/* Set VMREG value to maximum (4.45V). */735	idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;736	ret = rt9455_set_field_val(info, F_VMREG,737				   rt9455_vmreg_values,738				   ARRAY_SIZE(rt9455_vmreg_values),739				   rt9455_vmreg_values[idx]);740	if (ret) {741		dev_err(dev, "Failed to set VMREG value\n");742		return ret;743	}744 745	/*746	 * Set MIVR to value retrieved from device-specific data.747	 * If no value is specified, default value for MIVR is 4.5V.748	 */749	if (mivr == -1)750		mivr = 4500000;751 752	ret = rt9455_set_field_val(info, F_MIVR,753				   rt9455_mivr_values,754				   ARRAY_SIZE(rt9455_mivr_values), mivr);755	if (ret) {756		dev_err(dev, "Failed to set MIVR value\n");757		return ret;758	}759 760	/*761	 * Set IAICR to value retrieved from device-specific data.762	 * If no value is specified, default value for IAICR is 500 mA.763	 */764	if (iaicr == -1)765		iaicr = 500000;766 767	ret = rt9455_set_field_val(info, F_IAICR,768				   rt9455_iaicr_values,769				   ARRAY_SIZE(rt9455_iaicr_values), iaicr);770	if (ret) {771		dev_err(dev, "Failed to set IAICR value\n");772		return ret;773	}774 775	/*776	 * Set IAICR_INT bit so that IAICR value is determined by IAICR bits777	 * and not by OTG pin.778	 */779	ret = regmap_field_write(info->regmap_fields[F_IAICR_INT], 0x01);780	if (ret) {781		dev_err(dev, "Failed to set IAICR_INT bit\n");782		return ret;783	}784 785	/*786	 * Disable CHMIVRI interrupt. Because the driver sets MIVR value,787	 * CHMIVRI is triggered, but there is no action to be taken by the788	 * driver when CHMIVRI is triggered.789	 */790	ret = regmap_field_write(info->regmap_fields[F_CHMIVRIM], 0x01);791	if (ret) {792		dev_err(dev, "Failed to mask CHMIVRI interrupt\n");793		return ret;794	}795 796	return 0;797}798 799#if IS_ENABLED(CONFIG_USB_PHY)800/*801 * Before setting the charger into boost mode, boost output voltage is802 * set. This is needed because boost output voltage may differ from battery803 * regulation voltage. F_VOREG bits represent either battery regulation voltage804 * or boost output voltage, depending on the mode the charger is. Both battery805 * regulation voltage and boost output voltage are read from DT/ACPI during806 * probe.807 */808static int rt9455_set_boost_voltage_before_boost_mode(struct rt9455_info *info)809{810	struct device *dev = &info->client->dev;811	int ret;812 813	ret = rt9455_set_field_val(info, F_VOREG,814				   rt9455_boost_voltage_values,815				   ARRAY_SIZE(rt9455_boost_voltage_values),816				   info->boost_voltage);817	if (ret) {818		dev_err(dev, "Failed to set boost output voltage value\n");819		return ret;820	}821 822	return 0;823}824#endif825 826/*827 * Before setting the charger into charge mode, battery regulation voltage is828 * set. This is needed because boost output voltage may differ from battery829 * regulation voltage. F_VOREG bits represent either battery regulation voltage830 * or boost output voltage, depending on the mode the charger is. Both battery831 * regulation voltage and boost output voltage are read from DT/ACPI during832 * probe.833 */834static int rt9455_set_voreg_before_charge_mode(struct rt9455_info *info)835{836	struct device *dev = &info->client->dev;837	int ret;838 839	ret = rt9455_set_field_val(info, F_VOREG,840				   rt9455_voreg_values,841				   ARRAY_SIZE(rt9455_voreg_values),842				   info->voreg);843	if (ret) {844		dev_err(dev, "Failed to set VOREG value\n");845		return ret;846	}847 848	return 0;849}850 851static int rt9455_irq_handler_check_irq1_register(struct rt9455_info *info,852						  bool *_is_battery_absent,853						  bool *_alert_userspace)854{855	unsigned int irq1, mask1, mask2;856	struct device *dev = &info->client->dev;857	bool is_battery_absent = false;858	bool alert_userspace = false;859	int ret;860 861	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);862	if (ret) {863		dev_err(dev, "Failed to read IRQ1 register\n");864		return ret;865	}866 867	ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);868	if (ret) {869		dev_err(dev, "Failed to read MASK1 register\n");870		return ret;871	}872 873	if (irq1 & GET_MASK(F_TSDI)) {874		dev_err(dev, "Thermal shutdown fault occurred\n");875		alert_userspace = true;876	}877 878	if (irq1 & GET_MASK(F_VINOVPI)) {879		dev_err(dev, "Overvoltage input occurred\n");880		alert_userspace = true;881	}882 883	if (irq1 & GET_MASK(F_BATAB)) {884		dev_err(dev, "Battery absence occurred\n");885		is_battery_absent = true;886		alert_userspace = true;887 888		if ((mask1 & GET_MASK(F_BATABM)) == 0) {889			ret = regmap_field_write(info->regmap_fields[F_BATABM],890						 0x01);891			if (ret) {892				dev_err(dev, "Failed to mask BATAB interrupt\n");893				return ret;894			}895		}896 897		ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);898		if (ret) {899			dev_err(dev, "Failed to read MASK2 register\n");900			return ret;901		}902 903		if (mask2 & GET_MASK(F_CHTERMIM)) {904			ret = regmap_field_write(905				info->regmap_fields[F_CHTERMIM], 0x00);906			if (ret) {907				dev_err(dev, "Failed to unmask CHTERMI interrupt\n");908				return ret;909			}910		}911 912		if (mask2 & GET_MASK(F_CHRCHGIM)) {913			ret = regmap_field_write(914				info->regmap_fields[F_CHRCHGIM], 0x00);915			if (ret) {916				dev_err(dev, "Failed to unmask CHRCHGI interrupt\n");917				return ret;918			}919		}920 921		/*922		 * When the battery is absent, max_charging_time_work is923		 * cancelled, since no charging is done.924		 */925		cancel_delayed_work_sync(&info->max_charging_time_work);926		/*927		 * Since no interrupt is triggered when the battery is928		 * reconnected, max_charging_time_work is not rescheduled.929		 * Therefore, batt_presence_work is scheduled to check whether930		 * the battery is still absent or not.931		 */932		queue_delayed_work(system_power_efficient_wq,933				   &info->batt_presence_work,934				   RT9455_BATT_PRESENCE_DELAY * HZ);935	}936 937	*_is_battery_absent = is_battery_absent;938 939	if (alert_userspace)940		*_alert_userspace = alert_userspace;941 942	return 0;943}944 945static int rt9455_irq_handler_check_irq2_register(struct rt9455_info *info,946						  bool is_battery_absent,947						  bool *_alert_userspace)948{949	unsigned int irq2, mask2;950	struct device *dev = &info->client->dev;951	bool alert_userspace = false;952	int ret;953 954	ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &irq2);955	if (ret) {956		dev_err(dev, "Failed to read IRQ2 register\n");957		return ret;958	}959 960	ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);961	if (ret) {962		dev_err(dev, "Failed to read MASK2 register\n");963		return ret;964	}965 966	if (irq2 & GET_MASK(F_CHRVPI)) {967		dev_dbg(dev, "Charger fault occurred\n");968		/*969		 * CHRVPI bit is set in 2 cases:970		 * 1. when the power source is connected to the charger.971		 * 2. when the power source is disconnected from the charger.972		 * To identify the case, PWR_RDY bit is checked. Because973		 * PWR_RDY bit is set / cleared after CHRVPI interrupt is974		 * triggered, it is used delayed_work to later read PWR_RDY bit.975		 * Also, do not set to true alert_userspace, because there is no976		 * need to notify userspace when CHRVPI interrupt has occurred.977		 * Userspace will be notified after PWR_RDY bit is read.978		 */979		queue_delayed_work(system_power_efficient_wq,980				   &info->pwr_rdy_work,981				   RT9455_PWR_RDY_DELAY * HZ);982	}983	if (irq2 & GET_MASK(F_CHBATOVI)) {984		dev_err(dev, "Battery OVP occurred\n");985		alert_userspace = true;986	}987	if (irq2 & GET_MASK(F_CHTERMI)) {988		dev_dbg(dev, "Charge terminated\n");989		if (!is_battery_absent) {990			if ((mask2 & GET_MASK(F_CHTERMIM)) == 0) {991				ret = regmap_field_write(992					info->regmap_fields[F_CHTERMIM], 0x01);993				if (ret) {994					dev_err(dev, "Failed to mask CHTERMI interrupt\n");995					return ret;996				}997				/*998				 * Update MASK2 value, since CHTERMIM bit is999				 * set.1000				 */1001				mask2 = mask2 | GET_MASK(F_CHTERMIM);1002			}1003			cancel_delayed_work_sync(&info->max_charging_time_work);1004			alert_userspace = true;1005		}1006	}1007	if (irq2 & GET_MASK(F_CHRCHGI)) {1008		dev_dbg(dev, "Recharge request\n");1009		ret = regmap_field_write(info->regmap_fields[F_CHG_EN],1010					 RT9455_CHARGE_ENABLE);1011		if (ret) {1012			dev_err(dev, "Failed to enable charging\n");1013			return ret;1014		}1015		if (mask2 & GET_MASK(F_CHTERMIM)) {1016			ret = regmap_field_write(1017				info->regmap_fields[F_CHTERMIM], 0x00);1018			if (ret) {1019				dev_err(dev, "Failed to unmask CHTERMI interrupt\n");1020				return ret;1021			}1022			/* Update MASK2 value, since CHTERMIM bit is cleared. */1023			mask2 = mask2 & ~GET_MASK(F_CHTERMIM);1024		}1025		if (!is_battery_absent) {1026			/*1027			 * No need to check whether the charger is connected to1028			 * power source when CHRCHGI is received, since CHRCHGI1029			 * is not triggered if the charger is not connected to1030			 * the power source.1031			 */1032			queue_delayed_work(system_power_efficient_wq,1033					   &info->max_charging_time_work,1034					   RT9455_MAX_CHARGING_TIME * HZ);1035			alert_userspace = true;1036		}1037	}1038	if (irq2 & GET_MASK(F_CH32MI)) {1039		dev_err(dev, "Charger fault. 32 mins timeout occurred\n");1040		alert_userspace = true;1041	}1042	if (irq2 & GET_MASK(F_CHTREGI)) {1043		dev_warn(dev,1044			 "Charger warning. Thermal regulation loop active\n");1045		alert_userspace = true;1046	}1047	if (irq2 & GET_MASK(F_CHMIVRI)) {1048		dev_dbg(dev,1049			"Charger warning. Input voltage MIVR loop active\n");1050	}1051 1052	if (alert_userspace)1053		*_alert_userspace = alert_userspace;1054 1055	return 0;1056}1057 1058static int rt9455_irq_handler_check_irq3_register(struct rt9455_info *info,1059						  bool *_alert_userspace)1060{1061	unsigned int irq3, mask3;1062	struct device *dev = &info->client->dev;1063	bool alert_userspace = false;1064	int ret;1065 1066	ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &irq3);1067	if (ret) {1068		dev_err(dev, "Failed to read IRQ3 register\n");1069		return ret;1070	}1071 1072	ret = regmap_read(info->regmap, RT9455_REG_MASK3, &mask3);1073	if (ret) {1074		dev_err(dev, "Failed to read MASK3 register\n");1075		return ret;1076	}1077 1078	if (irq3 & GET_MASK(F_BSTBUSOVI)) {1079		dev_err(dev, "Boost fault. Overvoltage input occurred\n");1080		alert_userspace = true;1081	}1082	if (irq3 & GET_MASK(F_BSTOLI)) {1083		dev_err(dev, "Boost fault. Overload\n");1084		alert_userspace = true;1085	}1086	if (irq3 & GET_MASK(F_BSTLOWVI)) {1087		dev_err(dev, "Boost fault. Battery voltage too low\n");1088		alert_userspace = true;1089	}1090	if (irq3 & GET_MASK(F_BST32SI)) {1091		dev_err(dev, "Boost fault. 32 seconds timeout occurred.\n");1092		alert_userspace = true;1093	}1094 1095	if (alert_userspace) {1096		dev_info(dev, "Boost fault occurred, therefore the charger goes into charge mode\n");1097		ret = rt9455_set_voreg_before_charge_mode(info);1098		if (ret) {1099			dev_err(dev, "Failed to set VOREG before entering charge mode\n");1100			return ret;1101		}1102		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],1103					 RT9455_CHARGE_MODE);1104		if (ret) {1105			dev_err(dev, "Failed to set charger in charge mode\n");1106			return ret;1107		}1108		*_alert_userspace = alert_userspace;1109	}1110 1111	return 0;1112}1113 1114static irqreturn_t rt9455_irq_handler_thread(int irq, void *data)1115{1116	struct rt9455_info *info = data;1117	struct device *dev;1118	bool alert_userspace = false;1119	bool is_battery_absent = false;1120	unsigned int status;1121	int ret;1122 1123	if (!info)1124		return IRQ_NONE;1125 1126	dev = &info->client->dev;1127 1128	if (irq != info->client->irq) {1129		dev_err(dev, "Interrupt is not for RT9455 charger\n");1130		return IRQ_NONE;1131	}1132 1133	ret = regmap_field_read(info->regmap_fields[F_STAT], &status);1134	if (ret) {1135		dev_err(dev, "Failed to read STAT bits\n");1136		return IRQ_HANDLED;1137	}1138	dev_dbg(dev, "Charger status is %d\n", status);1139 1140	/*1141	 * Each function that processes an IRQ register receives as output1142	 * parameter alert_userspace pointer. alert_userspace is set to true1143	 * in such a function only if an interrupt has occurred in the1144	 * respective interrupt register. This way, it is avoided the following1145	 * case: interrupt occurs only in IRQ1 register,1146	 * rt9455_irq_handler_check_irq1_register() function sets to true1147	 * alert_userspace, but rt9455_irq_handler_check_irq2_register()1148	 * and rt9455_irq_handler_check_irq3_register() functions set to false1149	 * alert_userspace and power_supply_changed() is never called.1150	 */1151	ret = rt9455_irq_handler_check_irq1_register(info, &is_battery_absent,1152						     &alert_userspace);1153	if (ret) {1154		dev_err(dev, "Failed to handle IRQ1 register\n");1155		return IRQ_HANDLED;1156	}1157 1158	ret = rt9455_irq_handler_check_irq2_register(info, is_battery_absent,1159						     &alert_userspace);1160	if (ret) {1161		dev_err(dev, "Failed to handle IRQ2 register\n");1162		return IRQ_HANDLED;1163	}1164 1165	ret = rt9455_irq_handler_check_irq3_register(info, &alert_userspace);1166	if (ret) {1167		dev_err(dev, "Failed to handle IRQ3 register\n");1168		return IRQ_HANDLED;1169	}1170 1171	if (alert_userspace) {1172		/*1173		 * Sometimes, an interrupt occurs while rt9455_probe() function1174		 * is executing and power_supply_register() is not yet called.1175		 * Do not call power_supply_changed() in this case.1176		 */1177		if (info->charger)1178			power_supply_changed(info->charger);1179	}1180 1181	return IRQ_HANDLED;1182}1183 1184static int rt9455_discover_charger(struct rt9455_info *info, u32 *ichrg,1185				   u32 *ieoc_percentage,1186				   u32 *mivr, u32 *iaicr)1187{1188	struct device *dev = &info->client->dev;1189	int ret;1190 1191	if (!dev->of_node && !ACPI_HANDLE(dev)) {1192		dev_err(dev, "No support for either device tree or ACPI\n");1193		return -EINVAL;1194	}1195	/*1196	 * ICHRG, IEOC_PERCENTAGE, VOREG and boost output voltage are mandatory1197	 * parameters.1198	 */1199	ret = device_property_read_u32(dev, "richtek,output-charge-current",1200				       ichrg);1201	if (ret) {1202		dev_err(dev, "Error: missing \"output-charge-current\" property\n");1203		return ret;1204	}1205 1206	ret = device_property_read_u32(dev, "richtek,end-of-charge-percentage",1207				       ieoc_percentage);1208	if (ret) {1209		dev_err(dev, "Error: missing \"end-of-charge-percentage\" property\n");1210		return ret;1211	}1212 1213	ret = device_property_read_u32(dev,1214				       "richtek,battery-regulation-voltage",1215				       &info->voreg);1216	if (ret) {1217		dev_err(dev, "Error: missing \"battery-regulation-voltage\" property\n");1218		return ret;1219	}1220 1221	ret = device_property_read_u32(dev, "richtek,boost-output-voltage",1222				       &info->boost_voltage);1223	if (ret) {1224		dev_err(dev, "Error: missing \"boost-output-voltage\" property\n");1225		return ret;1226	}1227 1228	/*1229	 * MIVR and IAICR are optional parameters. Do not return error if one of1230	 * them is not present in ACPI table or device tree specification.1231	 */1232	device_property_read_u32(dev, "richtek,min-input-voltage-regulation",1233				 mivr);1234	device_property_read_u32(dev, "richtek,avg-input-current-regulation",1235				 iaicr);1236 1237	return 0;1238}1239 1240#if IS_ENABLED(CONFIG_USB_PHY)1241static int rt9455_usb_event_none(struct rt9455_info *info,1242				 u8 opa_mode, u8 iaicr)1243{1244	struct device *dev = &info->client->dev;1245	int ret;1246 1247	if (opa_mode == RT9455_BOOST_MODE) {1248		ret = rt9455_set_voreg_before_charge_mode(info);1249		if (ret) {1250			dev_err(dev, "Failed to set VOREG before entering charge mode\n");1251			return ret;1252		}1253		/*1254		 * If the charger is in boost mode, and it has received1255		 * USB_EVENT_NONE, this means the consumer device powered by the1256		 * charger is not connected anymore.1257		 * In this case, the charger goes into charge mode.1258		 */1259		dev_dbg(dev, "USB_EVENT_NONE received, therefore the charger goes into charge mode\n");1260		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],1261					 RT9455_CHARGE_MODE);1262		if (ret) {1263			dev_err(dev, "Failed to set charger in charge mode\n");1264			return NOTIFY_DONE;1265		}1266	}1267 1268	dev_dbg(dev, "USB_EVENT_NONE received, therefore IAICR is set to its minimum value\n");1269	if (iaicr != RT9455_IAICR_100MA) {1270		ret = regmap_field_write(info->regmap_fields[F_IAICR],1271					 RT9455_IAICR_100MA);1272		if (ret) {1273			dev_err(dev, "Failed to set IAICR value\n");1274			return NOTIFY_DONE;1275		}1276	}1277 1278	return NOTIFY_OK;1279}1280 1281static int rt9455_usb_event_vbus(struct rt9455_info *info,1282				 u8 opa_mode, u8 iaicr)1283{1284	struct device *dev = &info->client->dev;1285	int ret;1286 1287	if (opa_mode == RT9455_BOOST_MODE) {1288		ret = rt9455_set_voreg_before_charge_mode(info);1289		if (ret) {1290			dev_err(dev, "Failed to set VOREG before entering charge mode\n");1291			return ret;1292		}1293		/*1294		 * If the charger is in boost mode, and it has received1295		 * USB_EVENT_VBUS, this means the consumer device powered by the1296		 * charger is not connected anymore.1297		 * In this case, the charger goes into charge mode.1298		 */1299		dev_dbg(dev, "USB_EVENT_VBUS received, therefore the charger goes into charge mode\n");1300		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],1301					 RT9455_CHARGE_MODE);1302		if (ret) {1303			dev_err(dev, "Failed to set charger in charge mode\n");1304			return NOTIFY_DONE;1305		}1306	}1307 1308	dev_dbg(dev, "USB_EVENT_VBUS received, therefore IAICR is set to 500 mA\n");1309	if (iaicr != RT9455_IAICR_500MA) {1310		ret = regmap_field_write(info->regmap_fields[F_IAICR],1311					 RT9455_IAICR_500MA);1312		if (ret) {1313			dev_err(dev, "Failed to set IAICR value\n");1314			return NOTIFY_DONE;1315		}1316	}1317 1318	return NOTIFY_OK;1319}1320 1321static int rt9455_usb_event_id(struct rt9455_info *info,1322			       u8 opa_mode, u8 iaicr)1323{1324	struct device *dev = &info->client->dev;1325	int ret;1326 1327	if (opa_mode == RT9455_CHARGE_MODE) {1328		ret = rt9455_set_boost_voltage_before_boost_mode(info);1329		if (ret) {1330			dev_err(dev, "Failed to set boost output voltage before entering boost mode\n");1331			return ret;1332		}1333		/*1334		 * If the charger is in charge mode, and it has received1335		 * USB_EVENT_ID, this means a consumer device is connected and1336		 * it should be powered by the charger.1337		 * In this case, the charger goes into boost mode.1338		 */1339		dev_dbg(dev, "USB_EVENT_ID received, therefore the charger goes into boost mode\n");1340		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],1341					 RT9455_BOOST_MODE);1342		if (ret) {1343			dev_err(dev, "Failed to set charger in boost mode\n");1344			return NOTIFY_DONE;1345		}1346	}1347 1348	dev_dbg(dev, "USB_EVENT_ID received, therefore IAICR is set to its minimum value\n");1349	if (iaicr != RT9455_IAICR_100MA) {1350		ret = regmap_field_write(info->regmap_fields[F_IAICR],1351					 RT9455_IAICR_100MA);1352		if (ret) {1353			dev_err(dev, "Failed to set IAICR value\n");1354			return NOTIFY_DONE;1355		}1356	}1357 1358	return NOTIFY_OK;1359}1360 1361static int rt9455_usb_event_charger(struct rt9455_info *info,1362				    u8 opa_mode, u8 iaicr)1363{1364	struct device *dev = &info->client->dev;1365	int ret;1366 1367	if (opa_mode == RT9455_BOOST_MODE) {1368		ret = rt9455_set_voreg_before_charge_mode(info);1369		if (ret) {1370			dev_err(dev, "Failed to set VOREG before entering charge mode\n");1371			return ret;1372		}1373		/*1374		 * If the charger is in boost mode, and it has received1375		 * USB_EVENT_CHARGER, this means the consumer device powered by1376		 * the charger is not connected anymore.1377		 * In this case, the charger goes into charge mode.1378		 */1379		dev_dbg(dev, "USB_EVENT_CHARGER received, therefore the charger goes into charge mode\n");1380		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],1381					 RT9455_CHARGE_MODE);1382		if (ret) {1383			dev_err(dev, "Failed to set charger in charge mode\n");1384			return NOTIFY_DONE;1385		}1386	}1387 1388	dev_dbg(dev, "USB_EVENT_CHARGER received, therefore IAICR is set to no current limit\n");1389	if (iaicr != RT9455_IAICR_NO_LIMIT) {1390		ret = regmap_field_write(info->regmap_fields[F_IAICR],1391					 RT9455_IAICR_NO_LIMIT);1392		if (ret) {1393			dev_err(dev, "Failed to set IAICR value\n");1394			return NOTIFY_DONE;1395		}1396	}1397 1398	return NOTIFY_OK;1399}1400 1401static int rt9455_usb_event(struct notifier_block *nb,1402			    unsigned long event, void *power)1403{1404	struct rt9455_info *info = container_of(nb, struct rt9455_info, nb);1405	struct device *dev = &info->client->dev;1406	unsigned int opa_mode, iaicr;1407	int ret;1408 1409	/*1410	 * Determine whether the charger is in charge mode1411	 * or in boost mode.1412	 */1413	ret = regmap_field_read(info->regmap_fields[F_OPA_MODE],1414				&opa_mode);1415	if (ret) {1416		dev_err(dev, "Failed to read OPA_MODE value\n");1417		return NOTIFY_DONE;1418	}1419 1420	ret = regmap_field_read(info->regmap_fields[F_IAICR],1421				&iaicr);1422	if (ret) {1423		dev_err(dev, "Failed to read IAICR value\n");1424		return NOTIFY_DONE;1425	}1426 1427	dev_dbg(dev, "Received USB event %lu\n", event);1428	switch (event) {1429	case USB_EVENT_NONE:1430		return rt9455_usb_event_none(info, opa_mode, iaicr);1431	case USB_EVENT_VBUS:1432		return rt9455_usb_event_vbus(info, opa_mode, iaicr);1433	case USB_EVENT_ID:1434		return rt9455_usb_event_id(info, opa_mode, iaicr);1435	case USB_EVENT_CHARGER:1436		return rt9455_usb_event_charger(info, opa_mode, iaicr);1437	default:1438		dev_err(dev, "Unknown USB event\n");1439	}1440	return NOTIFY_DONE;1441}1442#endif1443 1444static void rt9455_pwr_rdy_work_callback(struct work_struct *work)1445{1446	struct rt9455_info *info = container_of(work, struct rt9455_info,1447						pwr_rdy_work.work);1448	struct device *dev = &info->client->dev;1449	unsigned int pwr_rdy;1450	int ret;1451 1452	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &pwr_rdy);1453	if (ret) {1454		dev_err(dev, "Failed to read PWR_RDY bit\n");1455		return;1456	}1457	switch (pwr_rdy) {1458	case RT9455_PWR_FAULT:1459		dev_dbg(dev, "Charger disconnected from power source\n");1460		cancel_delayed_work_sync(&info->max_charging_time_work);1461		break;1462	case RT9455_PWR_GOOD:1463		dev_dbg(dev, "Charger connected to power source\n");1464		ret = regmap_field_write(info->regmap_fields[F_CHG_EN],1465					 RT9455_CHARGE_ENABLE);1466		if (ret) {1467			dev_err(dev, "Failed to enable charging\n");1468			return;1469		}1470		queue_delayed_work(system_power_efficient_wq,1471				   &info->max_charging_time_work,1472				   RT9455_MAX_CHARGING_TIME * HZ);1473		break;1474	}1475	/*1476	 * Notify userspace that the charger has been either connected to or1477	 * disconnected from the power source.1478	 */1479	power_supply_changed(info->charger);1480}1481 1482static void rt9455_max_charging_time_work_callback(struct work_struct *work)1483{1484	struct rt9455_info *info = container_of(work, struct rt9455_info,1485						max_charging_time_work.work);1486	struct device *dev = &info->client->dev;1487	int ret;1488 1489	dev_err(dev, "Battery has been charging for at least 6 hours and is not yet fully charged. Battery is dead, therefore charging is disabled.\n");1490	ret = regmap_field_write(info->regmap_fields[F_CHG_EN],1491				 RT9455_CHARGE_DISABLE);1492	if (ret)1493		dev_err(dev, "Failed to disable charging\n");1494}1495 1496static void rt9455_batt_presence_work_callback(struct work_struct *work)1497{1498	struct rt9455_info *info = container_of(work, struct rt9455_info,1499						batt_presence_work.work);1500	struct device *dev = &info->client->dev;1501	unsigned int irq1, mask1;1502	int ret;1503 1504	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);1505	if (ret) {1506		dev_err(dev, "Failed to read IRQ1 register\n");1507		return;1508	}1509 1510	/*1511	 * If the battery is still absent, batt_presence_work is rescheduled.1512	 * Otherwise, max_charging_time is scheduled.1513	 */1514	if (irq1 & GET_MASK(F_BATAB)) {1515		queue_delayed_work(system_power_efficient_wq,1516				   &info->batt_presence_work,1517				   RT9455_BATT_PRESENCE_DELAY * HZ);1518	} else {1519		queue_delayed_work(system_power_efficient_wq,1520				   &info->max_charging_time_work,1521				   RT9455_MAX_CHARGING_TIME * HZ);1522 1523		ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);1524		if (ret) {1525			dev_err(dev, "Failed to read MASK1 register\n");1526			return;1527		}1528 1529		if (mask1 & GET_MASK(F_BATABM)) {1530			ret = regmap_field_write(info->regmap_fields[F_BATABM],1531						 0x00);1532			if (ret)1533				dev_err(dev, "Failed to unmask BATAB interrupt\n");1534		}1535		/*1536		 * Notify userspace that the battery is now connected to the1537		 * charger.1538		 */1539		power_supply_changed(info->charger);1540	}1541}1542 1543static const struct power_supply_desc rt9455_charger_desc = {1544	.name			= RT9455_DRIVER_NAME,1545	.type			= POWER_SUPPLY_TYPE_USB,1546	.properties		= rt9455_charger_properties,1547	.num_properties		= ARRAY_SIZE(rt9455_charger_properties),1548	.get_property		= rt9455_charger_get_property,1549};1550 1551static bool rt9455_is_writeable_reg(struct device *dev, unsigned int reg)1552{1553	switch (reg) {1554	case RT9455_REG_DEV_ID:1555	case RT9455_REG_IRQ1:1556	case RT9455_REG_IRQ2:1557	case RT9455_REG_IRQ3:1558		return false;1559	default:1560		return true;1561	}1562}1563 1564static bool rt9455_is_volatile_reg(struct device *dev, unsigned int reg)1565{1566	switch (reg) {1567	case RT9455_REG_DEV_ID:1568	case RT9455_REG_CTRL5:1569	case RT9455_REG_CTRL6:1570		return false;1571	default:1572		return true;1573	}1574}1575 1576static const struct regmap_config rt9455_regmap_config = {1577	.reg_bits	= 8,1578	.val_bits	= 8,1579	.writeable_reg	= rt9455_is_writeable_reg,1580	.volatile_reg	= rt9455_is_volatile_reg,1581	.max_register	= RT9455_REG_MASK3,1582	.cache_type	= REGCACHE_RBTREE,1583};1584 1585static int rt9455_probe(struct i2c_client *client)1586{1587	struct i2c_adapter *adapter = client->adapter;1588	struct device *dev = &client->dev;1589	struct rt9455_info *info;1590	struct power_supply_config rt9455_charger_config = {};1591	/*1592	 * Mandatory device-specific data values. Also, VOREG and boost output1593	 * voltage are mandatory values, but they are stored in rt9455_info1594	 * structure.1595	 */1596	u32 ichrg, ieoc_percentage;1597	/* Optional device-specific data values. */1598	u32 mivr = -1, iaicr = -1;1599	int i, ret;1600 1601	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {1602		dev_err(dev, "No support for SMBUS_BYTE_DATA\n");1603		return -ENODEV;1604	}1605	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);1606	if (!info)1607		return -ENOMEM;1608 1609	info->client = client;1610	i2c_set_clientdata(client, info);1611 1612	info->regmap = devm_regmap_init_i2c(client,1613					    &rt9455_regmap_config);1614	if (IS_ERR(info->regmap)) {1615		dev_err(dev, "Failed to initialize register map\n");1616		return -EINVAL;1617	}1618 1619	for (i = 0; i < F_MAX_FIELDS; i++) {1620		info->regmap_fields[i] =1621			devm_regmap_field_alloc(dev, info->regmap,1622						rt9455_reg_fields[i]);1623		if (IS_ERR(info->regmap_fields[i])) {1624			dev_err(dev,1625				"Failed to allocate regmap field = %d\n", i);1626			return PTR_ERR(info->regmap_fields[i]);1627		}1628	}1629 1630	ret = rt9455_discover_charger(info, &ichrg, &ieoc_percentage,1631				      &mivr, &iaicr);1632	if (ret) {1633		dev_err(dev, "Failed to discover charger\n");1634		return ret;1635	}1636 1637#if IS_ENABLED(CONFIG_USB_PHY)1638	info->usb_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);1639	if (IS_ERR(info->usb_phy)) {1640		dev_err(dev, "Failed to get USB transceiver\n");1641	} else {1642		info->nb.notifier_call = rt9455_usb_event;1643		ret = usb_register_notifier(info->usb_phy, &info->nb);1644		if (ret) {1645			dev_err(dev, "Failed to register USB notifier\n");1646			/*1647			 * If usb_register_notifier() fails, set notifier_call1648			 * to NULL, to avoid calling usb_unregister_notifier().1649			 */1650			info->nb.notifier_call = NULL;1651		}1652	}1653#endif1654 1655	INIT_DEFERRABLE_WORK(&info->pwr_rdy_work, rt9455_pwr_rdy_work_callback);1656	INIT_DEFERRABLE_WORK(&info->max_charging_time_work,1657			     rt9455_max_charging_time_work_callback);1658	INIT_DEFERRABLE_WORK(&info->batt_presence_work,1659			     rt9455_batt_presence_work_callback);1660 1661	rt9455_charger_config.of_node		= dev->of_node;1662	rt9455_charger_config.drv_data		= info;1663	rt9455_charger_config.supplied_to	= rt9455_charger_supplied_to;1664	rt9455_charger_config.num_supplicants	=1665					ARRAY_SIZE(rt9455_charger_supplied_to);1666	ret = devm_request_threaded_irq(dev, client->irq, NULL,1667					rt9455_irq_handler_thread,1668					IRQF_TRIGGER_LOW | IRQF_ONESHOT,1669					RT9455_DRIVER_NAME, info);1670	if (ret) {1671		dev_err(dev, "Failed to register IRQ handler\n");1672		goto put_usb_notifier;1673	}1674 1675	ret = rt9455_hw_init(info, ichrg, ieoc_percentage, mivr, iaicr);1676	if (ret) {1677		dev_err(dev, "Failed to set charger to its default values\n");1678		goto put_usb_notifier;1679	}1680 1681	info->charger = devm_power_supply_register(dev, &rt9455_charger_desc,1682						   &rt9455_charger_config);1683	if (IS_ERR(info->charger)) {1684		dev_err(dev, "Failed to register charger\n");1685		ret = PTR_ERR(info->charger);1686		goto put_usb_notifier;1687	}1688 1689	return 0;1690 1691put_usb_notifier:1692#if IS_ENABLED(CONFIG_USB_PHY)1693	if (info->nb.notifier_call)  {1694		usb_unregister_notifier(info->usb_phy, &info->nb);1695		info->nb.notifier_call = NULL;1696	}1697#endif1698	return ret;1699}1700 1701static void rt9455_remove(struct i2c_client *client)1702{1703	int ret;1704	struct rt9455_info *info = i2c_get_clientdata(client);1705 1706	ret = rt9455_register_reset(info);1707	if (ret)1708		dev_err(&info->client->dev, "Failed to set charger to its default values\n");1709 1710#if IS_ENABLED(CONFIG_USB_PHY)1711	if (info->nb.notifier_call)1712		usb_unregister_notifier(info->usb_phy, &info->nb);1713#endif1714 1715	cancel_delayed_work_sync(&info->pwr_rdy_work);1716	cancel_delayed_work_sync(&info->max_charging_time_work);1717	cancel_delayed_work_sync(&info->batt_presence_work);1718}1719 1720static const struct i2c_device_id rt9455_i2c_id_table[] = {1721	{ RT9455_DRIVER_NAME },1722	{ }1723};1724MODULE_DEVICE_TABLE(i2c, rt9455_i2c_id_table);1725 1726static const struct of_device_id rt9455_of_match[] __maybe_unused = {1727	{ .compatible = "richtek,rt9455", },1728	{ },1729};1730MODULE_DEVICE_TABLE(of, rt9455_of_match);1731 1732#ifdef CONFIG_ACPI1733static const struct acpi_device_id rt9455_i2c_acpi_match[] = {1734	{ "RT945500", 0 },1735	{ }1736};1737MODULE_DEVICE_TABLE(acpi, rt9455_i2c_acpi_match);1738#endif1739 1740static struct i2c_driver rt9455_driver = {1741	.probe		= rt9455_probe,1742	.remove		= rt9455_remove,1743	.id_table	= rt9455_i2c_id_table,1744	.driver = {1745		.name		= RT9455_DRIVER_NAME,1746		.of_match_table	= of_match_ptr(rt9455_of_match),1747		.acpi_match_table = ACPI_PTR(rt9455_i2c_acpi_match),1748	},1749};1750module_i2c_driver(rt9455_driver);1751 1752MODULE_LICENSE("GPL");1753MODULE_AUTHOR("Anda-Maria Nicolae <anda-maria.nicolae@intel.com>");1754MODULE_DESCRIPTION("Richtek RT9455 Charger Driver");1755