summaryrefslogtreecommitdiff
path: root/drivers/power/bq27x00_battery.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/bq27x00_battery.c')
-rw-r--r--drivers/power/bq27x00_battery.c119
1 files changed, 118 insertions, 1 deletions
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index c10f48b20c8..8c1546b7d37 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -43,8 +43,22 @@
#include <asm/unaligned.h>
#include <linux/wakelock.h>
+#include <linux/device.h>
#include <linux/power/bq27x00_battery.h>
+#ifdef CONFIG_OLIO_TS81001
+#include "../staging/triune/ts81001.h"
+#endif /* CONFIG_OLIO_TS81001 */
+
+
+#ifdef OLIODEBUG
+#define do { olio_debug(format, ...) printk("OLIO %s: ", __FUNCTION__); \
+ printk(format, ##__VA_ARGS__); } while(0)
+#else
+#define olio_debug(format, ...)
+#endif
+
+
#define DRIVER_VERSION "1.2.0"
#define INVALID_REG_ADDR 0xFF
@@ -1170,8 +1184,50 @@ static int bq27x00_battery_current(struct bq27x00_device_info *di,
return 0;
}
+#ifdef CONFIG_OLIO_TS81001
+
+static int bq27x00_charger_status(struct bq27x00_device_info *di) {
+ struct device * bq = di->dev;
+ struct bq27x00_platform_data * pdata = bq->platform_data;
+ struct ts81001 * ts81001;
+ ts81001_state_t state;
+
+ olio_debug("entered\n");
+
+ ts81001 = (struct ts81001 *) i2c_get_clientdata (pdata->charger_i2c);
+
+ if (ts81001 == NULL) {
+ olio_debug("Couldn't find charger struct!");
+ return -EINVAL;
+ }
+
+ olio_debug("Got client data for dev %s\n", dev_name(ts81001->dev));
+
+ state = ts81001->ops->get_status(ts81001);
+
+ olio_debug("Got status\n");
+
+ switch (state)
+ {
+ case NOT_CHARGING:
+ olio_debug("exiting, DISCHARGING\n");
+ return POWER_SUPPLY_STATUS_DISCHARGING;
+ case PRECHARGE:
+ case CHARGING_1C:
+ case TOPOFF:
+ olio_debug("exiting, CHARGING\n");
+ return POWER_SUPPLY_STATUS_CHARGING;
+ default:
+ olio_debug("Couldn't read status from ts81001 charger.\n");
+ olio_debug("exiting, EINVAL\n");
+ return -EINVAL;
+ }
+}
+
+#endif
+
static int bq27x00_battery_status(struct bq27x00_device_info *di,
- union power_supply_propval *val)
+ union power_supply_propval *val)
{
int status;
@@ -1187,10 +1243,15 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di,
} else {
if (di->cache.flags & BQ27XXX_FLAG_FC)
status = POWER_SUPPLY_STATUS_FULL;
+#ifdef CONFIG_OLIO_TS81001
+ else
+ status = bq27x00_charger_status (di);
+#else
else if (di->cache.flags & BQ27XXX_FLAG_DSC)
status = POWER_SUPPLY_STATUS_DISCHARGING;
else
status = POWER_SUPPLY_STATUS_CHARGING;
+#endif /* CONFIG_OLIO_TS81001 */
}
val->intval = status;
@@ -1681,15 +1742,67 @@ static const struct attribute_group bq27x00_attr_group = {
.attrs = bq27x00_attributes,
};
+#ifdef CONFIG_OLIO_TS81001
+
+/***************************************************************************
+ * bq27x00_set_platform_data - act on basic platform data
+ *
+ * We get the name of the charger passed in through the platform data
+ * structure. Now we need to find the device that it corresponds to, and
+ * it's i2c_client structure.
+ *
+ * Returns:
+ */
+
+static int bq27x00_set_platform_data (struct bq27x00_platform_data * pdata) {
+ int retval = 0;
+
+ olio_debug("entered\n");
+
+ pdata->charger_device =
+ bus_find_device_by_name(&i2c_bus_type,
+ NULL,
+ pdata->charger_name);
+ if (pdata->charger_device == NULL) {
+ olio_debug("couldn't find charger device by name (name=%s)\n",
+ pdata->charger_name);
+ retval = -ENXIO;
+ }
+ else { /* device found */
+ pdata->charger_i2c = i2c_verify_client(pdata->charger_device);
+
+ if (pdata->charger_i2c == NULL) {
+ olio_debug("couldn't find i2c_client for device name=%s\n",
+ pdata->charger_name);
+ retval = -ENXIO;
+ }
+ }
+
+ olio_debug("exiting\n");
+
+ return retval;
+}
+
+#endif /* CONFIG_OLIO_TS81001 */
+
static int __init bq27x00_battery_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
char *name;
struct bq27x00_device_info *di;
+ struct bq27x00_platform_data *pdata;
+
int num;
int retval = 0;
u8 *regs;
+#ifdef CONFIG_OLIO_TS81001
+ pdata = client->dev.platform_data;
+ retval = bq27x00_set_platform_data (pdata);
+ if (retval < 0)
+ return -EPROBE_DEFER;
+#endif /* CONFIG_OLIO_TS81001 */
+
/* Get new ID for the new battery device */
retval = idr_pre_get(&battery_id, GFP_KERNEL);
if (retval == 0)
@@ -1988,3 +2101,7 @@ module_exit(bq27x00_battery_exit);
MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
MODULE_DESCRIPTION("BQ27x00 battery monitor driver");
MODULE_LICENSE("GPL");
+
+#ifdef OLIODEBUG
+#undef OLIODEBUG
+#endif