Hi Heikki > > +static int ucsi_ccg_resume(struct device *dev) { > > + struct i2c_client *client = to_i2c_client(dev); > > + struct ucsi_ccg *uc = i2c_get_clientdata(client); > > + struct ucsi *ucsi = uc->ucsi; > > + struct ucsi_control c; > > + int ret; > > + > > + /* restore UCSI notification enable mask */ > > + UCSI_CMD_SET_NTFY_ENABLE(c, UCSI_ENABLE_NTFY_ALL); > > + ret = ucsi_send_command(ucsi, &c, NULL, 0); > > + if (ret < 0) { > > + dev_err(uc->dev, "%s: failed to set notification enable - %d\n", > > + __func__, ret); > > + } > > + return 0; > > +} > > I would prefer that we did this for all methods in ucsi.c, not just ccgx. Could you > add resume callback to struct ucsi_ppm, and then call it here. struct ucsi_ppm currently have .sync() and .cmd() callback which is implemented by ucsi_ccg and ucsi_acpi and invoked by usci.c. Is it okay to add a callback in this structure and implement inside ucsi.c and invoke from ucsi_ccg and ucsi_acpi? OR we can just add a function in ucsi.c and export it and use it from ucsi_ccg and ucsi_acpi? > > > +static int ucsi_ccg_runtime_suspend(struct device *dev) { > > + return 0; > > +} > > + > > +static int ucsi_ccg_runtime_resume(struct device *dev) { > > + return 0; > > +} > > + > > +static int ucsi_ccg_runtime_idle(struct device *dev) { > > + return 0; > > +} > > Oh yes, and do you really need to supply all of those stubs? We can drop ucsi_ccg_runtime_idle() but we do need ucsi_ccg_runtime_suspend() and ucsi_ccg_runtime_resume() for runtime pm functionality. Thanks Ajay > nvpublic > > + > > +static const struct dev_pm_ops ucsi_ccg_pm = { > > + .suspend = ucsi_ccg_suspend, > > + .resume = ucsi_ccg_resume, > > + .runtime_suspend = ucsi_ccg_runtime_suspend, > > + .runtime_resume = ucsi_ccg_runtime_resume, > > + .runtime_idle = ucsi_ccg_runtime_idle, }; > > + > > static struct i2c_driver ucsi_ccg_driver = { > > .driver = { > > .name = "ucsi_ccg", > > + .pm = &ucsi_ccg_pm, > > }, > > .probe = ucsi_ccg_probe, > > .remove = ucsi_ccg_remove, > > thanks, > > -- > heikki