Hi Arnd, On 10. 09. 20 1:10, Amit Sunil Dhamne wrote: > From: Rajan Vaja <rajan.v...@xilinx.com> > > Initially all devices are in power up state. Firmware expect that > processor should call InitFinalize API once it have requested devices > which are required so that it can turn off all unused devices and > save power. From Linux, PM driver calls InitFinalize to inform the > firmware that it can power down the unused devices. Upon > InitFinalize() call firmware power downs all unused devices. > > There are chances that PM driver is probed along with or before other > device drivers. So in that case some of the devices may not be > requested from firmware which is done by genpd driver. Due to that > firmware will consider those devices as unused and firmware will power > down those devices. Later when any device driver is probed, genpd > driver will ask firmware to power up that device using request node > API. So for those devices, power transition will be like on->off->on > which creates unnecessary power glitch to those devices. > > To avoid such unnecessary power transitions and as ideal behavior > InitFinalize should be called after all drivers are probed. So call > InitFinalize from late_initcall_sync. > > Signed-off-by: Rajan Vaja <rajan.v...@xilinx.com> > Signed-off-by: Amit Sunil Dhamne <amit.sunil.dha...@xilinx.com> > --- > Changes in v2: > - Check for compatible string for zynqmp or versal platform before > calling init finalize. > --- > drivers/soc/xilinx/zynqmp_power.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/soc/xilinx/zynqmp_power.c > b/drivers/soc/xilinx/zynqmp_power.c > index 31ff49f..22d2d2e 100644 > --- a/drivers/soc/xilinx/zynqmp_power.c > +++ b/drivers/soc/xilinx/zynqmp_power.c > @@ -178,7 +178,6 @@ static int zynqmp_pm_probe(struct platform_device *pdev) > u32 pm_api_version; > struct mbox_client *client; > > - zynqmp_pm_init_finalize(); > zynqmp_pm_get_api_version(&pm_api_version); > > /* Check PM API version number */ > @@ -246,6 +245,23 @@ static int zynqmp_pm_remove(struct platform_device *pdev) > return 0; > } > > +static int __init do_init_finalize(void) > +{ > + struct device_node *np; > + > + np = of_find_compatible_node(NULL, NULL, "xlnx,zynqmp"); > + if (!np) { > + np = of_find_compatible_node(NULL, NULL, "xlnx,versal"); > + if (!np) > + return 0; > + } > + of_node_put(np); > + > + return zynqmp_pm_init_finalize(); > +} > + > +late_initcall_sync(do_init_finalize); > + > static const struct of_device_id pm_of_match[] = { > { .compatible = "xlnx,zynqmp-power", }, > { /* end of table */ }, >
Arnd: are you fine with this way how to check that it runs on zynqmp or versal? Thanks, Michal