diff mbox series

[v6,1/3] usb: misc: onboard-hub: support multiple power supplies

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

Commit Message

Benjamin Bara June 23, 2023, 6:20 a.m. UTC
From: Benjamin Bara <benjamin.bara@skidata.com>

As some of the onboard hubs require multiple power supplies, provide the
environment to support them.

Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
---
v6:
- %d -> %ld

v5:
- use ARRAY_SIZE(supply_names) for MAX_SUPPLIES

v4:
- set num_supplies=1 for the existing hubs
- drop duplicate num_supplies in onboard_hub struct
- clarify connection between supply_names and MAX_SUPPLIES

v3:
- fix nits mentioned in v2

v2:
- replace (err != 0) with (err)
---
 drivers/usb/misc/onboard_usb_hub.c | 37 +++++++++++++++++++++++++++++--------
 drivers/usb/misc/onboard_usb_hub.h |  7 +++++++
 2 files changed, 36 insertions(+), 8 deletions(-)

Comments

kernel test robot June 23, 2023, 7:17 a.m. UTC | #1
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 mbox series

Patch

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[] = {