Commit 919c8401 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-v3.4-rc1' of git://git.infradead.org/battery-2.6

Pull battery updates from Anton Vorontsov:
 "Various small bugfixes and enhancements, plus two new drivers:
   - A quite complex ab8500 charger driver, submitted by Arun Murthy @
     ST-Ericsson;
   - Summit Microelectronics SMB347 Battery Charger, submitted by Bruce
     E Robertson and Alan Cox @ Intel.

  And that's all."

* tag 'for-v3.4-rc1' of git://git.infradead.org/battery-2.6: (36 commits)
  max17042_battery: Clean up interrupt handling
  Revert "max8998_charger: Include linux/module.h just once"
  ab8500_fg: Fix some build warnings on x86_64
  max17042_battery: Fix CHARGE_FULL representation.
  max8998_charger: Include linux/module.h just once
  power_supply: Convert i2c drivers to module_i2c_driver
  lp8727_charger: Add MODULE_DEVICE_TABLE
  charger-manager: Simplify charger_get_property(), get rid of a warning
  charger-manager: Clean up for better readability
  da9052-battery: Convert to use module_platform_driver
  da9052-battery: Fix a memory leak when unload the module
  da9052-battery: Add missing platform_set_drvdata
  ab8500: Turn unneeded global symbols into local ones
  ab8500_fg: Fix copy-paste error
  ab8500_fg: Get rid of 'struct battery_type'
  ab8500_fg: Get rid of 'struct v_to_cap'
  ab8500_btemp: Get rid of 'enum adc_therm'
  ab8500_charger: Convert to the new USB OTG calls
  ab8500-btemp: AB8500 battery temperature driver
  ab8500-fg: A8500 fuel gauge driver
  ...
parents a9d38a4f 5cdd4d7f
max17042_battery
~~~~~~~~~~~~~~~~
Required properties :
- compatible : "maxim,max17042"
Optional properties :
- maxim,rsns-microohm : Resistance of rsns resistor in micro Ohms
(datasheet-recommended value is 10000).
Defining this property enables current-sense functionality.
Example:
battery-charger@36 {
compatible = "maxim,max17042";
reg = <0x36>;
maxim,rsns-microohm = <10000>;
};
...@@ -249,7 +249,7 @@ config CHARGER_TWL4030 ...@@ -249,7 +249,7 @@ config CHARGER_TWL4030
Say Y here to enable support for TWL4030 Battery Charge Interface. Say Y here to enable support for TWL4030 Battery Charge Interface.
config CHARGER_LP8727 config CHARGER_LP8727
tristate "National Semiconductor LP8727 charger driver" tristate "TI/National Semiconductor LP8727 charger driver"
depends on I2C depends on I2C
help help
Say Y here to enable support for LP8727 Charger Driver. Say Y here to enable support for LP8727 Charger Driver.
...@@ -288,4 +288,23 @@ config CHARGER_MAX8998 ...@@ -288,4 +288,23 @@ config CHARGER_MAX8998
Say Y to enable support for the battery charger control sysfs and Say Y to enable support for the battery charger control sysfs and
platform data of MAX8998/LP3974 PMICs. platform data of MAX8998/LP3974 PMICs.
config CHARGER_SMB347
tristate "Summit Microelectronics SMB347 Battery Charger"
depends on I2C
help
Say Y to include support for Summit Microelectronics SMB347
Battery Charger.
config AB8500_BM
bool "AB8500 Battery Management Driver"
depends on AB8500_CORE && AB8500_GPADC
help
Say Y to include support for AB5500 battery management.
config AB8500_BATTERY_THERM_ON_BATCTRL
bool "Thermistor connected on BATCTRL ADC"
depends on AB8500_BM
help
Say Y to enable battery temperature measurements using
thermistor connected on BATCTRL ADC.
endif # POWER_SUPPLY endif # POWER_SUPPLY
...@@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_S3C_ADC) += s3c_adc_battery.o ...@@ -34,6 +34,7 @@ obj-$(CONFIG_BATTERY_S3C_ADC) += s3c_adc_battery.o
obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o
obj-$(CONFIG_BATTERY_JZ4740) += jz4740-battery.o obj-$(CONFIG_BATTERY_JZ4740) += jz4740-battery.o
obj-$(CONFIG_BATTERY_INTEL_MID) += intel_mid_battery.o obj-$(CONFIG_BATTERY_INTEL_MID) += intel_mid_battery.o
obj-$(CONFIG_AB8500_BM) += ab8500_charger.o ab8500_btemp.o ab8500_fg.o abx500_chargalg.o
obj-$(CONFIG_CHARGER_ISP1704) += isp1704_charger.o obj-$(CONFIG_CHARGER_ISP1704) += isp1704_charger.o
obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o
obj-$(CONFIG_CHARGER_TWL4030) += twl4030_charger.o obj-$(CONFIG_CHARGER_TWL4030) += twl4030_charger.o
...@@ -42,3 +43,4 @@ obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o ...@@ -42,3 +43,4 @@ obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o
obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o
obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
obj-$(CONFIG_CHARGER_SMB347) += smb347-charger.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -134,12 +134,11 @@ static int get_batt_uV(struct charger_manager *cm, int *uV) ...@@ -134,12 +134,11 @@ static int get_batt_uV(struct charger_manager *cm, int *uV)
union power_supply_propval val; union power_supply_propval val;
int ret; int ret;
if (cm->fuel_gauge) if (!cm->fuel_gauge)
ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
else
return -ENODEV; return -ENODEV;
ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
if (ret) if (ret)
return ret; return ret;
...@@ -245,9 +244,7 @@ static int try_charger_enable(struct charger_manager *cm, bool enable) ...@@ -245,9 +244,7 @@ static int try_charger_enable(struct charger_manager *cm, bool enable)
struct charger_desc *desc = cm->desc; struct charger_desc *desc = cm->desc;
/* Ignore if it's redundent command */ /* Ignore if it's redundent command */
if (enable && cm->charger_enabled) if (enable == cm->charger_enabled)
return 0;
if (!enable && !cm->charger_enabled)
return 0; return 0;
if (enable) { if (enable) {
...@@ -309,9 +306,7 @@ static void uevent_notify(struct charger_manager *cm, const char *event) ...@@ -309,9 +306,7 @@ static void uevent_notify(struct charger_manager *cm, const char *event)
if (!strncmp(env_str_save, event, UEVENT_BUF_SIZE)) if (!strncmp(env_str_save, event, UEVENT_BUF_SIZE))
return; /* Duplicated. */ return; /* Duplicated. */
else strncpy(env_str_save, event, UEVENT_BUF_SIZE);
strncpy(env_str_save, event, UEVENT_BUF_SIZE);
return; return;
} }
...@@ -387,8 +382,10 @@ static bool cm_monitor(void) ...@@ -387,8 +382,10 @@ static bool cm_monitor(void)
mutex_lock(&cm_list_mtx); mutex_lock(&cm_list_mtx);
list_for_each_entry(cm, &cm_list, entry) list_for_each_entry(cm, &cm_list, entry) {
stop = stop || _cm_monitor(cm); if (_cm_monitor(cm))
stop = true;
}
mutex_unlock(&cm_list_mtx); mutex_unlock(&cm_list_mtx);
...@@ -402,7 +399,8 @@ static int charger_get_property(struct power_supply *psy, ...@@ -402,7 +399,8 @@ static int charger_get_property(struct power_supply *psy,
struct charger_manager *cm = container_of(psy, struct charger_manager *cm = container_of(psy,
struct charger_manager, charger_psy); struct charger_manager, charger_psy);
struct charger_desc *desc = cm->desc; struct charger_desc *desc = cm->desc;
int i, ret = 0, uV; int ret = 0;
int uV;
switch (psp) { switch (psp) {
case POWER_SUPPLY_PROP_STATUS: case POWER_SUPPLY_PROP_STATUS:
...@@ -428,8 +426,7 @@ static int charger_get_property(struct power_supply *psy, ...@@ -428,8 +426,7 @@ static int charger_get_property(struct power_supply *psy,
val->intval = 0; val->intval = 0;
break; break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW: case POWER_SUPPLY_PROP_VOLTAGE_NOW:
ret = get_batt_uV(cm, &i); ret = get_batt_uV(cm, &val->intval);
val->intval = i;
break; break;
case POWER_SUPPLY_PROP_CURRENT_NOW: case POWER_SUPPLY_PROP_CURRENT_NOW:
ret = cm->fuel_gauge->get_property(cm->fuel_gauge, ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
...@@ -697,8 +694,10 @@ bool cm_suspend_again(void) ...@@ -697,8 +694,10 @@ bool cm_suspend_again(void)
mutex_lock(&cm_list_mtx); mutex_lock(&cm_list_mtx);
list_for_each_entry(cm, &cm_list, entry) { list_for_each_entry(cm, &cm_list, entry) {
if (cm->status_save_ext_pwr_inserted != is_ext_pwr_online(cm) || if (cm->status_save_ext_pwr_inserted != is_ext_pwr_online(cm) ||
cm->status_save_batt != is_batt_present(cm)) cm->status_save_batt != is_batt_present(cm)) {
ret = false; ret = false;
break;
}
} }
mutex_unlock(&cm_list_mtx); mutex_unlock(&cm_list_mtx);
...@@ -855,11 +854,10 @@ static int charger_manager_probe(struct platform_device *pdev) ...@@ -855,11 +854,10 @@ static int charger_manager_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, cm); platform_set_drvdata(pdev, cm);
memcpy(&cm->charger_psy, &psy_default, memcpy(&cm->charger_psy, &psy_default, sizeof(psy_default));
sizeof(psy_default));
if (!desc->psy_name) { if (!desc->psy_name) {
strncpy(cm->psy_name_buf, psy_default.name, strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX);
PSY_NAME_MAX);
} else { } else {
strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX); strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX);
} }
...@@ -894,15 +892,15 @@ static int charger_manager_probe(struct platform_device *pdev) ...@@ -894,15 +892,15 @@ static int charger_manager_probe(struct platform_device *pdev)
POWER_SUPPLY_PROP_CURRENT_NOW; POWER_SUPPLY_PROP_CURRENT_NOW;
cm->charger_psy.num_properties++; cm->charger_psy.num_properties++;
} }
if (!desc->measure_battery_temp) {
cm->charger_psy.properties[cm->charger_psy.num_properties] =
POWER_SUPPLY_PROP_TEMP_AMBIENT;
cm->charger_psy.num_properties++;
}
if (desc->measure_battery_temp) { if (desc->measure_battery_temp) {
cm->charger_psy.properties[cm->charger_psy.num_properties] = cm->charger_psy.properties[cm->charger_psy.num_properties] =
POWER_SUPPLY_PROP_TEMP; POWER_SUPPLY_PROP_TEMP;
cm->charger_psy.num_properties++; cm->charger_psy.num_properties++;
} else {
cm->charger_psy.properties[cm->charger_psy.num_properties] =
POWER_SUPPLY_PROP_TEMP_AMBIENT;
cm->charger_psy.num_properties++;
} }
ret = power_supply_register(NULL, &cm->charger_psy); ret = power_supply_register(NULL, &cm->charger_psy);
...@@ -933,9 +931,8 @@ static int charger_manager_probe(struct platform_device *pdev) ...@@ -933,9 +931,8 @@ static int charger_manager_probe(struct platform_device *pdev)
return 0; return 0;
err_chg_enable: err_chg_enable:
if (desc->charger_regulators) regulator_bulk_free(desc->num_charger_regulators,
regulator_bulk_free(desc->num_charger_regulators, desc->charger_regulators);
desc->charger_regulators);
err_bulk_get: err_bulk_get:
power_supply_unregister(&cm->charger_psy); power_supply_unregister(&cm->charger_psy);
err_register: err_register:
...@@ -961,10 +958,8 @@ static int __devexit charger_manager_remove(struct platform_device *pdev) ...@@ -961,10 +958,8 @@ static int __devexit charger_manager_remove(struct platform_device *pdev)
list_del(&cm->entry); list_del(&cm->entry);
mutex_unlock(&cm_list_mtx); mutex_unlock(&cm_list_mtx);
if (desc->charger_regulators) regulator_bulk_free(desc->num_charger_regulators,
regulator_bulk_free(desc->num_charger_regulators, desc->charger_regulators);
desc->charger_regulators);
power_supply_unregister(&cm->charger_psy); power_supply_unregister(&cm->charger_psy);
kfree(cm->charger_psy.properties); kfree(cm->charger_psy.properties);
kfree(cm->charger_stat); kfree(cm->charger_stat);
...@@ -982,9 +977,7 @@ MODULE_DEVICE_TABLE(platform, charger_manager_id); ...@@ -982,9 +977,7 @@ MODULE_DEVICE_TABLE(platform, charger_manager_id);
static int cm_suspend_prepare(struct device *dev) static int cm_suspend_prepare(struct device *dev)
{ {
struct platform_device *pdev = container_of(dev, struct platform_device, struct charger_manager *cm = dev_get_drvdata(dev);
dev);
struct charger_manager *cm = platform_get_drvdata(pdev);
if (!cm_suspended) { if (!cm_suspended) {
if (rtc_dev) { if (rtc_dev) {
...@@ -1020,9 +1013,7 @@ static int cm_suspend_prepare(struct device *dev) ...@@ -1020,9 +1013,7 @@ static int cm_suspend_prepare(struct device *dev)
static void cm_suspend_complete(struct device *dev) static void cm_suspend_complete(struct device *dev)
{ {
struct platform_device *pdev = container_of(dev, struct platform_device, struct charger_manager *cm = dev_get_drvdata(dev);
dev);
struct charger_manager *cm = platform_get_drvdata(pdev);
if (cm_suspended) { if (cm_suspended) {
if (rtc_dev) { if (rtc_dev) {
......
...@@ -612,6 +612,7 @@ static s32 __devinit da9052_bat_probe(struct platform_device *pdev) ...@@ -612,6 +612,7 @@ static s32 __devinit da9052_bat_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err; goto err;
platform_set_drvdata(pdev, bat);
return 0; return 0;
err: err:
...@@ -633,6 +634,7 @@ static int __devexit da9052_bat_remove(struct platform_device *pdev) ...@@ -633,6 +634,7 @@ static int __devexit da9052_bat_remove(struct platform_device *pdev)
free_irq(bat->da9052->irq_base + irq, bat); free_irq(bat->da9052->irq_base + irq, bat);
} }
power_supply_unregister(&bat->psy); power_supply_unregister(&bat->psy);
kfree(bat);
return 0; return 0;
} }
...@@ -645,18 +647,7 @@ static struct platform_driver da9052_bat_driver = { ...@@ -645,18 +647,7 @@ static struct platform_driver da9052_bat_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
}; };
module_platform_driver(da9052_bat_driver);
static int __init da9052_bat_init(void)
{
return platform_driver_register(&da9052_bat_driver);
}
module_init(da9052_bat_init);
static void __exit da9052_bat_exit(void)
{
platform_driver_unregister(&da9052_bat_driver);
}
module_exit(da9052_bat_exit);
MODULE_DESCRIPTION("DA9052 BAT Device Driver"); MODULE_DESCRIPTION("DA9052 BAT Device Driver");
MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
......
...@@ -403,18 +403,7 @@ static struct i2c_driver ds278x_battery_driver = { ...@@ -403,18 +403,7 @@ static struct i2c_driver ds278x_battery_driver = {
.remove = ds278x_battery_remove, .remove = ds278x_battery_remove,
.id_table = ds278x_id, .id_table = ds278x_id,
}; };
module_i2c_driver(ds278x_battery_driver);
static int __init ds278x_init(void)
{
return i2c_add_driver(&ds278x_battery_driver);
}
module_init(ds278x_init);
static void __exit ds278x_exit(void)
{
i2c_del_driver(&ds278x_battery_driver);
}
module_exit(ds278x_exit);
MODULE_AUTHOR("Ryan Mallon"); MODULE_AUTHOR("Ryan Mallon");
MODULE_DESCRIPTION("Maxim/Dallas DS2782 Stand-Alone Fuel Gauage IC driver"); MODULE_DESCRIPTION("Maxim/Dallas DS2782 Stand-Alone Fuel Gauage IC driver");
......
...@@ -480,6 +480,7 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev) ...@@ -480,6 +480,7 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to register isp1704 with error %d\n", ret); dev_err(&pdev->dev, "failed to register isp1704 with error %d\n", ret);
isp1704_charger_set_power(isp, 0);
return ret; return ret;
} }
......
/* /*
* Driver for LP8727 Micro/Mini USB IC with intergrated charger * Driver for LP8727 Micro/Mini USB IC with integrated charger
* *
* Copyright (C) 2011 Texas Instruments
* Copyright (C) 2011 National Semiconductor * Copyright (C) 2011 National Semiconductor
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -25,7 +26,7 @@ ...@@ -25,7 +26,7 @@
#define INT1 0x4 #define INT1 0x4
#define INT2 0x5 #define INT2 0x5
#define STATUS1 0x6 #define STATUS1 0x6
#define STATUS2 0x7 #define STATUS2 0x7
#define CHGCTRL2 0x9 #define CHGCTRL2 0x9
/* CTRL1 register */ /* CTRL1 register */
...@@ -91,7 +92,7 @@ struct lp8727_chg { ...@@ -91,7 +92,7 @@ struct lp8727_chg {
enum lp8727_dev_id devid; enum lp8727_dev_id devid;
}; };
static int lp8727_i2c_read(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len) static int lp8727_read_bytes(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len)
{ {
s32 ret; s32 ret;
...@@ -102,29 +103,22 @@ static int lp8727_i2c_read(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len) ...@@ -102,29 +103,22 @@ static int lp8727_i2c_read(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len)
return (ret != len) ? -EIO : 0; return (ret != len) ? -EIO : 0;
} }
static int lp8727_i2c_write(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len) static inline int lp8727_read_byte(struct lp8727_chg *pchg, u8 reg, u8 *data)
{ {
s32 ret; return lp8727_read_bytes(pchg, reg, data, 1);
}
static int lp8727_write_byte(struct lp8727_chg *pchg, u8 reg, u8 data)
{
int ret;
mutex_lock(&pchg->xfer_lock); mutex_lock(&pchg->xfer_lock);
ret = i2c_smbus_write_i2c_block_data(pchg->client, reg, len, data); ret = i2c_smbus_write_byte_data(pchg->client, reg, data);
mutex_unlock(&pchg->xfer_lock); mutex_unlock(&pchg->xfer_lock);
return ret; return ret;
} }
static inline int lp8727_i2c_read_byte(struct lp8727_chg *pchg, u8 reg,
u8 *data)
{
return lp8727_i2c_read(pchg, reg, data, 1);
}
static inline int lp8727_i2c_write_byte(struct lp8727_chg *pchg, u8 reg,
u8 *data)
{
return lp8727_i2c_write(pchg, reg, data, 1);
}
static int lp8727_is_charger_attached(const char *name, int id) static int lp8727_is_charger_attached(const char *name, int id)
{ {
if (name) { if (name) {
...@@ -137,37 +131,41 @@ static int lp8727_is_charger_attached(const char *name, int id) ...@@ -137,37 +131,41 @@ static int lp8727_is_charger_attached(const char *name, int id)
return (id >= ID_TA && id <= ID_USB_CHG) ? 1 : 0; return (id >= ID_TA && id <= ID_USB_CHG) ? 1 : 0;
} }
static void lp8727_init_device(struct lp8727_chg *pchg) static int lp8727_init_device(struct lp8727_chg *pchg)
{ {
u8 val; u8 val;
int ret;
val = ID200_EN | ADC_EN | CP_EN; val = ID200_EN | ADC_EN | CP_EN;
if (lp8727_i2c_write_byte(pchg, CTRL1, &val)) ret = lp8727_write_byte(pchg, CTRL1, val);
dev_err(pchg->dev, "i2c write err : addr=0x%.2x\n", CTRL1); if (ret)
return ret;
val = INT_EN | CHGDET_EN; val = INT_EN | CHGDET_EN;
if (lp8727_i2c_write_byte(pchg, CTRL2, &val)) ret = lp8727_write_byte(pchg, CTRL2, val);
dev_err(pchg->dev, "i2c write err : addr=0x%.2x\n", CTRL2); if (ret)
return ret;
return 0;
} }
static int lp8727_is_dedicated_charger(struct lp8727_chg *pchg) static int lp8727_is_dedicated_charger(struct lp8727_chg *pchg)
{ {
u8 val; u8 val;
lp8727_i2c_read_byte(pchg, STATUS1, &val); lp8727_read_byte(pchg, STATUS1, &val);
return (val & DCPORT); return val & DCPORT;
} }
static int lp8727_is_usb_charger(struct lp8727_chg *pchg) static int lp8727_is_usb_charger(struct lp8727_chg *pchg)
{ {
u8 val; u8 val;
lp8727_i2c_read_byte(pchg, STATUS1, &val); lp8727_read_byte(pchg, STATUS1, &val);
return (val & CHPORT); return val & CHPORT;
} }
static void lp8727_ctrl_switch(struct lp8727_chg *pchg, u8 sw) static void lp8727_ctrl_switch(struct lp8727_chg *pchg, u8 sw)
{ {
u8 val = sw; lp8727_write_byte(pchg, SWCTRL, sw);
lp8727_i2c_write_byte(pchg, SWCTRL, &val);
} }
static void lp8727_id_detection(struct lp8727_chg *pchg, u8 id, int vbusin) static void lp8727_id_detection(struct lp8727_chg *pchg, u8 id, int vbusin)
...@@ -207,9 +205,9 @@ static void lp8727_enable_chgdet(struct lp8727_chg *pchg) ...@@ -207,9 +205,9 @@ static void lp8727_enable_chgdet(struct lp8727_chg *pchg)
{ {
u8 val; u8 val;
lp8727_i2c_read_byte(pchg, CTRL2, &val); lp8727_read_byte(pchg, CTRL2, &val);
val |= CHGDET_EN; val |= CHGDET_EN;
lp8727_i2c_write_byte(pchg, CTRL2, &val); lp8727_write_byte(pchg, CTRL2, val);
} }
static void lp8727_delayed_func(struct work_struct *_work) static void lp8727_delayed_func(struct work_struct *_work)
...@@ -218,7 +216,7 @@ static void lp8727_delayed_func(struct work_struct *_work) ...@@ -218,7 +216,7 @@ static void lp8727_delayed_func(struct work_struct *_work)
struct lp8727_chg *pchg = struct lp8727_chg *pchg =
container_of(_work, struct lp8727_chg, work.work); container_of(_work, struct lp8727_chg, work.work);
if (lp8727_i2c_read(pchg, INT1, intstat, 2)) { if (lp8727_read_bytes(pchg, INT1, intstat, 2)) {
dev_err(pchg->dev, "can not read INT registers\n"); dev_err(pchg->dev, "can not read INT registers\n");
return; return;
} }
...@@ -244,20 +242,22 @@ static irqreturn_t lp8727_isr_func(int irq, void *ptr) ...@@ -244,20 +242,22 @@ static irqreturn_t lp8727_isr_func(int irq, void *ptr)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void lp8727_intr_config(struct lp8727_chg *pchg) static int lp8727_intr_config(struct lp8727_chg *pchg)
{ {
INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func); INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func);
pchg->irqthread = create_singlethread_workqueue("lp8727-irqthd"); pchg->irqthread = create_singlethread_workqueue("lp8727-irqthd");
if (!pchg->irqthread) if (!pchg->irqthread) {
dev_err(pchg->dev, "can not create thread for lp8727\n"); dev_err(pchg->dev, "can not create thread for lp8727\n");
return -ENOMEM;
if (request_threaded_irq(pchg->client->irq,
NULL,
lp8727_isr_func,
IRQF_TRIGGER_FALLING, "lp8727_irq", pchg)) {
dev_err(pchg->dev, "lp8727 irq can not be registered\n");
} }
return request_threaded_irq(pchg->client->irq,
NULL,
lp8727_isr_func,
IRQF_TRIGGER_FALLING,
"lp8727_irq",
pchg);
} }
static enum power_supply_property lp8727_charger_prop[] = { static enum power_supply_property lp8727_charger_prop[] = {
...@@ -300,7 +300,7 @@ static int lp8727_battery_get_property(struct power_supply *psy, ...@@ -300,7 +300,7 @@ static int lp8727_battery_get_property(struct power_supply *psy,
switch (psp) { switch (psp) {
case POWER_SUPPLY_PROP_STATUS: case POWER_SUPPLY_PROP_STATUS:
if (lp8727_is_charger_attached(psy->name, pchg->devid)) { if (lp8727_is_charger_attached(psy->name, pchg->devid)) {
lp8727_i2c_read_byte(pchg, STATUS1, &read); lp8727_read_byte(pchg, STATUS1, &read);
if (((read & CHGSTAT) >> 4) == EOC) if (((read & CHGSTAT) >> 4) == EOC)
val->intval = POWER_SUPPLY_STATUS_FULL; val->intval = POWER_SUPPLY_STATUS_FULL;
else else
...@@ -310,7 +310,7 @@ static int lp8727_battery_get_property(struct power_supply *psy, ...@@ -310,7 +310,7 @@ static int lp8727_battery_get_property(struct power_supply *psy,
} }
break; break;
case POWER_SUPPLY_PROP_HEALTH: case POWER_SUPPLY_PROP_HEALTH:
lp8727_i2c_read_byte(pchg, STATUS2, &read); lp8727_read_byte(pchg, STATUS2, &read);
read = (read & TEMP_STAT) >> 5; read = (read & TEMP_STAT) >> 5;
if (read >= 0x1 && read <= 0x3) if (read >= 0x1 && read <= 0x3)
val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
...@@ -351,7 +351,7 @@ static void lp8727_charger_changed(struct power_supply *psy) ...@@ -351,7 +351,7 @@ static void lp8727_charger_changed(struct power_supply *psy)
eoc_level = pchg->chg_parm->eoc_level; eoc_level = pchg->chg_parm->eoc_level;
ichg = pchg->chg_parm->ichg; ichg = pchg->chg_parm->ichg;
val = (ichg << 4) | eoc_level; val = (ichg << 4) | eoc_level;
lp8727_i2c_write_byte(pchg, CHGCTRL2, &val); lp8727_write_byte(pchg, CHGCTRL2, val);
} }
} }
} }
...@@ -439,15 +439,29 @@ static int lp8727_probe(struct i2c_client *cl, const struct i2c_device_id *id) ...@@ -439,15 +439,29 @@ static int lp8727_probe(struct i2c_client *cl, const struct i2c_device_id *id)
mutex_init(&pchg->xfer_lock); mutex_init(&pchg->xfer_lock);
lp8727_init_device(pchg); ret = lp8727_init_device(pchg);
lp8727_intr_config(pchg); if (ret) {
dev_err(pchg->dev, "i2c communication err: %d", ret);
goto error;
}
ret = lp8727_intr_config(pchg);
if (ret) {
dev_err(pchg->dev, "irq handler err: %d", ret);
goto error;
}
ret = lp8727_register_psy(pchg); ret = lp8727_register_psy(pchg);
if (ret) if (ret) {
dev_err(pchg->dev, dev_err(pchg->dev, "power supplies register err: %d", ret);
"can not register power supplies. err=%d", ret); goto error;
}
return 0; return 0;
error:
kfree(pchg);
return ret;
} }
static int __devexit lp8727_remove(struct i2c_client *cl) static int __devexit lp8727_remove(struct i2c_client *cl)
...@@ -466,6 +480,7 @@ static const struct i2c_device_id lp8727_ids[] = { ...@@ -466,6 +480,7 @@ static const struct i2c_device_id lp8727_ids[] = {
{"lp8727", 0}, {"lp8727", 0},
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, lp8727_ids);
static struct i2c_driver lp8727_driver = { static struct i2c_driver lp8727_driver = {
.driver = { .driver = {
...@@ -475,21 +490,9 @@ static struct i2c_driver lp8727_driver = { ...@@ -475,21 +490,9 @@ static struct i2c_driver lp8727_driver = {
.remove = __devexit_p(lp8727_remove), .remove = __devexit_p(lp8727_remove),
.id_table = lp8727_ids, .id_table = lp8727_ids,
}; };
module_i2c_driver(lp8727_driver);
static int __init lp8727_init(void) MODULE_DESCRIPTION("TI/National Semiconductor LP8727 charger driver");
{ MODULE_AUTHOR("Woogyom Kim <milo.kim@ti.com>, "
return i2c_add_driver(&lp8727_driver); "Daniel Jeong <daniel.jeong@ti.com>");
}
static void __exit lp8727_exit(void)
{
i2c_del_driver(&lp8727_driver);
}
module_init(lp8727_init);
module_exit(lp8727_exit);
MODULE_DESCRIPTION("National Semiconductor LP8727 charger driver");
MODULE_AUTHOR
("Woogyom Kim <milo.kim@ti.com>, Daniel Jeong <daniel.jeong@ti.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -290,18 +290,7 @@ static struct i2c_driver max17040_i2c_driver = { ...@@ -290,18 +290,7 @@ static struct i2c_driver max17040_i2c_driver = {
.resume = max17040_resume, .resume = max17040_resume,
.id_table = max17040_id, .id_table = max17040_id,
}; };
module_i2c_driver(max17040_i2c_driver);
static int __init max17040_init(void)
{
return i2c_add_driver(&max17040_i2c_driver);
}
module_init(max17040_init);
static void __exit max17040_exit(void)
{
i2c_del_driver(&max17040_i2c_driver);
}
module_exit(max17040_exit);
MODULE_AUTHOR("Minkyu Kang <mk7.kang@samsung.com>"); MODULE_AUTHOR("Minkyu Kang <mk7.kang@samsung.com>");
MODULE_DESCRIPTION("MAX17040 Fuel Gauge"); MODULE_DESCRIPTION("MAX17040 Fuel Gauge");
......
This diff is collapsed.
...@@ -852,18 +852,7 @@ static struct i2c_driver sbs_battery_driver = { ...@@ -852,18 +852,7 @@ static struct i2c_driver sbs_battery_driver = {
.of_match_table = sbs_dt_ids, .of_match_table = sbs_dt_ids,
}, },
}; };
module_i2c_driver(sbs_battery_driver);
static int __init sbs_battery_init(void)
{
return i2c_add_driver(&sbs_battery_driver);
}
module_init(sbs_battery_init);
static void __exit sbs_battery_exit(void)
{
i2c_del_driver(&sbs_battery_driver);
}
module_exit(sbs_battery_exit);
MODULE_DESCRIPTION("SBS battery monitor driver"); MODULE_DESCRIPTION("SBS battery monitor driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
This diff is collapsed.
...@@ -316,19 +316,7 @@ static struct i2c_driver z2_batt_driver = { ...@@ -316,19 +316,7 @@ static struct i2c_driver z2_batt_driver = {
.remove = __devexit_p(z2_batt_remove), .remove = __devexit_p(z2_batt_remove),
.id_table = z2_batt_id, .id_table = z2_batt_id,
}; };
module_i2c_driver(z2_batt_driver);
static int __init z2_batt_init(void)
{
return i2c_add_driver(&z2_batt_driver);
}
static void __exit z2_batt_exit(void)
{
i2c_del_driver(&z2_batt_driver);
}
module_init(z2_batt_init);
module_exit(z2_batt_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Peter Edwards <sweetlilmre@gmail.com>"); MODULE_AUTHOR("Peter Edwards <sweetlilmre@gmail.com>");
......
/* /*
* LP8727 Micro/Mini USB IC with integrated charger
*
* Copyright (C) 2011 Texas Instruments
* Copyright (C) 2011 National Semiconductor * Copyright (C) 2011 National Semiconductor
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -32,13 +35,24 @@ enum lp8727_ichg { ...@@ -32,13 +35,24 @@ enum lp8727_ichg {
ICHG_1000mA, ICHG_1000mA,
}; };
/**
* struct lp8727_chg_param
* @eoc_level : end of charge level setting
* @ichg : charging current
*/
struct lp8727_chg_param { struct lp8727_chg_param {
/* end of charge level setting */
enum lp8727_eoc_level eoc_level; enum lp8727_eoc_level eoc_level;
/* charging current */
enum lp8727_ichg ichg; enum lp8727_ichg ichg;
}; };
/**
* struct lp8727_platform_data
* @get_batt_present : check battery status - exists or not
* @get_batt_level : get battery voltage (mV)
* @get_batt_capacity : get battery capacity (%)
* @get_batt_temp : get battery temperature
* @ac, @usb : charging parameters each charger type
*/
struct lp8727_platform_data { struct lp8727_platform_data {
u8 (*get_batt_present)(void); u8 (*get_batt_present)(void);
u16 (*get_batt_level)(void); u16 (*get_batt_level)(void);
......
...@@ -146,6 +146,279 @@ struct abx500_init_settings { ...@@ -146,6 +146,279 @@ struct abx500_init_settings {
u8 setting; u8 setting;
}; };
/* Battery driver related data */
/*
* ADC for the battery thermistor.
* When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined
* with a NTC resistor to both identify the battery and to measure its
* temperature. Different phone manufactures uses different techniques to both
* identify the battery and to read its temperature.
*/
enum abx500_adc_therm {
ABx500_ADC_THERM_BATCTRL,
ABx500_ADC_THERM_BATTEMP,
};
/**
* struct abx500_res_to_temp - defines one point in a temp to res curve. To
* be used in battery packs that combines the identification resistor with a
* NTC resistor.
* @temp: battery pack temperature in Celcius
* @resist: NTC resistor net total resistance
*/
struct abx500_res_to_temp {
int temp;
int resist;
};
/**
* struct abx500_v_to_cap - Table for translating voltage to capacity
* @voltage: Voltage in mV
* @capacity: Capacity in percent
*/
struct abx500_v_to_cap {
int voltage;
int capacity;
};
/* Forward declaration */
struct abx500_fg;
/**
* struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds
* if not specified
* @recovery_sleep_timer: Time between measurements while recovering
* @recovery_total_time: Total recovery time
* @init_timer: Measurement interval during startup
* @init_discard_time: Time we discard voltage measurement at startup
* @init_total_time: Total init time during startup
* @high_curr_time: Time current has to be high to go to recovery
* @accu_charging: FG accumulation time while charging
* @accu_high_curr: FG accumulation time in high current mode
* @high_curr_threshold: High current threshold, in mA
* @lowbat_threshold: Low battery threshold, in mV
* @overbat_threshold: Over battery threshold, in mV
* @battok_falling_th_sel0 Threshold in mV for battOk signal sel0
* Resolution in 50 mV step.
* @battok_raising_th_sel1 Threshold in mV for battOk signal sel1
* Resolution in 50 mV step.
* @user_cap_limit Capacity reported from user must be within this
* limit to be considered as sane, in percentage
* points.
* @maint_thres This is the threshold where we stop reporting
* battery full while in maintenance, in per cent
*/
struct abx500_fg_parameters {
int recovery_sleep_timer;
int recovery_total_time;
int init_timer;
int init_discard_time;
int init_total_time;
int high_curr_time;
int accu_charging;
int accu_high_curr;
int high_curr_threshold;
int lowbat_threshold;
int overbat_threshold;
int battok_falling_th_sel0;
int battok_raising_th_sel1;
int user_cap_limit;
int maint_thres;
};
/**
* struct abx500_charger_maximization - struct used by the board config.
* @use_maxi: Enable maximization for this battery type
* @maxi_chg_curr: Maximum charger current allowed
* @maxi_wait_cycles: cycles to wait before setting charger current
* @charger_curr_step delta between two charger current settings (mA)
*/
struct abx500_maxim_parameters {
bool ena_maxi;
int chg_curr;
int wait_cycles;
int charger_curr_step;
};
/**
* struct abx500_battery_type - different batteries supported
* @name: battery technology
* @resis_high: battery upper resistance limit
* @resis_low: battery lower resistance limit
* @charge_full_design: Maximum battery capacity in mAh
* @nominal_voltage: Nominal voltage of the battery in mV
* @termination_vol: max voltage upto which battery can be charged
* @termination_curr battery charging termination current in mA
* @recharge_vol battery voltage limit that will trigger a new
* full charging cycle in the case where maintenan-
* -ce charging has been disabled
* @normal_cur_lvl: charger current in normal state in mA
* @normal_vol_lvl: charger voltage in normal state in mV
* @maint_a_cur_lvl: charger current in maintenance A state in mA
* @maint_a_vol_lvl: charger voltage in maintenance A state in mV
* @maint_a_chg_timer_h: charge time in maintenance A state
* @maint_b_cur_lvl: charger current in maintenance B state in mA
* @maint_b_vol_lvl: charger voltage in maintenance B state in mV
* @maint_b_chg_timer_h: charge time in maintenance B state
* @low_high_cur_lvl: charger current in temp low/high state in mA
* @low_high_vol_lvl: charger voltage in temp low/high state in mV'
* @battery_resistance: battery inner resistance in mOhm.
* @n_r_t_tbl_elements: number of elements in r_to_t_tbl
* @r_to_t_tbl: table containing resistance to temp points
* @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl
* @v_to_cap_tbl: Voltage to capacity (in %) table
* @n_batres_tbl_elements number of elements in the batres_tbl
* @batres_tbl battery internal resistance vs temperature table
*/
struct abx500_battery_type {
int name;
int resis_high;
int resis_low;
int charge_full_design;
int nominal_voltage;
int termination_vol;
int termination_curr;
int recharge_vol;
int normal_cur_lvl;
int normal_vol_lvl;
int maint_a_cur_lvl;
int maint_a_vol_lvl;
int maint_a_chg_timer_h;
int maint_b_cur_lvl;
int maint_b_vol_lvl;
int maint_b_chg_timer_h;
int low_high_cur_lvl;
int low_high_vol_lvl;
int battery_resistance;
int n_temp_tbl_elements;
struct abx500_res_to_temp *r_to_t_tbl;
int n_v_cap_tbl_elements;
struct abx500_v_to_cap *v_to_cap_tbl;
int n_batres_tbl_elements;
struct batres_vs_temp *batres_tbl;
};
/**
* struct abx500_bm_capacity_levels - abx500 capacity level data
* @critical: critical capacity level in percent
* @low: low capacity level in percent
* @normal: normal capacity level in percent
* @high: high capacity level in percent
* @full: full capacity level in percent
*/
struct abx500_bm_capacity_levels {
int critical;
int low;
int normal;
int high;
int full;
};
/**
* struct abx500_bm_charger_parameters - Charger specific parameters
* @usb_volt_max: maximum allowed USB charger voltage in mV
* @usb_curr_max: maximum allowed USB charger current in mA
* @ac_volt_max: maximum allowed AC charger voltage in mV
* @ac_curr_max: maximum allowed AC charger current in mA
*/
struct abx500_bm_charger_parameters {
int usb_volt_max;
int usb_curr_max;
int ac_volt_max;
int ac_curr_max;
};
/**
* struct abx500_bm_data - abx500 battery management data
* @temp_under under this temp, charging is stopped
* @temp_low between this temp and temp_under charging is reduced
* @temp_high between this temp and temp_over charging is reduced
* @temp_over over this temp, charging is stopped
* @temp_now present battery temperature
* @temp_interval_chg temperature measurement interval in s when charging
* @temp_interval_nochg temperature measurement interval in s when not charging
* @main_safety_tmr_h safety timer for main charger
* @usb_safety_tmr_h safety timer for usb charger
* @bkup_bat_v voltage which we charge the backup battery with
* @bkup_bat_i current which we charge the backup battery with
* @no_maintenance indicates that maintenance charging is disabled
* @abx500_adc_therm placement of thermistor, batctrl or battemp adc
* @chg_unknown_bat flag to enable charging of unknown batteries
* @enable_overshoot flag to enable VBAT overshoot control
* @auto_trig flag to enable auto adc trigger
* @fg_res resistance of FG resistor in 0.1mOhm
* @n_btypes number of elements in array bat_type
* @batt_id index of the identified battery in array bat_type
* @interval_charging charge alg cycle period time when charging (sec)
* @interval_not_charging charge alg cycle period time when not charging (sec)
* @temp_hysteresis temperature hysteresis
* @gnd_lift_resistance Battery ground to phone ground resistance (mOhm)
* @maxi: maximization parameters
* @cap_levels capacity in percent for the different capacity levels
* @bat_type table of supported battery types
* @chg_params charger parameters
* @fg_params fuel gauge parameters
*/
struct abx500_bm_data {
int temp_under;
int temp_low;
int temp_high;
int temp_over;
int temp_now;
int temp_interval_chg;
int temp_interval_nochg;
int main_safety_tmr_h;
int usb_safety_tmr_h;
int bkup_bat_v;
int bkup_bat_i;
bool no_maintenance;
bool chg_unknown_bat;
bool enable_overshoot;
bool auto_trig;
enum abx500_adc_therm adc_therm;
int fg_res;
int n_btypes;
int batt_id;
int interval_charging;
int interval_not_charging;
int temp_hysteresis;
int gnd_lift_resistance;
const struct abx500_maxim_parameters *maxi;
const struct abx500_bm_capacity_levels *cap_levels;
const struct abx500_battery_type *bat_type;
const struct abx500_bm_charger_parameters *chg_params;
const struct abx500_fg_parameters *fg_params;
};
struct abx500_chargalg_platform_data {
char **supplied_to;
size_t num_supplicants;
};
struct abx500_charger_platform_data {
char **supplied_to;
size_t num_supplicants;
bool autopower_cfg;
};
struct abx500_btemp_platform_data {
char **supplied_to;
size_t num_supplicants;
};
struct abx500_fg_platform_data {
char **supplied_to;
size_t num_supplicants;
};
struct abx500_bm_plat_data {
struct abx500_bm_data *battery;
struct abx500_charger_platform_data *charger;
struct abx500_btemp_platform_data *btemp;
struct abx500_fg_platform_data *fg;
struct abx500_chargalg_platform_data *chargalg;
};
int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg, int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg,
u8 value); u8 value);
int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg, int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg,
......
This diff is collapsed.
/*
* Copyright (C) ST-Ericsson SA 2012
* Author: Johan Gardsmark <johan.gardsmark@stericsson.com> for ST-Ericsson.
* License terms: GNU General Public License (GPL), version 2
*/
#ifndef _UX500_CHARGALG_H
#define _UX500_CHARGALG_H
#include <linux/power_supply.h>
#define psy_to_ux500_charger(x) container_of((x), \
struct ux500_charger, psy)
/* Forward declaration */
struct ux500_charger;
struct ux500_charger_ops {
int (*enable) (struct ux500_charger *, int, int, int);
int (*kick_wd) (struct ux500_charger *);
int (*update_curr) (struct ux500_charger *, int);
};
/**
* struct ux500_charger - power supply ux500 charger sub class
* @psy power supply base class
* @ops ux500 charger operations
* @max_out_volt maximum output charger voltage in mV
* @max_out_curr maximum output charger current in mA
*/
struct ux500_charger {
struct power_supply psy;
struct ux500_charger_ops ops;
int max_out_volt;
int max_out_curr;
};
#endif
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#define MAX17042_BATTERY_FULL (100) #define MAX17042_BATTERY_FULL (100)
#define MAX17042_DEFAULT_SNS_RESISTOR (10000) #define MAX17042_DEFAULT_SNS_RESISTOR (10000)
#define MAX17042_CHARACTERIZATION_DATA_SIZE 48
enum max17042_register { enum max17042_register {
MAX17042_STATUS = 0x00, MAX17042_STATUS = 0x00,
MAX17042_VALRT_Th = 0x01, MAX17042_VALRT_Th = 0x01,
...@@ -40,11 +42,11 @@ enum max17042_register { ...@@ -40,11 +42,11 @@ enum max17042_register {
MAX17042_VCELL = 0x09, MAX17042_VCELL = 0x09,
MAX17042_Current = 0x0A, MAX17042_Current = 0x0A,
MAX17042_AvgCurrent = 0x0B, MAX17042_AvgCurrent = 0x0B,
MAX17042_Qresidual = 0x0C,
MAX17042_SOC = 0x0D, MAX17042_SOC = 0x0D,
MAX17042_AvSOC = 0x0E, MAX17042_AvSOC = 0x0E,
MAX17042_RemCap = 0x0F, MAX17042_RemCap = 0x0F,
MAX17402_FullCAP = 0x10, MAX17042_FullCAP = 0x10,
MAX17042_TTE = 0x11, MAX17042_TTE = 0x11,
MAX17042_V_empty = 0x12, MAX17042_V_empty = 0x12,
...@@ -62,14 +64,14 @@ enum max17042_register { ...@@ -62,14 +64,14 @@ enum max17042_register {
MAX17042_AvCap = 0x1F, MAX17042_AvCap = 0x1F,
MAX17042_ManName = 0x20, MAX17042_ManName = 0x20,
MAX17042_DevName = 0x21, MAX17042_DevName = 0x21,
MAX17042_DevChem = 0x22,
MAX17042_FullCAPNom = 0x23,
MAX17042_TempNom = 0x24, MAX17042_TempNom = 0x24,
MAX17042_TempCold = 0x25, MAX17042_TempLim = 0x25,
MAX17042_TempHot = 0x26, MAX17042_TempHot = 0x26,
MAX17042_AIN = 0x27, MAX17042_AIN = 0x27,
MAX17042_LearnCFG = 0x28, MAX17042_LearnCFG = 0x28,
MAX17042_SHFTCFG = 0x29, MAX17042_FilterCFG = 0x29,
MAX17042_RelaxCFG = 0x2A, MAX17042_RelaxCFG = 0x2A,
MAX17042_MiscCFG = 0x2B, MAX17042_MiscCFG = 0x2B,
MAX17042_TGAIN = 0x2C, MAX17042_TGAIN = 0x2C,
...@@ -77,22 +79,41 @@ enum max17042_register { ...@@ -77,22 +79,41 @@ enum max17042_register {
MAX17042_CGAIN = 0x2E, MAX17042_CGAIN = 0x2E,
MAX17042_COFF = 0x2F, MAX17042_COFF = 0x2F,
MAX17042_Q_empty = 0x33, MAX17042_MaskSOC = 0x32,
MAX17042_SOC_empty = 0x33,
MAX17042_T_empty = 0x34, MAX17042_T_empty = 0x34,
MAX17042_FullCAP0 = 0x35,
MAX17042_LAvg_empty = 0x36,
MAX17042_FCTC = 0x37,
MAX17042_RCOMP0 = 0x38, MAX17042_RCOMP0 = 0x38,
MAX17042_TempCo = 0x39, MAX17042_TempCo = 0x39,
MAX17042_Rx = 0x3A, MAX17042_EmptyTempCo = 0x3A,
MAX17042_T_empty0 = 0x3B, MAX17042_K_empty0 = 0x3B,
MAX17042_TaskPeriod = 0x3C, MAX17042_TaskPeriod = 0x3C,
MAX17042_FSTAT = 0x3D, MAX17042_FSTAT = 0x3D,
MAX17042_SHDNTIMER = 0x3F, MAX17042_SHDNTIMER = 0x3F,
MAX17042_VFRemCap = 0x4A, MAX17042_dQacc = 0x45,
MAX17042_dPacc = 0x46,
MAX17042_VFSOC0 = 0x48,
MAX17042_QH = 0x4D, MAX17042_QH = 0x4D,
MAX17042_QL = 0x4E, MAX17042_QL = 0x4E,
MAX17042_VFSOC0Enable = 0x60,
MAX17042_MLOCKReg1 = 0x62,
MAX17042_MLOCKReg2 = 0x63,
MAX17042_MODELChrTbl = 0x80,
MAX17042_OCV = 0xEE,
MAX17042_OCVInternal = 0xFB,
MAX17042_VFSOC = 0xFF,
}; };
/* /*
...@@ -105,10 +126,64 @@ struct max17042_reg_data { ...@@ -105,10 +126,64 @@ struct max17042_reg_data {
u16 data; u16 data;
}; };
struct max17042_config_data {
/* External current sense resistor value in milli-ohms */
u32 cur_sense_val;
/* A/D measurement */
u16 tgain; /* 0x2C */
u16 toff; /* 0x2D */
u16 cgain; /* 0x2E */
u16 coff; /* 0x2F */
/* Alert / Status */
u16 valrt_thresh; /* 0x01 */
u16 talrt_thresh; /* 0x02 */
u16 soc_alrt_thresh; /* 0x03 */
u16 config; /* 0x01D */
u16 shdntimer; /* 0x03F */
/* App data */
u16 design_cap; /* 0x18 */
u16 ichgt_term; /* 0x1E */
/* MG3 config */
u16 at_rate; /* 0x04 */
u16 learn_cfg; /* 0x28 */
u16 filter_cfg; /* 0x29 */
u16 relax_cfg; /* 0x2A */
u16 misc_cfg; /* 0x2B */
u16 masksoc; /* 0x32 */
/* MG3 save and restore */
u16 fullcap; /* 0x10 */
u16 fullcapnom; /* 0x23 */
u16 socempty; /* 0x33 */
u16 lavg_empty; /* 0x36 */
u16 dqacc; /* 0x45 */
u16 dpacc; /* 0x46 */
/* Cell technology from power_supply.h */
u16 cell_technology;
/* Cell Data */
u16 vempty; /* 0x12 */
u16 temp_nom; /* 0x24 */
u16 temp_lim; /* 0x25 */
u16 fctc; /* 0x37 */
u16 rcomp0; /* 0x38 */
u16 tcompc0; /* 0x39 */
u16 empty_tempco; /* 0x3A */
u16 kempty0; /* 0x3B */
u16 cell_char_tbl[MAX17042_CHARACTERIZATION_DATA_SIZE];
} __packed;
struct max17042_platform_data { struct max17042_platform_data {
struct max17042_reg_data *init_data; struct max17042_reg_data *init_data;
struct max17042_config_data *config_data;
int num_init_data; /* Number of enties in init_data array */ int num_init_data; /* Number of enties in init_data array */
bool enable_current_sense; bool enable_current_sense;
bool enable_por_init; /* Use POR init from Maxim appnote */
/* /*
* R_sns in micro-ohms. * R_sns in micro-ohms.
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment