Re: [PATCH v6 6/6] phy: fsl-imx8mq-usb: keep PHY power domain runtime always-on for i.MX8MP
From: Xu Yang
Date: Thu Jul 16 2026 - 06:47:19 EST
On Wed, Jul 15, 2026 at 10:32:40AM -0500, Frank Li wrote:
> On Wed, Jul 15, 2026 at 07:34:01PM +0800, Xu Yang wrote:
> > From: Xu Yang <xu.yang_2@xxxxxxx>
> >
> > On i.MX8MP, the USB PHY has a dedicated power domain that was previously
> > never powered off at runtime. With the introduction of runtime PM support,
> > the power domain will be powered off if the device is runtime suspended,
> > which breaks USB wakeup functionality.
> >
> > To preserve wakeup functionality, mark the PHY power domain as runtime
> > always-on for i.MX8MP platform. To limit the behavior to i.MX8MP, add a
> > need_genpd_rpm_on to imx8mq_usb_phy_drvdata and set it as true for i.MX8MP.
> >
> > Signed-off-by: Xu Yang <xu.yang_2@xxxxxxx>
> >
> > ---
> > Changes in v6:
> > - set need_genpd_rpm_on flag for i.MX8MP and call dev_pm_genpd_rpm_always_on()
> > if the flag is true
> > Changes in v5:
> > - no changes
> > Changes in v4:
> > - no changes
> > Changes in v3:
> > - new patch
> > ---
> > drivers/phy/freescale/phy-fsl-imx8mq-usb.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c
> > index f0bdfa75d586..2398bda50eb8 100644
> > --- a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c
> > +++ b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c
> > @@ -9,6 +9,7 @@
> > #include <linux/of.h>
> > #include <linux/phy/phy.h>
> > #include <linux/platform_device.h>
> > +#include <linux/pm_domain.h>
> > #include <linux/pm_runtime.h>
> > #include <linux/regulator/consumer.h>
> > #include <linux/regmap.h>
> > @@ -134,6 +135,7 @@ struct imx8mq_usb_phy {
> >
> > struct imx8mq_usb_phy_drvdata {
> > const struct phy_ops *ops;
> > + bool need_genpd_rpm_on;
> > };
> >
> > static void tca_blk_orientation_set(struct tca_blk *tca,
> > @@ -669,6 +671,7 @@ static const struct imx8mq_usb_phy_drvdata imx8mq_usb_phy_data = {
> >
> > static const struct imx8mq_usb_phy_drvdata imx8mp_usb_phy_data = {
> > .ops = &imx8mp_usb_phy_ops,
> > + .need_genpd_rpm_on = true,
> > };
> >
> > static const struct imx8mq_usb_phy_drvdata imx95_usb_phy_data = {
> > @@ -739,6 +742,12 @@ static int imx8mq_usb_phy_probe(struct platform_device *pdev)
> > if (!phy_data)
> > return -EINVAL;
> >
> > + if (phy_data->need_genpd_rpm_on) {
> > + ret = dev_pm_genpd_rpm_always_on(dev, true);
> > + if (ret)
> > + return dev_err_probe(dev, ret, "failed to set genpd rpm always on\n");
> > + }
> > +
>
> need set false at driver remove?
Not need. Because this device will be deteched from the power domain after driver removal.
Thanks,
Xu Yang