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

Configure Feed

Select the types of activity you want to include in your feed.

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: 249fa8217b84 ("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>

authored by

Charalampos Mitrodimas and committed by
Greg Kroah-Hartman
43007b89 1f25307c

+21 -3
+21 -3
drivers/usb/misc/apple-mfi-fastcharge.c
··· 44 44 struct mfi_device { 45 45 struct usb_device *udev; 46 46 struct power_supply *battery; 47 + struct power_supply_desc battery_desc; 47 48 int charge_type; 48 49 }; 49 50 ··· 179 178 { 180 179 struct power_supply_config battery_cfg = {}; 181 180 struct mfi_device *mfi = NULL; 181 + char *battery_name; 182 182 int err; 183 183 184 184 if (!mfi_fc_match(udev)) ··· 189 187 if (!mfi) 190 188 return -ENOMEM; 191 189 190 + battery_name = kasprintf(GFP_KERNEL, "apple_mfi_fastcharge_%d-%d", 191 + udev->bus->busnum, udev->devnum); 192 + if (!battery_name) { 193 + err = -ENOMEM; 194 + goto err_free_mfi; 195 + } 196 + 197 + mfi->battery_desc = apple_mfi_fc_desc; 198 + mfi->battery_desc.name = battery_name; 199 + 192 200 battery_cfg.drv_data = mfi; 193 201 194 202 mfi->charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; 195 203 mfi->battery = power_supply_register(&udev->dev, 196 - &apple_mfi_fc_desc, 204 + &mfi->battery_desc, 197 205 &battery_cfg); 198 206 if (IS_ERR(mfi->battery)) { 199 207 dev_err(&udev->dev, "Can't register battery\n"); 200 208 err = PTR_ERR(mfi->battery); 201 - kfree(mfi); 202 - return err; 209 + goto err_free_name; 203 210 } 204 211 205 212 mfi->udev = usb_get_dev(udev); 206 213 dev_set_drvdata(&udev->dev, mfi); 207 214 208 215 return 0; 216 + 217 + err_free_name: 218 + kfree(battery_name); 219 + err_free_mfi: 220 + kfree(mfi); 221 + return err; 209 222 } 210 223 211 224 static void mfi_fc_disconnect(struct usb_device *udev) ··· 230 213 mfi = dev_get_drvdata(&udev->dev); 231 214 if (mfi->battery) 232 215 power_supply_unregister(mfi->battery); 216 + kfree(mfi->battery_desc.name); 233 217 dev_set_drvdata(&udev->dev, NULL); 234 218 usb_put_dev(mfi->udev); 235 219 kfree(mfi);