On Wed, 2024-05-22 at 15:39 +0300, Radu Sabau wrote: > Add support for PEC by attaching PEC attribute to the i2c device. > Add pec_store and pec_show function for accesing the "pec" file. > > Signed-off-by: Radu Sabau <radu.sabau@xxxxxxxxxx> > --- > Documentation/hwmon/max31827.rst | 13 ++++- > drivers/hwmon/max31827.c | 95 +++++++++++++++++++++++++++----- > 2 files changed, 92 insertions(+), 16 deletions(-) > > diff --git a/Documentation/hwmon/max31827.rst b/Documentation/hwmon/max31827.rst > index 44ab9dc064cb..9c11a9518c67 100644 > --- a/Documentation/hwmon/max31827.rst > +++ b/Documentation/hwmon/max31827.rst > @@ -131,7 +131,14 @@ The Fault Queue bits select how many consecutive temperature > faults must occur > before overtemperature or undertemperature faults are indicated in the > corresponding status bits. > > -Notes > ------ > +PEC Support > +----------- > + > +When reading a register value, the PEC byte is computed and sent by the chip. > + > +PEC on word data transaction respresents a signifcant increase in bandwitdh > +usage (+33% for both write and reads) in normal conditions. > > -PEC is not implemented. > +Since this operation implies there will be an extra delay to each > +transaction, PEC can be disabled or enabled through sysfs. > +Just write 1 to the "pec" file for enabling PEC and 0 for disabling it. > diff --git a/drivers/hwmon/max31827.c b/drivers/hwmon/max31827.c > index f8a13b30f100..16a1524413db 100644 > --- a/drivers/hwmon/max31827.c > +++ b/drivers/hwmon/max31827.c > @@ -11,19 +11,20 @@ > #include <linux/hwmon.h> > #include <linux/i2c.h> > #include <linux/mutex.h> > -#include <linux/of_device.h> > #include <linux/regmap.h> > #include <linux/regulator/consumer.h> > +#include <linux/of_device.h> > Looks like unrelated change... > -#define MAX31827_T_REG 0x0 > +#define MAX31827_T_REG 0x0 > #define MAX31827_CONFIGURATION_REG 0x2 > -#define MAX31827_TH_REG 0x4 > -#define MAX31827_TL_REG 0x6 > -#define MAX31827_TH_HYST_REG 0x8 > -#define MAX31827_TL_HYST_REG 0xA > +#define MAX31827_TH_REG 0x4 > +#define MAX31827_TL_REG 0x6 > +#define MAX31827_TH_HYST_REG 0x8 > +#define MAX31827_TL_HYST_REG 0xA ditto for all the other places ... > > +static ssize_t pec_show(struct device *dev, struct device_attribute *devattr, > + char *buf) > +{ > + struct i2c_client *client = to_i2c_client(dev); > + > + return scnprintf(buf, PAGE_SIZE, "%d\n", !!(client->flags & > I2C_CLIENT_PEC)); sysfs_emit() > +} > + > +static ssize_t pec_store(struct device *dev, struct device_attribute *devattr, > + const char *buf, size_t count) > +{ > + struct max31827_state *st = dev_get_drvdata(dev); > + struct i2c_client *client = to_i2c_client(dev); > + unsigned int val, val2; > + int err; > + > + err = kstrtouint(buf, 10, &val); > + if (err < 0) > + return err; > + > + val2 = FIELD_PREP(MAX31827_CONFIGURATION_PEC_EN_MASK, !!val); > + Why not just val? > + switch (val) { > + case 0: > + err = regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG, > + MAX31827_CONFIGURATION_PEC_EN_MASK, > + val2); > + if (err) > + return err; > + > + client->flags &= ~I2C_CLIENT_PEC; > + break; > + case 1: > + err = regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG, > + MAX31827_CONFIGURATION_PEC_EN_MASK, > + val2); > + if (err) > + return err; > + > + client->flags |= I2C_CLIENT_PEC; > + break; > + default: > + return -EINVAL; > + } > + > + return count; > +} > +static DEVICE_ATTR_RW(pec); > + > static struct attribute *max31827_attrs[] = { > &dev_attr_temp1_resolution.attr, > + &dev_attr_pec.attr, Do we need it in here?? - Nuno Sá