[PATCH] f75375s allow setting up fans with platform_data

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

 



This patch still applies as is.

Riku Voipio wrote:
> Allow initializing fans on systems where BIOS does not do that by
> default.
>
>  - define f75375s_platform_data in new file f75375s.h
>  - if platform_data was provided, set fans accordingly in f75375_init()
>  - split set_pwm_enable() to a sysfs callback and directly usable
>    set_pwm_enable_direct()
>
> Signed-off-by: Riku Voipio <riku.voipio at movial.fi>
> ---
>  drivers/hwmon/f75375s.c |   42 +++++++++++++++++++++++++++++++++++-------
>  include/linux/f75375s.h |   21 +++++++++++++++++++++
>  2 files changed, 56 insertions(+), 7 deletions(-)
>  create mode 100644 include/linux/f75375s.h
>
> diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
> index 9336f5e..3074f74 100644
> --- a/drivers/hwmon/f75375s.c
> +++ b/drivers/hwmon/f75375s.c
> @@ -34,6 +34,7 @@
>  #include <linux/i2c.h>
>  #include <linux/err.h>
>  #include <linux/mutex.h>
> +#include <linux/f75375s.h>
>  
>  /* Addresses to scan */
>  static unsigned short normal_i2c[] = { 0x2d, 0x2e, I2C_CLIENT_END };
> @@ -287,19 +288,14 @@ static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
>  	return sprintf(buf, "%d\n", data->pwm_enable[nr]);
>  }
>  
> -static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
> -		const char *buf, size_t count)
> +static int set_pwm_enable_direct(struct i2c_client *client, int nr, int val)
>  {
> -	int nr = to_sensor_dev_attr(attr)->index;
> -	struct i2c_client *client = to_i2c_client(dev);
>  	struct f75375_data *data = i2c_get_clientdata(client);
> -	int val = simple_strtoul(buf, NULL, 10);
>  	u8 fanmode;
>  
>  	if (val < 0 || val > 4)
>  		return -EINVAL;
>  
> -	mutex_lock(&data->update_lock);
>  	fanmode = f75375_read8(client, F75375_REG_FAN_TIMER);
>  	fanmode = ~(3 << FAN_CTRL_MODE(nr));
>  
> @@ -321,8 +317,22 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
>  	}
>  	f75375_write8(client, F75375_REG_FAN_TIMER, fanmode);
>  	data->pwm_enable[nr] = val;
> +	return 0;
> +}
> +
> +static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
> +		const char *buf, size_t count)
> +{
> +	int nr = to_sensor_dev_attr(attr)->index;
> +	struct i2c_client *client = to_i2c_client(dev);
> +	struct f75375_data *data = i2c_get_clientdata(client);
> +	int val = simple_strtoul(buf, NULL, 10);
> +	int err = 0;
> +
> +	mutex_lock(&data->update_lock);
> +	err = set_pwm_enable_direct(client, nr, val);
>  	mutex_unlock(&data->update_lock);
> -	return count;
> +	return err ? err : count;
>  }
>  
>  static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *attr,
> @@ -604,9 +614,24 @@ static int f75375_detach_client(struct i2c_client *client)
>  	return 0;
>  }
>  
> +static void f75375_init(struct i2c_client *client, struct f75375_data *data,
> +		struct f75375s_platform_data *f75375s_pdata)
> +{
> +	int nr;
> +	set_pwm_enable_direct(client, 0, f75375s_pdata->pwm_enable[0]);
> +	set_pwm_enable_direct(client, 1, f75375s_pdata->pwm_enable[1]);
> +	for (nr = 0; nr < 2; nr++) {
> +		data->pwm[nr] = SENSORS_LIMIT(f75375s_pdata->pwm[nr], 0, 255);
> +		f75375_write8(client, F75375_REG_FAN_PWM_DUTY(nr),
> +			data->pwm[nr]);
> +	}
> +
> +}
> +
>  static int f75375_probe(struct i2c_client *client)
>  {
>  	struct f75375_data *data = i2c_get_clientdata(client);
> +	struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
>  	int err;
>  
>  	if (!i2c_check_functionality(client->adapter,
> @@ -637,6 +662,9 @@ static int f75375_probe(struct i2c_client *client)
>  		goto exit_remove;
>  	}
>  
> +	if (f75375s_pdata != NULL)
> +		f75375_init(client, data, f75375s_pdata);
> +
>  	return 0;
>  
>  exit_remove:
> diff --git a/include/linux/f75375s.h b/include/linux/f75375s.h
> new file mode 100644
> index 0000000..e99e225
> --- /dev/null
> +++ b/include/linux/f75375s.h
> @@ -0,0 +1,21 @@
> +/*
> + * f75375s.h - platform data structure for f75375s sensor
> + *
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License.  See the file "COPYING" in the main directory of this archive
> + * for more details.
> + *
> + * Copyright (C) 2007, Riku Voipio <riku.voipio at iki.fi>
> + */
> +
> +#ifndef __LINUX_F75375S_H
> +#define __LINUX_F75375S_H
> +
> +/* We want to set fans spinning on systems where there is no
> + * BIOS to do that for us */
> +struct f75375s_platform_data {
> +	u8 pwm[2];
> +	u8 pwm_enable[2];
> +};
> +
> +#endif /* __LINUX_F75375S_H */
>   





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

  Powered by Linux