Re: [PATCH 2/2] hwmon/f71882fg: Add support for F71808A

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

 



On Thu, 21 Apr 2011 15:44:18 +0200, Hans de Goede wrote:
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
>  Documentation/hwmon/f71882fg |    4 ++
>  drivers/hwmon/Kconfig        |    2 +-
>  drivers/hwmon/f71882fg.c     |   79 ++++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 82 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/hwmon/f71882fg b/Documentation/hwmon/f71882fg
> index df02245..84d2623 100644
> --- a/Documentation/hwmon/f71882fg
> +++ b/Documentation/hwmon/f71882fg
> @@ -6,6 +6,10 @@ Supported chips:
>      Prefix: 'f71808e'
>      Addresses scanned: none, address read from Super I/O config space
>      Datasheet: Not public
> +  * Fintek F71808A
> +    Prefix: 'f71808a'
> +    Addresses scanned: none, address read from Super I/O config space
> +    Datasheet: Not public
>    * Fintek F71858FG
>      Prefix: 'f71858fg'
>      Addresses scanned: none, address read from Super I/O config space
> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index 065d01b..b4ede46 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -320,7 +320,7 @@ config SENSORS_F71882FG
>  	  If you say yes here you get support for hardware monitoring
>  	  features of many Fintek Super-I/O (LPC) chips. The currently
>  	  supported chips are:
> -	    F71808E
> +	    F71808E/A
>  	    F71858FG
>  	    F71862FG
>  	    F71863FG
> diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
> index 16330db..341922d 100644
> --- a/drivers/hwmon/f71882fg.c
> +++ b/drivers/hwmon/f71882fg.c
> @@ -48,6 +48,7 @@
>  
>  #define SIO_FINTEK_ID		0x1934	/* Manufacturers ID */
>  #define SIO_F71808E_ID		0x0901	/* Chipset ID */
> +#define SIO_F71808A_ID		0x1001	/* Chipset ID */
>  #define SIO_F71858_ID		0x0507  /* Chipset ID */
>  #define SIO_F71862_ID		0x0601	/* Chipset ID */
>  #define SIO_F71869_ID		0x0814	/* Chipset ID */
> @@ -107,11 +108,12 @@ static unsigned short force_id;
>  module_param(force_id, ushort, 0);
>  MODULE_PARM_DESC(force_id, "Override the detected device ID");
>  
> -enum chips { f71808e, f71858fg, f71862fg, f71869, f71882fg, f71889fg,
> +enum chips { f71808e, f71808a, f71858fg, f71862fg, f71869, f71882fg, f71889fg,
>  	     f71889ed, f71889a, f8000, f81865f };
>  
>  static const char *f71882fg_names[] = {
>  	"f71808e",
> +	"f71808a",
>  	"f71858fg",
>  	"f71862fg",
>  	"f71869", /* Both f71869f and f71869e, reg. compatible and same id */
> @@ -125,6 +127,7 @@ static const char *f71882fg_names[] = {
>  
>  static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
>  	[f71808e]	= { 1, 1, 1, 1, 1, 1, 0, 1, 1 },
> +	[f71808a]	= { 1, 1, 1, 1, 0, 0, 0, 1, 1 },
>  	[f71858fg]	= { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
>  	[f71862fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
>  	[f71869]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
> @@ -138,6 +141,7 @@ static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
>  
>  static const char f71882fg_has_in1_alarm[] = {
>  	[f71808e]	= 0,
> +	[f71808a]	= 0,
>  	[f71858fg]	= 0,
>  	[f71862fg]	= 0,
>  	[f71869]	= 0,
> @@ -151,6 +155,7 @@ static const char f71882fg_has_in1_alarm[] = {
>  
>  static const char f71882fg_fan_has_beep[] = {
>  	[f71808e]	= 0,
> +	[f71808a]	= 0,
>  	[f71858fg]	= 0,
>  	[f71862fg]	= 1,
>  	[f71869]	= 1,
> @@ -164,6 +169,7 @@ static const char f71882fg_fan_has_beep[] = {
>  
>  static const char f71882fg_nr_fans[] = {
>  	[f71808e]	= 3,
> +	[f71808a]	= 2, /* +1 fan which is monitor + simple pwm only */
>  	[f71858fg]	= 3,
>  	[f71862fg]	= 3,
>  	[f71869]	= 3,
> @@ -171,12 +177,13 @@ static const char f71882fg_nr_fans[] = {
>  	[f71889fg]	= 3,
>  	[f71889ed]	= 3,
>  	[f71889a]	= 3,
> -	[f8000]		= 3,
> +	[f8000]		= 3, /* +1 fan which is monitor only */
>  	[f81865f]	= 2,
>  };
>  
>  static const char f71882fg_temp_has_beep[] = {
>  	[f71808e]	= 0,
> +	[f71808a]	= 1,
>  	[f71858fg]	= 0,
>  	[f71862fg]	= 1,
>  	[f71869]	= 1,
> @@ -190,6 +197,7 @@ static const char f71882fg_temp_has_beep[] = {
>  
>  static const char f71882fg_nr_temps[] = {
>  	[f71808e]	= 2,
> +	[f71808a]	= 2,
>  	[f71858fg]	= 3,
>  	[f71862fg]	= 3,
>  	[f71869]	= 3,
> @@ -314,6 +322,10 @@ static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
>  	char *buf);
>  static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
>  	const char *buf, size_t count);
> +static ssize_t show_simple_pwm(struct device *dev,
> +	struct device_attribute *devattr, char *buf);
> +static ssize_t store_simple_pwm(struct device *dev,
> +	struct device_attribute *devattr, const char *buf, size_t count);
>  static ssize_t show_pwm_enable(struct device *dev,
>  	struct device_attribute *devattr, char *buf);
>  static ssize_t store_pwm_enable(struct device *dev,
> @@ -563,6 +575,14 @@ static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
>  		      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
>  } };
>  
> +/* Attr for the third fan of the f71808a, which only has manual pwm */
> +static struct sensor_device_attribute_2 f71808a_fan3_attr[] = {
> +	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
> +	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
> +	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR,
> +		      show_simple_pwm, store_simple_pwm, 0, 2),
> +};
> +
>  /* Attr for models which can beep on Fan alarm */
>  static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
>  	SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
> @@ -1736,6 +1756,38 @@ leave:
>  	return count;
>  }
>  
> +static ssize_t show_simple_pwm(struct device *dev,
> +			       struct device_attribute *devattr, char *buf)
> +{
> +	struct f71882fg_data *data = f71882fg_update_device(dev);
> +	int val, nr = to_sensor_dev_attr_2(devattr)->index;
> +
> +	val = data->pwm[nr];
> +	return sprintf(buf, "%d\n", val);
> +}
> +
> +static ssize_t store_simple_pwm(struct device *dev,
> +				struct device_attribute *devattr,
> +				const char *buf, size_t count)
> +{
> +	struct f71882fg_data *data = dev_get_drvdata(dev);
> +	int err, nr = to_sensor_dev_attr_2(devattr)->index;
> +	long val;
> +
> +	err = strict_strtol(buf, 10, &val);
> +	if (err)
> +		return err;
> +
> +	val = SENSORS_LIMIT(val, 0, 255);
> +
> +	mutex_lock(&data->update_lock);
> +	f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
> +	data->pwm[nr] = val;
> +	mutex_unlock(&data->update_lock);
> +
> +	return count;
> +}
> +
>  static ssize_t show_pwm_enable(struct device *dev,
>  			       struct device_attribute *devattr, char *buf)
>  {
> @@ -2182,6 +2234,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
>  
>  	if (start_reg & 0x02) {
>  		switch (data->type) {
> +		case f71808a:
>  		case f71808e:
>  		case f71869:
>  			/* These always have signed auto point temps */
> @@ -2243,6 +2296,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
>  		}
>  
>  		switch (data->type) {
> +		case f71808a:
>  		case f71808e:
>  		case f71869:
>  		case f71889fg:

Nitpicking: in all other places you listed the f71808e first, so you
should do the same here for consistency.

> @@ -2269,6 +2323,16 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
>  		}
>  
>  		switch (data->type) {
> +		case f71808a:
> +			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;
> +			err = f71882fg_create_sysfs_files(pdev,
> +					f71808a_fan3_attr,
> +					ARRAY_SIZE(f71808a_fan3_attr));
> +			break;
>  		case f71862fg:
>  			err = f71882fg_create_sysfs_files(pdev,
>  					f71862fg_auto_pwm_attr,
> @@ -2386,6 +2450,14 @@ static int f71882fg_remove(struct platform_device *pdev)
>  		}
>  
>  		switch (data->type) {
> +		case f71808a:
> +			f71882fg_remove_sysfs_files(pdev,
> +				&fxxxx_auto_pwm_attr[0][0],
> +				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
> +			f71882fg_remove_sysfs_files(pdev,
> +					f71808a_fan3_attr,
> +					ARRAY_SIZE(f71808a_fan3_attr));
> +			break;
>  		case f71862fg:
>  			f71882fg_remove_sysfs_files(pdev,
>  					f71862fg_auto_pwm_attr,
> @@ -2438,6 +2510,9 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address,
>  	case SIO_F71808E_ID:
>  		sio_data->type = f71808e;
>  		break;
> +	case SIO_F71808A_ID:
> +		sio_data->type = f71808a;
> +		break;
>  	case SIO_F71858_ID:
>  		sio_data->type = f71858fg;
>  		break;

Other than this, it looks all reasonable, so I've adjusted the code
myself and applied the patch. Thanks for your contribution.

-- 
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