[lm-sensors] [PATCH 0/2 v2] hwmon: (ltc4245) fix GPIO support

Ira Snyder iws at ovro.caltech.edu
Sun May 23 02:12:57 CEST 2010


On Sat, 22 May 2010 13:53:50 +0200
Jean Delvare <khali at linux-fr.org> wrote:

> Hi Ira,
> 
> On Fri, 21 May 2010 08:02:27 -0700, Ira W. Snyder wrote:
> > On Fri, May 21, 2010 at 11:04:52AM +0200, Jean Delvare wrote:
> > > I still think the current error handling is less than ideal. If it
> > > becomes common that hwmon drivers return errors, I'd prefer them to
> > > look nice in the output of "sensors". Something like:
> > > 
> > > Dig 3.30v Output: +3.26 V
> > > Dig 2.25v Output:     N/A
> > > Dig 1.80v Output:     N/A
> > > 
> > > Hopefully this wouldn't be too hard to implement. What do you think?
> > > 
> > > We might have to invent new libsensors error codes to differentiate
> > > between error cases, or give callers a way to retrieve the original
> > > error code.
> > 
> > I agree, that would be nice. That's a libsensors patch, not a kernel
> > patch though.
> 
> A more immediate action would actually be a sensors patch. I get the
> following output for my thinkpad with the attached patch applied:
> 
> thinkpad-isa-0000
> Adapter: ISA adapter
> fan1:       3430 RPM
> temp1:       +62.0°C                                    
> temp2:       +46.0°C                                    
> temp3:       +44.0°C                                    
> temp4:       +75.0°C                                    
> temp5:       +50.0°C                                    
> temp6:           N/A                                    
> temp7:       +37.0°C                                    
> temp8:           N/A                                    
> temp9:       +48.0°C                                    
> temp10:      +58.0°C                                    
> temp11:      +58.0°C                                    
> temp12:          N/A                                    
> temp13:          N/A                                    
> temp14:          N/A                                    
> temp15:          N/A                                    
> temp16:          N/A                                    
> 
> Would this be OK with you?
> 

That looks fine to me. I'm using libsensors (but not the sensors
program itself, except when debugging) to read my chips. The output
certainly is much nicer, though.

Ira

> ---
>  prog/sensors/chips.c |   42 ++++++++++++++++++++++++++++--------------
>  1 file changed, 28 insertions(+), 14 deletions(-)
> 
> --- lm-sensors.orig/prog/sensors/chips.c	2010-05-21 17:38:36.000000000 +0200
> +++ lm-sensors/prog/sensors/chips.c	2010-05-21 17:49:22.000000000 +0200
> @@ -91,6 +91,21 @@ static double get_value(const sensors_ch
>  	return val;
>  }
>  
> +/* A variant for input values, where we want to handle errors gracefully */
> +static int get_input_value(const sensors_chip_name *name,
> +			   const sensors_subfeature *sub,
> +			   double *val)
> +{
> +	int err;
> +
> +	err = sensors_get_value(name, sub->number, val);
> +	if (err && err != -SENSORS_ERR_ACCESS_R) {
> +		fprintf(stderr, "ERROR: Can't get value of subfeature %s: %s\n",
> +			sub->name, sensors_strerror(err));
> +	}
> +	return err;
> +}
> +
>  static int get_label_size(const sensors_chip_name *name)
>  {
>  	int i;
> @@ -230,8 +245,8 @@ static void print_chip_temp(const sensor
>  	} else {
>  		sf = sensors_get_subfeature(name, feature,
>  					    SENSORS_SUBFEATURE_TEMP_INPUT);
> -		if (sf) {
> -			val = get_value(name, sf);
> +		if (sf && get_input_value(name, sf, &val) == 0) {
> +			get_input_value(name, sf, &val);
>  			if (fahrenheit)
>  				val = deg_ctof(val);
>  			printf("%+6.1f%s  ", val, degstr);
> @@ -289,7 +304,7 @@ static void print_chip_in(const sensors_
>  			  int label_size)
>  {
>  	const sensors_subfeature *sf, *sfmin, *sfmax;
> -	double alarm_max, alarm_min;
> +	double val, alarm_max, alarm_min;
>  	char *label;
>  
>  	if (!(label = sensors_get_label(name, feature))) {
> @@ -302,8 +317,8 @@ static void print_chip_in(const sensors_
>  
>  	sf = sensors_get_subfeature(name, feature,
>  				    SENSORS_SUBFEATURE_IN_INPUT);
> -	if (sf)
> -		printf("%+6.2f V", get_value(name, sf));
> +	if (sf && get_input_value(name, sf, &val) == 0)
> +		printf("%+6.2f V", val);
>  	else
>  		printf("     N/A");
>  
> @@ -355,6 +370,7 @@ static void print_chip_fan(const sensors
>  			   int label_size)
>  {
>  	const sensors_subfeature *sf, *sfmin, *sfdiv;
> +	double val;
>  	char *label;
>  
>  	if (!(label = sensors_get_label(name, feature))) {
> @@ -372,8 +388,8 @@ static void print_chip_fan(const sensors
>  	else {
>  		sf = sensors_get_subfeature(name, feature,
>  					    SENSORS_SUBFEATURE_FAN_INPUT);
> -		if (sf)
> -			printf("%4.0f RPM", get_value(name, sf));
> +		if (sf && get_input_value(name, sf, &val) == 0)
> +			printf("%4.0f RPM", val);
>  		else
>  			printf("     N/A");
>  	}
> @@ -471,8 +487,7 @@ static void print_chip_power(const senso
>  					       SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL);
>  	}
>  
> -	if (sf) {
> -		val = get_value(name, sf);
> +	if (sf && get_input_value(name, sf, &val) == 0) {
>  		scale_value(&val, &unit);
>  		printf("%6.2f %sW", val, unit);
>  	} else
> @@ -526,8 +541,7 @@ static void print_chip_energy(const sens
>  
>  	sf = sensors_get_subfeature(name, feature,
>  				    SENSORS_SUBFEATURE_ENERGY_INPUT);
> -	if (sf) {
> -		val = get_value(name, sf);
> +	if (sf && get_input_value(name, sf, &val) == 0) {
>  		scale_value(&val, &unit);
>  		printf("%6.2f %sJ", val, unit);
>  	} else
> @@ -583,7 +597,7 @@ static void print_chip_curr(const sensor
>  			    int label_size)
>  {
>  	const sensors_subfeature *sf, *sfmin, *sfmax;
> -	double alarm_max, alarm_min;
> +	double alarm_max, alarm_min, val;
>  	char *label;
>  
>  	if (!(label = sensors_get_label(name, feature))) {
> @@ -596,8 +610,8 @@ static void print_chip_curr(const sensor
>  
>  	sf = sensors_get_subfeature(name, feature,
>  				    SENSORS_SUBFEATURE_CURR_INPUT);
> -	if (sf)
> -		printf("%+6.2f A", get_value(name, sf));
> +	if (sf && get_input_value(name, sf, &val) == 0)
> +		printf("%+6.2f A", val);
>  	else
>  		printf("     N/A");
>  
> 
> 
> 
> -- 
> Jean Delvare
> 


-- 
Ira Snyder <iws at ovro.caltech.edu>




More information about the lm-sensors mailing list