Skip to content

Commit 43007b8

Browse files
charmitrogregkh
authored andcommitted
usb: misc: apple-mfi-fastcharge: Make power supply names unique
When multiple Apple devices are connected concurrently, the apple-mfi-fastcharge driver fails to probe the subsequent devices with the following error: sysfs: cannot create duplicate filename '/class/power_supply/apple_mfi_fastcharge' apple-mfi-fastcharge 5-2.4.3.3: probe of 5-2.4.3.3 failed with error -17 This happens because the driver uses a fixed power supply name ("apple_mfi_fastcharge") for all devices, causing a sysfs name conflict when a second device is connected. Fix this by generating unique names using the USB bus and device number (e.g., "apple_mfi_fastcharge_5-12"). This ensures each connected device gets a unique power supply entry in sysfs. The change requires storing a copy of the power_supply_desc structure in the per-device mfi_device struct, since the name pointer needs to remain valid for the lifetime of the power supply registration. Fixes: 249fa82 ("USB: Add driver to control USB fast charge for iOS devices") Signed-off-by: Charalampos Mitrodimas <charmitro@posteo.net> Link: https://lore.kernel.org/r/20250602-apple-mfi-fastcharge-duplicate-sysfs-v1-1-5d84de34fac6@posteo.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 1f25307 commit 43007b8

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

drivers/usb/misc/apple-mfi-fastcharge.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ MODULE_DEVICE_TABLE(usb, mfi_fc_id_table);
4444
struct mfi_device {
4545
struct usb_device *udev;
4646
struct power_supply *battery;
47+
struct power_supply_desc battery_desc;
4748
int charge_type;
4849
};
4950

@@ -178,6 +179,7 @@ static int mfi_fc_probe(struct usb_device *udev)
178179
{
179180
struct power_supply_config battery_cfg = {};
180181
struct mfi_device *mfi = NULL;
182+
char *battery_name;
181183
int err;
182184

183185
if (!mfi_fc_match(udev))
@@ -187,23 +189,38 @@ static int mfi_fc_probe(struct usb_device *udev)
187189
if (!mfi)
188190
return -ENOMEM;
189191

192+
battery_name = kasprintf(GFP_KERNEL, "apple_mfi_fastcharge_%d-%d",
193+
udev->bus->busnum, udev->devnum);
194+
if (!battery_name) {
195+
err = -ENOMEM;
196+
goto err_free_mfi;
197+
}
198+
199+
mfi->battery_desc = apple_mfi_fc_desc;
200+
mfi->battery_desc.name = battery_name;
201+
190202
battery_cfg.drv_data = mfi;
191203

192204
mfi->charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
193205
mfi->battery = power_supply_register(&udev->dev,
194-
&apple_mfi_fc_desc,
206+
&mfi->battery_desc,
195207
&battery_cfg);
196208
if (IS_ERR(mfi->battery)) {
197209
dev_err(&udev->dev, "Can't register battery\n");
198210
err = PTR_ERR(mfi->battery);
199-
kfree(mfi);
200-
return err;
211+
goto err_free_name;
201212
}
202213

203214
mfi->udev = usb_get_dev(udev);
204215
dev_set_drvdata(&udev->dev, mfi);
205216

206217
return 0;
218+
219+
err_free_name:
220+
kfree(battery_name);
221+
err_free_mfi:
222+
kfree(mfi);
223+
return err;
207224
}
208225

209226
static void mfi_fc_disconnect(struct usb_device *udev)
@@ -213,6 +230,7 @@ static void mfi_fc_disconnect(struct usb_device *udev)
213230
mfi = dev_get_drvdata(&udev->dev);
214231
if (mfi->battery)
215232
power_supply_unregister(mfi->battery);
233+
kfree(mfi->battery_desc.name);
216234
dev_set_drvdata(&udev->dev, NULL);
217235
usb_put_dev(mfi->udev);
218236
kfree(mfi);

0 commit comments

Comments
 (0)