[PATCH v4 6/8] usb: misc: onboard_dev: use device supply names

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The current mechanism 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 as a fallback mechanism for backward compatibility.

Signed-off-by: Javier Carrasco <javier.carrasco@xxxxxxxxxxxxxx>
---
 drivers/usb/misc/onboard_usb_dev.c | 54 ++++++++++++++++++++------------------
 drivers/usb/misc/onboard_usb_dev.h | 23 ++++++++++++++++
 2 files changed, 52 insertions(+), 25 deletions(-)

diff --git a/drivers/usb/misc/onboard_usb_dev.c b/drivers/usb/misc/onboard_usb_dev.c
index f43130a6786f..e66fcac93006 100644
--- a/drivers/usb/misc/onboard_usb_dev.c
+++ b/drivers/usb/misc/onboard_usb_dev.c
@@ -29,18 +29,6 @@
 
 #include "onboard_usb_dev.h"
 
-/*
- * Use generic names, as the actual names might differ between devices. If a new
- * device 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_dev_attach_usb_driver(struct work_struct *work);
 
 static struct usb_device_driver onboard_dev_usbdev_driver;
@@ -66,6 +54,33 @@ struct onboard_dev {
 	struct clk *clk;
 };
 
+static int onboard_dev_get_regulator_bulk(struct device *dev,
+					  struct onboard_dev *onboard_dev)
+{
+	unsigned int i;
+	int err;
+
+	const char * const *supply_names = onboard_dev->pdata->supply_names;
+
+	if (onboard_dev->pdata->num_supplies > MAX_SUPPLIES)
+		return dev_err_probe(dev, -EINVAL, "max %zu supplies supported!\n",
+				     MAX_SUPPLIES);
+
+	if (!supply_names[0])
+		supply_names = generic_supply_names;
+
+	for (i = 0; i < onboard_dev->pdata->num_supplies; i++)
+		onboard_dev->supplies[i].supply = supply_names[i];
+
+	err = devm_regulator_bulk_get(dev, onboard_dev->pdata->num_supplies,
+				      onboard_dev->supplies);
+	if (err)
+		dev_err(dev, "Failed to get regulator supplies: %pe\n",
+			ERR_PTR(err));
+
+	return err;
+}
+
 static int onboard_dev_power_on(struct onboard_dev *onboard_dev)
 {
 	int err;
@@ -266,7 +281,6 @@ static int onboard_dev_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct onboard_dev *onboard_dev;
-	unsigned int i;
 	int err;
 
 	onboard_dev = devm_kzalloc(dev, sizeof(*onboard_dev), GFP_KERNEL);
@@ -277,19 +291,9 @@ static int onboard_dev_probe(struct platform_device *pdev)
 	if (!onboard_dev->pdata)
 		return -EINVAL;
 
-	if (onboard_dev->pdata->num_supplies > MAX_SUPPLIES)
-		return dev_err_probe(dev, -EINVAL, "max %zu supplies supported!\n",
-				     MAX_SUPPLIES);
-
-	for (i = 0; i < onboard_dev->pdata->num_supplies; i++)
-		onboard_dev->supplies[i].supply = supply_names[i];
-
-	err = devm_regulator_bulk_get(dev, onboard_dev->pdata->num_supplies,
-				      onboard_dev->supplies);
-	if (err) {
-		dev_err(dev, "Failed to get regulator supplies: %pe\n", ERR_PTR(err));
+	err = onboard_dev_get_regulator_bulk(dev, onboard_dev);
+	if (err)
 		return err;
-	}
 
 	onboard_dev->clk = devm_clk_get_optional(dev, NULL);
 	if (IS_ERR(onboard_dev->clk))
diff --git a/drivers/usb/misc/onboard_usb_dev.h b/drivers/usb/misc/onboard_usb_dev.h
index ebe83e19d818..59dced6bd339 100644
--- a/drivers/usb/misc/onboard_usb_dev.h
+++ b/drivers/usb/misc/onboard_usb_dev.h
@@ -6,63 +6,86 @@
 #ifndef _USB_MISC_ONBOARD_USB_DEV_H
 #define _USB_MISC_ONBOARD_USB_DEV_H
 
+/*
+ * Fallback supply names for backwards compatibility. If the device requires
+ * more than the currently supported supplies, add a new one here, and if
+ * possible, the real name supplies to the device-specific data.
+ */
+static const char * const generic_supply_names[] = {
+	"vdd",
+	"vdd2",
+};
+
+#define MAX_SUPPLIES ARRAY_SIZE(generic_supply_names)
+
 struct onboard_dev_pdata {
 	unsigned long reset_us;		/* reset pulse width in us */
 	unsigned int num_supplies;	/* number of supplies */
 	bool is_hub;
+	const char * const supply_names[MAX_SUPPLIES];
+
 };
 
 static const struct onboard_dev_pdata microchip_usb424_data = {
 	.reset_us = 1,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata microchip_usb5744_data = {
 	.reset_us = 0,
 	.num_supplies = 2,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata realtek_rts5411_data = {
 	.reset_us = 0,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata ti_tusb8041_data = {
 	.reset_us = 3000,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata cypress_hx3_data = {
 	.reset_us = 10000,
 	.num_supplies = 2,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata cypress_hx2vl_data = {
 	.reset_us = 1,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata genesys_gl850g_data = {
 	.reset_us = 3,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata genesys_gl852g_data = {
 	.reset_us = 50,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 
 static const struct onboard_dev_pdata vialab_vl817_data = {
 	.reset_us = 10,
 	.num_supplies = 1,
+	.supply_names = { NULL },
 	.is_hub = true,
 };
 

-- 
2.40.1





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux