Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
   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, client->name, smb);
 846	if (ret < 0)
 847		goto fail_gpio;
 848
 849	ret = smb347_set_writable(smb, true);
 850	if (ret < 0)
 851		goto fail_irq;
 852
 853	/*
 854	 * Configure the STAT output to be suitable for interrupts: disable
 855	 * all other output (except interrupts) and make it active low.
 856	 */
 857	ret = regmap_update_bits(smb->regmap, CFG_STAT,
 858				 CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED,
 859				 CFG_STAT_DISABLED);
 860	if (ret < 0)
 861		goto fail_readonly;
 862
 863	smb347_set_writable(smb, false);
 864	client->irq = irq;
 865	return 0;
 866
 867fail_readonly:
 868	smb347_set_writable(smb, false);
 869fail_irq:
 870	free_irq(irq, smb);
 871fail_gpio:
 872	gpio_free(pdata->irq_gpio);
 873fail:
 874	client->irq = 0;
 875	return ret;
 876}
 877
 878/*
 879 * Returns the constant charge current programmed
 880 * into the charger in uA.
 881 */
 882static int get_const_charge_current(struct smb347_charger *smb)
 883{
 884	int ret, intval;
 885	unsigned int v;
 886
 887	if (!smb347_is_ps_online(smb))
 888		return -ENODATA;
 889
 890	ret = regmap_read(smb->regmap, STAT_B, &v);
 891	if (ret < 0)
 892		return ret;
 893
 894	/*
 895	 * The current value is composition of FCC and PCC values
 896	 * and we can detect which table to use from bit 5.
 897	 */
 898	if (v & 0x20) {
 899		intval = hw_to_current(fcc_tbl, ARRAY_SIZE(fcc_tbl), v & 7);
 900	} else {
 901		v >>= 3;
 902		intval = hw_to_current(pcc_tbl, ARRAY_SIZE(pcc_tbl), v & 7);
 903	}
 904
 905	return intval;
 906}
 907
 908/*
 909 * Returns the constant charge voltage programmed
 910 * into the charger in uV.
 911 */
 912static int get_const_charge_voltage(struct smb347_charger *smb)
 913{
 914	int ret, intval;
 915	unsigned int v;
 916
 917	if (!smb347_is_ps_online(smb))
 918		return -ENODATA;
 919
 920	ret = regmap_read(smb->regmap, STAT_A, &v);
 921	if (ret < 0)
 922		return ret;
 923
 924	v &= STAT_A_FLOAT_VOLTAGE_MASK;
 925	if (v > 0x3d)
 926		v = 0x3d;
 927
 928	intval = 3500000 + v * 20000;
 929
 930	return intval;
 931}
 932
 933static int smb347_mains_get_property(struct power_supply *psy,
 934				     enum power_supply_property prop,
 935				     union power_supply_propval *val)
 936{
 937	struct smb347_charger *smb =
 938		container_of(psy, struct smb347_charger, mains);
 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 =
 980		container_of(psy, struct smb347_charger, usb);
 981	int ret;
 982
 983	switch (prop) {
 984	case POWER_SUPPLY_PROP_ONLINE:
 985		val->intval = smb->usb_online;
 986		break;
 987
 988	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 989		ret = get_const_charge_voltage(smb);
 990		if (ret < 0)
 991			return ret;
 992		else
 993			val->intval = ret;
 994		break;
 995
 996	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
 997		ret = get_const_charge_current(smb);
 998		if (ret < 0)
 999			return ret;
1000		else
1001			val->intval = ret;
1002		break;
1003
1004	default:
1005		return -EINVAL;
1006	}
1007
1008	return 0;
1009}
1010
1011static enum power_supply_property smb347_usb_properties[] = {
1012	POWER_SUPPLY_PROP_ONLINE,
1013	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1014	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1015};
1016
1017static int smb347_get_charging_status(struct smb347_charger *smb)
1018{
1019	int ret, status;
1020	unsigned int val;
1021
1022	if (!smb347_is_ps_online(smb))
1023		return POWER_SUPPLY_STATUS_DISCHARGING;
1024
1025	ret = regmap_read(smb->regmap, STAT_C, &val);
1026	if (ret < 0)
1027		return ret;
1028
1029	if ((val & STAT_C_CHARGER_ERROR) ||
1030			(val & STAT_C_HOLDOFF_STAT)) {
1031		/*
1032		 * set to NOT CHARGING upon charger error
1033		 * or charging has stopped.
1034		 */
1035		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1036	} else {
1037		if ((val & STAT_C_CHG_MASK) >> STAT_C_CHG_SHIFT) {
1038			/*
1039			 * set to charging if battery is in pre-charge,
1040			 * fast charge or taper charging mode.
1041			 */
1042			status = POWER_SUPPLY_STATUS_CHARGING;
1043		} else if (val & STAT_C_CHG_TERM) {
1044			/*
1045			 * set the status to FULL if battery is not in pre
1046			 * charge, fast charge or taper charging mode AND
1047			 * charging is terminated at least once.
1048			 */
1049			status = POWER_SUPPLY_STATUS_FULL;
1050		} else {
1051			/*
1052			 * in this case no charger error or termination
1053			 * occured but charging is not in progress!!!
1054			 */
1055			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1056		}
1057	}
1058
1059	return status;
1060}
1061
1062static int smb347_battery_get_property(struct power_supply *psy,
1063				       enum power_supply_property prop,
1064				       union power_supply_propval *val)
1065{
1066	struct smb347_charger *smb =
1067			container_of(psy, struct smb347_charger, battery);
1068	const struct smb347_charger_platform_data *pdata = smb->pdata;
1069	int ret;
1070
1071	ret = smb347_update_ps_status(smb);
1072	if (ret < 0)
1073		return ret;
1074
1075	switch (prop) {
1076	case POWER_SUPPLY_PROP_STATUS:
1077		ret = smb347_get_charging_status(smb);
1078		if (ret < 0)
1079			return ret;
1080		val->intval = ret;
1081		break;
1082
1083	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1084		if (!smb347_is_ps_online(smb))
1085			return -ENODATA;
1086
1087		/*
1088		 * We handle trickle and pre-charging the same, and taper
1089		 * and none the same.
1090		 */
1091		switch (smb347_charging_status(smb)) {
1092		case 1:
1093			val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1094			break;
1095		case 2:
1096			val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
1097			break;
1098		default:
1099			val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
1100			break;
1101		}
1102		break;
1103
1104	case POWER_SUPPLY_PROP_TECHNOLOGY:
1105		val->intval = pdata->battery_info.technology;
1106		break;
1107
1108	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1109		val->intval = pdata->battery_info.voltage_min_design;
1110		break;
1111
1112	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1113		val->intval = pdata->battery_info.voltage_max_design;
1114		break;
1115
1116	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1117		val->intval = pdata->battery_info.charge_full_design;
1118		break;
1119
1120	case POWER_SUPPLY_PROP_MODEL_NAME:
1121		val->strval = pdata->battery_info.name;
1122		break;
1123
1124	default:
1125		return -EINVAL;
1126	}
1127
1128	return 0;
1129}
1130
1131static enum power_supply_property smb347_battery_properties[] = {
1132	POWER_SUPPLY_PROP_STATUS,
1133	POWER_SUPPLY_PROP_CHARGE_TYPE,
1134	POWER_SUPPLY_PROP_TECHNOLOGY,
1135	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1136	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1137	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
1138	POWER_SUPPLY_PROP_MODEL_NAME,
1139};
1140
1141static bool smb347_volatile_reg(struct device *dev, unsigned int reg)
1142{
1143	switch (reg) {
1144	case IRQSTAT_A:
1145	case IRQSTAT_C:
1146	case IRQSTAT_E:
1147	case IRQSTAT_F:
1148	case STAT_A:
1149	case STAT_B:
1150	case STAT_C:
1151	case STAT_E:
1152		return true;
1153	}
1154
1155	return false;
1156}
1157
1158static bool smb347_readable_reg(struct device *dev, unsigned int reg)
1159{
1160	switch (reg) {
1161	case CFG_CHARGE_CURRENT:
1162	case CFG_CURRENT_LIMIT:
1163	case CFG_FLOAT_VOLTAGE:
1164	case CFG_STAT:
1165	case CFG_PIN:
1166	case CFG_THERM:
1167	case CFG_SYSOK:
1168	case CFG_OTHER:
1169	case CFG_OTG:
1170	case CFG_TEMP_LIMIT:
1171	case CFG_FAULT_IRQ:
1172	case CFG_STATUS_IRQ:
1173	case CFG_ADDRESS:
1174	case CMD_A:
1175	case CMD_B:
1176	case CMD_C:
1177		return true;
1178	}
1179
1180	return smb347_volatile_reg(dev, reg);
1181}
1182
1183static const struct regmap_config smb347_regmap = {
1184	.reg_bits	= 8,
1185	.val_bits	= 8,
1186	.max_register	= SMB347_MAX_REGISTER,
1187	.volatile_reg	= smb347_volatile_reg,
1188	.readable_reg	= smb347_readable_reg,
1189};
1190
1191static int smb347_probe(struct i2c_client *client,
1192			const struct i2c_device_id *id)
1193{
1194	static char *battery[] = { "smb347-battery" };
1195	const struct smb347_charger_platform_data *pdata;
1196	struct device *dev = &client->dev;
1197	struct smb347_charger *smb;
1198	int ret;
1199
1200	pdata = dev->platform_data;
1201	if (!pdata)
1202		return -EINVAL;
1203
1204	if (!pdata->use_mains && !pdata->use_usb)
1205		return -EINVAL;
1206
1207	smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL);
1208	if (!smb)
1209		return -ENOMEM;
1210
1211	i2c_set_clientdata(client, smb);
1212
1213	mutex_init(&smb->lock);
1214	smb->dev = &client->dev;
1215	smb->pdata = pdata;
1216
1217	smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap);
1218	if (IS_ERR(smb->regmap))
1219		return PTR_ERR(smb->regmap);
1220
1221	ret = smb347_hw_init(smb);
1222	if (ret < 0)
1223		return ret;
1224
1225	if (smb->pdata->use_mains) {
1226		smb->mains.name = "smb347-mains";
1227		smb->mains.type = POWER_SUPPLY_TYPE_MAINS;
1228		smb->mains.get_property = smb347_mains_get_property;
1229		smb->mains.properties = smb347_mains_properties;
1230		smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties);
1231		smb->mains.supplied_to = battery;
1232		smb->mains.num_supplicants = ARRAY_SIZE(battery);
1233		ret = power_supply_register(dev, &smb->mains);
1234		if (ret < 0)
1235			return ret;
1236	}
1237
1238	if (smb->pdata->use_usb) {
1239		smb->usb.name = "smb347-usb";
1240		smb->usb.type = POWER_SUPPLY_TYPE_USB;
1241		smb->usb.get_property = smb347_usb_get_property;
1242		smb->usb.properties = smb347_usb_properties;
1243		smb->usb.num_properties = ARRAY_SIZE(smb347_usb_properties);
1244		smb->usb.supplied_to = battery;
1245		smb->usb.num_supplicants = ARRAY_SIZE(battery);
1246		ret = power_supply_register(dev, &smb->usb);
1247		if (ret < 0) {
1248			if (smb->pdata->use_mains)
1249				power_supply_unregister(&smb->mains);
1250			return ret;
1251		}
1252	}
1253
1254	smb->battery.name = "smb347-battery";
1255	smb->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1256	smb->battery.get_property = smb347_battery_get_property;
1257	smb->battery.properties = smb347_battery_properties;
1258	smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties);
1259
1260
1261	ret = power_supply_register(dev, &smb->battery);
1262	if (ret < 0) {
1263		if (smb->pdata->use_usb)
1264			power_supply_unregister(&smb->usb);
1265		if (smb->pdata->use_mains)
1266			power_supply_unregister(&smb->mains);
1267		return ret;
1268	}
1269
1270	/*
1271	 * Interrupt pin is optional. If it is connected, we setup the
1272	 * interrupt support here.
1273	 */
1274	if (pdata->irq_gpio >= 0) {
1275		ret = smb347_irq_init(smb, client);
1276		if (ret < 0) {
1277			dev_warn(dev, "failed to initialize IRQ: %d\n", ret);
1278			dev_warn(dev, "disabling IRQ support\n");
1279		} else {
1280			smb347_irq_enable(smb);
1281		}
1282	}
1283
1284	return 0;
1285}
1286
1287static int smb347_remove(struct i2c_client *client)
1288{
1289	struct smb347_charger *smb = i2c_get_clientdata(client);
1290
1291	if (client->irq) {
1292		smb347_irq_disable(smb);
1293		free_irq(client->irq, smb);
1294		gpio_free(smb->pdata->irq_gpio);
1295	}
1296
1297	power_supply_unregister(&smb->battery);
1298	if (smb->pdata->use_usb)
1299		power_supply_unregister(&smb->usb);
1300	if (smb->pdata->use_mains)
1301		power_supply_unregister(&smb->mains);
1302	return 0;
1303}
1304
1305static const struct i2c_device_id smb347_id[] = {
1306	{ "smb347", 0 },
1307	{ }
1308};
1309MODULE_DEVICE_TABLE(i2c, smb347_id);
1310
1311static struct i2c_driver smb347_driver = {
1312	.driver = {
1313		.name = "smb347",
1314	},
1315	.probe        = smb347_probe,
1316	.remove       = smb347_remove,
1317	.id_table     = smb347_id,
1318};
1319
1320module_i2c_driver(smb347_driver);
1321
1322MODULE_AUTHOR("Bruce E. Robertson <bruce.e.robertson@intel.com>");
1323MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
1324MODULE_DESCRIPTION("SMB347 battery charger driver");
1325MODULE_LICENSE("GPL");
1326MODULE_ALIAS("i2c:smb347");