diff options
author | Jeremy Lainé <jeremy.laine@m4x.org> | 2009-10-05 18:48:17 +0200 |
---|---|---|
committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2009-10-05 18:48:17 +0200 |
commit | 280be5d65abd35492163f78c602c695cecf7c43c (patch) | |
tree | 23b50509aab77a134d19740b3fd4e000332503cf /recipes/linux/linux-2.6.29 | |
parent | 571fb9f63920660ad5bdb332856bfe9129a1f343 (diff) |
linux-2.6.29: update patch for lm73 on boc01
Diffstat (limited to 'recipes/linux/linux-2.6.29')
-rw-r--r-- | recipes/linux/linux-2.6.29/boc01/007-091005-lm73.patch (renamed from recipes/linux/linux-2.6.29/boc01/007-090825-lm73.patch) | 178 |
1 files changed, 70 insertions, 108 deletions
diff --git a/recipes/linux/linux-2.6.29/boc01/007-090825-lm73.patch b/recipes/linux/linux-2.6.29/boc01/007-091005-lm73.patch index 8ffae6a2b0..bc43a0a70a 100644 --- a/recipes/linux/linux-2.6.29/boc01/007-090825-lm73.patch +++ b/recipes/linux/linux-2.6.29/boc01/007-091005-lm73.patch @@ -1,7 +1,7 @@ Index: linux-2.6.29/drivers/hwmon/Kconfig =================================================================== ---- linux-2.6.29.orig/drivers/hwmon/Kconfig 2009-08-25 17:33:48.000000000 +0200 -+++ linux-2.6.29/drivers/hwmon/Kconfig 2009-08-25 17:34:24.000000000 +0200 +--- linux-2.6.29.orig/drivers/hwmon/Kconfig 2009-10-05 18:27:57.000000000 +0200 ++++ linux-2.6.29/drivers/hwmon/Kconfig 2009-10-05 18:28:35.000000000 +0200 @@ -448,6 +448,15 @@ This driver can also be built as a module. If so, the module will be called lm70. @@ -11,7 +11,7 @@ Index: linux-2.6.29/drivers/hwmon/Kconfig + depends on I2C + help + If you say yes here you get support for National Semiconductor LM73 -+ sensor chips ++ sensor chips. + This driver can also be built as a module. If so, the module + will be called lm73. + @@ -21,102 +21,98 @@ Index: linux-2.6.29/drivers/hwmon/Kconfig Index: linux-2.6.29/drivers/hwmon/lm73.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.29/drivers/hwmon/lm73.c 2009-08-25 18:43:49.000000000 +0200 -@@ -0,0 +1,243 @@ -+ /* ++++ linux-2.6.29/drivers/hwmon/lm73.c 2009-10-05 18:28:49.000000000 +0200 +@@ -0,0 +1,205 @@ ++/* + * LM73 Sensor driver + * Based on LM75 + * + * Copyright (C) 2007, CenoSYS (www.cenosys.com). + * Copyright (C) 2009, Bollore telecom (www.bolloretelecom.eu). + * -+ * Guillaume Ligneul (Guillaume.ligneul@gmail.com) ++ * Guillaume Ligneul <guillaume.ligneul@cenosys.com> + * Adrien Demarez <adrien.demarez@bolloretelecom.eu> + * Jeremy Laine <jeremy.laine@bolloretelecom.eu> + * + * This software program is licensed subject to the GNU General Public License -+ * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html ++ * (GPL).Version 2,June 1991, available at ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/slab.h> -+#include <linux/jiffies.h> +#include <linux/i2c.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/err.h> -+#include <linux/mutex.h> + + +/* Addresses scanned */ -+static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, -+ 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; ++static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c, ++ 0x4d, 0x4e, I2C_CLIENT_END }; + +/* Insmod parameters */ +I2C_CLIENT_INSMOD_1(lm73); + +/* LM73 registers */ ++#define LM73_REG_INPUT 0x00 +#define LM73_REG_CONF 0x01 -+static const u8 LM73_REG_TEMP[3] = { -+ 0x00, /* input */ -+ 0x02, /* max */ -+ 0x03, /* min */ -+}; -+ -+/* Each client has this additional data */ -+struct lm73_data { -+ struct device *hwmon_dev; -+ struct mutex update_lock; -+ u16 temp[3]; /* Register values, -+ 0 = input -+ 1 = max -+ 2 = min */ -+}; -+ -+static int lm73_read_value(struct i2c_client *client, u8 reg); -+static int lm73_write_value(struct i2c_client *client, u8 reg, short value); ++#define LM73_REG_MAX 0x02 ++#define LM73_REG_MIN 0x03 ++#define LM73_REG_CTRL 0x04 ++#define LM73_REG_ID 0x07 + ++#define LM73_ID 0x9001 /* or 0x190 after a swab16() */ ++#define DRVNAME "lm73" ++#define LM73_TEMP_MIN (-40) ++#define LM73_TEMP_MAX 150 + +/*-----------------------------------------------------------------------*/ + -+/* sysfs attributes for hwmon */ + -+static ssize_t show_temp(struct device *dev, struct device_attribute *da, -+ char *buf) ++static ssize_t set_temp(struct device *dev, struct device_attribute *da, ++ const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); -+ struct lm73_data *data = i2c_get_clientdata(client); -+ int iTemp = 0; ++ long temp; ++ short value; + -+ mutex_lock(&data->update_lock); -+ iTemp = lm73_read_value(client, LM73_REG_TEMP[attr->index]); -+ mutex_unlock(&data->update_lock); ++ int status = strict_strtol(buf, 10, &temp); ++ if(status < 0) ++ return status; + -+ return sprintf(buf, "%d\n", iTemp); ++ /* Write value */ ++ value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4), ++ (LM73_TEMP_MAX*4)) << 5; ++ i2c_smbus_write_word_data(client, attr->index, swab16(value)); ++ return count; +} + -+static ssize_t set_temp(struct device *dev, struct device_attribute *da, -+ const char *buf, size_t count) ++static ssize_t show_temp(struct device *dev, struct device_attribute *da, ++ char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); -+ struct lm73_data *data = i2c_get_clientdata(client); -+ int nr = attr->index; -+ long temp = simple_strtol(buf, NULL, 10); -+ -+ mutex_lock(&data->update_lock); -+ lm73_write_value(client, LM73_REG_TEMP[nr], temp); -+ mutex_unlock(&data->update_lock); -+ return count; ++ /* use integer division instead of equivalent right shift to ++ guarantee arithmetic shift and preserve the sign */ ++ int temp = ((s16) (swab16(i2c_smbus_read_word_data(client, ++ attr->index)))*250) / 32; ++ return sprintf(buf, "%d\n", temp); +} + ++ ++/*-----------------------------------------------------------------------*/ ++ ++/* sysfs attributes for hwmon */ ++ +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, -+ show_temp, set_temp, 1); ++ show_temp, set_temp, LM73_REG_MAX); +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, -+ show_temp, set_temp, 2); -+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); ++ show_temp, set_temp, LM73_REG_MIN); ++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ++ show_temp, NULL, LM73_REG_INPUT); + + +static struct attribute *lm73_attributes[] = { @@ -138,52 +134,38 @@ Index: linux-2.6.29/drivers/hwmon/lm73.c +static int +lm73_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ -+ struct lm73_data *data; ++ struct device *hwmon_dev; + int status; + -+ if (!i2c_check_functionality(client->adapter, -+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) -+ return -EIO; -+ -+ data = kzalloc(sizeof(struct lm73_data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ i2c_set_clientdata(client, data); -+ mutex_init(&data->update_lock); -+ + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &lm73_group); + if (status) -+ goto exit_free; ++ return status; + -+ data->hwmon_dev = hwmon_device_register(&client->dev); -+ if (IS_ERR(data->hwmon_dev)) { -+ status = PTR_ERR(data->hwmon_dev); ++ hwmon_dev = hwmon_device_register(&client->dev); ++ if (IS_ERR(hwmon_dev)) { ++ status = PTR_ERR(hwmon_dev); + goto exit_remove; + } ++ i2c_set_clientdata(client, hwmon_dev); + + dev_info(&client->dev, "%s: sensor '%s'\n", -+ dev_name(data->hwmon_dev), client->name); ++ dev_name(hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &lm73_group); -+exit_free: -+ i2c_set_clientdata(client, NULL); -+ kfree(data); + return status; +} + +static int lm73_remove(struct i2c_client *client) +{ -+ struct lm73_data *data = i2c_get_clientdata(client); ++ struct device *hwmon_dev = i2c_get_clientdata(client); + -+ hwmon_device_unregister(data->hwmon_dev); ++ hwmon_device_unregister(hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &lm73_group); + i2c_set_clientdata(client, NULL); -+ kfree(data); + return 0; +} + @@ -195,17 +177,22 @@ Index: linux-2.6.29/drivers/hwmon/lm73.c + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int lm73_detect(struct i2c_client *new_client, int kind, -+ struct i2c_board_info *info) ++ struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = new_client->adapter; ++ u16 id; ++ u8 ctrl; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | -+ I2C_FUNC_SMBUS_WORD_DATA)) ++ I2C_FUNC_SMBUS_WORD_DATA)) ++ return -ENODEV; ++ ++ /* Check device ID */ ++ id = i2c_smbus_read_word_data(new_client, LM73_REG_ID); ++ ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL); ++ if ((id != LM73_ID) || (ctrl & 0x10)) + return -ENODEV; + -+ /* NOTE: we treat "force=..." and "force_lm73=..." the same. -+ * Only new-style driver binding distinguishes chip types. -+ */ + strlcpy(info->type, "lm73", I2C_NAME_SIZE); + + return 0; @@ -223,31 +210,6 @@ Index: linux-2.6.29/drivers/hwmon/lm73.c + .address_data = &addr_data, +}; + -+/*-----------------------------------------------------------------------*/ -+ -+/* register access */ -+ -+static int lm73_read_value(struct i2c_client *client, u8 reg) -+{ -+ short value; -+ -+ if (reg == LM73_REG_CONF) -+ return i2c_smbus_read_byte_data(client, reg); -+ -+ value = swab16(i2c_smbus_read_word_data(client, reg)) >> 7; -+ return value; -+} -+ -+static int lm73_write_value(struct i2c_client *client, u8 reg, short value) -+{ -+ if (reg == LM73_REG_CONF) -+ return i2c_smbus_write_byte_data(client, reg, value); -+ else -+ return i2c_smbus_write_word_data(client, reg, swab16(value<<7)); -+} -+ -+/*-----------------------------------------------------------------------*/ -+ +/* module glue */ + +static int __init sensors_lm73_init(void) @@ -260,7 +222,7 @@ Index: linux-2.6.29/drivers/hwmon/lm73.c + i2c_del_driver(&lm73_driver); +} + -+MODULE_AUTHOR("Ligneul Guillaume <guillaume.ligneul@gmail.com>"); ++MODULE_AUTHOR("Guillaume Ligneul <guillaume.ligneul@cenosys.com>"); +MODULE_DESCRIPTION("LM73 driver"); +MODULE_LICENSE("GPL"); + @@ -268,8 +230,8 @@ Index: linux-2.6.29/drivers/hwmon/lm73.c +module_exit(sensors_lm73_exit); Index: linux-2.6.29/drivers/hwmon/Makefile =================================================================== ---- linux-2.6.29.orig/drivers/hwmon/Makefile 2009-08-25 17:33:48.000000000 +0200 -+++ linux-2.6.29/drivers/hwmon/Makefile 2009-08-25 17:34:24.000000000 +0200 +--- linux-2.6.29.orig/drivers/hwmon/Makefile 2009-10-05 18:27:57.000000000 +0200 ++++ linux-2.6.29/drivers/hwmon/Makefile 2009-10-05 18:28:35.000000000 +0200 @@ -54,6 +54,7 @@ obj-$(CONFIG_SENSORS_LIS3LV02D) += lis3lv02d.o hp_accel.o obj-$(CONFIG_SENSORS_LM63) += lm63.o |