mpc85xx: use regulator for USB power

Use upstream solution for managing GPIO power for USB devices.

A small patch is needed to make the whole thing work as this is an older
USB driver that does not use the PHY framework.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/16842
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
This commit is contained in:
Rosen Penev authored and Jonas Jelonek committed 2026-07-15 20:25:52 +02:00
1 parent 867c857b93
commit 9e43544bc6
4 files changed
+108 -9

No files matched your search

@@ -119,6 +119,8 @@
phy_type = "utmi";
dr_mode = "host";
vbus-supply = <&reg_power_usb>;
port@1 {
#address-cells = <1>;
#size-cells = <0>;
@@ -435,15 +437,15 @@
};
};
gpio_export {
compatible = "gpio-export";
usb-pwr {
gpio-export,name = "usb_pwr";
gpio-export,output = <1>;
gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
};
};
reg_power_usb: regulator {
compatible = "regulator-fixed";
regulator-name = "power_usb";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
enable-active-high;
regulator-boot-on;
};
buttons {
compatible = "gpio-keys";
@@ -36,6 +36,7 @@ CONFIG_REALTEK_PHY=y
CONFIG_RED_15W_REV1=y
CONFIG_REGMAP=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_SGL_ALLOC=y
CONFIG_SPI_BITBANG=y
CONFIG_SPI_GPIO=y
@@ -0,0 +1,48 @@
From 04c30383e668da328ceec9f10d6437a8aa9c5b8f Mon Sep 17 00:00:00 2001
From: Rosen Penev <rosenp@gmail.com>
Date: Tue, 3 Dec 2024 13:53:31 -0800
Subject: [PATCH] usb: fsl-mph-dr-of: add regulator support
Some devices have a GPIO that controls power to the USB bus. Add
support for a vbus regulator to have the kernel control it automatically
instead of having to rely on userspace.
Acquire the regulator in the common probe path so that it works for
all fsl-usb2-dr compatible controllers, not just MPC5121.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/usb/host/fsl-mph-dr-of.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
--- a/drivers/usb/host/fsl-mph-dr-of.c
+++ b/drivers/usb/host/fsl-mph-dr-of.c
@@ -15,6 +15,7 @@
#include <linux/clk.h>
#include <linux/module.h>
#include <linux/dma-mapping.h>
+#include <linux/regulator/consumer.h>
struct fsl_usb2_dev_data {
char *dr_mode; /* controller mode */
@@ -183,7 +184,7 @@ static int fsl_usb2_mph_dr_of_probe(stru
const struct of_device_id *match;
const unsigned char *prop;
static unsigned int idx;
- int i;
+ int i, err;
if (!of_device_is_available(np))
return -ENODEV;
@@ -246,6 +247,10 @@ static int fsl_usb2_mph_dr_of_probe(stru
}
}
+ err = devm_regulator_get_enable_optional(&ofdev->dev, "vbus");
+ if (err)
+ return dev_err_probe(&ofdev->dev, err, "failed to get vbus regulator\n");
+
for (i = 0; i < ARRAY_SIZE(dev_data->drivers); i++) {
if (!dev_data->drivers[i])
continue;
@@ -0,0 +1,48 @@
From 04c30383e668da328ceec9f10d6437a8aa9c5b8f Mon Sep 17 00:00:00 2001
From: Rosen Penev <rosenp@gmail.com>
Date: Tue, 3 Dec 2024 13:53:31 -0800
Subject: [PATCH] usb: fsl-mph-dr-of: add regulator support
Some devices have a GPIO that controls power to the USB bus. Add
support for a vbus regulator to have the kernel control it automatically
instead of having to rely on userspace.
Acquire the regulator in the common probe path so that it works for
all fsl-usb2-dr compatible controllers, not just MPC5121.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/usb/host/fsl-mph-dr-of.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
--- a/drivers/usb/host/fsl-mph-dr-of.c
+++ b/drivers/usb/host/fsl-mph-dr-of.c
@@ -15,6 +15,7 @@
#include <linux/clk.h>
#include <linux/module.h>
#include <linux/dma-mapping.h>
+#include <linux/regulator/consumer.h>
struct fsl_usb2_dev_data {
char *dr_mode; /* controller mode */
@@ -183,7 +184,7 @@ static int fsl_usb2_mph_dr_of_probe(stru
const struct of_device_id *match;
const unsigned char *prop;
static unsigned int idx;
- int i;
+ int i, err;
if (!of_device_is_available(np))
return -ENODEV;
@@ -246,6 +247,10 @@ static int fsl_usb2_mph_dr_of_probe(stru
}
}
+ err = devm_regulator_get_enable_optional(&ofdev->dev, "vbus");
+ if (err)
+ return dev_err_probe(&ofdev->dev, err, "failed to get vbus regulator\n");
+
for (i = 0; i < ARRAY_SIZE(dev_data->drivers); i++) {
if (!dev_data->drivers[i])
continue;