Théo Lebrun <theo.lebrun@xxxxxxxxxxx> writes: > Add match data support, with one boolean to indicate whether the > hardware resets after a system-wide suspend. If hardware resets, we > force execute ->runtime_resume() at system-wide resume to run the > hardware init sequence. Is "whether the hardware resets after a system-wide suspend" really a function of the IP itself, or rather whether the IP is in a power domain that might power down? > No compatible exploits this functionality, just yet. > > Signed-off-by: Théo Lebrun <theo.lebrun@xxxxxxxxxxx> > --- > drivers/usb/cdns3/cdns3-ti.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c > index 4c8a557e6a6f..f76327566798 100644 > --- a/drivers/usb/cdns3/cdns3-ti.c > +++ b/drivers/usb/cdns3/cdns3-ti.c > @@ -57,9 +57,14 @@ struct cdns_ti { > unsigned vbus_divider:1; > struct clk *usb2_refclk; > struct clk *lpm_clk; > + const struct cdns_ti_match_data *match_data; > int usb2_refclk_rate_code; > }; > > +struct cdns_ti_match_data { > + bool reset_on_resume; > +}; > + > static const int cdns_ti_rate_table[] = { /* in KHZ */ > 9600, > 10000, > @@ -101,6 +106,7 @@ static int cdns_ti_probe(struct platform_device *pdev) > platform_set_drvdata(pdev, data); > > data->dev = dev; > + data->match_data = device_get_match_data(dev); > > data->usbss = devm_platform_ioremap_resource(pdev, 0); > if (IS_ERR(data->usbss)) { > @@ -220,8 +226,29 @@ static int cdns_ti_runtime_resume(struct device *dev) > return 0; > } > > +static int cdns_ti_suspend(struct device *dev) > +{ > + struct cdns_ti *data = dev_get_drvdata(dev); > + > + if (data->match_data && data->match_data->reset_on_resume) > + return pm_runtime_force_suspend(dev); > + else > + return 0; > +} > + > +static int cdns_ti_resume(struct device *dev) > +{ > + struct cdns_ti *data = dev_get_drvdata(dev); > + > + if (data->match_data && data->match_data->reset_on_resume) > + return pm_runtime_force_resume(dev); > + else > + return 0; > +} Conditionally forcing runtime suspend/resume based on a property of the IP doesn't feel right to me. IMO, the device should always runtime suspend/resume, and in the runtime PM hooks is where the conditional logic should be. And speaking of the conditional logic... let's go back to whether "resets_on_resume" is a property of the IP or the enclosing power domain. Instead of having an IP-specific flag, another way of approaching this when ->runtime_resume() is called every time is simply for that hook to check if a reset has happend. Sometimes you can tell this simply by reading a register that has been previously programmed by the driver but has a known reset. Simply check that regisister and you can tell whether context has been lost. Doing it this way makes the driver "smart" and then you don't have to rely on bool flag based on the IP and dependent on the DT compatible. Kevin