lkml.org 
[lkml]   [2009]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[rfc/patch 02/15] power: bq27200: this is an i2c device
Date
... with hardcoded device address so i2c subsystem won't
talk to more than one of those.

Signed-off-by: Felipe Balbi <me@felipebalbi.com>
---
drivers/power/bq27200_battery.c | 55 +++++---------------------------------
1 files changed, 8 insertions(+), 47 deletions(-)

diff --git a/drivers/power/bq27200_battery.c b/drivers/power/bq27200_battery.c
index f31f167..1978cd9 100644
--- a/drivers/power/bq27200_battery.c
+++ b/drivers/power/bq27200_battery.c
@@ -22,9 +22,7 @@
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
-#include <linux/idr.h>
#include <linux/i2c.h>
-#include <asm/unaligned.h>

#define DRIVER_VERSION "1.0.0"

@@ -34,12 +32,6 @@
#define BQ27200_REG_AI 0x14
#define BQ27200_REG_FLAGS 0x0A

-/* If the system has several batteries we need a different name for each
- * of them...
- */
-static DEFINE_IDR(battery_id);
-static DEFINE_MUTEX(battery_mutex);
-
struct bq27200_device_info;
struct bq27200_access_methods {
int (*read)(u8 reg, int *rt_value, int b_single,
@@ -48,7 +40,6 @@ struct bq27200_access_methods {

struct bq27200_device_info {
struct device *dev;
- int id;
int voltage_uV;
int current_uA;
int temp_C;
@@ -251,48 +242,28 @@ static int _bq27200_read(u8 reg, int *rt_value, int b_single,
static int bq27200_battery_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
- char *name;
struct bq27200_device_info *di;
struct bq27200_access_methods *bus;
- int num;
int retval = 0;

- /* Get new ID for the new battery device */
- retval = idr_pre_get(&battery_id, GFP_KERNEL);
- if (retval == 0)
- return -ENOMEM;
- mutex_lock(&battery_mutex);
- retval = idr_get_new(&battery_id, client, &num);
- mutex_unlock(&battery_mutex);
- if (retval < 0)
- return retval;
-
- name = kasprintf(GFP_KERNEL, "bq27200-%d", num);
- if (!name) {
- dev_err(&client->dev, "failed to allocate device name\n");
- retval = -ENOMEM;
- goto batt_failed_1;
- }
-
di = kzalloc(sizeof(*di), GFP_KERNEL);
if (!di) {
dev_err(&client->dev, "failed to allocate device info data\n");
retval = -ENOMEM;
- goto batt_failed_2;
+ goto batt_failed_1;
}
- di->id = num;

bus = kzalloc(sizeof(*bus), GFP_KERNEL);
if (!bus) {
dev_err(&client->dev, "failed to allocate access method "
"data\n");
retval = -ENOMEM;
- goto batt_failed_3;
+ goto batt_failed_2;
}

i2c_set_clientdata(client, di);
di->dev = &client->dev;
- di->bat.name = name;
+ di->bat.name = client->name;
bus->read = &_bq27200_read;
di->bus = bus;
di->client = client;
@@ -302,24 +273,20 @@ static int bq27200_battery_probe(struct i2c_client *client,
retval = power_supply_register(&client->dev, &di->bat);
if (retval) {
dev_err(&client->dev, "failed to register battery\n");
- goto batt_failed_4;
+ goto batt_failed_3;
}

dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION);

return 0;

-batt_failed_4:
- kfree(bus);
batt_failed_3:
- kfree(di);
+ kfree(bus);
+
batt_failed_2:
- kfree(name);
-batt_failed_1:
- mutex_lock(&battery_mutex);
- idr_remove(&battery_id, num);
- mutex_unlock(&battery_mutex);
+ kfree(di);

+batt_failed_1:
return retval;
}

@@ -328,13 +295,7 @@ static int bq27200_battery_remove(struct i2c_client *client)
struct bq27200_device_info *di = i2c_get_clientdata(client);

power_supply_unregister(&di->bat);
-
kfree(di->bat.name);
-
- mutex_lock(&battery_mutex);
- idr_remove(&battery_id, di->id);
- mutex_unlock(&battery_mutex);
-
kfree(di);

return 0;
--
1.6.1.3


\
 
 \ /
  Last update: 2009-07-12 20:37    [W:1.936 / U:0.832 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site