Skip to content

Commit

Permalink
usb: misc: onboard-hub: support multiple power supplies
Browse files Browse the repository at this point in the history
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>
Acked-by: Matthias Kaehlcke <mka@chromium.org>
Link: https://lore.kernel.org/r/20230620-hx3-v7-1-f79b4b22a1bf@skidata.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Benjamin Bara authored and Greg Kroah-Hartman committed Jul 30, 2023
1 parent 4202633 commit f26069c
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
37 changes: 29 additions & 8 deletions drivers/usb/misc/onboard_usb_hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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 %zu 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);
Expand Down
7 changes: 7 additions & 0 deletions drivers/usb/misc/onboard_usb_hub.h
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down

0 comments on commit f26069c

Please sign in to comment.