Skip to contentSkip to conversation

add MAX17040 Fuel Gauge driver

PATCH Superseded Minkyu Kang 2 participants 3 messages Jun 3, 2009 – Jun 4, 2009

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 add MAX17040 Fuel Gauge driver

The MAX17040 is a I2C interfaced Fuel Gauge systems for lithium-ion batteries This patch adds support the MAX17040 Fuel Gauge

---
 drivers/power/Kconfig            |    8 +
 drivers/power/Makefile           |    3 +-
 drivers/power/max17040_battery.c |  304 ++++++++++++++++++++++++++++++++++++++
 include/linux/max17040_battery.h |   19 +++
 4 files changed, 333 insertions(+), 1 deletions(-)
 create mode 100644 drivers/power/max17040_battery.c
 create mode 100644 include/linux/max17040_battery.h
drivers/power/Kconfig +8 -0
index 33da112..6af5798 100644
@@ -88,4 +88,12 @@ config CHARGER_PCF50633
 	help
 	 Say Y to include support for NXP PCF50633 Main Battery Charger.
 
+config BATTERY_MAX17040
+	tristate "Maxim MAX17040 Fuel Gauge"
+	depends on I2C
+	help
+	  MAX17040 is fuel-gauge systems for lithium-ion (Li+) batteries
+	  in handheld and portable equipment. The MAX17040 is configured
+	  to operate with a single lithium cell
+
 endif # POWER_SUPPLY
drivers/power/Makefile +2 -1
index 2fcf41d..9c48995 100644
@@ -25,4 +25,5 @@ obj-$(CONFIG_BATTERY_TOSA)	+= tosa_battery.o
 obj-$(CONFIG_BATTERY_WM97XX)	+= wm97xx_battery.o
 obj-$(CONFIG_BATTERY_BQ27x00)	+= bq27x00_battery.o
 obj-$(CONFIG_BATTERY_DA9030)	+= da9030_battery.o
-obj-$(CONFIG_CHARGER_PCF50633)	+= pcf50633-charger.o
\ No newline at end of file
+obj-$(CONFIG_BATTERY_MAX17040))	+= max17040_battery.o
+obj-$(CONFIG_CHARGER_PCF50633)	+= pcf50633-charger.o
drivers/power/max17040_battery.c new file +304 -0

304 lines not on this page · raw message

include/linux/max17040_battery.h new file +19 -0
new file mode 100644
index 0000000..ad97b06
@@ -0,0 +1,19 @@
+/*
+ *  Copyright (C) 2009 Samsung Electronics
+ *  Minkyu Kang <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __MAX17040_BATTERY_H_
+#define __MAX17040_BATTERY_H_
+
+struct max17040_platform_data {
+	int (*battery_online)(void);
+	int (*charger_online)(void);
+	int (*charger_enable)(void);
+};
+
+#endif
Signature · 1 line
1.5.4.3
#1 lore raw
Quoted 9 lines · On Wed, 03 Jun 2009 11:09:04 +0900 Minkyu Kang <[email protected]> wrote:

The MAX17040 is a I2C interfaced Fuel Gauge systems for lithium-ion batteries This patch adds support the MAX17040 Fuel Gauge

---
 drivers/power/Kconfig            |    8 +
 drivers/power/Makefile           |    3 +-
 drivers/power/max17040_battery.c |  304 ++++++++++++++++++++++++++++++++++++++
 include/linux/max17040_battery.h |   19 +++

Please Cc Anton Vorontsov <[email protected]> on drivers/power patches.

Quoted 27 lines

...

drivers/power/max17040_battery.c new file +24 -0
+static int __devinit max17040_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct max17040_chip *chip;
+	int ret;
+
+	chip = kzalloc(sizeof(struct max17040_chip), GFP_KERNEL);
+	if (!chip)
+		return -ENOMEM;
+
+	chip->client = client;
+	pdata = client->dev.platform_data;
+
+	i2c_set_clientdata(client, chip);
+	max17040 = chip;
+
+	max17040_reset();
+
+	max17040_get_version();
+
+	INIT_DELAYED_WORK_DEFERRABLE(&chip->work, max17040_work);
+	schedule_delayed_work(&chip->work, MAX17040_DELAY);
+
+	bat_ps.properties = max17040_battery_props;

drivers/power/max17040_battery.c line 239

Quoted 10 lines
drivers/power/max17040_battery.c new file +10 -0
+	bat_ps.num_properties = ARRAY_SIZE(max17040_battery_props);
+
+	ret = power_supply_register(&client->dev, &bat_ps);
+	if (ret) {
+		dev_err(&max17040->client->dev,
+				"failed: power supply register\n");
+		kfree(chip);
+		max17040 = NULL;
+		i2c_set_clientdata(client, NULL);
+		return -1;

This leaves the delayed work still pending.

Quoted 5 lines
drivers/power/max17040_battery.c new file +5 -0
+	}
+
+	return 0;
+}
+

drivers/power/max17040_battery.c line 254

Quoted 10 lines
drivers/power/max17040_battery.c new file +10 -0
+static int __devexit max17040_remove(struct i2c_client *client)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	kfree(chip);
+	max17040 = NULL;
+	i2c_set_clientdata(client, NULL);
+	power_supply_unregister(&bat_ps);
+	return 0;
+}

Shouldn't max17040_remove() also cancel the delayed_work?

Quoted 16 lines
drivers/power/max17040_battery.c new file +16 -0
+static int max17040_suspend(struct i2c_client *client,
+		pm_message_t state)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	cancel_delayed_work(&chip->work);
+	return 0;
+}
+
+static int max17040_resume(struct i2c_client *client)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	schedule_delayed_work(&chip->work, MAX17040_DELAY);
+	return 0;
+}
#2 lore raw
In reply to Minkyu Kang
Quoted 9 lines · On Wed, 03 Jun 2009 11:09:04 +0900 Minkyu Kang <[email protected]> wrote:

The MAX17040 is a I2C interfaced Fuel Gauge systems for lithium-ion batteries This patch adds support the MAX17040 Fuel Gauge

---
 drivers/power/Kconfig            |    8 +
 drivers/power/Makefile           |    3 +-
 drivers/power/max17040_battery.c |  304 ++++++++++++++++++++++++++++++++++++++
 include/linux/max17040_battery.h |   19 +++

Please Cc Anton Vorontsov <[email protected]> on drivers/power patches.

Quoted 27 lines

...

drivers/power/max17040_battery.c new file +24 -0
+static int __devinit max17040_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct max17040_chip *chip;
+	int ret;
+
+	chip = kzalloc(sizeof(struct max17040_chip), GFP_KERNEL);
+	if (!chip)
+		return -ENOMEM;
+
+	chip->client = client;
+	pdata = client->dev.platform_data;
+
+	i2c_set_clientdata(client, chip);
+	max17040 = chip;
+
+	max17040_reset();
+
+	max17040_get_version();
+
+	INIT_DELAYED_WORK_DEFERRABLE(&chip->work, max17040_work);
+	schedule_delayed_work(&chip->work, MAX17040_DELAY);
+
+	bat_ps.properties = max17040_battery_props;

drivers/power/max17040_battery.c line 239

Quoted 10 lines
drivers/power/max17040_battery.c new file +10 -0
+	bat_ps.num_properties = ARRAY_SIZE(max17040_battery_props);
+
+	ret = power_supply_register(&client->dev, &bat_ps);
+	if (ret) {
+		dev_err(&max17040->client->dev,
+				"failed: power supply register\n");
+		kfree(chip);
+		max17040 = NULL;
+		i2c_set_clientdata(client, NULL);
+		return -1;

This leaves the delayed work still pending.

Quoted 5 lines
drivers/power/max17040_battery.c new file +5 -0
+	}
+
+	return 0;
+}
+

drivers/power/max17040_battery.c line 254

Quoted 10 lines
drivers/power/max17040_battery.c new file +10 -0
+static int __devexit max17040_remove(struct i2c_client *client)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	kfree(chip);
+	max17040 = NULL;
+	i2c_set_clientdata(client, NULL);
+	power_supply_unregister(&bat_ps);
+	return 0;
+}

Shouldn't max17040_remove() also cancel the delayed_work?

Quoted 16 lines
drivers/power/max17040_battery.c new file +16 -0
+static int max17040_suspend(struct i2c_client *client,
+		pm_message_t state)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	cancel_delayed_work(&chip->work);
+	return 0;
+}
+
+static int max17040_resume(struct i2c_client *client)
+{
+	struct max17040_chip *chip = i2c_get_clientdata(client);
+
+	schedule_delayed_work(&chip->work, MAX17040_DELAY);
+	return 0;
+}