1/*
2 * max14577_charger.c - Battery charger driver for the Maxim 14577/77836
3 *
4 * Copyright (C) 2013,2014 Samsung Electronics
5 * Krzysztof Kozlowski <k.kozlowski@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 */
17
18#include <linux/module.h>
19#include <linux/platform_device.h>
20#include <linux/power_supply.h>
21#include <linux/mfd/max14577-private.h>
22#include <linux/mfd/max14577.h>
23
24struct max14577_charger {
25	struct device		*dev;
26	struct max14577		*max14577;
27	struct power_supply	*charger;
28
29	struct max14577_charger_platform_data	*pdata;
30};
31
32/*
33 * Helper function for mapping values of STATUS2/CHGTYP register on max14577
34 * and max77836 chipsets to enum maxim_muic_charger_type.
35 */
36static enum max14577_muic_charger_type maxim_get_charger_type(
37		enum maxim_device_type dev_type, u8 val) {
38	switch (val) {
39	case MAX14577_CHARGER_TYPE_NONE:
40	case MAX14577_CHARGER_TYPE_USB:
41	case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
42	case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
43	case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
44	case MAX14577_CHARGER_TYPE_SPECIAL_1A:
45		return val;
46	case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
47	case MAX14577_CHARGER_TYPE_RESERVED:
48		if (dev_type == MAXIM_DEVICE_TYPE_MAX77836)
49			val |= 0x8;
50		return val;
51	default:
52		WARN_ONCE(1, "max14577: Unsupported chgtyp register value 0x%02x", val);
53		return val;
54	}
55}
56
57static int max14577_get_charger_state(struct max14577_charger *chg, int *val)
58{
59	struct regmap *rmap = chg->max14577->regmap;
60	int ret;
61	u8 reg_data;
62
63	/*
64	 * Charging occurs only if:
65	 *  - CHGCTRL2/MBCHOSTEN == 1
66	 *  - STATUS2/CGMBC == 1
67	 *
68	 * TODO:
69	 *  - handle FULL after Top-off timer (EOC register may be off
70	 *    and the charger won't be charging although MBCHOSTEN is on)
71	 *  - handle properly dead-battery charging (respect timer)
72	 *  - handle timers (fast-charge and prequal) /MBCCHGERR/
73	 */
74	ret = max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL2, &reg_data);
75	if (ret < 0)
76		goto out;
77
78	if ((reg_data & CHGCTRL2_MBCHOSTEN_MASK) == 0) {
79		*val = POWER_SUPPLY_STATUS_DISCHARGING;
80		goto out;
81	}
82
83	ret = max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, &reg_data);
84	if (ret < 0)
85		goto out;
86
87	if (reg_data & STATUS3_CGMBC_MASK) {
88		/* Charger or USB-cable is connected */
89		if (reg_data & STATUS3_EOC_MASK)
90			*val = POWER_SUPPLY_STATUS_FULL;
91		else
92			*val = POWER_SUPPLY_STATUS_CHARGING;
93		goto out;
94	}
95
96	*val = POWER_SUPPLY_STATUS_DISCHARGING;
97
98out:
99	return ret;
100}
101
102/*
103 * Supported charge types:
104 *  - POWER_SUPPLY_CHARGE_TYPE_NONE
105 *  - POWER_SUPPLY_CHARGE_TYPE_FAST
106 */
107static int max14577_get_charge_type(struct max14577_charger *chg, int *val)
108{
109	int ret, charging;
110
111	/*
112	 * TODO: CHARGE_TYPE_TRICKLE (VCHGR_RC or EOC)?
113	 * As spec says:
114	 * [after reaching EOC interrupt]
115	 * "When the battery is fully charged, the 30-minute (typ)
116	 *  top-off timer starts. The device continues to trickle
117	 *  charge the battery until the top-off timer runs out."
118	 */
119	ret = max14577_get_charger_state(chg, &charging);
120	if (ret < 0)
121		return ret;
122
123	if (charging == POWER_SUPPLY_STATUS_CHARGING)
124		*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
125	else
126		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
127
128	return 0;
129}
130
131static int max14577_get_online(struct max14577_charger *chg, int *val)
132{
133	struct regmap *rmap = chg->max14577->regmap;
134	u8 reg_data;
135	int ret;
136	enum max14577_muic_charger_type chg_type;
137
138	ret = max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data);
139	if (ret < 0)
140		return ret;
141
142	reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
143	chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
144	switch (chg_type) {
145	case MAX14577_CHARGER_TYPE_USB:
146	case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
147	case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
148	case MAX14577_CHARGER_TYPE_SPECIAL_1A:
149	case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
150	case MAX77836_CHARGER_TYPE_SPECIAL_BIAS:
151		*val = 1;
152		break;
153	case MAX14577_CHARGER_TYPE_NONE:
154	case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
155	case MAX14577_CHARGER_TYPE_RESERVED:
156	case MAX77836_CHARGER_TYPE_RESERVED:
157	default:
158		*val = 0;
159	}
160
161	return 0;
162}
163
164/*
165 * Supported health statuses:
166 *  - POWER_SUPPLY_HEALTH_DEAD
167 *  - POWER_SUPPLY_HEALTH_OVERVOLTAGE
168 *  - POWER_SUPPLY_HEALTH_GOOD
169 */
170static int max14577_get_battery_health(struct max14577_charger *chg, int *val)
171{
172	struct regmap *rmap = chg->max14577->regmap;
173	int ret;
174	u8 reg_data;
175	enum max14577_muic_charger_type chg_type;
176
177	ret = max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data);
178	if (ret < 0)
179		goto out;
180
181	reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
182	chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
183	if (chg_type == MAX14577_CHARGER_TYPE_DEAD_BATTERY) {
184		*val = POWER_SUPPLY_HEALTH_DEAD;
185		goto out;
186	}
187
188	ret = max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, &reg_data);
189	if (ret < 0)
190		goto out;
191
192	if (reg_data & STATUS3_OVP_MASK) {
193		*val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
194		goto out;
195	}
196
197	/* Not dead, not overvoltage */
198	*val = POWER_SUPPLY_HEALTH_GOOD;
199
200out:
201	return ret;
202}
203
204/*
205 * Always returns 1.
206 * The max14577 chip doesn't report any status of battery presence.
207 * Lets assume that it will always be used with some battery.
208 */
209static int max14577_get_present(struct max14577_charger *chg, int *val)
210{
211	*val = 1;
212
213	return 0;
214}
215
216static int max14577_set_fast_charge_timer(struct max14577_charger *chg,
217		unsigned long hours)
218{
219	u8 reg_data;
220
221	switch (hours) {
222	case 5 ... 7:
223		reg_data = hours - 3;
224		break;
225	case 0:
226		/* Disable */
227		reg_data = 0x7;
228		break;
229	default:
230		dev_err(chg->dev, "Wrong value for Fast-Charge Timer: %lu\n",
231				hours);
232		return -EINVAL;
233	}
234	reg_data <<= CHGCTRL1_TCHW_SHIFT;
235
236	return max14577_update_reg(chg->max14577->regmap,
237			MAX14577_REG_CHGCTRL1, CHGCTRL1_TCHW_MASK, reg_data);
238}
239
240static int max14577_init_constant_voltage(struct max14577_charger *chg,
241		unsigned int uvolt)
242{
243	u8 reg_data;
244
245	if (uvolt < MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN ||
246			uvolt > MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
247		return -EINVAL;
248
249	if (uvolt == 4200000)
250		reg_data = 0x0;
251	else if (uvolt == MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
252		reg_data = 0x1f;
253	else if (uvolt <= 4280000) {
254		unsigned int val = uvolt;
255
256		val -= MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN;
257		val /= MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP;
258		if (uvolt <= 4180000)
259			reg_data = 0x1 + val;
260		else
261			reg_data = val; /* Fix for gap between 4.18V and 4.22V */
262	} else
263		return -EINVAL;
264
265	reg_data <<= CHGCTRL3_MBCCVWRC_SHIFT;
266
267	return max14577_write_reg(chg->max14577->regmap,
268			MAX14577_CHG_REG_CHG_CTRL3, reg_data);
269}
270
271static int max14577_init_eoc(struct max14577_charger *chg,
272		unsigned int uamp)
273{
274	unsigned int current_bits = 0xf;
275	u8 reg_data;
276
277	switch (chg->max14577->dev_type) {
278	case MAXIM_DEVICE_TYPE_MAX77836:
279		if (uamp < 5000)
280			return -EINVAL; /* Requested current is too low */
281
282		if (uamp >= 7500 && uamp < 10000)
283			current_bits = 0x0;
284		else if (uamp <= 50000) {
285			/* <5000, 7499> and <10000, 50000> */
286			current_bits = uamp / 5000;
287		} else {
288			uamp = min(uamp, 100000U) - 50000U;
289			current_bits = 0xa + uamp / 10000;
290		}
291		break;
292
293	case MAXIM_DEVICE_TYPE_MAX14577:
294	default:
295		if (uamp < MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN)
296			return -EINVAL; /* Requested current is too low */
297
298		uamp = min(uamp, MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
299		uamp -= MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN;
300		current_bits = uamp / MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP;
301		break;
302	}
303
304	reg_data = current_bits << CHGCTRL5_EOCS_SHIFT;
305
306	return max14577_update_reg(chg->max14577->regmap,
307			MAX14577_CHG_REG_CHG_CTRL5, CHGCTRL5_EOCS_MASK,
308			reg_data);
309}
310
311static int max14577_init_fast_charge(struct max14577_charger *chg,
312		unsigned int uamp)
313{
314	u8 reg_data;
315	int ret;
316	const struct maxim_charger_current *limits =
317		&maxim_charger_currents[chg->max14577->dev_type];
318
319	ret = maxim_charger_calc_reg_current(limits, uamp, uamp, &reg_data);
320	if (ret) {
321		dev_err(chg->dev, "Wrong value for fast charge: %u\n", uamp);
322		return ret;
323	}
324
325	return max14577_update_reg(chg->max14577->regmap,
326			MAX14577_CHG_REG_CHG_CTRL4,
327			CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK,
328			reg_data);
329}
330
331/*
332 * Sets charger registers to proper and safe default values.
333 * Some of these values are equal to defaults in MAX14577E
334 * data sheet but there are minor differences.
335 */
336static int max14577_charger_reg_init(struct max14577_charger *chg)
337{
338	struct regmap *rmap = chg->max14577->regmap;
339	u8 reg_data;
340	int ret;
341
342	/*
343	 * Charger-Type Manual Detection, default off (set CHGTYPMAN to 0)
344	 * Charger-Detection Enable, default on (set CHGDETEN to 1)
345	 * Combined mask of CHGDETEN and CHGTYPMAN will zero the CHGTYPMAN bit
346	 */
347	reg_data = 0x1 << CDETCTRL1_CHGDETEN_SHIFT;
348	max14577_update_reg(rmap, MAX14577_REG_CDETCTRL1,
349			CDETCTRL1_CHGDETEN_MASK | CDETCTRL1_CHGTYPMAN_MASK,
350			reg_data);
351
352	/*
353	 * Wall-Adapter Rapid Charge, default on
354	 * Battery-Charger, default on
355	 */
356	reg_data = 0x1 << CHGCTRL2_VCHGR_RC_SHIFT;
357	reg_data |= 0x1 << CHGCTRL2_MBCHOSTEN_SHIFT;
358	max14577_write_reg(rmap, MAX14577_REG_CHGCTRL2, reg_data);
359
360	/* Auto Charging Stop, default off */
361	reg_data = 0x0 << CHGCTRL6_AUTOSTOP_SHIFT;
362	max14577_write_reg(rmap, MAX14577_REG_CHGCTRL6, reg_data);
363
364	ret = max14577_init_constant_voltage(chg, chg->pdata->constant_uvolt);
365	if (ret)
366		return ret;
367
368	ret = max14577_init_eoc(chg, chg->pdata->eoc_uamp);
369	if (ret)
370		return ret;
371
372	ret = max14577_init_fast_charge(chg, chg->pdata->fast_charge_uamp);
373	if (ret)
374		return ret;
375
376	ret = max14577_set_fast_charge_timer(chg,
377			MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT);
378	if (ret)
379		return ret;
380
381	/* Initialize Overvoltage-Protection Threshold */
382	switch (chg->pdata->ovp_uvolt) {
383	case 7500000:
384		reg_data = 0x0;
385		break;
386	case 6000000:
387	case 6500000:
388	case 7000000:
389		reg_data = 0x1 + (chg->pdata->ovp_uvolt - 6000000) / 500000;
390		break;
391	default:
392		dev_err(chg->dev, "Wrong value for OVP: %u\n",
393				chg->pdata->ovp_uvolt);
394		return -EINVAL;
395	}
396	reg_data <<= CHGCTRL7_OTPCGHCVS_SHIFT;
397	max14577_write_reg(rmap, MAX14577_REG_CHGCTRL7, reg_data);
398
399	return 0;
400}
401
402/* Support property from charger */
403static enum power_supply_property max14577_charger_props[] = {
404	POWER_SUPPLY_PROP_STATUS,
405	POWER_SUPPLY_PROP_CHARGE_TYPE,
406	POWER_SUPPLY_PROP_HEALTH,
407	POWER_SUPPLY_PROP_PRESENT,
408	POWER_SUPPLY_PROP_ONLINE,
409	POWER_SUPPLY_PROP_MODEL_NAME,
410	POWER_SUPPLY_PROP_MANUFACTURER,
411};
412
413static const char * const model_names[] = {
414	[MAXIM_DEVICE_TYPE_UNKNOWN]	= "MAX14577-like",
415	[MAXIM_DEVICE_TYPE_MAX14577]	= "MAX14577",
416	[MAXIM_DEVICE_TYPE_MAX77836]	= "MAX77836",
417};
418static const char *manufacturer = "Maxim Integrated";
419
420static int max14577_charger_get_property(struct power_supply *psy,
421			    enum power_supply_property psp,
422			    union power_supply_propval *val)
423{
424	struct max14577_charger *chg = power_supply_get_drvdata(psy);
425	int ret = 0;
426
427	switch (psp) {
428	case POWER_SUPPLY_PROP_STATUS:
429		ret = max14577_get_charger_state(chg, &val->intval);
430		break;
431	case POWER_SUPPLY_PROP_CHARGE_TYPE:
432		ret = max14577_get_charge_type(chg, &val->intval);
433		break;
434	case POWER_SUPPLY_PROP_HEALTH:
435		ret = max14577_get_battery_health(chg, &val->intval);
436		break;
437	case POWER_SUPPLY_PROP_PRESENT:
438		ret = max14577_get_present(chg, &val->intval);
439		break;
440	case POWER_SUPPLY_PROP_ONLINE:
441		ret = max14577_get_online(chg, &val->intval);
442		break;
443	case POWER_SUPPLY_PROP_MODEL_NAME:
444		BUILD_BUG_ON(ARRAY_SIZE(model_names) != MAXIM_DEVICE_TYPE_NUM);
445		val->strval = model_names[chg->max14577->dev_type];
446		break;
447	case POWER_SUPPLY_PROP_MANUFACTURER:
448		val->strval = manufacturer;
449		break;
450	default:
451		return -EINVAL;
452	}
453
454	return ret;
455}
456
457static const struct power_supply_desc max14577_charger_desc = {
458	.name = "max14577-charger",
459	.type = POWER_SUPPLY_TYPE_BATTERY,
460	.properties = max14577_charger_props,
461	.num_properties = ARRAY_SIZE(max14577_charger_props),
462	.get_property = max14577_charger_get_property,
463};
464
465#ifdef CONFIG_OF
466static struct max14577_charger_platform_data *max14577_charger_dt_init(
467		struct platform_device *pdev)
468{
469	struct max14577_charger_platform_data *pdata;
470	struct device_node *np = pdev->dev.of_node;
471	int ret;
472
473	if (!np) {
474		dev_err(&pdev->dev, "No charger OF node\n");
475		return ERR_PTR(-EINVAL);
476	}
477
478	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
479	if (!pdata)
480		return ERR_PTR(-ENOMEM);
481
482	ret = of_property_read_u32(np, "maxim,constant-uvolt",
483			&pdata->constant_uvolt);
484	if (ret) {
485		dev_err(&pdev->dev, "Cannot parse maxim,constant-uvolt field from DT\n");
486		return ERR_PTR(ret);
487	}
488
489	ret = of_property_read_u32(np, "maxim,fast-charge-uamp",
490			&pdata->fast_charge_uamp);
491	if (ret) {
492		dev_err(&pdev->dev, "Cannot parse maxim,fast-charge-uamp field from DT\n");
493		return ERR_PTR(ret);
494	}
495
496	ret = of_property_read_u32(np, "maxim,eoc-uamp", &pdata->eoc_uamp);
497	if (ret) {
498		dev_err(&pdev->dev, "Cannot parse maxim,eoc-uamp field from DT\n");
499		return ERR_PTR(ret);
500	}
501
502	ret = of_property_read_u32(np, "maxim,ovp-uvolt", &pdata->ovp_uvolt);
503	if (ret) {
504		dev_err(&pdev->dev, "Cannot parse maxim,ovp-uvolt field from DT\n");
505		return ERR_PTR(ret);
506	}
507
508	return pdata;
509}
510#else /* CONFIG_OF */
511static struct max14577_charger_platform_data *max14577_charger_dt_init(
512		struct platform_device *pdev)
513{
514	return NULL;
515}
516#endif /* CONFIG_OF */
517
518static ssize_t show_fast_charge_timer(struct device *dev,
519		struct device_attribute *attr, char *buf)
520{
521	struct max14577_charger *chg = dev_get_drvdata(dev);
522	u8 reg_data;
523	int ret;
524	unsigned int val;
525
526	ret = max14577_read_reg(chg->max14577->regmap, MAX14577_REG_CHGCTRL1,
527			&reg_data);
528	if (ret)
529		return ret;
530
531	reg_data &= CHGCTRL1_TCHW_MASK;
532	reg_data >>= CHGCTRL1_TCHW_SHIFT;
533	switch (reg_data) {
534	case 0x2 ... 0x4:
535		val = reg_data + 3;
536		break;
537	case 0x7:
538		val = 0;
539		break;
540	default:
541		val = 5;
542		break;
543	}
544
545	return scnprintf(buf, PAGE_SIZE, "%u\n", val);
546}
547
548static ssize_t store_fast_charge_timer(struct device *dev,
549		struct device_attribute *attr, const char *buf, size_t count)
550{
551	struct max14577_charger *chg = dev_get_drvdata(dev);
552	unsigned long val;
553	int ret;
554
555	ret = kstrtoul(buf, 10, &val);
556	if (ret)
557		return ret;
558
559	ret = max14577_set_fast_charge_timer(chg, val);
560	if (ret)
561		return ret;
562
563	return count;
564}
565
566static DEVICE_ATTR(fast_charge_timer, S_IRUGO | S_IWUSR,
567		show_fast_charge_timer, store_fast_charge_timer);
568
569static int max14577_charger_probe(struct platform_device *pdev)
570{
571	struct max14577_charger *chg;
572	struct power_supply_config psy_cfg = {};
573	struct max14577 *max14577 = dev_get_drvdata(pdev->dev.parent);
574	int ret;
575
576	chg = devm_kzalloc(&pdev->dev, sizeof(*chg), GFP_KERNEL);
577	if (!chg)
578		return -ENOMEM;
579
580	platform_set_drvdata(pdev, chg);
581	chg->dev = &pdev->dev;
582	chg->max14577 = max14577;
583
584	chg->pdata = max14577_charger_dt_init(pdev);
585	if (IS_ERR_OR_NULL(chg->pdata))
586		return PTR_ERR(chg->pdata);
587
588	ret = max14577_charger_reg_init(chg);
589	if (ret)
590		return ret;
591
592	ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
593	if (ret) {
594		dev_err(&pdev->dev, "failed: create sysfs entry\n");
595		return ret;
596	}
597
598	psy_cfg.drv_data = chg;
599	chg->charger = power_supply_register(&pdev->dev, &max14577_charger_desc,
600						&psy_cfg);
601	if (IS_ERR(chg->charger)) {
602		dev_err(&pdev->dev, "failed: power supply register\n");
603		ret = PTR_ERR(chg->charger);
604		goto err;
605	}
606
607	/* Check for valid values for charger */
608	BUILD_BUG_ON(MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN +
609			MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP * 0xf !=
610			MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
611	return 0;
612
613err:
614	device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
615
616	return ret;
617}
618
619static int max14577_charger_remove(struct platform_device *pdev)
620{
621	struct max14577_charger *chg = platform_get_drvdata(pdev);
622
623	device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
624	power_supply_unregister(chg->charger);
625
626	return 0;
627}
628
629static const struct platform_device_id max14577_charger_id[] = {
630	{ "max14577-charger", MAXIM_DEVICE_TYPE_MAX14577, },
631	{ "max77836-charger", MAXIM_DEVICE_TYPE_MAX77836, },
632	{ }
633};
634MODULE_DEVICE_TABLE(platform, max14577_charger_id);
635
636static struct platform_driver max14577_charger_driver = {
637	.driver = {
638		.name	= "max14577-charger",
639	},
640	.probe		= max14577_charger_probe,
641	.remove		= max14577_charger_remove,
642	.id_table	= max14577_charger_id,
643};
644module_platform_driver(max14577_charger_driver);
645
646MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>");
647MODULE_DESCRIPTION("Maxim 14577/77836 charger driver");
648MODULE_LICENSE("GPL");
649