Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

power: bq27xxx_battery: Restore device name

Patch <703df6c09795> ("power: bq27xxx_battery: Reorganize I2C
into a module") has removed the device name numbering from
bq27xxx_battery_i2c_probe. Fix that by restoring the code.

Fixes: 703df6c097956d17a818e63961c82e8e9eef9fef
Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Tested-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>

authored by

Ivaylo Dimitrov and committed by
Sebastian Reichel
9aafabc7 e35a49b1

+35 -3
+34 -3
drivers/power/bq27xxx_battery_i2c.c
··· 21 21 22 22 #include <linux/power/bq27xxx_battery.h> 23 23 24 + static DEFINE_IDR(battery_id); 25 + static DEFINE_MUTEX(battery_mutex); 26 + 24 27 static irqreturn_t bq27xxx_battery_irq_handler_thread(int irq, void *data) 25 28 { 26 29 struct bq27xxx_device_info *di = data; ··· 73 70 { 74 71 struct bq27xxx_device_info *di; 75 72 int ret; 73 + char *name; 74 + int num; 75 + 76 + /* Get new ID for the new battery device */ 77 + mutex_lock(&battery_mutex); 78 + num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL); 79 + mutex_unlock(&battery_mutex); 80 + if (num < 0) 81 + return num; 82 + 83 + name = devm_kasprintf(&client->dev, GFP_KERNEL, "%s-%d", id->name, num); 84 + if (!name) 85 + goto err_mem; 76 86 77 87 di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL); 78 88 if (!di) 79 - return -ENOMEM; 89 + goto err_mem; 80 90 91 + di->id = num; 81 92 di->dev = &client->dev; 82 93 di->chip = id->driver_data; 83 - di->name = id->name; 94 + di->name = name; 84 95 di->bus.read = bq27xxx_battery_i2c_read; 85 96 86 97 ret = bq27xxx_battery_setup(di); 87 98 if (ret) 88 - return ret; 99 + goto err_failed; 89 100 90 101 /* Schedule a polling after about 1 min */ 91 102 schedule_delayed_work(&di->work, 60 * HZ); ··· 120 103 } 121 104 122 105 return 0; 106 + 107 + err_mem: 108 + ret = -ENOMEM; 109 + 110 + err_failed: 111 + mutex_lock(&battery_mutex); 112 + idr_remove(&battery_id, num); 113 + mutex_unlock(&battery_mutex); 114 + 115 + return ret; 123 116 } 124 117 125 118 static int bq27xxx_battery_i2c_remove(struct i2c_client *client) ··· 137 110 struct bq27xxx_device_info *di = i2c_get_clientdata(client); 138 111 139 112 bq27xxx_battery_teardown(di); 113 + 114 + mutex_lock(&battery_mutex); 115 + idr_remove(&battery_id, di->id); 116 + mutex_unlock(&battery_mutex); 140 117 141 118 return 0; 142 119 }
+1
include/linux/power/bq27xxx_battery.h
··· 49 49 50 50 struct bq27xxx_device_info { 51 51 struct device *dev; 52 + int id; 52 53 enum bq27xxx_chip chip; 53 54 const char *name; 54 55 struct bq27xxx_access_methods bus;