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

usb: misc: onboard_hub: use device supply names

The current implementation uses generic names for the power supplies,
which conflicts with proper name definitions in the device bindings.

Add a per-device property to include real supply names and keep generic
names for existing devices to keep backward compatibility.

Acked-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Javier Carrasco <javier.carrasco@wolfvision.net>
Link: https://lore.kernel.org/r/20240325-onboard_xvf3500-v8-1-29e3f9222922@wolfvision.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Javier Carrasco and committed by
Greg Kroah-Hartman
ec1848cd 47870bad

+39 -23
+26 -23
drivers/usb/misc/onboard_usb_hub.c
··· 29 29 30 30 #include "onboard_usb_hub.h" 31 31 32 - /* 33 - * Use generic names, as the actual names might differ between hubs. If a new 34 - * hub requires more than the currently supported supplies, add a new one here. 35 - */ 36 - static const char * const supply_names[] = { 37 - "vdd", 38 - "vdd2", 39 - }; 40 - 41 - #define MAX_SUPPLIES ARRAY_SIZE(supply_names) 42 - 43 32 static void onboard_hub_attach_usb_driver(struct work_struct *work); 44 33 45 34 static struct usb_device_driver onboard_hub_usbdev_driver; ··· 53 64 struct mutex lock; 54 65 struct clk *clk; 55 66 }; 67 + 68 + static int onboard_hub_get_regulators(struct onboard_hub *hub) 69 + { 70 + const char * const *supply_names = hub->pdata->supply_names; 71 + unsigned int num_supplies = hub->pdata->num_supplies; 72 + struct device *dev = hub->dev; 73 + unsigned int i; 74 + int err; 75 + 76 + if (num_supplies > MAX_SUPPLIES) 77 + return dev_err_probe(dev, -EINVAL, "max %d supplies supported!\n", 78 + MAX_SUPPLIES); 79 + 80 + for (i = 0; i < num_supplies; i++) 81 + hub->supplies[i].supply = supply_names[i]; 82 + 83 + err = devm_regulator_bulk_get(dev, num_supplies, hub->supplies); 84 + if (err) 85 + dev_err(dev, "Failed to get regulator supplies: %pe\n", 86 + ERR_PTR(err)); 87 + 88 + return err; 89 + } 56 90 57 91 static int onboard_hub_power_on(struct onboard_hub *hub) 58 92 { ··· 265 253 { 266 254 struct device *dev = &pdev->dev; 267 255 struct onboard_hub *hub; 268 - unsigned int i; 269 256 int err; 270 257 271 258 hub = devm_kzalloc(dev, sizeof(*hub), GFP_KERNEL); ··· 275 264 if (!hub->pdata) 276 265 return -EINVAL; 277 266 278 - if (hub->pdata->num_supplies > MAX_SUPPLIES) 279 - return dev_err_probe(dev, -EINVAL, "max %zu supplies supported!\n", 280 - MAX_SUPPLIES); 267 + hub->dev = dev; 281 268 282 - for (i = 0; i < hub->pdata->num_supplies; i++) 283 - hub->supplies[i].supply = supply_names[i]; 284 - 285 - err = devm_regulator_bulk_get(dev, hub->pdata->num_supplies, hub->supplies); 286 - if (err) { 287 - dev_err(dev, "Failed to get regulator supplies: %pe\n", ERR_PTR(err)); 269 + err = onboard_hub_get_regulators(hub); 270 + if (err) 288 271 return err; 289 - } 290 272 291 273 hub->clk = devm_clk_get_optional(dev, NULL); 292 274 if (IS_ERR(hub->clk)) ··· 290 286 if (IS_ERR(hub->reset_gpio)) 291 287 return dev_err_probe(dev, PTR_ERR(hub->reset_gpio), "failed to get reset GPIO\n"); 292 288 293 - hub->dev = dev; 294 289 mutex_init(&hub->lock); 295 290 INIT_LIST_HEAD(&hub->udev_list); 296 291
+13
drivers/usb/misc/onboard_usb_hub.h
··· 6 6 #ifndef _USB_MISC_ONBOARD_USB_HUB_H 7 7 #define _USB_MISC_ONBOARD_USB_HUB_H 8 8 9 + #define MAX_SUPPLIES 2 10 + 9 11 struct onboard_hub_pdata { 10 12 unsigned long reset_us; /* reset pulse width in us */ 11 13 unsigned int num_supplies; /* number of supplies */ 14 + const char * const supply_names[MAX_SUPPLIES]; 12 15 }; 13 16 14 17 static const struct onboard_hub_pdata microchip_usb424_data = { 15 18 .reset_us = 1, 16 19 .num_supplies = 1, 20 + .supply_names = { "vdd" }, 17 21 }; 18 22 19 23 static const struct onboard_hub_pdata microchip_usb5744_data = { 20 24 .reset_us = 0, 21 25 .num_supplies = 2, 26 + .supply_names = { "vdd", "vdd2" }, 22 27 }; 23 28 24 29 static const struct onboard_hub_pdata realtek_rts5411_data = { 25 30 .reset_us = 0, 26 31 .num_supplies = 1, 32 + .supply_names = { "vdd" }, 27 33 }; 28 34 29 35 static const struct onboard_hub_pdata ti_tusb8020b_data = { 30 36 .reset_us = 3000, 31 37 .num_supplies = 1, 38 + .supply_names = { "vdd" }, 32 39 }; 33 40 34 41 static const struct onboard_hub_pdata ti_tusb8041_data = { 35 42 .reset_us = 3000, 36 43 .num_supplies = 1, 44 + .supply_names = { "vdd" }, 37 45 }; 38 46 39 47 static const struct onboard_hub_pdata cypress_hx3_data = { 40 48 .reset_us = 10000, 41 49 .num_supplies = 2, 50 + .supply_names = { "vdd", "vdd2" }, 42 51 }; 43 52 44 53 static const struct onboard_hub_pdata cypress_hx2vl_data = { 45 54 .reset_us = 1, 46 55 .num_supplies = 1, 56 + .supply_names = { "vdd" }, 47 57 }; 48 58 49 59 static const struct onboard_hub_pdata genesys_gl850g_data = { 50 60 .reset_us = 3, 51 61 .num_supplies = 1, 62 + .supply_names = { "vdd" }, 52 63 }; 53 64 54 65 static const struct onboard_hub_pdata genesys_gl852g_data = { 55 66 .reset_us = 50, 56 67 .num_supplies = 1, 68 + .supply_names = { "vdd" }, 57 69 }; 58 70 59 71 static const struct onboard_hub_pdata vialab_vl817_data = { 60 72 .reset_us = 10, 61 73 .num_supplies = 1, 74 + .supply_names = { "vdd" }, 62 75 }; 63 76 64 77 static const struct of_device_id onboard_hub_match[] = {