Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ff312d07c2e1b1482fcc139b8af67ca39e9e98f0
Commit:     ff312d07c2e1b1482fcc139b8af67ca39e9e98f0
Parent:     620c142db20477149bf04c7e8e8fde70d608e8c7
Author:     Riku Voipio <[EMAIL PROTECTED]>
AuthorDate: Wed Sep 26 13:14:40 2007 +0300
Committer:  Mark M. Hoffman <[EMAIL PROTECTED]>
CommitDate: Thu Nov 8 08:42:46 2007 -0500

    hwmon: (f75375s) Allow setting up fans with platform_data
    
    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 <[EMAIL PROTECTED]>
    Signed-off-by: Mark M. Hoffman <[EMAIL PROTECTED]>
---
 drivers/hwmon/f75375s.c |   42 +++++++++++++++++++++++++++++++++++-------
 include/linux/f75375s.h |   21 +++++++++++++++++++++
 2 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
index 19b3427..472b052 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 };
@@ -286,19 +287,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));
 
@@ -320,8 +316,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 <[EMAIL PROTECTED]>
+ */
+
+#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 */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to