|
20 | 20 | #include <linux/power_supply.h>
|
21 | 21 | #include <linux/regulator/consumer.h>
|
22 | 22 | #include <linux/usb/role.h>
|
| 23 | +#include <linux/idr.h> |
| 24 | + |
| 25 | +static DEFINE_IDA(usb_conn_ida); |
23 | 26 |
|
24 | 27 | #define USB_GPIO_DEB_MS 20 /* ms */
|
25 | 28 | #define USB_GPIO_DEB_US ((USB_GPIO_DEB_MS) * 1000) /* us */
|
|
29 | 32 |
|
30 | 33 | struct usb_conn_info {
|
31 | 34 | struct device *dev;
|
| 35 | + int conn_id; /* store the IDA-allocated ID */ |
32 | 36 | struct usb_role_switch *role_sw;
|
33 | 37 | enum usb_role last_role;
|
34 | 38 | struct regulator *vbus;
|
@@ -160,16 +164,28 @@ static int usb_conn_psy_register(struct usb_conn_info *info)
|
160 | 164 | .of_node = dev->of_node,
|
161 | 165 | };
|
162 | 166 |
|
163 |
| - desc->name = "usb-charger"; |
| 167 | + info->conn_id = ida_alloc(&usb_conn_ida, GFP_KERNEL); |
| 168 | + if (info->conn_id < 0) |
| 169 | + return info->conn_id; |
| 170 | + |
| 171 | + desc->name = devm_kasprintf(dev, GFP_KERNEL, "usb-charger-%d", |
| 172 | + info->conn_id); |
| 173 | + if (!desc->name) { |
| 174 | + ida_free(&usb_conn_ida, info->conn_id); |
| 175 | + return -ENOMEM; |
| 176 | + } |
| 177 | + |
164 | 178 | desc->properties = usb_charger_properties;
|
165 | 179 | desc->num_properties = ARRAY_SIZE(usb_charger_properties);
|
166 | 180 | desc->get_property = usb_charger_get_property;
|
167 | 181 | desc->type = POWER_SUPPLY_TYPE_USB;
|
168 | 182 | cfg.drv_data = info;
|
169 | 183 |
|
170 | 184 | info->charger = devm_power_supply_register(dev, desc, &cfg);
|
171 |
| - if (IS_ERR(info->charger)) |
172 |
| - dev_err(dev, "Unable to register charger\n"); |
| 185 | + if (IS_ERR(info->charger)) { |
| 186 | + dev_err(dev, "Unable to register charger %d\n", info->conn_id); |
| 187 | + ida_free(&usb_conn_ida, info->conn_id); |
| 188 | + } |
173 | 189 |
|
174 | 190 | return PTR_ERR_OR_ZERO(info->charger);
|
175 | 191 | }
|
@@ -277,6 +293,9 @@ static void usb_conn_remove(struct platform_device *pdev)
|
277 | 293 |
|
278 | 294 | cancel_delayed_work_sync(&info->dw_det);
|
279 | 295 |
|
| 296 | + if (info->charger) |
| 297 | + ida_free(&usb_conn_ida, info->conn_id); |
| 298 | + |
280 | 299 | if (info->last_role == USB_ROLE_HOST && info->vbus)
|
281 | 300 | regulator_disable(info->vbus);
|
282 | 301 |
|
|
0 commit comments