Re: [PATCH 2/4] hwmon-f71882fg: Cleanup sysfs attr creation 2/2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 22 Oct 2009 12:08:58 +0200, Hans de Goede wrote:
> hwmon-f71882fg: Cleanup sysfs attr creation 2/2
> 
> This patch merges the f71882fg_auto_pwm_attr array into the
> fxxxx_fan_attr resp. fxxxx_auto_pwm_attr array, as the f71882fg_auto_pwm_attr
> array was merely extending these 2 with entries for a 4th fan, it also makes
> these 2 arrays 2 dimensional so that the rest of the code can choose to
> add attr for 3 or 4 fans without needing to know the nr of attr per fan.

Again only minor comments, which I can fix myself:

> 
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> --- linux/drivers/hwmon/f71882fg.c	2009-10-21 11:59:06.000000000 +0200
> +++ linux/drivers/hwmon/f71882fg.c	2009-10-21 13:25:13.000000000 +0200
> @@ -416,41 +416,51 @@
>  };
>  
>  /* Fan / PWM attr common to all models */
> -static struct sensor_device_attribute_2 fxxxx_fan_attr[] = {
> +static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
>  	SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
>  	SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
>  		      show_fan_full_speed,
>  		      store_fan_full_speed, 0, 0),
>  	SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
> -	SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
> -	SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
> -		      show_fan_full_speed,
> -		      store_fan_full_speed, 0, 1),
> -	SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
> -	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
> -	SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
> -		      show_fan_full_speed,
> -		      store_fan_full_speed, 0, 2),
> -	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
> -
>  	SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
>  	SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
>  		      store_pwm_enable, 0, 0),
>  	SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
>  		      show_pwm_interpolate, store_pwm_interpolate, 0, 0),
> -
> +}, {
> +	SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
> +	SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
> +		      show_fan_full_speed,
> +		      store_fan_full_speed, 0, 1),
> +	SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
>  	SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
>  	SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
>  		      store_pwm_enable, 0, 1),
>  	SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
>  		      show_pwm_interpolate, store_pwm_interpolate, 0, 1),
> -
> +}, {
> +	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
> +	SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
> +		      show_fan_full_speed,
> +		      store_fan_full_speed, 0, 2),
> +	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
>  	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
>  	SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
>  		      store_pwm_enable, 0, 2),
>  	SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
>  		      show_pwm_interpolate, store_pwm_interpolate, 0, 2),
> -};
> +}, {
> +	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
> +	SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
> +		      show_fan_full_speed,
> +		      store_fan_full_speed, 0, 3),
> +	SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
> +	SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
> +	SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
> +		      store_pwm_enable, 0, 3),
> +	SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
> +		      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
> +} };
>  
>  /* Attr for models which can beep on Fan alarm */
>  static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
> @@ -460,10 +470,12 @@
>  		store_fan_beep, 0, 1),
>  	SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
>  		store_fan_beep, 0, 2),
> +	SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
> +		store_fan_beep, 0, 3),
>  };
>  
>  /* PWM attr for the f71862fg, less pwms and less zones per pwm than the
> -   f71882fg / f71889fg */
> +   f71858fg / f71882fg / f71889fg */

This comment change should be merged into patch 1.

>  static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = {
>  	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
>  		      show_pwm_auto_point_channel,
> @@ -533,7 +545,7 @@
>  };
>  
>  /* PWM attr common to both the f71858fg, f71882fg and f71889fg */
> -static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[] = {
> +static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
>  	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
>  		      show_pwm_auto_point_channel,
>  		      store_pwm_auto_point_channel, 0, 0),
> @@ -574,7 +586,7 @@
>  		      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
>  	SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
>  		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
> -
> +}, {
>  	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
>  		      show_pwm_auto_point_channel,
>  		      store_pwm_auto_point_channel, 0, 1),
> @@ -615,7 +627,7 @@
>  		      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
>  	SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
>  		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
> -
> +}, {
>  	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
>  		      show_pwm_auto_point_channel,
>  		      store_pwm_auto_point_channel, 0, 2),
> @@ -656,23 +668,7 @@
>  		      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
>  	SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
>  		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
> -};
> -
> -/* Fan / PWM attr found on the f71882fg but not on the f71858fg */
> -static struct sensor_device_attribute_2 f71882fg_auto_pwm_attr[] = {
> -	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
> -	SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
> -		      show_fan_full_speed,
> -		      store_fan_full_speed, 0, 3),
> -	SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
> -		store_fan_beep, 0, 3),
> -	SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
> -
> -	SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
> -	SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
> -		      store_pwm_enable, 0, 3),
> -	SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
> -		      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
> +}, {
>  	SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
>  		      show_pwm_auto_point_channel,
>  		      store_pwm_auto_point_channel, 0, 3),
> @@ -713,7 +709,7 @@
>  		      show_pwm_auto_point_temp_hyst, NULL, 2, 3),
>  	SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
>  		      show_pwm_auto_point_temp_hyst, NULL, 3, 3),
> -};
> +} };
>  
>  /* Fan attr specific to the f8000 (4th fan input can only measure speed) */
>  static struct sensor_device_attribute_2 f8000_fan_attr[] = {
> @@ -1917,39 +1913,24 @@
>  			goto exit_unregister_sysfs;
>  		}
>  
> -		err = f71882fg_create_sysfs_files(pdev, fxxxx_fan_attr,
> -					ARRAY_SIZE(fxxxx_fan_attr));
> +		err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
> +				ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);

I have to admit I am a little worried by this. Looping over individual
sub-arrays would look better (less hackish) to me. But maybe it's just
me. Another problem is that any hole in the array will cause a bug, and
unfortunately (my version of) gcc doesn't warn about this (and looping
over individual sub-arrays doesn't help.) But well, if you know what
you're doing it should be OK.

As a side note, I don't think "fxxxx_fan_attr" or
"&fxxxx_fan_attr[0][0]" make any difference.

>  		if (err)
>  			goto exit_unregister_sysfs;
>  
> -		switch (data->type) {
> -		case f71862fg:
> +		if (data->type == f71862fg || data->type == f71882fg) {
>  			err = f71882fg_create_sysfs_files(pdev,
> -					fxxxx_fan_beep_attr,
> -					ARRAY_SIZE(fxxxx_fan_beep_attr));
> +					fxxxx_fan_beep_attr, nr_fans);
>  			if (err)
>  				goto exit_unregister_sysfs;
> +		}
> +
> +		switch (data->type) {
> +		case f71862fg:
>  			err = f71882fg_create_sysfs_files(pdev,
>  					f71862fg_auto_pwm_attr,
>  					ARRAY_SIZE(f71862fg_auto_pwm_attr));
>  			break;
> -		case f71882fg:
> -			err = f71882fg_create_sysfs_files(pdev,
> -					fxxxx_fan_beep_attr,
> -					ARRAY_SIZE(fxxxx_fan_beep_attr));
> -			if (err)
> -				goto exit_unregister_sysfs;
> -			err = f71882fg_create_sysfs_files(pdev,
> -					f71882fg_auto_pwm_attr,
> -					ARRAY_SIZE(f71882fg_auto_pwm_attr));
> -			if (err)
> -				goto exit_unregister_sysfs;
> -			/* fall through! */
> -		case f71858fg:
> -			err = f71882fg_create_sysfs_files(pdev,
> -					fxxxx_auto_pwm_attr,
> -					ARRAY_SIZE(fxxxx_auto_pwm_attr));
> -			break;
>  		case f8000:
>  			err = f71882fg_create_sysfs_files(pdev,
>  					f8000_fan_attr,
> @@ -1960,6 +1941,10 @@
>  					f8000_auto_pwm_attr,
>  					ARRAY_SIZE(f8000_auto_pwm_attr));
>  			break;
> +		default: /* f71858fg / f71882fg / f71889fg */
> +			err = f71882fg_create_sysfs_files(pdev,
> +				&fxxxx_auto_pwm_attr[0][0],
> +				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
>  		}
>  		if (err)
>  			goto exit_unregister_sysfs;
> @@ -1989,7 +1974,7 @@
>  
>  static int f71882fg_remove(struct platform_device *pdev)
>  {
> -	int i;
> +	int i, j;
>  	struct f71882fg_data *data = platform_get_drvdata(pdev);
>  
>  	platform_set_drvdata(pdev, NULL);
> @@ -2009,15 +1994,18 @@
>  					&fxxxx_in1_alarm_attr[i].dev_attr);
>  
>  	for (i = 0; i < ARRAY_SIZE(fxxxx_fan_attr); i++)
> -		device_remove_file(&pdev->dev, &fxxxx_fan_attr[i].dev_attr);
> +		for (j = 0; j < ARRAY_SIZE(fxxxx_fan_attr[0]); j++)
> +			device_remove_file(&pdev->dev,
> +					   &fxxxx_fan_attr[i][j].dev_attr);
>  
>  	for (i = 0; i < ARRAY_SIZE(fxxxx_fan_beep_attr); i++)
>  		device_remove_file(&pdev->dev,
>  				   &fxxxx_fan_beep_attr[i].dev_attr);
>  
> -	for (i = 0; i < ARRAY_SIZE(f71882fg_auto_pwm_attr); i++)
> -		device_remove_file(&pdev->dev,
> -				   &f71882fg_auto_pwm_attr[i].dev_attr);
> +	for (i = 0; i < ARRAY_SIZE(fxxxx_auto_pwm_attr); i++)
> +		for (j = 0; j < ARRAY_SIZE(fxxxx_auto_pwm_attr[0]); j++)
> +			device_remove_file(&pdev->dev,
> +					  &fxxxx_auto_pwm_attr[i][j].dev_attr);
>  
>  	for (i = 0; i < ARRAY_SIZE(f8000_auto_pwm_attr); i++)
>  		device_remove_file(&pdev->dev,

-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux