[lm-sensors] [patch 2.6.25-git] lm75: add new-style driver binding
David Brownell
david-b at pacbell.net
Sat May 3 17:20:41 CEST 2008
On Saturday 03 May 2008, Jean Delvare wrote:
> > +enum lm75_type { /* keep sorted in alphabetical order */
> > + ds1775,
> > + ds75,
> > + LM75, /* UPPERCASE prevents INSMOD_1 conflict(!) */
>
> Huu, this is ugly. Not really your fault, of course, the
> I2C_CLIENT_INSMOD stuff is ugly and there's not much we can do at this
> point.
Right ...
> I'm not only worried by the use of uppercase, that's only a
> detail. What worries me more is the fact that a given chip type ends up
> being enumerated twice with different values, and a given type number
> corresponds to different chip types depending on which enum you look
> at. This has potential for future trouble. As this problem is likely to
> happen to all hybrid hardware monitoring drivers, I'd like to find a
> clean solution right now...
Fair enough.
> My proposal would be to only list in enum lm75_type, the types which
> are NOT declared by I2C_CLIENT_INSMOD. To prevent numbering conflict,
> you would start lm75_type at 9 (I2C_CLIENT_INSMOD_8 is the max.) See my
> proposed patch at the end of this post.
Looked OK to me, modulo a header comment (read infix below).
> > + lm75a,
> > + max6625,
> > + max6626,
> > + mcp980x,
> > + stds75,
> > + tcn75,
> > + tmp100,
> > + tmp101,
> > + tmp175,
> > + tmp275,
> > + tmp75,
> > +};
>
> Do you really need that many different types? I though that some of
> those parts were 100% compatible, at least as far as this driver is
> concerned. The more different types, the more tests you'll have to do
> at initialization time or even at run time.
ISTR most of them handle 12-bit encodings. And it turns
out that the probe() code has most need to know about the
differences: it's what will set up the state used by the rest
of the driver. (Albeit not in this particular patch...)
Re compatibility, I think explicit listings inside driver
code lead to a lot less confusion and time wasted on writing
needless drivers; and it also avoids wondering "is it *really*
compatible?". Plus it's easier to trust board init code that
matches the schematics (and other board docs).
> > /* Each client has this additional data */
> > struct lm75_data {
> > - struct i2c_client client;
> > + struct i2c_client *client;
> > + enum lm75_type type;
>
> You don't use the type field anywhere. If you use it in a later patch,
> then add it in that patch.
Fair enough. Your update doesn't remove it though...
> > struct device *hwmon_dev;
> > struct mutex update_lock;
> > + u8 orig_conf;
> > char valid; /* !=0 if registers are valid */
> > unsigned long last_updated; /* In jiffies */
> > - u16 temp[3]; /* Register values,
> > + s16 temp[3]; /* Register values,
>
> This too doesn't seem to belong to this patch any longer.
First time you commented on that, and that bugfix has been
in this patch for ages. :)
Yeah, that could stand to get pulled out and merged ASAP.
> > ...
> > + { "tmp75", tmp75, },
> > + { /* LIST END */ },
>
> Trailing comma not needed - you can't grow the list beyond its end.
Doesn't hurt either.
> > +};
> > +MODULE_DEVICE_TABLE(i2c, lm75_ids);
> > (...)
>
> Proposed patch:
ACK, modulo the comment below:
> ---
> drivers/hwmon/lm75.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> --- linux-2.6.26-rc0.orig/drivers/hwmon/lm75.c 2008-05-02 22:46:01.000000000 +0200
> +++ linux-2.6.26-rc0/drivers/hwmon/lm75.c 2008-05-03 10:01:15.000000000 +0200
> @@ -34,12 +34,14 @@
> * This driver handles the LM75 and compatible digital temperature sensors.
> * Compatibles include at least the DS75, DS1775, MCP980x, STDS75, TCN75,
> * TMP100, TMP101, TMP75, TMP175, and TMP275.
> + * Only types which are _not_ part of I2C_CLIENT_INSMOD below, need to be
> + * enumerated here. We start at 9 because I2C_CLIENT_INSMOD can be used to
> + * define up to 8 chip types.
> */
Better to also strike the "Compatibles include..." sentence;
it's already out of sync.
> enum lm75_type { /* keep sorted in alphabetical order */
> - ds1775,
> + ds1775 = 9,
> ds75,
> - LM75, /* UPPERCASE prevents INSMOD_1 conflict(!) */
> lm75a,
> max6625,
> max6626,
> @@ -72,7 +74,7 @@ static const u8 LM75_REG_TEMP[3] = {
> /* Each client has this additional data */
> struct lm75_data {
> struct i2c_client *client;
> - enum lm75_type type;
> + unsigned int type;
> struct device *hwmon_dev;
> struct mutex update_lock;
> u8 orig_conf;
> @@ -220,7 +222,7 @@ static int lm75_remove(struct i2c_client
> static const struct i2c_device_id lm75_ids[] = {
> { "ds1775", ds1775, },
> { "ds75", ds75, },
> - { "lm75", LM75, },
> + { "lm75", lm75, },
> { "lm75a", lm75a, },
> { "max6625", max6625, },
> { "max6626", max6626, },
>
> The advantages are: case consistency, each chip type has a single type
> number, and it is possible and easy to move types from the
> new-style-specific enum to the common one if needed. What do you think?
I think adding new chip support to legacy driver side
should be avoided. ;)
- Dave
More information about the lm-sensors
mailing list