Re: [cip-dev] [PATCH 6.12.y-cip v2 01/17] reset: rzg2l-usbphy-ctrl: Add support for USB PWRRDY
Claudiu Beznea <[email protected]> Tue, 21 Jul 2026 12:21:30 +0300
| Newsgroups | org.cip-project.lists.cip-dev |
|---|---|
| Message-ID | <[email protected]> |
Hi, CIP maintainers, Could you please let me know if there's anything I need to do for this series and the 6.1, 5.10 ones? Thank you, Claudiu On 7/8/26 11:12, claudiu beznea via lists.cip-project.org wrote: > From: Claudiu Beznea <[email protected]> > > commit 78f2d64e484753bfede6a0e9eab0ef35830c34fb upstream. > > On the Renesas RZ/G3S SoC, the USB PHY block has an input signal called > PWRRDY. This signal is managed by the system controller and must be > de-asserted after powering on the area where USB PHY resides and asserted > before powering it off. > > On power-on/resume the USB PWRRDY signal need to be de-asserted before > enabling clock and switching the module to normal state (through MSTOP > support). The power-on/resume configuration sequence must be: > > 1/ PWRRDY=0 > 2/ CLK_ON=1 > 3/ MSTOP=0 > > On power-off/suspend the configuration sequence should be: > > 1/ MSTOP=1 > 2/ CLK_ON=0 > 3/ PWRRDY=1 > > The CLK_ON and MSTOP functionalities are controlled by clock drivers. > The suspend/resume support will be handled by different patches. > > After long discussions with the internal HW team, it has been confirmed > that the HW connection b/w USB PHY block, the USB channels, the system > controller, clock, MSTOP, PWRRDY signal is as follows: > > ┌──────────────────────────────┐ > │ │◄── CPG_CLKON_USB.CLK0_ON > │ USB CH0 │ > ┌──────────────────────────┐ │┌───────────────────────────┐ │◄── CPG_CLKON_USB.CLK2_ON > │ ┌────────┐ ││host controller registers │ │ > │ │ │ ││function controller registers│ > │ │ PHY0 │◄──┤└───────────────────────────┘ │ > │ USB PHY │ │ └────────────▲─────────────────┘ > │ └────────┘ │ > │ │ CPG_BUS_PERI_COM_MSTOP.MSTOP{6, 5}_ON > │┌──────────────┐ ┌────────┐ > ││USHPHY control│ │ │ > ││ registers │ │ PHY1 │ ┌──────────────────────────────┐ > │└──────────────┘ │ │◄──┤ USB CH1 │ > │ └────────┘ │┌───────────────────────────┐ │◄── CPG_CLKON_USB.CLK1_ON > └─▲───────▲─────────▲──────┘ ││ host controller registers │ │ > │ │ │ │└───────────────────────────┘ │ > │ │ │ └────────────▲─────────────────┘ > │ │ │ │ > │ │ │ CPG_BUS_PERI_COM_MSTOP.MSTOP7_ON > │PWRRDY │ │ > │ │ CPG_CLK_ON_USB.CLK3_ON > │ │ > │ CPG_BUS_PERI_COM_MSTOP.MSTOP4_ON > │ > ┌────┐ > │SYSC│ > └────┘ > > where: > - CPG_CLKON_USB.CLK.CLKX_ON is the register bit controlling the clock X > of different USB blocks, X in {0, 1, 2, 3} > - CPG_BUS_PERI_COM_MSTOP.MSTOPX_ON is the register bit controlling the > MSTOP of different USB blocks, X in {4, 5, 6, 7} > - USB PHY is the USB PHY block exposing 2 ports, port0 and port1, used > by the USB CH0, USB CH1 > - SYSC is the system controller block controlling the PWRRDY signal > - USB CHx are individual USB block with host and function capabilities > (USB CH0 have both host and function capabilities, USB CH1 has only > host capabilities) > > The USBPHY control registers are controlled though the > reset-rzg2l-usbphy-ctrl driver. The USB PHY ports are controlled by > phy_rcar_gen3_usb2 (drivers/phy/renesas/phy-rcar-gen3-usb2.c file). The > USB PHY ports request resets from the reset-rzg2l-usbphy-ctrl driver. > > The connection b/w the system controller and the USB PHY CTRL driver is > implemented through the renesas,sysc-pwrrdy device tree property > proposed in this patch. This property specifies the register offset and the > bitmask required to control the PWRRDY signal. > > Since the USB PHY CTRL driver needs to be probed before any other > USB-specific driver on RZ/G3S, control of PWRRDY is passed exclusively > to it. This guarantees the correct configuration sequence between clocks, > MSTOP bits, and the PWRRDY bit on probe/resume and remove/suspend. At the > same time, changes are kept minimal by avoiding modifications to the USB > PHY driver to also handle the PWRRDY itself. > > Tested-by: Wolfram Sang <[email protected]> > Signed-off-by: Claudiu Beznea <[email protected]> > Reviewed-by: Philipp Zabel <[email protected]> > Signed-off-by: Philipp Zabel <[email protected]> > Signed-off-by: Claudiu Beznea <[email protected]> > --- > > Changes in v2: > - none > > drivers/reset/Kconfig | 1 + > drivers/reset/reset-rzg2l-usbphy-ctrl.c | 56 +++++++++++++++++++++++++ > 2 files changed, 57 insertions(+) > > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig > index 8329ebd982f1..380b7e87fcd6 100644 > --- a/drivers/reset/Kconfig > +++ b/drivers/reset/Kconfig > @@ -227,6 +227,7 @@ config RESET_RASPBERRYPI > config RESET_RZG2L_USBPHY_CTRL > tristate "Renesas RZ/G2L USBPHY control driver" > depends on ARCH_RZG2L || COMPILE_TEST > + select MFD_SYSCON > help > Support for USBPHY Control found on RZ/G2L family. It mainly > controls reset and power down of the USB/PHY. > diff --git a/drivers/reset/reset-rzg2l-usbphy-ctrl.c b/drivers/reset/reset-rzg2l-usbphy-ctrl.c > index 4e2ac1f0060c..dcc8c2dde3f8 100644 > --- a/drivers/reset/reset-rzg2l-usbphy-ctrl.c > +++ b/drivers/reset/reset-rzg2l-usbphy-ctrl.c > @@ -13,6 +13,7 @@ > #include <linux/regmap.h> > #include <linux/reset.h> > #include <linux/reset-controller.h> > +#include <linux/mfd/syscon.h> > > #define RESET 0x000 > #define VBENCTL 0x03c > @@ -91,6 +92,8 @@ static int rzg2l_usbphy_ctrl_status(struct reset_controller_dev *rcdev, > return !!(readl(priv->base + RESET) & port_mask); > } > > +#define RZG2L_USBPHY_CTRL_PWRRDY 1 > + > static const struct of_device_id rzg2l_usbphy_ctrl_match_table[] = { > { .compatible = "renesas,rzg2l-usbphy-ctrl" }, > { /* Sentinel */ } > @@ -110,6 +113,55 @@ static const struct regmap_config rzg2l_usb_regconf = { > .max_register = 1, > }; > > +static void rzg2l_usbphy_ctrl_set_pwrrdy(struct regmap_field *pwrrdy, > + bool power_on) > +{ > + u32 val = power_on ? 0 : 1; > + > + /* The initialization path guarantees that the mask is 1 bit long. */ > + regmap_field_update_bits(pwrrdy, 1, val); > +} > + > +static void rzg2l_usbphy_ctrl_pwrrdy_off(void *data) > +{ > + rzg2l_usbphy_ctrl_set_pwrrdy(data, false); > +} > + > +static int rzg2l_usbphy_ctrl_pwrrdy_init(struct device *dev) > +{ > + struct regmap_field *pwrrdy; > + struct reg_field field; > + struct regmap *regmap; > + const int *data; > + u32 args[2]; > + > + data = device_get_match_data(dev); > + if ((uintptr_t)data != RZG2L_USBPHY_CTRL_PWRRDY) > + return 0; > + > + regmap = syscon_regmap_lookup_by_phandle_args(dev->of_node, > + "renesas,sysc-pwrrdy", > + ARRAY_SIZE(args), args); > + if (IS_ERR(regmap)) > + return PTR_ERR(regmap); > + > + /* Don't allow more than one bit in mask. */ > + if (hweight32(args[1]) != 1) > + return -EINVAL; > + > + field.reg = args[0]; > + field.lsb = __ffs(args[1]); > + field.msb = __fls(args[1]); > + > + pwrrdy = devm_regmap_field_alloc(dev, regmap, field); > + if (!pwrrdy) > + return -ENOMEM; > + > + rzg2l_usbphy_ctrl_set_pwrrdy(pwrrdy, true); > + > + return devm_add_action_or_reset(dev, rzg2l_usbphy_ctrl_pwrrdy_off, pwrrdy); > +} > + > static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -132,6 +184,10 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev) > if (IS_ERR(regmap)) > return PTR_ERR(regmap); > > + error = rzg2l_usbphy_ctrl_pwrrdy_init(dev); > + if (error) > + return error; > + > priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); > if (IS_ERR(priv->rstc)) > return dev_err_probe(dev, PTR_ERR(priv->rstc), > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#23530): https://lists.cip-project.org/g/cip-dev/message/23530 > Mute This Topic: https://lists.cip-project.org/mt/120170421/8377987 > Group Owner: [email protected] > Unsubscribe: https://lists.cip-project.org/g/cip-dev/unsub [[email protected]] > -=-=-=-=-=-=-=-=-=-=-=- >