diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2008-12-02 07:07:45 +0100 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2008-12-02 07:07:45 +0100 |
| commit | 08e1a194bea902951f0e6bc9b0f2050ba031671f (patch) | |
| tree | f57475a6eb3e6df0ccd7890b60c5d91e6632d39b /packages/linux | |
| parent | 90d0da93bd1e187d192bb417b4d343fa3de5d0f7 (diff) | |
linux-2.6.26: update patches for boc01 machine
Diffstat (limited to 'packages/linux')
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/005-081127-isl12024.patch (renamed from packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch) | 58 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch | 317 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/007-081127-lm73.patch | 275 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/008-081105-spi.patch | 100 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/008-081127-spi.patch | 327 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/013-081127-lcd.patch | 663 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/boc01.dts | 3 | ||||
| -rw-r--r-- | packages/linux/linux-2.6.26/boc01/defconfig | 76 | ||||
| -rw-r--r-- | packages/linux/linux_2.6.26.bb | 9 |
9 files changed, 1317 insertions, 511 deletions
diff --git a/packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch b/packages/linux/linux-2.6.26/boc01/005-081127-isl12024.patch index 538a29ce7e..5e9f198b47 100644 --- a/packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch +++ b/packages/linux/linux-2.6.26/boc01/005-081127-isl12024.patch @@ -327,10 +327,10 @@ diff -Nru linux-2.6.26-officiel/drivers/rtc/Makefile /home/guilig/workspace/kern obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o -diff -Nru linux-2.6.26-officiel/drivers/rtc/rtc-isl12024.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/rtc-isl12024.c ---- linux-2.6.26-officiel/drivers/rtc/rtc-isl12024.c 1970-01-01 01:00:00.000000000 +0100 -+++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/rtc-isl12024.c 2008-10-21 10:41:51.000000000 +0200 -@@ -0,0 +1,564 @@ +diff -Nru linux-2.6.26/drivers/rtc/rtc-isl12024.c linux-2.6.26.mod/drivers/rtc/rtc-isl12024.c +--- linux-2.6.26/drivers/rtc/rtc-isl12024.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.26.mod/drivers/rtc/rtc-isl12024.c 2008-11-27 12:05:37.000000000 +0100 +@@ -0,0 +1,516 @@ +/* + * Intersil ISL12024 class driver + * @@ -550,54 +550,6 @@ diff -Nru linux-2.6.26-officiel/drivers/rtc/rtc-isl12024.c /home/guilig/workspac + return 0; +} + -+//static int isl12024_get_datetime(struct i2c_client *client, struct rtc_time *tm, -+// unsigned char reg_base) -+//{ -+// unsigned char dt_addr[2] = { 0, reg_base }; -+// unsigned char buf[8]; -+// int i; -+// -+// struct i2c_msg msgs[] = { -+// { client->addr, 0, 2, dt_addr }, /* setup read ptr */ -+// { client->addr, I2C_M_RD, 8, buf }, /* read date */ -+// }; -+// -+// /* read date registers */ -+// if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { -+// dev_err(&client->dev, "%s: read error\n", __func__); -+// return -EIO; -+// } -+// -+// dev_dbg(&client->dev, -+// "%s: raw read data - sec=%02x, min=%02x, hr=%02x, " -+// "mday=%02x, mon=%02x, year=%02x, wday=%02x, y2k=%02x\n", -+// __func__, -+// buf[0], buf[1], buf[2], buf[3], -+// buf[4], buf[5], buf[6], buf[7]); -+// -+// /* Mask out the enable bits if these are alarm registers */ -+// if (reg_base < ISL12024_CCR_BASE) -+// for (i = 0; i <= 4; i++) -+// buf[i] &= 0x7F; -+// -+// tm->tm_sec = BCD2BIN(buf[CCR_SEC]); -+// tm->tm_min = BCD2BIN(buf[CCR_MIN]); -+// tm->tm_hour = BCD2BIN(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */ -+// tm->tm_mday = BCD2BIN(buf[CCR_MDAY]); -+// tm->tm_mon = BCD2BIN(buf[CCR_MONTH]) - 1; /* mon is 0-11 */ -+// tm->tm_year = BCD2BIN(buf[CCR_YEAR]) -+// + (BCD2BIN(buf[CCR_Y2K]) * 100) - 1900; -+// tm->tm_wday = buf[CCR_WDAY]; -+// -+// dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " -+// "mday=%d, mon=%d, year=%d, wday=%d\n", -+// __func__, -+// tm->tm_sec, tm->tm_min, tm->tm_hour, -+// tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); -+// -+// return 0; -+//} -+ +static int isl12024_set_datetime(struct i2c_client *client, struct rtc_time *tm, + int datetoo, u8 reg_base, unsigned char alm_enable) +{ @@ -634,7 +586,7 @@ diff -Nru linux-2.6.26-officiel/drivers/rtc/rtc-isl12024.c /home/guilig/workspac + buf[CCR_MDAY] = BIN2BCD(tm->tm_mday); + + /* month, 1 - 12 */ -+ buf[CCR_MONTH] = BIN2BCD(tm->tm_mon + 1); ++ buf[CCR_MONTH] = BIN2BCD(tm->tm_mon); + + /* year, since the rtc epoch*/ + buf[CCR_YEAR] = BIN2BCD(tm->tm_year % 100); diff --git a/packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch b/packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch deleted file mode 100644 index 4f51d5d222..0000000000 --- a/packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch +++ /dev/null @@ -1,317 +0,0 @@ -diff -Nru linux-2.6.26-officiel/drivers/hwmon/Kconfig /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/Kconfig ---- linux-2.6.26-officiel/drivers/hwmon/Kconfig 2008-07-13 23:51:29.000000000 +0200 -+++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/Kconfig 2008-11-06 11:25:51.000000000 +0100 -@@ -390,6 +390,15 @@ - This driver can also be built as a module. If so, the module - will be called lm70. - -+config SENSORS_LM73 -+ tristate "National Semiconductor LM73" -+ depends on I2C -+ help -+ If you say yes here you get support for National Semiconductor LM73 -+ sensor chips -+ This driver can also be built as a module. If so, the module -+ will be called lm73. -+ - config SENSORS_LM75 - tristate "National Semiconductor LM75 and compatibles" - depends on I2C -diff -Nru linux-2.6.26-officiel/drivers/hwmon/lm73.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/lm73.c ---- linux-2.6.26-officiel/drivers/hwmon/lm73.c 1970-01-01 01:00:00.000000000 +0100 -+++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/lm73.c 2008-11-04 14:57:12.000000000 +0100 -@@ -0,0 +1,283 @@ -+/* -+ lm75.c - Part of lm_sensors, Linux kernel modules for hardware -+ monitoring -+ Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl> -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#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> -+#include "lm75.h" -+ -+ -+/* Addresses to scan */ -+static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, -+ 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; -+ -+/* Insmod parameters */ -+I2C_CLIENT_INSMOD_1(lm75); -+ -+/* Many LM75 constants specified below */ -+ -+/* The LM75 registers */ -+#define LM75_REG_CONF 0x01 -+static const u8 LM75_REG_TEMP[3] = { -+ 0x00, /* input */ -+ 0x02, /* max */ -+ 0x02, /* hyst */ -+}; -+ -+/* Each client has this additional data */ -+struct lm75_data { -+ struct i2c_client client; -+ struct device *hwmon_dev; -+ struct mutex update_lock; -+ char valid; /* !=0 if following fields are valid */ -+ unsigned long last_updated; /* In jiffies */ -+ u16 temp[3]; /* Register values, -+ 0 = input -+ 1 = max -+ 2 = hyst */ -+}; -+ -+static int lm75_attach_adapter(struct i2c_adapter *adapter); -+static int lm75_detect(struct i2c_adapter *adapter, int address, int kind); -+static void lm75_init_client(struct i2c_client *client); -+static int lm75_detach_client(struct i2c_client *client); -+static int lm75_read_value(struct i2c_client *client, u8 reg); -+static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value); -+static struct lm75_data *lm75_update_device(struct device *dev); -+ -+ -+/* This is the driver that will be inserted */ -+static struct i2c_driver lm75_driver = { -+ .driver = { -+ .name = "lm75", -+ }, -+ .attach_adapter = lm75_attach_adapter, -+ .detach_client = lm75_detach_client, -+}; -+ -+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 lm75_data *data = lm75_update_device(dev); -+ return sprintf(buf, "%d\n", -+ LM75_TEMP_FROM_REG(data->temp[attr->index])); -+} -+ -+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 lm75_data *data = i2c_get_clientdata(client); -+ int nr = attr->index; -+ long temp = simple_strtol(buf, NULL, 10); -+ -+ mutex_lock(&data->update_lock); -+ data->temp[nr] = LM75_TEMP_TO_REG(temp); -+ lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]); -+ mutex_unlock(&data->update_lock); -+ return count; -+} -+ -+static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, -+ show_temp, set_temp, 1); -+static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, -+ show_temp, set_temp, 2); -+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); -+ -+static int lm75_attach_adapter(struct i2c_adapter *adapter) -+{ -+ if (!(adapter->class & I2C_CLASS_HWMON)) -+ return 0; -+ -+ return i2c_probe(adapter, &addr_data, lm75_detect); -+} -+ -+static struct attribute *lm75_attributes[] = { -+ &sensor_dev_attr_temp1_input.dev_attr.attr, -+ &sensor_dev_attr_temp1_max.dev_attr.attr, -+ &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, -+ -+ NULL -+}; -+ -+static const struct attribute_group lm75_group = { -+ .attrs = lm75_attributes, -+}; -+ -+/* This function is called by i2c_probe */ -+static int lm75_detect(struct i2c_adapter *adapter, int address, int kind) -+{ -+ int i; -+ struct i2c_client *new_client; -+ struct lm75_data *data; -+ int err = 0; -+ const char *name = ""; -+ -+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | -+ I2C_FUNC_SMBUS_WORD_DATA)) -+ goto exit; -+ /* OK. For now, we presume we have a valid client. We now create the -+ client structure, even though we cannot fill it completely yet. -+ But it allows us to access lm75_{read,write}_value. */ -+ if (!(data = kzalloc(sizeof(struct lm75_data), GFP_KERNEL))) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ -+ new_client = &data->client; -+ i2c_set_clientdata(new_client, data); -+ new_client->addr = address; -+ new_client->adapter = adapter; -+ new_client->driver = &lm75_driver; -+ new_client->flags = 0; -+ -+ name = "lm75"; -+ -+ /* Fill in the remaining client fields and put it into the global list */ -+ strlcpy(new_client->name, name, I2C_NAME_SIZE); -+ data->valid = 0; -+ mutex_init(&data->update_lock); -+ -+ /* Tell the I2C layer a new client has arrived */ -+ if ((err = i2c_attach_client(new_client))) -+ goto exit_free; -+ -+ /* Initialize the LM75 chip */ -+ lm75_init_client(new_client); -+ -+ /* Register sysfs hooks */ -+ if ((err = sysfs_create_group(&new_client->dev.kobj, &lm75_group))) -+ goto exit_detach; -+ -+ data->hwmon_dev = hwmon_device_register(&new_client->dev); -+ if (IS_ERR(data->hwmon_dev)) { -+ err = PTR_ERR(data->hwmon_dev); -+ goto exit_remove; -+ } -+ -+ return 0; -+ -+exit_remove: -+ sysfs_remove_group(&new_client->dev.kobj, &lm75_group); -+exit_detach: -+ i2c_detach_client(new_client); -+exit_free: -+ kfree(data); -+exit: -+ return err; -+} -+ -+static int lm75_detach_client(struct i2c_client *client) -+{ -+ struct lm75_data *data = i2c_get_clientdata(client); -+ hwmon_device_unregister(data->hwmon_dev); -+ sysfs_remove_group(&client->dev.kobj, &lm75_group); -+ i2c_detach_client(client); -+ kfree(data); -+ return 0; -+} -+ -+/* All registers are word-sized, except for the configuration register. -+ LM75 uses a high-byte first convention, which is exactly opposite to -+ the SMBus standard. */ -+static int lm75_read_value(struct i2c_client *client, u8 reg) -+{ -+ int value; -+ -+ if (reg == LM75_REG_CONF) -+ return i2c_smbus_read_byte_data(client, reg); -+ -+ value = i2c_smbus_read_word_data(client, reg); -+ return (value < 0) ? value : swab16(value); -+} -+ -+static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) -+{ -+ if (reg == LM75_REG_CONF) -+ return i2c_smbus_write_byte_data(client, reg, value); -+ else -+ return i2c_smbus_write_word_data(client, reg, swab16(value)); -+} -+ -+static void lm75_init_client(struct i2c_client *client) -+{ -+ int reg; -+ -+ /* Enable if in shutdown mode */ -+ reg = lm75_read_value(client, LM75_REG_CONF); -+ if (reg >= 0 && (reg & 0x01)) -+ lm75_write_value(client, LM75_REG_CONF, reg & 0xfe); -+} -+ -+static struct lm75_data *lm75_update_device(struct device *dev) -+{ -+ struct i2c_client *client = to_i2c_client(dev); -+ struct lm75_data *data = i2c_get_clientdata(client); -+ -+ mutex_lock(&data->update_lock); -+ -+ if (time_after(jiffies, data->last_updated + HZ + HZ / 2) -+ || !data->valid) { -+ int i; -+ dev_dbg(&client->dev, "Starting lm75 update\n"); -+ -+ for (i = 0; i < ARRAY_SIZE(data->temp); i++) { -+ int status; -+ -+ status = lm75_read_value(client, LM75_REG_TEMP[i]); -+ if (status < 0) -+ dev_dbg(&client->dev, "reg %d, err %d\n", -+ LM75_REG_TEMP[i], status); -+ else -+ data->temp[i] = status; -+ } -+ data->last_updated = jiffies; -+ data->valid = 1; -+ } -+ -+ mutex_unlock(&data->update_lock); -+ -+ return data; -+} -+ -+static int __init sensors_lm75_init(void) -+{ -+ return i2c_add_driver(&lm75_driver); -+} -+ -+static void __exit sensors_lm75_exit(void) -+{ -+ i2c_del_driver(&lm75_driver); -+} -+ -+MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>"); -+MODULE_DESCRIPTION("LM75 driver"); -+MODULE_LICENSE("GPL"); -+ -+module_init(sensors_lm75_init); -+module_exit(sensors_lm75_exit); -diff -Nru linux-2.6.26-officiel/drivers/hwmon/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/Makefile ---- linux-2.6.26-officiel/drivers/hwmon/Makefile 2008-07-13 23:51:29.000000000 +0200 -+++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/hwmon/Makefile 2008-11-06 11:26:13.000000000 +0100 -@@ -47,6 +47,7 @@ - obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o - obj-$(CONFIG_SENSORS_LM63) += lm63.o - obj-$(CONFIG_SENSORS_LM70) += lm70.o -+obj-$(CONFIG_SENSORS_LM73) += lm73.o - obj-$(CONFIG_SENSORS_LM75) += lm75.o - obj-$(CONFIG_SENSORS_LM77) += lm77.o - obj-$(CONFIG_SENSORS_LM78) += lm78.o diff --git a/packages/linux/linux-2.6.26/boc01/007-081127-lm73.patch b/packages/linux/linux-2.6.26/boc01/007-081127-lm73.patch new file mode 100644 index 0000000000..14787f8b04 --- /dev/null +++ b/packages/linux/linux-2.6.26/boc01/007-081127-lm73.patch @@ -0,0 +1,275 @@ +diff -Nru linux-2.6.26/drivers/hwmon/Kconfig linux-2.6.26.mod/drivers/hwmon/Kconfig +--- linux-2.6.26/drivers/hwmon/Kconfig 2008-07-13 23:51:29.000000000 +0200 ++++ linux-2.6.26.mod/drivers/hwmon/Kconfig 2008-11-18 11:54:04.000000000 +0100 +@@ -390,6 +390,15 @@ + This driver can also be built as a module. If so, the module + will be called lm70. + ++config SENSORS_LM73 ++ tristate "National Semiconductor LM73" ++ depends on I2C ++ help ++ If you say yes here you get support for National Semiconductor LM73 ++ sensor chips ++ This driver can also be built as a module. If so, the module ++ will be called lm73. ++ + config SENSORS_LM75 + tristate "National Semiconductor LM75 and compatibles" + depends on I2C +diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.c +--- linux-2.6.26/drivers/hwmon/lm73.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.26.mod/drivers/hwmon/lm73.c 2008-11-27 11:46:31.000000000 +0100 +@@ -0,0 +1,241 @@ ++ /* ++ * LM73 Sensor driver ++ * Based on LM75 ++ * ++ * ++ * Copyright (C) 2007, CenoSYS (www.cenosys.com). ++ * Guillaume Ligneul ++ * Guillaume.ligneul@gmail.com ++ * ++ * 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 ++ */ ++ ++#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 to scan */ ++static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, ++ 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; ++ ++/* Insmod parameters */ ++I2C_CLIENT_INSMOD_1(lm73); ++ ++/* LM73 registers */ ++#define LM73_REG_INPUT 0x00 ++#define LM73_REG_CONF 0x01 ++#define LM73_REG_T_HIGH 0x02 ++#define LM73_REG_T_LOW 0x03 ++ ++static const u8 LM73_REG_TEMP[3] = { ++ LM73_REG_INPUT, /* input */ ++ LM73_REG_T_HIGH, /* max */ ++ LM73_REG_T_LOW, /* min */ ++}; ++ ++/* Each client has this additional data */ ++struct lm73_data { ++ struct i2c_client client; ++ struct device *hwmon_dev; ++ struct mutex update_lock; ++ char valid; /* !=0 if following fields are valid */ ++ unsigned long last_updated; /* In jiffies */ ++ u16 temp[3]; /* Register values, ++ 0 = input ++ 1 = max ++ 2 = min */ ++}; ++ ++static int lm73_attach_adapter(struct i2c_adapter *adapter); ++static int lm73_detect(struct i2c_adapter *adapter, int address, int kind); ++static int lm73_detach_client(struct i2c_client *client); ++static int lm73_read_value(struct i2c_client *client, u8 reg); ++static int lm73_write_value(struct i2c_client *client, u8 reg, short value); ++ ++/* This is the driver that will be inserted */ ++static struct i2c_driver lm73_driver = { ++ .driver = { ++ .name = "lm73", ++ }, ++ .attach_adapter = lm73_attach_adapter, ++ .detach_client = lm73_detach_client, ++}; ++ ++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); ++ int iTemp = 0; ++ ++ iTemp = lm73_read_value(client, LM73_REG_TEMP[attr->index]); ++ ++ return sprintf(buf, "%d\n", iTemp); ++ ++ ++} ++ ++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); ++ int nr = attr->index; ++ ++ long tmp = simple_strtol(buf, NULL, 10); ++ ++ lm73_write_value(client, LM73_REG_TEMP[nr], tmp); ++ return count; ++} ++ ++static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, ++ show_temp, set_temp, 1); ++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); ++ ++static int lm73_attach_adapter(struct i2c_adapter *adapter) ++{ ++ if (!(adapter->class & I2C_CLASS_HWMON)) ++ return 0; ++ ++ return i2c_probe(adapter, &addr_data, lm73_detect); ++} ++ ++static struct attribute *lm73_attributes[] = { ++ &sensor_dev_attr_temp1_input.dev_attr.attr, ++ &sensor_dev_attr_temp1_max.dev_attr.attr, ++ &sensor_dev_attr_temp1_min.dev_attr.attr, ++ ++ NULL ++}; ++ ++static const struct attribute_group lm73_group = { ++ .attrs = lm73_attributes, ++}; ++ ++/* This function is called by i2c_probe */ ++static int lm73_detect(struct i2c_adapter *adapter, int address, int kind) ++{ ++ struct i2c_client *new_client; ++ struct lm73_data *data; ++ int err = 0; ++ const char *name = ""; ++ ++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | ++ I2C_FUNC_SMBUS_WORD_DATA)) ++ goto exit; ++ ++ if (!(data = kzalloc(sizeof(struct lm73_data), GFP_KERNEL))) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ++ new_client = &data->client; ++ i2c_set_clientdata(new_client, data); ++ new_client->addr = address; ++ new_client->adapter = adapter; ++ new_client->driver = &lm73_driver; ++ new_client->flags = 0; ++ ++ name = "lm73"; ++ ++ /* Fill in the remaining client fields and put it into the global list */ ++ strlcpy(new_client->name, name, I2C_NAME_SIZE); ++ data->valid = 0; ++ mutex_init(&data->update_lock); ++ ++ /* Tell the I2C layer a new client has arrived */ ++ if ((err = i2c_attach_client(new_client))) ++ goto exit_free; ++ ++ /* Register sysfs hooks */ ++ if ((err = sysfs_create_group(&new_client->dev.kobj, &lm73_group))) ++ goto exit_detach; ++ ++ data->hwmon_dev = hwmon_device_register(&new_client->dev); ++ if (IS_ERR(data->hwmon_dev)) { ++ err = PTR_ERR(data->hwmon_dev); ++ goto exit_remove; ++ } ++ ++ return 0; ++ ++exit_remove: ++ sysfs_remove_group(&new_client->dev.kobj, &lm73_group); ++exit_detach: ++ i2c_detach_client(new_client); ++exit_free: ++ kfree(data); ++exit: ++ return err; ++} ++ ++static int lm73_detach_client(struct i2c_client *client) ++{ ++ struct lm73_data *data = i2c_get_clientdata(client); ++ hwmon_device_unregister(data->hwmon_dev); ++ sysfs_remove_group(&client->dev.kobj, &lm73_group); ++ i2c_detach_client(client); ++ kfree(data); ++ return 0; ++} ++ ++static int lm73_read_value(struct i2c_client *client, u8 reg) ++{ ++ short sVal; ++ ++ if (reg == LM73_REG_CONF) ++ return i2c_smbus_read_byte_data(client, reg); ++ else ++ { ++ sVal = swab16(i2c_smbus_read_word_data(client, reg)); ++ sVal = sVal >> 7; ++ ++ if(sVal & 0xFFFF) ++ { ++ sVal = sVal - 0x1; ++ sVal = ~sVal; ++ ++ return -sVal; ++ } ++ } ++ ++} ++ ++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 ++ { ++ value = value<<7; ++ return i2c_smbus_write_word_data(client, reg, swab16(value)); ++ ++ } ++} ++ ++static int __init sensors_lm73_init(void) ++{ ++ return i2c_add_driver(&lm73_driver); ++} ++ ++static void __exit sensors_lm73_exit(void) ++{ ++ i2c_del_driver(&lm73_driver); ++} ++ ++MODULE_AUTHOR("Ligneul Guillaume <guillaume.ligneul@gmail.com>"); ++MODULE_DESCRIPTION("LM73 driver"); ++MODULE_LICENSE("GPL"); ++ ++module_init(sensors_lm73_init); ++module_exit(sensors_lm73_exit); +diff -Nru linux-2.6.26/drivers/hwmon/Makefile linux-2.6.26.mod/drivers/hwmon/Makefile +--- linux-2.6.26/drivers/hwmon/Makefile 2008-07-13 23:51:29.000000000 +0200 ++++ linux-2.6.26.mod/drivers/hwmon/Makefile 2008-11-18 11:54:04.000000000 +0100 +@@ -47,6 +47,7 @@ + obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o + obj-$(CONFIG_SENSORS_LM63) += lm63.o + obj-$(CONFIG_SENSORS_LM70) += lm70.o ++obj-$(CONFIG_SENSORS_LM73) += lm73.o + obj-$(CONFIG_SENSORS_LM75) += lm75.o + obj-$(CONFIG_SENSORS_LM77) += lm77.o + obj-$(CONFIG_SENSORS_LM78) += lm78.o diff --git a/packages/linux/linux-2.6.26/boc01/008-081105-spi.patch b/packages/linux/linux-2.6.26/boc01/008-081105-spi.patch deleted file mode 100644 index 0c2ddf3383..0000000000 --- a/packages/linux/linux-2.6.26/boc01/008-081105-spi.patch +++ /dev/null @@ -1,100 +0,0 @@ -diff -Nru linux-2.6.26-officiel/arch/powerpc/platforms/83xx/mpc831x_rdb.c /home/guilig/workspace/kernel-goobie-2.6.26/src/arch/powerpc/platforms/83xx/mpc831x_rdb.c ---- linux-2.6.26-officiel/arch/powerpc/platforms/83xx/mpc831x_rdb.c 2008-07-13 23:51:29.000000000 +0200 -+++ /home/guilig/workspace/kernel-goobie-2.6.26/src/arch/powerpc/platforms/83xx/mpc831x_rdb.c 2008-09-26 11:51:32.000000000 +0200 -@@ -15,16 +15,95 @@ - - #include <linux/pci.h> - #include <linux/of_platform.h> -- -+#include <linux/interrupt.h> -+#include <linux/spi/spi.h> -+#include <linux/spi/mmc_spi.h> -+#include <linux/mmc/host.h> -+#include <linux/of_platform.h> -+#include <sysdev/fsl_soc.h> -+#include <asm/qe.h> -+#include <asm/qe_ic.h> -+#include <asm/time.h> -+#include <asm/ipic.h> -+#include <asm/udbg.h> - #include <asm/time.h> - #include <asm/ipic.h> - #include <asm/udbg.h> -+#include <sysdev/fsl_soc.h> -+ - - #include "mpc83xx.h" - - /* - * Setup the architecture - */ -+struct gpio { -+ __be32 gpdir; -+ __be32 gpodr; -+ __be32 gpdat; -+ __be32 gpier; -+ __be32 gpimr; -+ __be32 gpicr; -+} __attribute__ ((packed)); -+static struct gpio *gpio_regs; -+ -+static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity) -+{ -+ //printk(KERN_INFO "%s %d %d\n", __func__, cs, polarity); -+ if (polarity) -+ setbits32(&gpio_regs->gpdat, 1 << (31 - 13)); -+ else -+ clrbits32(&gpio_regs->gpdat, 1 << (31 - 13)); -+} -+ -+static void mpc83xx_spi_deactivate_cs(u8 cs, u8 polarity) -+{ -+ //printk(KERN_INFO "%s %d %d\n", __func__, cs, polarity); -+ if (polarity) -+ clrbits32(&gpio_regs->gpdat, 1 << (31 - 13)); -+ else -+ setbits32(&gpio_regs->gpdat, 1 << (31 - 13)); -+ -+} -+ -+static struct mmc_spi_platform_data mpc8313_mmc_pdata = { -+ .ocr_mask = MMC_VDD_33_34, -+}; -+ -+static struct spi_board_info mpc8313_spi_boardinfo = { -+ .bus_num = 0x7000, -+ .chip_select = 0, -+ .max_speed_hz = 50000000, -+ .modalias = "spidev", -+ .platform_data = &mpc8313_mmc_pdata, -+}; -+ -+static int __init mpc8313_spi_init(void) -+{ -+ __be32 __iomem *psicrl; -+ -+ /* System I/O Configuration Register Low */ -+ psicrl = ioremap(get_immrbase() + MPC83XX_SICRL_OFFS, 0x4); -+ gpio_regs = ioremap(get_immrbase() + 0xc00, 0x20); -+ if (!psicrl || !gpio_regs) -+ return -ENOMEM; -+ -+ clrbits32(psicrl, 0x03F00000); -+ setbits32(psicrl, 0x30000000); -+ iounmap(psicrl); -+ -+ /* set GPIO13 as output */ -+ setbits32(&gpio_regs->gpdir, 1 << (31 - 13)); -+ clrbits32(&gpio_regs->gpodr, 1 << (31 - 13)); -+ setbits32(&gpio_regs->gpdat, 1 << (31 - 13)); -+ -+ return fsl_spi_init(&mpc8313_spi_boardinfo, 1, -+ mpc83xx_spi_activate_cs, -+ mpc83xx_spi_deactivate_cs); -+} -+ -+device_initcall(mpc8313_spi_init); -+ - static void __init mpc831x_rdb_setup_arch(void) - { - #ifdef CONFIG_PCI diff --git a/packages/linux/linux-2.6.26/boc01/008-081127-spi.patch b/packages/linux/linux-2.6.26/boc01/008-081127-spi.patch new file mode 100644 index 0000000000..41777a5753 --- /dev/null +++ b/packages/linux/linux-2.6.26/boc01/008-081127-spi.patch @@ -0,0 +1,327 @@ +--- linux-2.6.26.orig/drivers/spi/spi_mpc83xx.c 2008-07-13 23:51:29.000000000 +0200 ++++ linux-2.6.26/drivers/spi/spi_mpc83xx.c 2008-11-26 11:32:07.000000000 +0100 +@@ -27,6 +27,8 @@ + #include <asm/irq.h> + #include <asm/io.h> + ++//#define DBG_SPI 1 ++ + /* SPI Controller registers */ + struct mpc83xx_spi_reg { + u8 res1[0x20]; +@@ -114,6 +116,7 @@ + + static inline void mpc83xx_spi_write_reg(__be32 __iomem * reg, u32 val) + { ++ + out_be32(reg, val); + } + +@@ -157,11 +160,17 @@ + + mpc83xx_spi = spi_master_get_devdata(spi->master); + ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_chipselect (163)\n"); ++#endif DBG_SPI ++ + if (value == BITBANG_CS_INACTIVE) { + if (mpc83xx_spi->deactivate_cs) + mpc83xx_spi->deactivate_cs(spi->chip_select, pol); + } +- ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_chipselect (171)\n"); ++#endif DBG_SPI + if (value == BITBANG_CS_ACTIVE) { + u32 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); + +@@ -171,6 +180,9 @@ + mpc83xx_spi->get_tx = cs->get_tx; + + if (cs->hw_mode != regval) { ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_chipselect (184)\n"); ++#endif DBG_SPI + unsigned long flags; + void *tmp_ptr = &mpc83xx_spi->base->mode; + +@@ -184,6 +196,9 @@ + mpc83xx_spi_write_reg(tmp_ptr, regval); + local_irq_restore(flags); + } ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_chipselect (196)\n"); ++#endif DBG_SPI + if (mpc83xx_spi->activate_cs) + mpc83xx_spi->activate_cs(spi->chip_select, pol); + } +@@ -266,26 +281,38 @@ + + cs->hw_mode |= SPMODE_LEN(bits_per_word); + +- if ((mpc83xx_spi->spibrg / hz) >= 64) { ++ /*if ((mpc83xx_spi->spibrg / hz) >= 64) { + pm = mpc83xx_spi->spibrg / (hz * 64) - 1; +- if (pm > 0x0f) { ++ if (pm > 0x0f) {*/ ++ if ((mpc83xx_spi->spibrg / hz) > 64) { ++ cs->hw_mode |= SPMODE_DIV16; ++ pm = mpc83xx_spi->spibrg / (hz * 64); ++ if (pm > 16) { + dev_err(&spi->dev, "Requested speed is too " + "low: %d Hz. Will use %d Hz instead.\n", + hz, mpc83xx_spi->spibrg / 1024); +- pm = 0x0f; ++ pm = 16; + } +- cs->hw_mode |= SPMODE_PM(pm) | SPMODE_DIV16; +- } else { ++ //cs->hw_mode |= SPMODE_PM(pm) | SPMODE_DIV16; ++ } else + pm = mpc83xx_spi->spibrg / (hz * 4); +- if (pm) +- pm--; +- cs->hw_mode |= SPMODE_PM(pm); +- } ++ if (pm) ++ pm--; ++ cs->hw_mode = 0x0F700000; ++ mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode,cs->hw_mode); + regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); ++#ifdef DBG_SPI ++printk("mpc83xx_spi_setup_transfer regval=%4X\n",regval); ++#endif ++ ++ ++ + if (cs->hw_mode != regval) { + unsigned long flags; + void *tmp_ptr = &mpc83xx_spi->base->mode; +- ++#ifdef DBG_SPI ++printk("mpc83xx_spi_setup_transfer cs->hw_mode=%4X\n",cs->hw_mode); ++#endif + regval = cs->hw_mode; + /* Turn off IRQs locally to minimize time + * that SPI is disabled +@@ -322,15 +349,24 @@ + /* enable rx ints */ + mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, SPIM_NE); + ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_bufs (338)\n"); ++#endif ++ + /* transmit word */ + word = mpc83xx_spi->get_tx(mpc83xx_spi); +- mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word); + ++ mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word); ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_bufs (345)\n"); ++#endif + wait_for_completion(&mpc83xx_spi->done); + + /* disable rx ints */ + mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, 0); +- ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_bufs (352)\n"); ++#endif + return mpc83xx_spi->count; + } + +@@ -360,15 +396,22 @@ + if (t->bits_per_word || t->speed_hz) { + /* Don't allow changes if CS is active */ + status = -EINVAL; +- ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_work (366)\n"); ++#endif + if (cs_change) + status = mpc83xx_spi_setup_transfer(spi, t); + if (status < 0) + break; + } +- ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_work (374)\n"); ++#endif + if (cs_change) + mpc83xx_spi_chipselect(spi, BITBANG_CS_ACTIVE); ++#ifdef DBG_SPI ++printk(KERN_INFO "mpc83xx_spi_work (379)\n"); ++#endif + cs_change = t->cs_change; + if (t->len) + status = mpc83xx_spi_bufs(spi, t); +@@ -439,26 +482,39 @@ + cs->hw_mode = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); + /* mask out bits we are going to set */ + cs->hw_mode &= ~(SPMODE_CP_BEGIN_EDGECLK | SPMODE_CI_INACTIVEHIGH +- | SPMODE_REV | SPMODE_LOOP); +- +- if (spi->mode & SPI_CPHA) ++ | SPMODE_REV); ++#ifdef DBG_SPI ++printk("mpc83xx_spi_setup (475) cs->hw_mode=0x%4X\n",cs->hw_mode); ++#endif ++ /*if (spi->mode & SPI_CPHA) + cs->hw_mode |= SPMODE_CP_BEGIN_EDGECLK; + if (spi->mode & SPI_CPOL) + cs->hw_mode |= SPMODE_CI_INACTIVEHIGH; + if (!(spi->mode & SPI_LSB_FIRST)) +- cs->hw_mode |= SPMODE_REV; +- if (spi->mode & SPI_LOOP) +- cs->hw_mode |= SPMODE_LOOP; ++ cs->hw_mode |= SPMODE_REV;*/ ++ //if (spi->mode & SPI_LOOP) ++ // cs->hw_mode |= SPMODE_LOOP; ++cs->hw_mode = 0x0F700000; ++mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode,cs->hw_mode); ++cs->hw_mode = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); ++ + ++#ifdef DBG_SPI ++printk("mpc83xx_spi_setup (486) cs->hw_mode=0x%4X\n",cs->hw_mode); ++#endif + retval = mpc83xx_spi_setup_transfer(spi, NULL); + if (retval < 0) { ++#ifdef DBG_SPI ++printk("mpc83xx_spi_setup (491) "); ++#endif + cs->hw_mode = hw_mode; /* Restore settings */ + return retval; + } +- +- dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u Hz\n", ++#ifdef DBG_SPI ++ printk(KERN_INFO "%s, mode %d, %u bits/w, %u Hz\n", + __func__, spi->mode & (SPI_CPOL | SPI_CPHA), + spi->bits_per_word, spi->max_speed_hz); ++#endif + #if 0 /* Don't think this is needed */ + /* NOTE we _need_ to call chipselect() early |
