[lm-sensors] [PATCH] f75375s allow setting up fans with platform_data
Riku Voipio
riku.voipio at movial.fi
Tue Oct 16 11:47:27 CEST 2007
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 */
>
More information about the lm-sensors
mailing list