Message ID | 20230620-hx3-v6-1-6a1d6f8ce689@skidata.com |
---|---|
State | Superseded |
Headers | show |
Series | usb: misc: onboard_usb_hub: add support for Cypress HX3 USB 3.0 family | expand |
Hi Benjamin, kernel test robot noticed the following build warnings: [auto build test WARNING on 45a3e24f65e90a047bef86f927ebdc4c710edaa1] url: https://github.com/intel-lab-lkp/linux/commits/Benjamin-Bara/usb-misc-onboard-hub-support-multiple-power-supplies/20230623-142256 base: 45a3e24f65e90a047bef86f927ebdc4c710edaa1 patch link: https://lore.kernel.org/r/20230620-hx3-v6-1-6a1d6f8ce689%40skidata.com patch subject: [PATCH v6 1/3] usb: misc: onboard-hub: support multiple power supplies config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230623/202306231557.18uGlgSW-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230623/202306231557.18uGlgSW-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202306231557.18uGlgSW-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/usb/misc/onboard_usb_hub.c: In function 'onboard_hub_probe': >> drivers/usb/misc/onboard_usb_hub.c:262:59: warning: format '%ld' expects argument of type 'long int', but argument 4 has type 'unsigned int' [-Wformat=] 262 | return dev_err_probe(dev, -EINVAL, "max %ld supplies supported!\n", | ~~^ | | | long int | %d vim +262 drivers/usb/misc/onboard_usb_hub.c 240 241 static int onboard_hub_probe(struct platform_device *pdev) 242 { 243 const struct of_device_id *of_id; 244 struct device *dev = &pdev->dev; 245 struct onboard_hub *hub; 246 unsigned int i; 247 int err; 248 249 hub = devm_kzalloc(dev, sizeof(*hub), GFP_KERNEL); 250 if (!hub) 251 return -ENOMEM; 252 253 of_id = of_match_device(onboard_hub_match, &pdev->dev); 254 if (!of_id) 255 return -ENODEV; 256 257 hub->pdata = of_id->data; 258 if (!hub->pdata) 259 return -EINVAL; 260 261 if (hub->pdata->num_supplies > MAX_SUPPLIES) > 262 return dev_err_probe(dev, -EINVAL, "max %ld supplies supported!\n", 263 MAX_SUPPLIES); 264 265 for (i = 0; i < hub->pdata->num_supplies; i++) 266 hub->supplies[i].supply = supply_names[i]; 267 268 err = devm_regulator_bulk_get(dev, hub->pdata->num_supplies, hub->supplies); 269 if (err) { 270 dev_err(dev, "Failed to get regulator supplies: %d\n", err); 271 return err; 272 } 273 274 hub->reset_gpio = devm_gpiod_get_optional(dev, "reset", 275 GPIOD_OUT_HIGH); 276 if (IS_ERR(hub->reset_gpio)) 277 return dev_err_probe(dev, PTR_ERR(hub->reset_gpio), "failed to get reset GPIO\n"); 278 279 hub->dev = dev; 280 mutex_init(&hub->lock); 281 INIT_LIST_HEAD(&hub->udev_list); 282 283 dev_set_drvdata(dev, hub); 284 285 err = onboard_hub_power_on(hub); 286 if (err) 287 return err; 288 289 /* 290 * The USB driver might have been detached from the USB devices by 291 * onboard_hub_remove() (e.g. through an 'unbind' by userspace), 292 * make sure to re-attach it if needed. 293 * 294 * This needs to be done deferred to avoid self-deadlocks on systems 295 * with nested onboard hubs. 296 */ 297 schedule_work(&attach_usb_driver_work); 298 299 return 0; 300 } 301
diff --git a/drivers/usb/misc/onboard_usb_hub.c b/drivers/usb/misc/onboard_usb_hub.c index 12fc6eb67c3b..ff0bdd49ada5 100644 --- a/drivers/usb/misc/onboard_usb_hub.c +++ b/drivers/usb/misc/onboard_usb_hub.c @@ -27,6 +27,17 @@ #include "onboard_usb_hub.h" +/* + * Use generic names, as the actual names might differ between hubs. If a new + * hub requires more than the currently supported supplies, add a new one here. + */ +static const char * const supply_names[] = { + "vdd", + "vdd2", +}; + +#define MAX_SUPPLIES ARRAY_SIZE(supply_names) + static void onboard_hub_attach_usb_driver(struct work_struct *work); static struct usb_device_driver onboard_hub_usbdev_driver; @@ -40,7 +51,7 @@ struct usbdev_node { }; struct onboard_hub { - struct regulator *vdd; + struct regulator_bulk_data supplies[MAX_SUPPLIES]; struct device *dev; const struct onboard_hub_pdata *pdata; struct gpio_desc *reset_gpio; @@ -55,9 +66,9 @@ static int onboard_hub_power_on(struct onboard_hub *hub) { int err; - err = regulator_enable(hub->vdd); + err = regulator_bulk_enable(hub->pdata->num_supplies, hub->supplies); if (err) { - dev_err(hub->dev, "failed to enable regulator: %d\n", err); + dev_err(hub->dev, "failed to enable supplies: %d\n", err); return err; } @@ -75,9 +86,9 @@ static int onboard_hub_power_off(struct onboard_hub *hub) gpiod_set_value_cansleep(hub->reset_gpio, 1); - err = regulator_disable(hub->vdd); + err = regulator_bulk_disable(hub->pdata->num_supplies, hub->supplies); if (err) { - dev_err(hub->dev, "failed to disable regulator: %d\n", err); + dev_err(hub->dev, "failed to disable supplies: %d\n", err); return err; } @@ -232,6 +243,7 @@ static int onboard_hub_probe(struct platform_device *pdev) const struct of_device_id *of_id; struct device *dev = &pdev->dev; struct onboard_hub *hub; + unsigned int i; int err; hub = devm_kzalloc(dev, sizeof(*hub), GFP_KERNEL); @@ -246,9 +258,18 @@ static int onboard_hub_probe(struct platform_device *pdev) if (!hub->pdata) return -EINVAL; - hub->vdd = devm_regulator_get(dev, "vdd"); - if (IS_ERR(hub->vdd)) - return PTR_ERR(hub->vdd); + if (hub->pdata->num_supplies > MAX_SUPPLIES) + return dev_err_probe(dev, -EINVAL, "max %ld supplies supported!\n", + MAX_SUPPLIES); + + for (i = 0; i < hub->pdata->num_supplies; i++) + hub->supplies[i].supply = supply_names[i]; + + err = devm_regulator_bulk_get(dev, hub->pdata->num_supplies, hub->supplies); + if (err) { + dev_err(dev, "Failed to get regulator supplies: %d\n", err); + return err; + } hub->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); diff --git a/drivers/usb/misc/onboard_usb_hub.h b/drivers/usb/misc/onboard_usb_hub.h index aca5f50eb0da..41a4127a92dc 100644 --- a/drivers/usb/misc/onboard_usb_hub.h +++ b/drivers/usb/misc/onboard_usb_hub.h @@ -8,30 +8,37 @@ struct onboard_hub_pdata { unsigned long reset_us; /* reset pulse width in us */ + unsigned int num_supplies; /* number of supplies */ }; static const struct onboard_hub_pdata microchip_usb424_data = { .reset_us = 1, + .num_supplies = 1, }; static const struct onboard_hub_pdata realtek_rts5411_data = { .reset_us = 0, + .num_supplies = 1, }; static const struct onboard_hub_pdata ti_tusb8041_data = { .reset_us = 3000, + .num_supplies = 1, }; static const struct onboard_hub_pdata genesys_gl850g_data = { .reset_us = 3, + .num_supplies = 1, }; static const struct onboard_hub_pdata genesys_gl852g_data = { .reset_us = 50, + .num_supplies = 1, }; static const struct onboard_hub_pdata vialab_vl817_data = { .reset_us = 10, + .num_supplies = 1, }; static const struct of_device_id onboard_hub_match[] = {