aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/bq27x00_battery.c
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2010-05-24 13:37:58 -0400
committerLars-Peter Clausen <lars@metafoo.de>2011-02-22 05:02:41 -0500
commita40402ef0bf3b6e53a7dfd396e9487eb2f613e19 (patch)
tree69abcc1951f19164a0f96f7a5ec3cc004144bc49 /drivers/power/bq27x00_battery.c
parent3413b4ea250ff0b4142a154a2764e33979957e8b (diff)
bq27x00: Prepare code for addition of bq27000 platform driver
This patch simplifies the drivers data structure and moves code to be shared by the bq27000 and bq27200/bq27500 init functions into a common function. This patch has no functional changes, it only moves code around. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Rodolfo Giometti <giometti@linux.it> Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Diffstat (limited to 'drivers/power/bq27x00_battery.c')
-rw-r--r--drivers/power/bq27x00_battery.c86
1 files changed, 39 insertions, 47 deletions
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index 9f16666dc46..def951d8fc2 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -54,8 +54,8 @@ static DEFINE_MUTEX(battery_mutex);
54 54
55struct bq27x00_device_info; 55struct bq27x00_device_info;
56struct bq27x00_access_methods { 56struct bq27x00_access_methods {
57 int (*read)(u8 reg, int *rt_value, int b_single, 57 int (*read)(struct bq27x00_device_info *, u8 reg, int *rt_value,
58 struct bq27x00_device_info *di); 58 bool single);
59}; 59};
60 60
61enum bq27x00_chip { BQ27000, BQ27500 }; 61enum bq27x00_chip { BQ27000, BQ27500 };
@@ -63,11 +63,11 @@ enum bq27x00_chip { BQ27000, BQ27500 };
63struct bq27x00_device_info { 63struct bq27x00_device_info {
64 struct device *dev; 64 struct device *dev;
65 int id; 65 int id;
66 struct bq27x00_access_methods *bus;
67 struct power_supply bat;
68 enum bq27x00_chip chip; 66 enum bq27x00_chip chip;
69 67
70 struct i2c_client *client; 68 struct power_supply bat;
69
70 struct bq27x00_access_methods bus;
71}; 71};
72 72
73static enum power_supply_property bq27x00_battery_props[] = { 73static enum power_supply_property bq27x00_battery_props[] = {
@@ -87,10 +87,10 @@ static enum power_supply_property bq27x00_battery_props[] = {
87 * Common code for BQ27x00 devices 87 * Common code for BQ27x00 devices
88 */ 88 */
89 89
90static int bq27x00_read(u8 reg, int *rt_value, int b_single, 90static inline int bq27x00_read(struct bq27x00_device_info *di, u8 reg,
91 struct bq27x00_device_info *di) 91 int *rt_value, bool single)
92{ 92{
93 return di->bus->read(reg, rt_value, b_single, di); 93 return di->bus.read(di, reg, rt_value, single);
94} 94}
95 95
96/* 96/*
@@ -102,7 +102,7 @@ static int bq27x00_battery_temperature(struct bq27x00_device_info *di)
102 int ret; 102 int ret;
103 int temp = 0; 103 int temp = 0;
104 104
105 ret = bq27x00_read(BQ27x00_REG_TEMP, &temp, 0, di); 105 ret = bq27x00_read(di, BQ27x00_REG_TEMP, &temp, false);
106 if (ret) { 106 if (ret) {
107 dev_err(di->dev, "error reading temperature\n"); 107 dev_err(di->dev, "error reading temperature\n");
108 return ret; 108 return ret;
@@ -123,7 +123,7 @@ static int bq27x00_battery_voltage(struct bq27x00_device_info *di)
123 int ret; 123 int ret;
124 int volt = 0; 124 int volt = 0;
125 125
126 ret = bq27x00_read(BQ27x00_REG_VOLT, &volt, 0, di); 126 ret = bq27x00_read(di, BQ27x00_REG_VOLT, &volt, false);
127 if (ret) { 127 if (ret) {
128 dev_err(di->dev, "error reading voltage\n"); 128 dev_err(di->dev, "error reading voltage\n");
129 return ret; 129 return ret;
@@ -143,7 +143,7 @@ static int bq27x00_battery_current(struct bq27x00_device_info *di)
143 int curr = 0; 143 int curr = 0;
144 int flags = 0; 144 int flags = 0;
145 145
146 ret = bq27x00_read(BQ27x00_REG_AI, &curr, 0, di); 146 ret = bq27x00_read(di, BQ27x00_REG_AI, &curr, false);
147 if (ret) { 147 if (ret) {
148 dev_err(di->dev, "error reading current\n"); 148 dev_err(di->dev, "error reading current\n");
149 return 0; 149 return 0;
@@ -153,7 +153,7 @@ static int bq27x00_battery_current(struct bq27x00_device_info *di)
153 /* bq27500 returns signed value */ 153 /* bq27500 returns signed value */
154 curr = (int)((s16)curr) * 1000; 154 curr = (int)((s16)curr) * 1000;
155 } else { 155 } else {
156 ret = bq27x00_read(BQ27x00_REG_FLAGS, &flags, 0, di); 156 ret = bq27x00_read(di, BQ27x00_REG_FLAGS, &flags, false);
157 if (ret < 0) { 157 if (ret < 0) {
158 dev_err(di->dev, "error reading flags\n"); 158 dev_err(di->dev, "error reading flags\n");
159 return 0; 159 return 0;
@@ -178,9 +178,9 @@ static int bq27x00_battery_rsoc(struct bq27x00_device_info *di)
178 int rsoc = 0; 178 int rsoc = 0;
179 179
180 if (di->chip == BQ27500) 180 if (di->chip == BQ27500)
181 ret = bq27x00_read(BQ27500_REG_SOC, &rsoc, 0, di); 181 ret = bq27x00_read(di, BQ27500_REG_SOC, &rsoc, false);
182 else 182 else
183 ret = bq27x00_read(BQ27000_REG_RSOC, &rsoc, 1, di); 183 ret = bq27x00_read(di, BQ27000_REG_RSOC, &rsoc, true);
184 if (ret) { 184 if (ret) {
185 dev_err(di->dev, "error reading relative State-of-Charge\n"); 185 dev_err(di->dev, "error reading relative State-of-Charge\n");
186 return ret; 186 return ret;
@@ -196,7 +196,7 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di,
196 int status; 196 int status;
197 int ret; 197 int ret;
198 198
199 ret = bq27x00_read(BQ27x00_REG_FLAGS, &flags, 0, di); 199 ret = bq27x00_read(di, BQ27x00_REG_FLAGS, &flags, false);
200 if (ret < 0) { 200 if (ret < 0) {
201 dev_err(di->dev, "error reading flags\n"); 201 dev_err(di->dev, "error reading flags\n");
202 return ret; 202 return ret;
@@ -230,7 +230,7 @@ static int bq27x00_battery_time(struct bq27x00_device_info *di, int reg,
230 int tval = 0; 230 int tval = 0;
231 int ret; 231 int ret;
232 232
233 ret = bq27x00_read(reg, &tval, 0, di); 233 ret = bq27x00_read(di, reg, &tval, false);
234 if (ret) { 234 if (ret) {
235 dev_err(di->dev, "error reading register %02x\n", reg); 235 dev_err(di->dev, "error reading register %02x\n", reg);
236 return ret; 236 return ret;
@@ -296,23 +296,35 @@ static int bq27x00_battery_get_property(struct power_supply *psy,
296 return ret; 296 return ret;
297} 297}
298 298
299static void bq27x00_powersupply_init(struct bq27x00_device_info *di) 299static int bq27x00_powersupply_init(struct bq27x00_device_info *di)
300{ 300{
301 int ret;
302
301 di->bat.type = POWER_SUPPLY_TYPE_BATTERY; 303 di->bat.type = POWER_SUPPLY_TYPE_BATTERY;
302 di->bat.properties = bq27x00_battery_props; 304 di->bat.properties = bq27x00_battery_props;
303 di->bat.num_properties = ARRAY_SIZE(bq27x00_battery_props); 305 di->bat.num_properties = ARRAY_SIZE(bq27x00_battery_props);
304 di->bat.get_property = bq27x00_battery_get_property; 306 di->bat.get_property = bq27x00_battery_get_property;
305 di->bat.external_power_changed = NULL; 307 di->bat.external_power_changed = NULL;
308
309 ret = power_supply_register(di->dev, &di->bat);
310 if (ret) {
311 dev_err(di->dev, "failed to register battery: %d\n", ret);
312 return ret;
313 }
314
315 dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
316
317 return 0;
306} 318}
307 319
308/* 320/*
309 * i2c specific code 321 * i2c specific code
310 */ 322 */
311 323
312static int bq27x00_read_i2c(u8 reg, int *rt_value, int b_single, 324static int bq27x00_read_i2c(struct bq27x00_device_info *di, u8 reg,
313 struct bq27x00_device_info *di) 325 int *rt_value, bool single)
314{ 326{
315 struct i2c_client *client = di->client; 327 struct i2c_client *client = to_i2c_client(di->dev);
316 struct i2c_msg msg[1]; 328 struct i2c_msg msg[1];
317 unsigned char data[2]; 329 unsigned char data[2];
318 int err; 330 int err;
@@ -329,7 +341,7 @@ static int bq27x00_read_i2c(u8 reg, int *rt_value, int b_single,
329 err = i2c_transfer(client->adapter, msg, 1); 341 err = i2c_transfer(client->adapter, msg, 1);
330 342
331 if (err >= 0) { 343 if (err >= 0) {
332 if (!b_single) 344 if (!single)
333 msg->len = 2; 345 msg->len = 2;
334 else 346 else
335 msg->len = 1; 347 msg->len = 1;
@@ -337,7 +349,7 @@ static int bq27x00_read_i2c(u8 reg, int *rt_value, int b_single,
337 msg->flags = I2C_M_RD; 349 msg->flags = I2C_M_RD;
338 err = i2c_transfer(client->adapter, msg, 1); 350 err = i2c_transfer(client->adapter, msg, 1);
339 if (err >= 0) { 351 if (err >= 0) {
340 if (!b_single) 352 if (!single)
341 *rt_value = get_unaligned_le16(data); 353 *rt_value = get_unaligned_le16(data);
342 else 354 else
343 *rt_value = data[0]; 355 *rt_value = data[0];
@@ -353,7 +365,6 @@ static int bq27x00_battery_probe(struct i2c_client *client,
353{ 365{
354 char *name; 366 char *name;
355 struct bq27x00_device_info *di; 367 struct bq27x00_device_info *di;
356 struct bq27x00_access_methods *bus;
357 int num; 368 int num;
358 int retval = 0; 369 int retval = 0;
359 370
@@ -380,38 +391,20 @@ static int bq27x00_battery_probe(struct i2c_client *client,
380 retval = -ENOMEM; 391 retval = -ENOMEM;
381 goto batt_failed_2; 392 goto batt_failed_2;
382 } 393 }
394
383 di->id = num; 395 di->id = num;
396 di->dev = &client->dev;
384 di->chip = id->driver_data; 397 di->chip = id->driver_data;
398 di->bat.name = name;
399 di->bus.read = &bq27x00_read_i2c;
385 400
386 bus = kzalloc(sizeof(*bus), GFP_KERNEL); 401 if (bq27x00_powersupply_init(di))
387 if (!bus) {
388 dev_err(&client->dev, "failed to allocate access method "
389 "data\n");
390 retval = -ENOMEM;
391 goto batt_failed_3; 402 goto batt_failed_3;
392 }
393 403
394 i2c_set_clientdata(client, di); 404 i2c_set_clientdata(client, di);
395 di->dev = &client->dev;
396 di->bat.name = name;
397 bus->read = &bq27x00_read_i2c;
398 di->bus = bus;
399 di->client = client;
400
401 bq27x00_powersupply_init(di);
402
403 retval = power_supply_register(&client->dev, &di->bat);
404 if (retval) {
405 dev_err(&client->dev, "failed to register battery\n");
406 goto batt_failed_4;
407 }
408
409 dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION);
410 405
411 return 0; 406 return 0;
412 407
413batt_failed_4:
414 kfree(bus);
415batt_failed_3: 408batt_failed_3:
416 kfree(di); 409 kfree(di);
417batt_failed_2: 410batt_failed_2:
@@ -430,7 +423,6 @@ static int bq27x00_battery_remove(struct i2c_client *client)
430 423
431 power_supply_unregister(&di->bat); 424 power_supply_unregister(&di->bat);
432 425
433 kfree(di->bus);
434 kfree(di->bat.name); 426 kfree(di->bat.name);
435 427
436 mutex_lock(&battery_mutex); 428 mutex_lock(&battery_mutex);