diff options
Diffstat (limited to 'drivers/usb/common/usb-conn-gpio.c')
| -rw-r--r-- | drivers/usb/common/usb-conn-gpio.c | 25 | 
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c index 1e36be2a28fd..421c3af38e06 100644 --- a/drivers/usb/common/usb-conn-gpio.c +++ b/drivers/usb/common/usb-conn-gpio.c @@ -21,6 +21,9 @@  #include <linux/regulator/consumer.h>  #include <linux/string_choices.h>  #include <linux/usb/role.h> +#include <linux/idr.h> + +static DEFINE_IDA(usb_conn_ida);  #define USB_GPIO_DEB_MS		20	/* ms */  #define USB_GPIO_DEB_US		((USB_GPIO_DEB_MS) * 1000)	/* us */ @@ -30,6 +33,7 @@  struct usb_conn_info {  	struct device *dev; +	int conn_id; /* store the IDA-allocated ID */  	struct usb_role_switch *role_sw;  	enum usb_role last_role;  	struct regulator *vbus; @@ -161,7 +165,17 @@ static int usb_conn_psy_register(struct usb_conn_info *info)  		.fwnode = dev_fwnode(dev),  	}; -	desc->name = "usb-charger"; +	info->conn_id = ida_alloc(&usb_conn_ida, GFP_KERNEL); +	if (info->conn_id < 0) +		return info->conn_id; + +	desc->name = devm_kasprintf(dev, GFP_KERNEL, "usb-charger-%d", +				    info->conn_id); +	if (!desc->name) { +		ida_free(&usb_conn_ida, info->conn_id); +		return -ENOMEM; +	} +  	desc->properties = usb_charger_properties;  	desc->num_properties = ARRAY_SIZE(usb_charger_properties);  	desc->get_property = usb_charger_get_property; @@ -169,8 +183,10 @@ static int usb_conn_psy_register(struct usb_conn_info *info)  	cfg.drv_data = info;  	info->charger = devm_power_supply_register(dev, desc, &cfg); -	if (IS_ERR(info->charger)) -		dev_err(dev, "Unable to register charger\n"); +	if (IS_ERR(info->charger)) { +		dev_err(dev, "Unable to register charger %d\n", info->conn_id); +		ida_free(&usb_conn_ida, info->conn_id); +	}  	return PTR_ERR_OR_ZERO(info->charger);  } @@ -278,6 +294,9 @@ static void usb_conn_remove(struct platform_device *pdev)  	cancel_delayed_work_sync(&info->dw_det); +	if (info->charger) +		ida_free(&usb_conn_ida, info->conn_id); +  	if (info->last_role == USB_ROLE_HOST && info->vbus)  		regulator_disable(info->vbus);  | 
