HI, Jonathan Jonathan Cameron <jic23@xxxxxxxxxx> 於 2022年7月17日 週日 凌晨1:29寫道: > > > > > > > + > > > > > +static int rtq6056_probe(struct i2c_client *i2c) > > > > > +{ > > > > > + struct iio_dev *indio_dev; > > > > > + struct rtq6056_priv *priv; > > > > > + struct device *dev = &i2c->dev; > > > > > + struct regmap *regmap; > > > > > + unsigned int vendor_id, shunt_resistor_uohm; > > > > > + int ret; > > > > > + > > > > > + if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_WORD_DATA)) > > > > > + return -EOPNOTSUPP; > > > > > + > > > > > + indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); > > > > > + if (!indio_dev) > > > > > + return -ENOMEM; > > > > > + > > > > > + priv = iio_priv(indio_dev); > > > > > + priv->dev = dev; > > > > > + priv->vshuntct_us = priv->vbusct_us = 1037; > > > > > + priv->avg_sample = 1; > > > > > + i2c_set_clientdata(i2c, priv); > > > > > + > > > > > + regmap = devm_regmap_init_i2c(i2c, &rtq6056_regmap_config); > > > > > + if (IS_ERR(regmap)) > > > > > + return dev_err_probe(dev, PTR_ERR(regmap), > > > > > + "Failed to init regmap\n"); > > > > > + > > > > > + priv->regmap = regmap; > > > > > + > > > > > + ret = regmap_read(regmap, RTQ6056_REG_MANUFACTID, &vendor_id); > > > > > + if (ret) > > > > > + return dev_err_probe(dev, ret, > > > > > + "Failed to get manufacturer info\n"); > > > > > + > > > > > + if (vendor_id != RTQ6056_VENDOR_ID) > > > > > + return dev_err_probe(dev, -ENODEV, > > > > > + "Invalid vendor id 0x%04x\n", vendor_id); > > > > > + > > > > > + ret = devm_regmap_field_bulk_alloc(dev, regmap, priv->rm_fields, > > > > > + rtq6056_reg_fields, F_MAX_FIELDS); > > > > > + if (ret) > > > > > + return dev_err_probe(dev, ret, "Failed to init regmap field\n"); > > > > > + > > > > > + /* > > > > > + * By default, configure average sample as 1, bus and shunt conversion > > > > > + * timea as 1037 microsecond, and operating mode to all on. > > > > > + */ > > > > > + ret = regmap_write(regmap, RTQ6056_REG_CONFIG, RTQ6056_DEFAULT_CONFIG); > > > > > + if (ret) > > > > > + return dev_err_probe(dev, ret, > > > > > + "Failed to enable continuous sensing\n"); > > > > > + > > > > > + pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC); > > > > > + pm_runtime_use_autosuspend(dev); > > > > > + pm_runtime_set_active(dev); > > > > > + pm_runtime_mark_last_busy(dev); > > > > > + pm_runtime_enable(dev); > > > > > > > > Look at whether you can use devm_pm_runtime_enable() > > > > Note it handles disabling autosuspend for you. > > > > > > > > When using runtime_pm() you want to ensure that the device works without > > > > runtime pm support being enabled. As such, you turn the device on before > > > > enabling runtime_pm() and (this is missing I think) turn it off after disabling > > > > runtime pm. So I'd expect a devm_add_action_or_reset() call to unwind > > > > setting the device into continuous sending above. > > > > > > > If so, I think it's better to configure the device keep in off state > > > in probe stage. > > > The calling order may need to be changed as below > > > devm_add_action_or_reset... > > > > > > pm_runtime_set_autosuspend_delay > > > pm_runtime_use_auto_suspend > > > devm_pm_runtime_enable > > > > > Ah, not correct. How about if 'PM_RUNTIME' is not enabled? > > Do we need to consider about this case? > > > > If yes, the original flow about 'pm_runtime' is correct. > I don't follow. Perhaps next version will make it clear what you mean. > In v6, I already fixed most about the comment in v5. Only the 'DEFINE_RUNTIME_DEV_PM_OPS' is left. Now all are clear. Please review the v7. It includes all the fixes. Thanks. > Jonathan