On Fri, Sep 24, 2021 at 11:42:40AM +0200, Krzysztof Adamski wrote: > Recent patch added possibility to disable selected channels. That would > only make sure that the ENODATA is returned for those channels but would > not configure the actual hardware. > > With this patch, the config register is written to make sure the > channels are disabled also at hardware level. > > Signed-off-by: Krzysztof Adamski <krzysztof.adamski@xxxxxxxxx> > --- > drivers/hwmon/tmp421.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c > index 0fa4c02f5808..4934ce13afb4 100644 > --- a/drivers/hwmon/tmp421.c > +++ b/drivers/hwmon/tmp421.c > @@ -33,6 +33,9 @@ enum chips { tmp421, tmp422, tmp423, tmp441, tmp442 }; > /* The TMP421 registers */ > #define TMP421_STATUS_REG 0x08 > #define TMP421_CONFIG_REG_1 0x09 > +#define TMP421_CONFIG_REG_2 0x0A > +#define TMP421_CONFIG_REG_REN(x) (BIT(3 + (x))) > +#define TMP421_CONFIG_REG_REN_MASK (BIT(3)|BIT(4)|BIT(5)|BIT(6)) GENMASK() would probably be better here. > #define TMP421_CONVERSION_RATE_REG 0x0B > #define TMP421_N_FACTOR_REG_1 0x21 > #define TMP421_MANUFACTURER_ID_REG 0xFE > @@ -155,6 +158,33 @@ static struct tmp421_data *tmp421_update_device(struct device *dev) > return data; > } > > +static int tmp421_enable_channels(struct tmp421_data *data) > +{ > + int err; > + struct i2c_client *client = data->client; > + struct device *dev = &client->dev; > + int cfg = i2c_smbus_read_byte_data(client, TMP421_CONFIG_REG_2); > + int i; > + > + if (cfg < 0) { > + dev_err(dev, > + "error reading register, can't disable channels\n"); Unnecessary line break > + return err; return cfg; > + } > + > + cfg &= ~TMP421_CONFIG_REG_REN_MASK; > + for (i = 0; i < data->channels; i++) > + if (data->channel[i].enabled) > + cfg |= TMP421_CONFIG_REG_REN(i); > + > + err = i2c_smbus_write_byte_data(client, TMP421_CONFIG_REG_2, cfg); > + if (err < 0) > + dev_err(dev, > + "error writing register, can't disable channels\n"); Unnecessary line break > + > + return err; > +} > + > static int tmp421_read(struct device *dev, enum hwmon_sensor_types type, > u32 attr, int channel, long *val) > { > @@ -395,6 +425,10 @@ static int tmp421_probe(struct i2c_client *client) > if (err) > return err; > > + err = tmp421_enable_channels(data); > + if (err) > + return err; This should really be called from tmp421_init_client(). After all, that is what the function is for. > + > data->chip.ops = &tmp421_ops; > data->chip.info = data->info; >