1/*
2 * Summit Microelectronics SMB347 Battery Charger Driver
3 *
4 * Copyright (C) 2011, Intel Corporation
5 *
6 * Authors: Bruce E. Robertson <bruce.e.robertson@intel.com>
7 *          Mika Westerberg <mika.westerberg@linux.intel.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14#include <linux/err.h>
15#include <linux/gpio.h>
16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/init.h>
19#include <linux/interrupt.h>
20#include <linux/i2c.h>
21#include <linux/mutex.h>
22#include <linux/power_supply.h>
23#include <linux/power/smb347-charger.h>
24#include <linux/regmap.h>
25
26/*
27 * Configuration registers. These are mirrored to volatile RAM and can be
28 * written once %CMD_A_ALLOW_WRITE is set in %CMD_A register. They will be
29 * reloaded from non-volatile registers after POR.
30 */
31#define CFG_CHARGE_CURRENT			0x00
32#define CFG_CHARGE_CURRENT_FCC_MASK		0xe0
33#define CFG_CHARGE_CURRENT_FCC_SHIFT		5
34#define CFG_CHARGE_CURRENT_PCC_MASK		0x18
35#define CFG_CHARGE_CURRENT_PCC_SHIFT		3
36#define CFG_CHARGE_CURRENT_TC_MASK		0x07
37#define CFG_CURRENT_LIMIT			0x01
38#define CFG_CURRENT_LIMIT_DC_MASK		0xf0
39#define CFG_CURRENT_LIMIT_DC_SHIFT		4
40#define CFG_CURRENT_LIMIT_USB_MASK		0x0f
41#define CFG_FLOAT_VOLTAGE			0x03
42#define CFG_FLOAT_VOLTAGE_FLOAT_MASK		0x3f
43#define CFG_FLOAT_VOLTAGE_THRESHOLD_MASK	0xc0
44#define CFG_FLOAT_VOLTAGE_THRESHOLD_SHIFT	6
45#define CFG_STAT				0x05
46#define CFG_STAT_DISABLED			BIT(5)
47#define CFG_STAT_ACTIVE_HIGH			BIT(7)
48#define CFG_PIN					0x06
49#define CFG_PIN_EN_CTRL_MASK			0x60
50#define CFG_PIN_EN_CTRL_ACTIVE_HIGH		0x40
51#define CFG_PIN_EN_CTRL_ACTIVE_LOW		0x60
52#define CFG_PIN_EN_APSD_IRQ			BIT(1)
53#define CFG_PIN_EN_CHARGER_ERROR		BIT(2)
54#define CFG_THERM				0x07
55#define CFG_THERM_SOFT_HOT_COMPENSATION_MASK	0x03
56#define CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT	0
57#define CFG_THERM_SOFT_COLD_COMPENSATION_MASK	0x0c
58#define CFG_THERM_SOFT_COLD_COMPENSATION_SHIFT	2
59#define CFG_THERM_MONITOR_DISABLED		BIT(4)
60#define CFG_SYSOK				0x08
61#define CFG_SYSOK_SUSPEND_HARD_LIMIT_DISABLED	BIT(2)
62#define CFG_OTHER				0x09
63#define CFG_OTHER_RID_MASK			0xc0
64#define CFG_OTHER_RID_ENABLED_AUTO_OTG		0xc0
65#define CFG_OTG					0x0a
66#define CFG_OTG_TEMP_THRESHOLD_MASK		0x30
67#define CFG_OTG_TEMP_THRESHOLD_SHIFT		4
68#define CFG_OTG_CC_COMPENSATION_MASK		0xc0
69#define CFG_OTG_CC_COMPENSATION_SHIFT		6
70#define CFG_TEMP_LIMIT				0x0b
71#define CFG_TEMP_LIMIT_SOFT_HOT_MASK		0x03
72#define CFG_TEMP_LIMIT_SOFT_HOT_SHIFT		0
73#define CFG_TEMP_LIMIT_SOFT_COLD_MASK		0x0c
74#define CFG_TEMP_LIMIT_SOFT_COLD_SHIFT		2
75#define CFG_TEMP_LIMIT_HARD_HOT_MASK		0x30
76#define CFG_TEMP_LIMIT_HARD_HOT_SHIFT		4
77#define CFG_TEMP_LIMIT_HARD_COLD_MASK		0xc0
78#define CFG_TEMP_LIMIT_HARD_COLD_SHIFT		6
79#define CFG_FAULT_IRQ				0x0c
80#define CFG_FAULT_IRQ_DCIN_UV			BIT(2)
81#define CFG_STATUS_IRQ				0x0d
82#define CFG_STATUS_IRQ_TERMINATION_OR_TAPER	BIT(4)
83#define CFG_STATUS_IRQ_CHARGE_TIMEOUT		BIT(7)
84#define CFG_ADDRESS				0x0e
85
86/* Command registers */
87#define CMD_A					0x30
88#define CMD_A_CHG_ENABLED			BIT(1)
89#define CMD_A_SUSPEND_ENABLED			BIT(2)
90#define CMD_A_ALLOW_WRITE			BIT(7)
91#define CMD_B					0x31
92#define CMD_C					0x33
93
94/* Interrupt Status registers */
95#define IRQSTAT_A				0x35
96#define IRQSTAT_C				0x37
97#define IRQSTAT_C_TERMINATION_STAT		BIT(0)
98#define IRQSTAT_C_TERMINATION_IRQ		BIT(1)
99#define IRQSTAT_C_TAPER_IRQ			BIT(3)
100#define IRQSTAT_D				0x38
101#define IRQSTAT_D_CHARGE_TIMEOUT_STAT		BIT(2)
102#define IRQSTAT_D_CHARGE_TIMEOUT_IRQ		BIT(3)
103#define IRQSTAT_E				0x39
104#define IRQSTAT_E_USBIN_UV_STAT			BIT(0)
105#define IRQSTAT_E_USBIN_UV_IRQ			BIT(1)
106#define IRQSTAT_E_DCIN_UV_STAT			BIT(4)
107#define IRQSTAT_E_DCIN_UV_IRQ			BIT(5)
108#define IRQSTAT_F				0x3a
109
110/* Status registers */
111#define STAT_A					0x3b
112#define STAT_A_FLOAT_VOLTAGE_MASK		0x3f
113#define STAT_B					0x3c
114#define STAT_C					0x3d
115#define STAT_C_CHG_ENABLED			BIT(0)
116#define STAT_C_HOLDOFF_STAT			BIT(3)
117#define STAT_C_CHG_MASK				0x06
118#define STAT_C_CHG_SHIFT			1
119#define STAT_C_CHG_TERM				BIT(5)
120#define STAT_C_CHARGER_ERROR			BIT(6)
121#define STAT_E					0x3f
122
123#define SMB347_MAX_REGISTER			0x3f
124
125/**
126 * struct smb347_charger - smb347 charger instance
127 * @lock: protects concurrent access to online variables
128 * @dev: pointer to device
129 * @regmap: pointer to driver regmap
130 * @mains: power_supply instance for AC/DC power
131 * @usb: power_supply instance for USB power
132 * @battery: power_supply instance for battery
133 * @mains_online: is AC/DC input connected
134 * @usb_online: is USB input connected
135 * @charging_enabled: is charging enabled
136 * @pdata: pointer to platform data
137 */
138struct smb347_charger {
139	struct mutex		lock;
140	struct device		*dev;
141	struct regmap		*regmap;
142	struct power_supply	*mains;
143	struct power_supply	*usb;
144	struct power_supply	*battery;
145	bool			mains_online;
146	bool			usb_online;
147	bool			charging_enabled;
148	const struct smb347_charger_platform_data *pdata;
149};
150
151/* Fast charge current in uA */
152static const unsigned int fcc_tbl[] = {
153	700000,
154	900000,
155	1200000,
156	1500000,
157	1800000,
158	2000000,
159	2200000,
160	2500000,
161};
162
163/* Pre-charge current in uA */
164static const unsigned int pcc_tbl[] = {
165	100000,
166	150000,
167	200000,
168	250000,
169};
170
171/* Termination current in uA */
172static const unsigned int tc_tbl[] = {
173	37500,
174	50000,
175	100000,
176	150000,
177	200000,
178	250000,
179	500000,
180	600000,
181};
182
183/* Input current limit in uA */
184static const unsigned int icl_tbl[] = {
185	300000,
186	500000,
187	700000,
188	900000,
189	1200000,
190	1500000,
191	1800000,
192	2000000,
193	2200000,
194	2500000,
195};
196
197/* Charge current compensation in uA */
198static const unsigned int ccc_tbl[] = {
199	250000,
200	700000,
201	900000,
202	1200000,
203};
204
205/* Convert register value to current using lookup table */
206static int hw_to_current(const unsigned int *tbl, size_t size, unsigned int val)
207{
208	if (val >= size)
209		return -EINVAL;
210	return tbl[val];
211}
212
213/* Convert current to register value using lookup table */
214static int current_to_hw(const unsigned int *tbl, size_t size, unsigned int val)
215{
216	size_t i;
217
218	for (i = 0; i < size; i++)
219		if (val < tbl[i])
220			break;
221	return i > 0 ? i - 1 : -EINVAL;
222}
223
224/**
225 * smb347_update_ps_status - refreshes the power source status
226 * @smb: pointer to smb347 charger instance
227 *
228 * Function checks whether any power source is connected to the charger and
229 * updates internal state accordingly. If there is a change to previous state
230 * function returns %1, otherwise %0 and negative errno in case of errror.
231 */
232static int smb347_update_ps_status(struct smb347_charger *smb)
233{
234	bool usb = false;
235	bool dc = false;
236	unsigned int val;
237	int ret;
238
239	ret = regmap_read(smb->regmap, IRQSTAT_E, &val);
240	if (ret < 0)
241		return ret;
242
243	/*
244	 * Dc and usb are set depending on whether they are enabled in
245	 * platform data _and_ whether corresponding undervoltage is set.
246	 */
247	if (smb->pdata->use_mains)
248		dc = !(val & IRQSTAT_E_DCIN_UV_STAT);
249	if (smb->pdata->use_usb)
250		usb = !(val & IRQSTAT_E_USBIN_UV_STAT);
251
252	mutex_lock(&smb->lock);
253	ret = smb->mains_online != dc || smb->usb_online != usb;
254	smb->mains_online = dc;
255	smb->usb_online = usb;
256	mutex_unlock(&smb->lock);
257
258	return ret;
259}
260
261/*
262 * smb347_is_ps_online - returns whether input power source is connected
263 * @smb: pointer to smb347 charger instance
264 *
265 * Returns %true if input power source is connected. Note that this is
266 * dependent on what platform has configured for usable power sources. For
267 * example if USB is disabled, this will return %false even if the USB cable
268 * is connected.
269 */
270static bool smb347_is_ps_online(struct smb347_charger *smb)
271{
272	bool ret;
273
274	mutex_lock(&smb->lock);
275	ret = smb->usb_online || smb->mains_online;
276	mutex_unlock(&smb->lock);
277
278	return ret;
279}
280
281/**
282 * smb347_charging_status - returns status of charging
283 * @smb: pointer to smb347 charger instance
284 *
285 * Function returns charging status. %0 means no charging is in progress,
286 * %1 means pre-charging, %2 fast-charging and %3 taper-charging.
287 */
288static int smb347_charging_status(struct smb347_charger *smb)
289{
290	unsigned int val;
291	int ret;
292
293	if (!smb347_is_ps_online(smb))
294		return 0;
295
296	ret = regmap_read(smb->regmap, STAT_C, &val);
297	if (ret < 0)
298		return 0;
299
300	return (val & STAT_C_CHG_MASK) >> STAT_C_CHG_SHIFT;
301}
302
303static int smb347_charging_set(struct smb347_charger *smb, bool enable)
304{
305	int ret = 0;
306
307	if (smb->pdata->enable_control != SMB347_CHG_ENABLE_SW) {
308		dev_dbg(smb->dev, "charging enable/disable in SW disabled\n");
309		return 0;
310	}
311
312	mutex_lock(&smb->lock);
313	if (smb->charging_enabled != enable) {
314		ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED,
315					 enable ? CMD_A_CHG_ENABLED : 0);
316		if (!ret)
317			smb->charging_enabled = enable;
318	}
319	mutex_unlock(&smb->lock);
320	return ret;
321}
322
323static inline int smb347_charging_enable(struct smb347_charger *smb)
324{
325	return smb347_charging_set(smb, true);
326}
327
328static inline int smb347_charging_disable(struct smb347_charger *smb)
329{
330	return smb347_charging_set(smb, false);
331}
332
333static int smb347_start_stop_charging(struct smb347_charger *smb)
334{
335	int ret;
336
337	/*
338	 * Depending on whether valid power source is connected or not, we
339	 * disable or enable the charging. We do it manually because it
340	 * depends on how the platform has configured the valid inputs.
341	 */
342	if (smb347_is_ps_online(smb)) {
343		ret = smb347_charging_enable(smb);
344		if (ret < 0)
345			dev_err(smb->dev, "failed to enable charging\n");
346	} else {
347		ret = smb347_charging_disable(smb);
348		if (ret < 0)
349			dev_err(smb->dev, "failed to disable charging\n");
350	}
351
352	return ret;
353}
354
355static int smb347_set_charge_current(struct smb347_charger *smb)
356{
357	int ret;
358
359	if (smb->pdata->max_charge_current) {
360		ret = current_to_hw(fcc_tbl, ARRAY_SIZE(fcc_tbl),
361				    smb->pdata->max_charge_current);
362		if (ret < 0)
363			return ret;
364
365		ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
366					 CFG_CHARGE_CURRENT_FCC_MASK,
367					 ret << CFG_CHARGE_CURRENT_FCC_SHIFT);
368		if (ret < 0)
369			return ret;
370	}
371
372	if (smb->pdata->pre_charge_current) {
373		ret = current_to_hw(pcc_tbl, ARRAY_SIZE(pcc_tbl),
374				    smb->pdata->pre_charge_current);
375		if (ret < 0)
376			return ret;
377
378		ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
379					 CFG_CHARGE_CURRENT_PCC_MASK,
380					 ret << CFG_CHARGE_CURRENT_PCC_SHIFT);
381		if (ret < 0)
382			return ret;
383	}
384
385	if (smb->pdata->termination_current) {
386		ret = current_to_hw(tc_tbl, ARRAY_SIZE(tc_tbl),
387				    smb->pdata->termination_current);
388		if (ret < 0)
389			return ret;
390
391		ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
392					 CFG_CHARGE_CURRENT_TC_MASK, ret);
393		if (ret < 0)
394			return ret;
395	}
396
397	return 0;
398}
399
400static int smb347_set_current_limits(struct smb347_charger *smb)
401{
402	int ret;
403
404	if (smb->pdata->mains_current_limit) {
405		ret = current_to_hw(icl_tbl, ARRAY_SIZE(icl_tbl),
406				    smb->pdata->mains_current_limit);
407		if (ret < 0)
408			return ret;
409
410		ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT,
411					 CFG_CURRENT_LIMIT_DC_MASK,
412					 ret << CFG_CURRENT_LIMIT_DC_SHIFT);
413		if (ret < 0)
414			return ret;
415	}
416
417	if (smb->pdata->usb_hc_current_limit) {
418		ret = current_to_hw(icl_tbl, ARRAY_SIZE(icl_tbl),
419				    smb->pdata->usb_hc_current_limit);
420		if (ret < 0)
421			return ret;
422
423		ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT,
424					 CFG_CURRENT_LIMIT_USB_MASK, ret);
425		if (ret < 0)
426			return ret;
427	}
428
429	return 0;
430}
431
432static int smb347_set_voltage_limits(struct smb347_charger *smb)
433{
434	int ret;
435
436	if (smb->pdata->pre_to_fast_voltage) {
437		ret = smb->pdata->pre_to_fast_voltage;
438
439		/* uV */
440		ret = clamp_val(ret, 2400000, 3000000) - 2400000;
441		ret /= 200000;
442
443		ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE,
444				CFG_FLOAT_VOLTAGE_THRESHOLD_MASK,
445				ret << CFG_FLOAT_VOLTAGE_THRESHOLD_SHIFT);
446		if (ret < 0)
447			return ret;
448	}
449
450	if (smb->pdata->max_charge_voltage) {
451		ret = smb->pdata->max_charge_voltage;
452
453		/* uV */
454		ret = clamp_val(ret, 3500000, 4500000) - 3500000;
455		ret /= 20000;
456
457		ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE,
458					 CFG_FLOAT_VOLTAGE_FLOAT_MASK, ret);
459		if (ret < 0)
460			return ret;
461	}
462
463	return 0;
464}
465
466static int smb347_set_temp_limits(struct smb347_charger *smb)
467{
468	bool enable_therm_monitor = false;
469	int ret = 0;
470	int val;
471
472	if (smb->pdata->chip_temp_threshold) {
473		val = smb->pdata->chip_temp_threshold;
474
475		/* degree C */
476		val = clamp_val(val, 100, 130) - 100;
477		val /= 10;
478
479		ret = regmap_update_bits(smb->regmap, CFG_OTG,
480					 CFG_OTG_TEMP_THRESHOLD_MASK,
481					 val << CFG_OTG_TEMP_THRESHOLD_SHIFT);
482		if (ret < 0)
483			return ret;
484	}
485
486	if (smb->pdata->soft_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) {
487		val = smb->pdata->soft_cold_temp_limit;
488
489		val = clamp_val(val, 0, 15);
490		val /= 5;
491		/* this goes from higher to lower so invert the value */
492		val = ~val & 0x3;
493
494		ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
495					 CFG_TEMP_LIMIT_SOFT_COLD_MASK,
496					 val << CFG_TEMP_LIMIT_SOFT_COLD_SHIFT);
497		if (ret < 0)
498			return ret;
499
500		enable_therm_monitor = true;
501	}
502
503	if (smb->pdata->soft_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) {
504		val = smb->pdata->soft_hot_temp_limit;
505
506		val = clamp_val(val, 40, 55) - 40;
507		val /= 5;
508
509		ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
510					 CFG_TEMP_LIMIT_SOFT_HOT_MASK,
511					 val << CFG_TEMP_LIMIT_SOFT_HOT_SHIFT);
512		if (ret < 0)
513			return ret;
514
515		enable_therm_monitor = true;
516	}
517
518	if (smb->pdata->hard_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) {
519		val = smb->pdata->hard_cold_temp_limit;
520
521		val = clamp_val(val, -5, 10) + 5;
522		val /= 5;
523		/* this goes from higher to lower so invert the value */
524		val = ~val & 0x3;
525
526		ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
527					 CFG_TEMP_LIMIT_HARD_COLD_MASK,
528					 val << CFG_TEMP_LIMIT_HARD_COLD_SHIFT);
529		if (ret < 0)
530			return ret;
531
532		enable_therm_monitor = true;
533	}
534
535	if (smb->pdata->hard_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) {
536		val = smb->pdata->hard_hot_temp_limit;
537
538		val = clamp_val(val, 50, 65) - 50;
539		val /= 5;
540
541		ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
542					 CFG_TEMP_LIMIT_HARD_HOT_MASK,
543					 val << CFG_TEMP_LIMIT_HARD_HOT_SHIFT);
544		if (ret < 0)
545			return ret;
546
547		enable_therm_monitor = true;
548	}
549
550	/*
551	 * If any of the temperature limits are set, we also enable the
552	 * thermistor monitoring.
553	 *
554	 * When soft limits are hit, the device will start to compensate
555	 * current and/or voltage depending on the configuration.
556	 *
557	 * When hard limit is hit, the device will suspend charging
558	 * depending on the configuration.
559	 */
560	if (enable_therm_monitor) {
561		ret = regmap_update_bits(smb->regmap, CFG_THERM,
562					 CFG_THERM_MONITOR_DISABLED, 0);
563		if (ret < 0)
564			return ret;
565	}
566
567	if (smb->pdata->suspend_on_hard_temp_limit) {
568		ret = regmap_update_bits(smb->regmap, CFG_SYSOK,
569				 CFG_SYSOK_SUSPEND_HARD_LIMIT_DISABLED, 0);
570		if (ret < 0)
571			return ret;
572	}
573
574	if (smb->pdata->soft_temp_limit_compensation !=
575	    SMB347_SOFT_TEMP_COMPENSATE_DEFAULT) {
576		val = smb->pdata->soft_temp_limit_compensation & 0x3;
577
578		ret = regmap_update_bits(smb->regmap, CFG_THERM,
579				 CFG_THERM_SOFT_HOT_COMPENSATION_MASK,
580				 val << CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT);
581		if (ret < 0)
582			return ret;
583
584		ret = regmap_update_bits(smb->regmap, CFG_THERM,
585				 CFG_THERM_SOFT_COLD_COMPENSATION_MASK,
586				 val << CFG_THERM_SOFT_COLD_COMPENSATION_SHIFT);
587		if (ret < 0)
588			return ret;
589	}
590
591	if (smb->pdata->charge_current_compensation) {
592		val = current_to_hw(ccc_tbl, ARRAY_SIZE(ccc_tbl),
593				    smb->pdata->charge_current_compensation);
594		if (val < 0)
595			return val;
596
597		ret = regmap_update_bits(smb->regmap, CFG_OTG,
598				CFG_OTG_CC_COMPENSATION_MASK,
599				(val & 0x3) << CFG_OTG_CC_COMPENSATION_SHIFT);
600		if (ret < 0)
601			return ret;
602	}
603
604	return ret;
605}
606
607/*
608 * smb347_set_writable - enables/disables writing to non-volatile registers
609 * @smb: pointer to smb347 charger instance
610 *
611 * You can enable/disable writing to the non-volatile configuration
612 * registers by calling this function.
613 *
614 * Returns %0 on success and negative errno in case of failure.
615 */
616static int smb347_set_writable(struct smb347_charger *smb, bool writable)
617{
618	return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE,
619				  writable ? CMD_A_ALLOW_WRITE : 0);
620}
621
622static int smb347_hw_init(struct smb347_charger *smb)
623{
624	unsigned int val;
625	int ret;
626
627	ret = smb347_set_writable(smb, true);
628	if (ret < 0)
629		return ret;
630
631	/*
632	 * Program the platform specific configuration values to the device
633	 * first.
634	 */
635	ret = smb347_set_charge_current(smb);
636	if (ret < 0)
637		goto fail;
638
639	ret = smb347_set_current_limits(smb);
640	if (ret < 0)
641		goto fail;
642
643	ret = smb347_set_voltage_limits(smb);
644	if (ret < 0)
645		goto fail;
646
647	ret = smb347_set_temp_limits(smb);
648	if (ret < 0)
649		goto fail;
650
651	/* If USB charging is disabled we put the USB in suspend mode */
652	if (!smb->pdata->use_usb) {
653		ret = regmap_update_bits(smb->regmap, CMD_A,
654					 CMD_A_SUSPEND_ENABLED,
655					 CMD_A_SUSPEND_ENABLED);
656		if (ret < 0)
657			goto fail;
658	}
659
660	/*
661	 * If configured by platform data, we enable hardware Auto-OTG
662	 * support for driving VBUS. Otherwise we disable it.
663	 */
664	ret = regmap_update_bits(smb->regmap, CFG_OTHER, CFG_OTHER_RID_MASK,
665		smb->pdata->use_usb_otg ? CFG_OTHER_RID_ENABLED_AUTO_OTG : 0);
666	if (ret < 0)
667		goto fail;
668
669	/*
670	 * Make the charging functionality controllable by a write to the
671	 * command register unless pin control is specified in the platform
672	 * data.
673	 */
674	switch (smb->pdata->enable_control) {
675	case SMB347_CHG_ENABLE_PIN_ACTIVE_LOW:
676		val = CFG_PIN_EN_CTRL_ACTIVE_LOW;
677		break;
678	case SMB347_CHG_ENABLE_PIN_ACTIVE_HIGH:
679		val = CFG_PIN_EN_CTRL_ACTIVE_HIGH;
680		break;
681	default:
682		val = 0;
683		break;
684	}
685
686	ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL_MASK,
687				 val);
688	if (ret < 0)
689		goto fail;
690
691	/* Disable Automatic Power Source Detection (APSD) interrupt. */
692	ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_APSD_IRQ, 0);
693	if (ret < 0)
694		goto fail;
695
696	ret = smb347_update_ps_status(smb);
697	if (ret < 0)
698		goto fail;
699
700	ret = smb347_start_stop_charging(smb);
701
702fail:
703	smb347_set_writable(smb, false);
704	return ret;
705}
706
707static irqreturn_t smb347_interrupt(int irq, void *data)
708{
709	struct smb347_charger *smb = data;
710	unsigned int stat_c, irqstat_c, irqstat_d, irqstat_e;
711	bool handled = false;
712	int ret;
713
714	ret = regmap_read(smb->regmap, STAT_C, &stat_c);
715	if (ret < 0) {
716		dev_warn(smb->dev, "reading STAT_C failed\n");
717		return IRQ_NONE;
718	}
719
720	ret = regmap_read(smb->regmap, IRQSTAT_C, &irqstat_c);
721	if (ret < 0) {
722		dev_warn(smb->dev, "reading IRQSTAT_C failed\n");
723		return IRQ_NONE;
724	}
725
726	ret = regmap_read(smb->regmap, IRQSTAT_D, &irqstat_d);
727	if (ret < 0) {
728		dev_warn(smb->dev, "reading IRQSTAT_D failed\n");
729		return IRQ_NONE;
730	}
731
732	ret = regmap_read(smb->regmap, IRQSTAT_E, &irqstat_e);
733	if (ret < 0) {
734		dev_warn(smb->dev, "reading IRQSTAT_E failed\n");
735		return IRQ_NONE;
736	}
737
738	/*
739	 * If we get charger error we report the error back to user.
740	 * If the error is recovered charging will resume again.
741	 */
742	if (stat_c & STAT_C_CHARGER_ERROR) {
743		dev_err(smb->dev, "charging stopped due to charger error\n");
744		power_supply_changed(smb->battery);
745		handled = true;
746	}
747
748	/*
749	 * If we reached the termination current the battery is charged and
750	 * we can update the status now. Charging is automatically
751	 * disabled by the hardware.
752	 */
753	if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) {
754		if (irqstat_c & IRQSTAT_C_TERMINATION_STAT)
755			power_supply_changed(smb->battery);
756		dev_dbg(smb->dev, "going to HW maintenance mode\n");
757		handled = true;
758	}
759
760	/*
761	 * If we got a charger timeout INT that means the charge
762	 * full is not detected with in charge timeout value.
763	 */
764	if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_IRQ) {
765		dev_dbg(smb->dev, "total Charge Timeout INT received\n");
766
767		if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_STAT)
768			dev_warn(smb->dev, "charging stopped due to timeout\n");
769		power_supply_changed(smb->battery);
770		handled = true;
771	}
772
773	/*
774	 * If we got an under voltage interrupt it means that AC/USB input
775	 * was connected or disconnected.
776	 */
777	if (irqstat_e & (IRQSTAT_E_USBIN_UV_IRQ | IRQSTAT_E_DCIN_UV_IRQ)) {
778		if (smb347_update_ps_status(smb) > 0) {
779			smb347_start_stop_charging(smb);
780			if (smb->pdata->use_mains)
781				power_supply_changed(smb->mains);
782			if (smb->pdata->use_usb)
783				power_supply_changed(smb->usb);
784		}
785		handled = true;
786	}
787
788	return handled ? IRQ_HANDLED : IRQ_NONE;
789}
790
791static int smb347_irq_set(struct smb347_charger *smb, bool enable)
792{
793	int ret;
794
795	ret = smb347_set_writable(smb, true);
796	if (ret < 0)
797		return ret;
798
799	/*
800	 * Enable/disable interrupts for:
801	 *	- under voltage
802	 *	- termination current reached
803	 *	- charger timeout
804	 *	- charger error
805	 */
806	ret = regmap_update_bits(smb->regmap, CFG_FAULT_IRQ, 0xff,
807				 enable ? CFG_FAULT_IRQ_DCIN_UV : 0);
808	if (ret < 0)
809		goto fail;
810
811	ret = regmap_update_bits(smb->regmap, CFG_STATUS_IRQ, 0xff,
812			enable ? (CFG_STATUS_IRQ_TERMINATION_OR_TAPER |
813					CFG_STATUS_IRQ_CHARGE_TIMEOUT) : 0);
814	if (ret < 0)
815		goto fail;
816
817	ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR,
818				 enable ? CFG_PIN_EN_CHARGER_ERROR : 0);
819fail:
820	smb347_set_writable(smb, false);
821	return ret;
822}
823
824static inline int smb347_irq_enable(struct smb347_charger *smb)
825{
826	return smb347_irq_set(smb, true);
827}
828
829static inline int smb347_irq_disable(struct smb347_charger *smb)
830{
831	return smb347_irq_set(smb, false);
832}
833
834static int smb347_irq_init(struct smb347_charger *smb,
835			   struct i2c_client *client)
836{
837	const struct smb347_charger_platform_data *pdata = smb->pdata;
838	int ret, irq = gpio_to_irq(pdata->irq_gpio);
839
840	ret = gpio_request_one(pdata->irq_gpio, GPIOF_IN, client->name);
841	if (ret < 0)
842		goto fail;
843
844	ret = request_threaded_irq(irq, NULL, smb347_interrupt,
845				   IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
846				   client->name, smb);
847	if (ret < 0)
848		goto fail_gpio;
849
850	ret = smb347_set_writable(smb, true);
851	if (ret < 0)
852		goto fail_irq;
853
854	/*
855	 * Configure the STAT output to be suitable for interrupts: disable
856	 * all other output (except interrupts) and make it active low.
857	 */
858	ret = regmap_update_bits(smb->regmap, CFG_STAT,
859				 CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED,
860				 CFG_STAT_DISABLED);
861	if (ret < 0)
862		goto fail_readonly;
863
864	smb347_set_writable(smb, false);
865	client->irq = irq;
866	return 0;
867
868fail_readonly:
869	smb347_set_writable(smb, false);
870fail_irq:
871	free_irq(irq, smb);
872fail_gpio:
873	gpio_free(pdata->irq_gpio);
874fail:
875	client->irq = 0;
876	return ret;
877}
878
879/*
880 * Returns the constant charge current programmed
881 * into the charger in uA.
882 */
883static int get_const_charge_current(struct smb347_charger *smb)
884{
885	int ret, intval;
886	unsigned int v;
887
888	if (!smb347_is_ps_online(smb))
889		return -ENODATA;
890
891	ret = regmap_read(smb->regmap, STAT_B, &v);
892	if (ret < 0)
893		return ret;
894
895	/*
896	 * The current value is composition of FCC and PCC values
897	 * and we can detect which table to use from bit 5.
898	 */
899	if (v & 0x20) {
900		intval = hw_to_current(fcc_tbl, ARRAY_SIZE(fcc_tbl), v & 7);
901	} else {
902		v >>= 3;
903		intval = hw_to_current(pcc_tbl, ARRAY_SIZE(pcc_tbl), v & 7);
904	}
905
906	return intval;
907}
908
909/*
910 * Returns the constant charge voltage programmed
911 * into the charger in uV.
912 */
913static int get_const_charge_voltage(struct smb347_charger *smb)
914{
915	int ret, intval;
916	unsigned int v;
917
918	if (!smb347_is_ps_online(smb))
919		return -ENODATA;
920
921	ret = regmap_read(smb->regmap, STAT_A, &v);
922	if (ret < 0)
923		return ret;
924
925	v &= STAT_A_FLOAT_VOLTAGE_MASK;
926	if (v > 0x3d)
927		v = 0x3d;
928
929	intval = 3500000 + v * 20000;
930
931	return intval;
932}
933
934static int smb347_mains_get_property(struct power_supply *psy,
935				     enum power_supply_property prop,
936				     union power_supply_propval *val)
937{
938	struct smb347_charger *smb = power_supply_get_drvdata(psy);
939	int ret;
940
941	switch (prop) {
942	case POWER_SUPPLY_PROP_ONLINE:
943		val->intval = smb->mains_online;
944		break;
945
946	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
947		ret = get_const_charge_voltage(smb);
948		if (ret < 0)
949			return ret;
950		else
951			val->intval = ret;
952		break;
953
954	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
955		ret = get_const_charge_current(smb);
956		if (ret < 0)
957			return ret;
958		else
959			val->intval = ret;
960		break;
961
962	default:
963		return -EINVAL;
964	}
965
966	return 0;
967}
968
969static enum power_supply_property smb347_mains_properties[] = {
970	POWER_SUPPLY_PROP_ONLINE,
971	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
972	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
973};
974
975static int smb347_usb_get_property(struct power_supply *psy,
976				   enum power_supply_property prop,
977				   union power_supply_propval *val)
978{
979	struct smb347_charger *smb = power_supply_get_drvdata(psy);
980	int ret;
981
982	switch (prop) {
983	case POWER_SUPPLY_PROP_ONLINE:
984		val->intval = smb->usb_online;
985		break;
986
987	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
988		ret = get_const_charge_voltage(smb);
989		if (ret < 0)
990			return ret;
991		else
992			val->intval = ret;
993		break;
994
995	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
996		ret = get_const_charge_current(smb);
997		if (ret < 0)
998			return ret;
999		else
1000			val->intval = ret;
1001		break;
1002
1003	default:
1004		return -EINVAL;
1005	}
1006
1007	return 0;
1008}
1009
1010static enum power_supply_property smb347_usb_properties[] = {
1011	POWER_SUPPLY_PROP_ONLINE,
1012	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1013	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1014};
1015
1016static int smb347_get_charging_status(struct smb347_charger *smb)
1017{
1018	int ret, status;
1019	unsigned int val;
1020
1021	if (!smb347_is_ps_online(smb))
1022		return POWER_SUPPLY_STATUS_DISCHARGING;
1023
1024	ret = regmap_read(smb->regmap, STAT_C, &val);
1025	if (ret < 0)
1026		return ret;
1027
1028	if ((val & STAT_C_CHARGER_ERROR) ||
1029			(val & STAT_C_HOLDOFF_STAT)) {
1030		/*
1031		 * set to NOT CHARGING upon charger error
1032		 * or charging has stopped.
1033		 */
1034		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1035	} else {
1036		if ((val & STAT_C_CHG_MASK) >> STAT_C_CHG_SHIFT) {
1037			/*
1038			 * set to charging if battery is in pre-charge,
1039			 * fast charge or taper charging mode.
1040			 */
1041			status = POWER_SUPPLY_STATUS_CHARGING;
1042		} else if (val & STAT_C_CHG_TERM) {
1043			/*
1044			 * set the status to FULL if battery is not in pre
1045			 * charge, fast charge or taper charging mode AND
1046			 * charging is terminated at least once.
1047			 */
1048			status = POWER_SUPPLY_STATUS_FULL;
1049		} else {
1050			/*
1051			 * in this case no charger error or termination
1052			 * occured but charging is not in progress!!!
1053			 */
1054			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1055		}
1056	}
1057
1058	return status;
1059}
1060
1061static int smb347_battery_get_property(struct power_supply *psy,
1062				       enum power_supply_property prop,
1063				       union power_supply_propval *val)
1064{
1065	struct smb347_charger *smb = power_supply_get_drvdata(psy);
1066	const struct smb347_charger_platform_data *pdata = smb->pdata;
1067	int ret;
1068
1069	ret = smb347_update_ps_status(smb);
1070	if (ret < 0)
1071		return ret;
1072
1073	switch (prop) {
1074	case POWER_SUPPLY_PROP_STATUS:
1075		ret = smb347_get_charging_status(smb);
1076		if (ret < 0)
1077			return ret;
1078		val->intval = ret;
1079		break;
1080
1081	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1082		if (!smb347_is_ps_online(smb))
1083			return -ENODATA;
1084
1085		/*
1086		 * We handle trickle and pre-charging the same, and taper
1087		 * and none the same.
1088		 */
1089		switch (smb347_charging_status(smb)) {
1090		case 1:
1091			val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1092			break;
1093		case 2:
1094			val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
1095			break;
1096		default:
1097			val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
1098			break;
1099		}
1100		break;
1101
1102	case POWER_SUPPLY_PROP_TECHNOLOGY:
1103		val->intval = pdata->battery_info.technology;
1104		break;
1105
1106	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1107		val->intval = pdata->battery_info.voltage_min_design;
1108		break;
1109
1110	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1111		val->intval = pdata->battery_info.voltage_max_design;
1112		break;
1113
1114	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1115		val->intval = pdata->battery_info.charge_full_design;
1116		break;
1117
1118	case POWER_SUPPLY_PROP_MODEL_NAME:
1119		val->strval = pdata->battery_info.name;
1120		break;
1121
1122	default:
1123		return -EINVAL;
1124	}
1125
1126	return 0;
1127}
1128
1129static enum power_supply_property smb347_battery_properties[] = {
1130	POWER_SUPPLY_PROP_STATUS,
1131	POWER_SUPPLY_PROP_CHARGE_TYPE,
1132	POWER_SUPPLY_PROP_TECHNOLOGY,
1133	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1134	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1135	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
1136	POWER_SUPPLY_PROP_MODEL_NAME,
1137};
1138
1139static bool smb347_volatile_reg(struct device *dev, unsigned int reg)
1140{
1141	switch (reg) {
1142	case IRQSTAT_A:
1143	case IRQSTAT_C:
1144	case IRQSTAT_E:
1145	case IRQSTAT_F:
1146	case STAT_A:
1147	case STAT_B:
1148	case STAT_C:
1149	case STAT_E:
1150		return true;
1151	}
1152
1153	return false;
1154}
1155
1156static bool smb347_readable_reg(struct device *dev, unsigned int reg)
1157{
1158	switch (reg) {
1159	case CFG_CHARGE_CURRENT:
1160	case CFG_CURRENT_LIMIT:
1161	case CFG_FLOAT_VOLTAGE:
1162	case CFG_STAT:
1163	case CFG_PIN:
1164	case CFG_THERM:
1165	case CFG_SYSOK:
1166	case CFG_OTHER:
1167	case CFG_OTG:
1168	case CFG_TEMP_LIMIT:
1169	case CFG_FAULT_IRQ:
1170	case CFG_STATUS_IRQ:
1171	case CFG_ADDRESS:
1172	case CMD_A:
1173	case CMD_B:
1174	case CMD_C:
1175		return true;
1176	}
1177
1178	return smb347_volatile_reg(dev, reg);
1179}
1180
1181static const struct regmap_config smb347_regmap = {
1182	.reg_bits	= 8,
1183	.val_bits	= 8,
1184	.max_register	= SMB347_MAX_REGISTER,
1185	.volatile_reg	= smb347_volatile_reg,
1186	.readable_reg	= smb347_readable_reg,
1187};
1188
1189static const struct power_supply_desc smb347_mains_desc = {
1190	.name		= "smb347-mains",
1191	.type		= POWER_SUPPLY_TYPE_MAINS,
1192	.get_property	= smb347_mains_get_property,
1193	.properties	= smb347_mains_properties,
1194	.num_properties	= ARRAY_SIZE(smb347_mains_properties),
1195};
1196
1197static const struct power_supply_desc smb347_usb_desc = {
1198	.name		= "smb347-usb",
1199	.type		= POWER_SUPPLY_TYPE_USB,
1200	.get_property	= smb347_usb_get_property,
1201	.properties	= smb347_usb_properties,
1202	.num_properties	= ARRAY_SIZE(smb347_usb_properties),
1203};
1204
1205static const struct power_supply_desc smb347_battery_desc = {
1206	.name		= "smb347-battery",
1207	.type		= POWER_SUPPLY_TYPE_BATTERY,
1208	.get_property	= smb347_battery_get_property,
1209	.properties	= smb347_battery_properties,
1210	.num_properties	= ARRAY_SIZE(smb347_battery_properties),
1211};
1212
1213static int smb347_probe(struct i2c_client *client,
1214			const struct i2c_device_id *id)
1215{
1216	static char *battery[] = { "smb347-battery" };
1217	const struct smb347_charger_platform_data *pdata;
1218	struct power_supply_config mains_usb_cfg = {}, battery_cfg = {};
1219	struct device *dev = &client->dev;
1220	struct smb347_charger *smb;
1221	int ret;
1222
1223	pdata = dev->platform_data;
1224	if (!pdata)
1225		return -EINVAL;
1226
1227	if (!pdata->use_mains && !pdata->use_usb)
1228		return -EINVAL;
1229
1230	smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL);
1231	if (!smb)
1232		return -ENOMEM;
1233
1234	i2c_set_clientdata(client, smb);
1235
1236	mutex_init(&smb->lock);
1237	smb->dev = &client->dev;
1238	smb->pdata = pdata;
1239
1240	smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap);
1241	if (IS_ERR(smb->regmap))
1242		return PTR_ERR(smb->regmap);
1243
1244	ret = smb347_hw_init(smb);
1245	if (ret < 0)
1246		return ret;
1247
1248	mains_usb_cfg.supplied_to = battery;
1249	mains_usb_cfg.num_supplicants = ARRAY_SIZE(battery);
1250	mains_usb_cfg.drv_data = smb;
1251	if (smb->pdata->use_mains) {
1252		smb->mains = power_supply_register(dev, &smb347_mains_desc,
1253						   &mains_usb_cfg);
1254		if (IS_ERR(smb->mains))
1255			return PTR_ERR(smb->mains);
1256	}
1257
1258	if (smb->pdata->use_usb) {
1259		smb->usb = power_supply_register(dev, &smb347_usb_desc,
1260						 &mains_usb_cfg);
1261		if (IS_ERR(smb->usb)) {
1262			if (smb->pdata->use_mains)
1263				power_supply_unregister(smb->mains);
1264			return PTR_ERR(smb->usb);
1265		}
1266	}
1267
1268	battery_cfg.drv_data = smb;
1269	smb->battery = power_supply_register(dev, &smb347_battery_desc,
1270					     &battery_cfg);
1271	if (IS_ERR(smb->battery)) {
1272		if (smb->pdata->use_usb)
1273			power_supply_unregister(smb->usb);
1274		if (smb->pdata->use_mains)
1275			power_supply_unregister(smb->mains);
1276		return PTR_ERR(smb->battery);
1277	}
1278
1279	/*
1280	 * Interrupt pin is optional. If it is connected, we setup the
1281	 * interrupt support here.
1282	 */
1283	if (pdata->irq_gpio >= 0) {
1284		ret = smb347_irq_init(smb, client);
1285		if (ret < 0) {
1286			dev_warn(dev, "failed to initialize IRQ: %d\n", ret);
1287			dev_warn(dev, "disabling IRQ support\n");
1288		} else {
1289			smb347_irq_enable(smb);
1290		}
1291	}
1292
1293	return 0;
1294}
1295
1296static int smb347_remove(struct i2c_client *client)
1297{
1298	struct smb347_charger *smb = i2c_get_clientdata(client);
1299
1300	if (client->irq) {
1301		smb347_irq_disable(smb);
1302		free_irq(client->irq, smb);
1303		gpio_free(smb->pdata->irq_gpio);
1304	}
1305
1306	power_supply_unregister(smb->battery);
1307	if (smb->pdata->use_usb)
1308		power_supply_unregister(smb->usb);
1309	if (smb->pdata->use_mains)
1310		power_supply_unregister(smb->mains);
1311	return 0;
1312}
1313
1314static const struct i2c_device_id smb347_id[] = {
1315	{ "smb347", 0 },
1316	{ }
1317};
1318MODULE_DEVICE_TABLE(i2c, smb347_id);
1319
1320static struct i2c_driver smb347_driver = {
1321	.driver = {
1322		.name = "smb347",
1323	},
1324	.probe        = smb347_probe,
1325	.remove       = smb347_remove,
1326	.id_table     = smb347_id,
1327};
1328
1329module_i2c_driver(smb347_driver);
1330
1331MODULE_AUTHOR("Bruce E. Robertson <bruce.e.robertson@intel.com>");
1332MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
1333MODULE_DESCRIPTION("SMB347 battery charger driver");
1334MODULE_LICENSE("GPL");
1335MODULE_ALIAS("i2c:smb347");
1336