Query on apparently 'disconnected' sysfs interfaces

Mark M. Hoffman mhoffman at lightlink.com
Fri Mar 18 06:25:39 CET 2005

Hi Grant:

* Grant Coady <grant_nospam at dodo.com.au> [2005-03-18 11:35:40 +1100]:


> Problem: There are many examples of disconnected code fragments 
> in the sysfs interface area.
> Possibilities?  I'm missing an obscure indirection, cruft in code, 
> something else I've not yet thought of.  Also, I'm no preprocessor 
> expert, still picking up what the macros are doing from context. 

The preprocessor macros are the keys to understanding these drivers.

> Given (## = my thoughts) so few drivers are inconsistent, here's 
> one example:

That (## = my thoughts) is a little ironic, you will see...


> ## more attributes defined but not used?
> drivers/i2c/chips/lm83.c:static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input1, NULL);
> drivers/i2c/chips/lm83.c:static DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input2, NULL);
> drivers/i2c/chips/lm83.c:static DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_input3, NULL);
> drivers/i2c/chips/lm83.c:static DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_input4, NULL);

E.g. with lm83, take a look at this part (to which I added two comments):

	#define show_temp(suffix, value) \
	static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
	{ \
        	struct lm83_data *data = lm83_update_device(dev); \
        	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
	show_temp(input1, temp_input[0]); /* defines show_temp_input1() */
	show_temp(input2, temp_input[1]); /* defines show_temp_input2() */
	/* ... */

Each show_temp() defines an entire (small) function.  The preprocessor
operator ## is used to tack the literal text "input1" onto "show_temp_"
to form a single token.  See page 90 of K&R/C.

> My problem at this point is seeing how the driver interfaces to 
> sysfs -- finding many exceptions to the 'norm', thus now it seems 
> I must find what the non-documented 'norm' actually is, before 
> bothering writing to an indeterminate (in my mind) interface.

Functions like the above show_temp_input1() are registered to sysfs and
are invoked whenever the sysfs file is read or written.  They are
registered by calling device_create_file().

> Is it worth documenting inconsistencies while I try to fathom 
> current practice vs documentation?

The existing documentation is a guideline for how to name the sysfs files;
it doesn't really specify how to code it.  In practice, the macro-fu just
reduces the line count for all those little functions.

> Are there tools written to perform this or similar checking?
> I'd really dislike re-inventing this stuff.  

I'm not sure what you mean here.  What checking?

> Another thing I tried was diff'ing -mm4 against -ac4, showed 
> where many obvious improvements have been made in -mm4 tree.
> Then I got side-tracked back into my current problem space, 
> sysfs interface seems not fully documented and/or me confused.  

Greg KH's i2c/sensors tree gets picked up by -mm long before those 
patches hit -ac.  I.e. what you saw is expected.

I hope this helps; regards,

Mark M. Hoffman
mhoffman at lightlink.com

More information about the lm-sensors mailing list