[lm-sensors] [PATCH] hwmon: add driver for ADT7411
Wolfram Sang
w.sang at pengutronix.de
Mon Jan 18 16:02:57 CET 2010
Hi Jean,
> > I polished up an older driver from us. Hope I didn't overlook some issues...
>
> Review:
Seems like it was a bad first try, after all :(
> It seems to me that you are only using a small subset of the registers
> defined above. I suggest not defining registers you don't use, as it
> only makes the code bigger with no benefit. The datasheet of this chip
> is publicly available, if anybody needs a reference.
The intention was to spare other people copying this data again, but I get your
point and agree.
> Logic seems overly complex. Do you have such an unreliable I2C bus that
> transient failures are frequent?
The customer had a very "hostile" environment, so this was needed. It could be
rated as a special extension and dropped, of course. I saw it in some other
drivers (lm93) and wasn't sure about the preferred way.
> > + u8 lsb_reg = ADT7411_REG_EXT_TEMP_AIN14_LSB + (nr >> 2);
> > + u8 lsb_shift = (nr & 0x03) << 1;
>
> "2 * (nr & 0x03)" would be easier to understand.
Really? Will do, but when it comes to registers and bit positions, I like
shifting better.
> > +static ssize_t adt7411_set_bit(struct device *dev, struct device_attribute *attr,
> > + const char *buf, size_t count)
> > +{
> > + struct sensor_device_attribute_2 *s_attr2 = to_sensor_dev_attr_2(attr);
> > + struct i2c_client *client = to_i2c_client(dev);
> > + struct adt7411_data *data = i2c_get_clientdata(client);
> > + int reg, bit, ret;
> > + unsigned long val;
> > +
> > + ret = strict_strtoul(buf, 0, &val);
> > +
> > + if (ret || val > 1)
> > + return -EINVAL;
> > +
> > + reg = s_attr2->index;
> > + bit = s_attr2->nr;
> > +
> > + if (val)
> > + data->config[reg] |= bit;
> > + else
> > + data->config[reg] &= ~bit;
> > +
> > + i2c_smbus_write_byte_data(client, ADT7411_REG_CFG1 + reg,
> > + data->config[reg]);
> > + return count;
> > +}
>
> This assumes that nobody else ever changes the configuration registers.
> That's an unsafe assumption... Not only external users of the chip
> could (think multi-master I2C setups) but even concurrent users of your
> own driver could! So you want to read the register value instead of
> relying on a cached value. And if you want to keep a cache (which
> doesn't seem terribly needed to me),you also want to protect the
> read-modify-write operation with a mutex.
Right, but the mutex is needed for the non-cached I2C-based RMW, too, no?
Rest is also accepted, of course. Thanks for the review!
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.lm-sensors.org/pipermail/lm-sensors/attachments/20100118/95d69f8c/attachment.sig>
More information about the lm-sensors
mailing list