On Thu, Mar 24, 2022 at 12:07:11PM +0530, Sandeep Maheswaram wrote: > Currently the phy init is done from dwc3 and also xhci which makes the > runtime_usage value 2 for the phy which causes issue during runtime > suspend. When we run the below command the runtime_status still shows > active. > echo auto > /sys/bus/platform/devices/88e3000.phy/power/control > > dwc3 manages PHY by own DRD driver, so skip the management by > HCD core by setting this quirk. > > Signed-off-by: Sandeep Maheswaram <quic_c_sanm@xxxxxxxxxxx> > --- > drivers/usb/dwc3/host.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c > index eda8719..d4fcf06 100644 > --- a/drivers/usb/dwc3/host.c > +++ b/drivers/usb/dwc3/host.c > @@ -13,6 +13,12 @@ > #include <linux/platform_device.h> > > #include "core.h" > +#include <linux/usb/xhci-plat.h> > +#include <linux/usb/xhci-quirks.h> > + > +static const struct xhci_plat_priv xhci_plat_dwc3_xhci = { > + .quirks = XHCI_SKIP_PHY_INIT, > +}; > > static void dwc3_host_fill_xhci_irq_res(struct dwc3 *dwc, > int irq, char *name) > @@ -122,6 +128,13 @@ int dwc3_host_init(struct dwc3 *dwc) > } > } > > + ret = platform_device_add_data(xhci, &xhci_plat_dwc3_xhci, > + sizeof(xhci_plat_dwc3_xhci)); > + if (ret) { > + dev_err(dwc->dev, "failed to add data to xHCI\n"); > + goto err; > + } > + > ret = platform_device_add(xhci); > if (ret) { > dev_err(dwc->dev, "failed to register xHCI device\n"); I think you should just use device property: diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c index eda871973d6cc..dbff7b8ed6d5e 100644 --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c @@ -67,7 +67,7 @@ static int dwc3_host_get_irq(struct dwc3 *dwc) int dwc3_host_init(struct dwc3 *dwc) { - struct property_entry props[4]; + struct property_entry props[5]; struct platform_device *xhci; int ret, irq; int prop_idx = 0; @@ -114,12 +114,12 @@ int dwc3_host_init(struct dwc3 *dwc) if (DWC3_VER_IS_WITHIN(DWC3, ANY, 300A)) props[prop_idx++] = PROPERTY_ENTRY_BOOL("quirk-broken-port-ped"); - if (prop_idx) { - ret = device_create_managed_software_node(&xhci->dev, props, NULL); - if (ret) { - dev_err(dwc->dev, "failed to add properties to xHCI\n"); - goto err; - } + props[prop_idx++] = PROPERTY_ENTRY_BOOL("skip-phy-init"); + + ret = device_create_managed_software_node(&xhci->dev, props, NULL); + if (ret) { + dev_err(dwc->dev, "failed to add properties to xHCI\n"); + goto err; } ret = platform_device_add(xhci); diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 649ffd861b44e..31ed39d06e29b 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -307,6 +307,9 @@ static int xhci_plat_probe(struct platform_device *pdev) device_property_read_u32(tmpdev, "imod-interval-ns", &xhci->imod_interval); + + if (device_property_read_bool(tmpdev, "skip-phy-init")) + hcd->skip_phy_initialization = 1; } hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0); -- heikki