diff options
Diffstat (limited to 'recipes/linux')
16 files changed, 3656 insertions, 583 deletions
diff --git a/recipes/linux/linux-2.6.24/hipox/defconfig b/recipes/linux/linux-2.6.24/hipox/defconfig index a1482fbf4b..27acce8811 100644 --- a/recipes/linux/linux-2.6.24/hipox/defconfig +++ b/recipes/linux/linux-2.6.24/hipox/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.24.4 -# Mon Aug 24 09:09:25 2009 +# Wed Oct 7 11:41:43 2009 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -32,7 +32,7 @@ CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_LOCALVERSION="" -CONFIG_LOCALVERSION_AUTO=y +# CONFIG_LOCALVERSION_AUTO is not set CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y @@ -46,7 +46,7 @@ CONFIG_SYSVIPC_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_FAIR_GROUP_SCHED is not set -CONFIG_SYSFS_DEPRECATED=y +# CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" @@ -332,7 +332,10 @@ CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set CONFIG_IP_FIB_HASH=y -# CONFIG_IP_PNP is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set @@ -747,7 +750,22 @@ CONFIG_SYNOPSYS_GMAC=y # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set -# CONFIG_USB_USBNET is not set +CONFIG_USB_USBNET=m +CONFIG_USB_NET_CDCETHER=m +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_GL620A is not set +CONFIG_USB_NET_NET1080=m +# CONFIG_USB_NET_PLUSB is not set +CONFIG_USB_NET_MCS7830=m +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +# CONFIG_USB_NET_ZAURUS is not set # CONFIG_WAN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set @@ -1201,6 +1219,7 @@ CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_DIRECTIO=y # CONFIG_NFSD is not set +CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y diff --git a/recipes/linux/linux-2.6.29/boc01/001-090114-sqn11x0-usb-hack.patch b/recipes/linux/linux-2.6.29/boc01/001-090114-sqn11x0-usb-hack.patch deleted file mode 100644 index 4bd44e25db..0000000000 --- a/recipes/linux/linux-2.6.29/boc01/001-090114-sqn11x0-usb-hack.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff -ur linux-2.6.27.orig/drivers/usb/host/ehci-q.c linux-2.6.27/drivers/usb/host/ehci-q.c ---- linux-2.6.27.orig/drivers/usb/host/ehci-q.c 2008-10-10 00:13:53.000000000 +0200 -+++ linux-2.6.27/drivers/usb/host/ehci-q.c 2009-01-06 18:31:38.000000000 +0100 -@@ -799,7 +799,12 @@ - * to help them do so. So now people expect to use - * such nonconformant devices with Linux too; sigh. - */ -- info1 |= max_packet(maxp) << 16; -+ struct usb_device_descriptor *desc = &urb->dev->descriptor; -+ if (desc->idVendor == cpu_to_le16(0x148e) && desc->idProduct == cpu_to_le16(0x0900)) { -+ info1 |= 256 << 16; -+ } else { -+ info1 |= max_packet(maxp) << 16; -+ } - info2 |= (EHCI_TUNE_MULT_HS << 30); - } else { /* PIPE_INTERRUPT */ - info1 |= max_packet (maxp) << 16; diff --git a/recipes/linux/linux-2.6.29/boc01/005-090226-isl12024.patch b/recipes/linux/linux-2.6.29/boc01/005-091008-isl12024.patch index ce71c3af80..50a4c75177 100644 --- a/recipes/linux/linux-2.6.29/boc01/005-090226-isl12024.patch +++ b/recipes/linux/linux-2.6.29/boc01/005-091008-isl12024.patch @@ -1,26 +1,26 @@ Index: linux-2.6.29/drivers/misc/eeprom/at24.c =================================================================== --- linux-2.6.29.orig/drivers/misc/eeprom/at24.c 2009-03-24 00:12:14.000000000 +0100 -+++ linux-2.6.29/drivers/misc/eeprom/at24.c 2009-04-01 17:37:45.000000000 +0200 ++++ linux-2.6.29/drivers/misc/eeprom/at24.c 2009-10-09 18:37:43.000000000 +0200 @@ -114,6 +114,8 @@ { "spd", AT24_DEVICE_MAGIC(2048 / 8, AT24_FLAG_READONLY | AT24_FLAG_IRUGO) }, { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) }, + /* Intersil RTC/Unique-ID isl12024 eeprom handled here */ -+ { "isl12024",AT24_DEVICE_MAGIC(4096 / 8, AT24_FLAG_ADDR16) }, ++ { "isl12024-eeprom", AT24_DEVICE_MAGIC(4096 / 8, AT24_FLAG_ADDR16) }, /* 24rf08 quirk is handled at i2c-core */ { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) }, { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) }, Index: linux-2.6.29/drivers/rtc/Kconfig =================================================================== --- linux-2.6.29.orig/drivers/rtc/Kconfig 2009-03-24 00:12:14.000000000 +0100 -+++ linux-2.6.29/drivers/rtc/Kconfig 2009-04-01 17:37:45.000000000 +0200 ++++ linux-2.6.29/drivers/rtc/Kconfig 2009-10-09 18:37:43.000000000 +0200 @@ -128,6 +128,12 @@ if I2C +config RTC_DRV_ISL12024 -+ tristate "Intersil 12024 RTC/ UniqueID" ++ tristate "Intersil 12024 RTC/Unique-ID" + help + If you say yes .... + This driver can also be built as a module. @@ -31,7 +31,7 @@ Index: linux-2.6.29/drivers/rtc/Kconfig Index: linux-2.6.29/drivers/rtc/Makefile =================================================================== --- linux-2.6.29.orig/drivers/rtc/Makefile 2009-03-24 00:12:14.000000000 +0100 -+++ linux-2.6.29/drivers/rtc/Makefile 2009-04-01 17:37:45.000000000 +0200 ++++ linux-2.6.29/drivers/rtc/Makefile 2009-10-09 18:37:43.000000000 +0200 @@ -39,6 +39,7 @@ obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o @@ -40,100 +40,63 @@ Index: linux-2.6.29/drivers/rtc/Makefile obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t94.o obj-$(CONFIG_RTC_DRV_M48T35) += rtc-m48t35.o -Index: linux-2.6.29/drivers/rtc/isl12024.h +Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.29/drivers/rtc/isl12024.h 2009-04-01 17:37:45.000000000 +0200 -@@ -0,0 +1,100 @@ ++++ linux-2.6.29/drivers/rtc/rtc-isl12024.c 2009-10-09 19:05:21.000000000 +0200 +@@ -0,0 +1,498 @@ +/* -+ * Intersil ISL12024 chip registers definitions ++ * Intersil ISL12024 class driver + * + * -+ * Copyright (C) 2008, CenoSYS (www.cenosys.com). -+ * Guillaume Ligneul -+ * Guillaume.ligneul@gmail.com ++ * Copyright (C) 2007, CenoSYS (www.cenosys.com). ++ * ++ * Guillaume Ligneul <guillaume.ligneul@gmail.com> ++ * Sylvain Giroudon <sylvain.giroudon@goobie.fr> ++ * 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 + */ + -+#ifndef ISL12024_H_ -+#define ISL12024_H_ -+ -+#define ISL12024_REG_SR 0x3F /* status register */ -+#define ISL12024_REG_Y2K 0x37 -+#define ISL12024_REG_DW 0x36 -+#define ISL12024_REG_YR 0x35 -+#define ISL12024_REG_MO 0x34 -+#define ISL12024_REG_DT 0x33 -+#define ISL12024_REG_HR 0x32 -+#define ISL12024_REG_MN 0x31 -+#define ISL12024_REG_SC 0x30 -+#define ISL12024_REG_DTR 0x13 -+#define ISL12024_REG_ATR 0x12 -+#define ISL12024_REG_INT 0x11 -+#define ISL12024_REG_0 0x10 -+#define ISL12024_REG_Y2K1 0x0F -+#define ISL12024_REG_DWA1 0x0E -+#define ISL12024_REG_YRA1 0x0D -+#define ISL12024_REG_MOA1 0x0C -+#define ISL12024_REG_DTA1 0x0B -+#define ISL12024_REG_HRA1 0x0A -+#define ISL12024_REG_MNA1 0x09 -+#define ISL12024_REG_SCA1 0x08 -+#define ISL12024_REG_Y2K0 0x07 -+#define ISL12024_REG_DWA0 0x06 -+#define ISL12024_REG_YRA0 0x05 -+#define ISL12024_REG_MOA0 0x04 -+#define ISL12024_REG_DTA0 0x03 -+#define ISL12024_REG_HRA0 0x02 -+#define ISL12024_REG_MNA0 0x01 -+#define ISL12024_REG_SCA0 0x00 ++#include <linux/module.h> ++#include <linux/i2c.h> ++#include <linux/bcd.h> ++#include <linux/rtc.h> ++#include <linux/delay.h> ++ ++#define DRV_VERSION "0.3" + +#define ISL12024_CCR_BASE 0x30 /* Base address of CCR */ +#define ISL12024_ALM0_BASE 0x00 /* Base address of ALARM0 */ -+ -+#define ISL12024_SR_RTCF 0x01 /* Clock failure */ -+#define ISL12024_SR_WEL 0x02 /* Write Enable Latch */ -+#define ISL12024_SR_RWEL 0x04 /* Register Write Enable */ -+#define ISL12024_SR_AL0 0x20 /* Alarm 0 match */ -+ -+#define ISL12024_DTR_DTR0 0x01 -+#define ISL12024_DTR_DTR1 0x02 -+#define ISL12024_DTR_DTR2 0x04 -+ -+#define ISL12024_HR_MIL 0x80 /* Set in ccr.hour for 24 hr mode */ -+ +#define ISL12024_INT_AL0E 0x20 /* Alarm 0 enable */ + -+/* I2C ADDRESS */ -+#define ISL12024_I2C_ADDR 0xDE -+#define ISL12024_I2C_EEPROM_ADDR 0x57 ++/* Register map */ + +/* device id section */ +#define ISL12024_REG_ID 0x20 + -+/* Register map */ +/* rtc section */ +#define ISL12024_REG_HR_MIL (1<<7) /* 24h/12h mode */ +#define ISL12024_REG_HR_PM (1<<5) /* PM/AM bit in 12h mode */ -+//#define ISL12024_REG_DT 0x33 /* Date */ -+//#define ISL12024_REG_MO 0x34 /* Month */ -+//#define ISL12024_REG_YR 0x35 /* Year */ -+//#define ISL12024_REG_DW 0x36 -+//#define ISL12024_REG_Y2K 0x37 ++#define ISL12024_REG_SC 0x30 ++#define ISL12024_REG_DT 0x33 /* Date */ ++#define ISL12024_REG_MO 0x34 /* Month */ ++#define ISL12024_REG_YR 0x35 /* Year */ ++#define ISL12024_REG_DW 0x36 ++#define ISL12024_REG_Y2K 0x37 +#define ISL12024_RTC_SECTION_LEN 8 + +/* control/status section */ -+//#define ISL12024_REG_SR 0x3F -+//#define ISL12024_REG_SR_BAT (1<<7) /* battery */ -+//#define ISL12024_REG_SR_AL1 (1<<6) /* alarm 0 */ -+//#define ISL12024_REG_SR_AL0 (1<<5) /* alarm 1 */ -+//#define ISL12024_REG_SR_OSCF (1<<4) /* oscillator fail */ -+//#define ISL12024_REG_SR_RWEL (1<<2) /* register write enable latch */ -+//#define ISL12024_REG_SR_WEL (1<<1) /* write enable latch */ -+//#define ISL12024_REG_SR_RTCF (1<<0) /* rtc fail */ -+//#define ISL12024_REG_INT 0x11 ++#define ISL12024_REG_SR 0x3F ++#define ISL12024_REG_SR_BAT (1<<7) /* battery */ ++#define ISL12024_REG_SR_AL1 (1<<6) /* alarm 0 */ ++#define ISL12024_REG_SR_AL0 (1<<5) /* alarm 1 */ ++#define ISL12024_REG_SR_OSCF (1<<4) /* oscillator fail */ ++#define ISL12024_REG_SR_RWEL (1<<2) /* register write enable latch */ ++#define ISL12024_REG_SR_WEL (1<<1) /* write enable latch */ ++#define ISL12024_REG_SR_RTCF (1<<0) /* rtc fail */ ++#define ISL12024_REG_INT 0x11 + +#define CCR_SEC 0 +#define CCR_MIN 1 @@ -144,73 +107,12 @@ Index: linux-2.6.29/drivers/rtc/isl12024.h +#define CCR_WDAY 6 +#define CCR_Y2K 7 + -+#endif /*ISL12024_H_*/ -Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.29/drivers/rtc/rtc-isl12024.c 2009-04-01 17:37:45.000000000 +0200 -@@ -0,0 +1,541 @@ -+/* -+ * Intersil ISL12024 class driver -+ * -+ * -+ * Copyright (C) 2007, CenoSYS (www.cenosys.com). -+ * -+ * Guillaume Ligneul <guillaume.ligneul@gmail.com> -+ * Sylvain Giroudon <sylvain.giroudon@goobie.fr> -+ * -+ * 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/i2c.h> -+#include <linux/bcd.h> -+#include <linux/rtc.h> -+#include <linux/proc_fs.h> -+#include <linux/delay.h> -+ -+#include "isl12024.h" -+ -+ -+#define DBG 1 -+#undef DBG -+ -+#define DRV_NAME "isl12024" -+#define DRV_VERSION "0.2" -+ -+/* i2c configuration */ -+static const unsigned short normal_i2c[] = { -+ ISL12024_I2C_ADDR >>1, I2C_CLIENT_END -+}; -+I2C_CLIENT_INSMOD; -+ +static int isl12024_get_status(struct i2c_client *client, unsigned char *sr); +static int isl12024_fix_osc(struct i2c_client *client); + -+static int isl12024_attach_adapter(struct i2c_adapter *adapter); -+static int isl12024_detach_client(struct i2c_client *client); -+ -+ -+/* Bufer to store unique identifier in */ -+static u8 buf_id[ISL12024_RTC_SECTION_LEN] = { 0 }; -+ -+ -+// To debug (may be added in include/linux/i2c-id.h) -+#define I2C_DRIVERID_ISL12024 97 -+ -+ -+static struct i2c_driver isl12024_driver = { -+ .driver = { -+ .name = DRV_NAME, -+ }, -+ .id = I2C_DRIVERID_ISL12024, -+ .attach_adapter = &isl12024_attach_adapter, -+ .detach_client = &isl12024_detach_client, -+}; ++static struct i2c_driver isl12024_driver; + -+ -+int ++static int +isl12024_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[], + unsigned len) +{ @@ -228,7 +130,7 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + .addr = client->addr, + .flags = I2C_M_RD, + .len = len , -+ .buf = buf , ++ .buf = buf, + }, + }; + @@ -243,10 +145,8 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + return ret; +} + -+EXPORT_SYMBOL(isl12024_i2c_read_regs); + -+ -+int ++static int +isl12024_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], + unsigned len) +{ @@ -270,13 +170,11 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + + ret = i2c_transfer(client->adapter, msgs, 1); + if ( ret < 0 ) -+ printk(KERN_ERR DRV_NAME ": i2c_transfer failed (%d)\n", ret); ++ dev_err(&client->dev, "i2c_transfer failed (%d)\n", ret); + + return ret; +} + -+EXPORT_SYMBOL(isl12024_i2c_set_regs); -+ + +static int isl12024_i2c_validate_client(struct i2c_client *client) +{ @@ -296,13 +194,11 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + for (i = 0; i < ISL12024_RTC_SECTION_LEN; ++i) { + if (regs[i] & zero_mask[i]) /* check if bits are cleared */ + return -ENODEV; -+ + } + + return 0; +} + -+ +static int isl12024_read_time(struct i2c_client *client, + struct rtc_time *tm) +{ @@ -310,25 +206,16 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + int err; + u8 regs[ISL12024_RTC_SECTION_LEN] = { 0, }; + -+ //printk(KERN_INFO DRV_NAME "%s\n ",__FUNCTION__ ); -+ + if (isl12024_get_status(client, &sr) < 0) { -+ dev_err(&client->dev, "%s: reading SR failed\n", __func__); ++ dev_err(&client->dev, "reading SR failed\n"); + return -EIO; + } + + err = isl12024_i2c_read_regs(client, ISL12024_REG_SC, regs, ISL12024_RTC_SECTION_LEN); + -+#ifdef DBG -+ int i; -+ for(i=0; i<ISL12024_RTC_SECTION_LEN; i++) -+ printk(KERN_INFO DRV_NAME "0x%2X\n", regs[i]); -+#endif -+ + if (err < 0) { -+ dev_err(&client->dev, "%s: reading RTC section failed\n", -+ __func__); -+ return sr; ++ dev_err(&client->dev, "reading RTC section failed\n"); ++ return err; + } + + tm->tm_sec = bcd2bin(regs[0]); @@ -353,7 +240,6 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + return rtc_valid_tm(tm); +} + -+ +static int isl12024_get_status(struct i2c_client *client, unsigned char *sr) +{ + static unsigned char sr_addr[2] = { 0, ISL12024_REG_SR }; @@ -381,10 +267,10 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + unsigned char rdata[10] = { 0, reg_base }; + + static const unsigned char wel[3] = { 0, ISL12024_REG_SR, -+ ISL12024_SR_WEL }; ++ ISL12024_REG_SR_WEL }; + + static const unsigned char rwel[3] = { 0, ISL12024_REG_SR, -+ ISL12024_SR_WEL | ISL12024_SR_RWEL }; ++ ISL12024_REG_SR_WEL | ISL12024_REG_SR_RWEL }; + + static const unsigned char diswe[3] = { 0, ISL12024_REG_SR, 0 }; + @@ -397,7 +283,7 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + buf[CCR_MIN] = bin2bcd(tm->tm_min); + + /* set hour and 24hr bit */ -+ buf[CCR_HOUR] = bin2bcd(tm->tm_hour) | ISL12024_HR_MIL; ++ buf[CCR_HOUR] = bin2bcd(tm->tm_hour) | ISL12024_REG_HR_MIL; + + /* should we also set the date? */ + if (datetoo) { @@ -494,7 +380,6 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + return 0; +} + -+ +static int isl12024_fix_osc(struct i2c_client *client) +{ + int err; @@ -504,26 +389,23 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + + err = isl12024_set_datetime(client, &tm, 0, ISL12024_CCR_BASE, 0); + if ( err < 0 ) -+ printk(KERN_ERR DRV_NAME ": Unable to restart the oscillator (%d)\n", err); ++ dev_err(&client->dev, "unable to restart the oscillator (%d)\n", err); + + return err; +} + -+ +static int isl12024_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + return isl12024_read_time(to_i2c_client(dev), tm); + +} + -+ +static int isl12024_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + return isl12024_set_datetime(to_i2c_client(dev), + tm, 1, ISL12024_CCR_BASE, 0); +} + -+ +static int +isl12024_rtc_proc(struct device *dev, struct seq_file *seq) +{ @@ -533,144 +415,114 @@ Index: linux-2.6.29/drivers/rtc/rtc-isl12024.c + return 0; +} + -+ +static const struct rtc_class_ops isl12024_rtc_ops = { + .proc = isl12024_rtc_proc, + .read_time = isl12024_rtc_read_time, + .set_time = isl12024_rtc_set_time, +}; + -+static int -+read_proc(char * page, char ** start, off_t off, int count, int * eof, void * data) ++static ssize_t isl12024_show_id(struct device *dev, struct device_attribute *attr, ++ char *buf) +{ ++ struct i2c_client *client = to_i2c_client(dev); ++ int err; + int len = 0; + int i; ++ u8 id_buffer[ISL12024_RTC_SECTION_LEN]; + -+ for (i = 0; i < ISL12024_RTC_SECTION_LEN; i++) -+ len += sprintf(page+len, "%02X", buf_id[i]); -+ len += sprintf(page+len, "\n"); -+ -+ len -= off; -+ if ( len < count ) { -+ *eof = 1; -+ if ( len <= 0 ) -+ return 0; -+ } else { -+ len = count; ++ /* Read unique id from eeprom */ ++ err = isl12024_i2c_read_regs(client, ISL12024_REG_ID, id_buffer, sizeof(id_buffer)); ++ if (err < 0) { ++ dev_err(&client->dev, "reading RTC section failed\n"); ++ return err; + } + -+ *start = page + off; -+ ++ /* Print hexadecimal */ ++ for (i = 0; i < sizeof(id_buffer); i++) ++ len += sprintf(buf + len, "%02X", id_buffer[i]); ++ len += sprintf(buf + len, "\n"); + return len; +} + ++static DEVICE_ATTR(id, S_IRUGO, isl12024_show_id, NULL); + +static int -+isl12024_probe(struct i2c_adapter *adapter, int addr, int kind) ++isl12024_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int rc = 0; -+ int err = 0; + unsigned char sr; -+ struct i2c_client *new_client = NULL; + struct rtc_device *rtc = NULL; -+ struct proc_dir_entry *proc_root; -+ struct proc_dir_entry *proc_entry; -+ -+ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { -+ rc = -ENODEV; -+ goto failout; -+ } -+ -+ new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); -+ if (new_client == NULL) { -+ rc = -ENOMEM; -+ goto failout; -+ } + -+ new_client->addr = addr; -+ new_client->adapter = adapter; -+ new_client->driver = &isl12024_driver; -+ new_client->flags = 0; -+ strcpy(new_client->name, DRV_NAME); ++ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) ++ return -ENODEV; + -+ if (kind < 0) { -+ rc = isl12024_i2c_validate_client(new_client); -+ if (rc < 0) -+ goto failout; -+ } ++ if (isl12024_i2c_validate_client(client) < 0) ++ return -ENODEV; + -+ rc = i2c_attach_client(new_client); -+ if (rc < 0) -+ goto failout; ++ dev_info(&client->dev, ++ "chip found, driver version " DRV_VERSION "\n"); + + rtc = rtc_device_register(isl12024_driver.driver.name, -+ &new_client->dev, -+ &isl12024_rtc_ops, THIS_MODULE); -+ -+ if (IS_ERR(rtc)) { -+ printk(KERN_ERR DRV_NAME ": Error during rtc registration\n"); -+ rc = PTR_ERR(rtc); -+ goto failout; ++ &client->dev, &isl12024_rtc_ops, ++ THIS_MODULE); ++ ++ if (IS_ERR(rtc)) ++ return PTR_ERR(rtc); ++ ++ i2c_set_clientdata(client, rtc); ++ ++ rc = isl12024_get_status(client, &sr); ++ if (rc < 0) { ++ dev_err(&client->dev, "reading status failed\n"); ++ goto exit_unregister; ++ } ++ ++ /* Check for power failures and enable the osc */ ++ if (sr & ISL12024_REG_SR_RTCF) { ++ dev_warn(&client->dev, "rtc power failure detected, " ++ "please set clock.\n"); ++ udelay(50); ++ isl12024_fix_osc(client); + } + -+ i2c_set_clientdata(new_client, rtc); -+ -+ /* Check for power failures and eventualy enable the osc */ -+ if ((err = isl12024_get_status(new_client, &sr)) == 0) { -+ if (sr & ISL12024_SR_RTCF) { -+ printk(KERN_INFO DRV_NAME ": Power failure detected, please set the clock\n"); -+ udelay(50); -+ isl12024_fix_osc(new_client); -+ } -+ } -+ else { -+ printk(KERN_ERR DRV_NAME ": Couldn't read status\n"); -+ } -+ -+ proc_root = proc_mkdir(DRV_NAME, 0); -+ proc_entry = create_proc_entry("id", S_IFREG | S_IRUGO, proc_root); -+ if (proc_entry == NULL) -+ return -1; -+ -+ proc_entry->owner = THIS_MODULE; -+ proc_entry->read_proc = read_proc; -+ -+ /* Read unique id from eeprom */ -+ isl12024_i2c_read_regs(new_client, ISL12024_REG_ID, buf_id, sizeof(buf_id)); ++ /* Register sysfs hooks */ ++ rc = device_create_file(&client->dev, &dev_attr_id); ++ if (rc < 0) ++ goto exit_unregister; + + return 0; + -+ failout: -+ kfree(new_client); -+ return rc; -+} ++exit_unregister: ++ rtc_device_unregister(rtc); + -+ -+static int -+isl12024_attach_adapter (struct i2c_adapter *adapter) -+{ -+ return i2c_probe(adapter, &addr_data, isl12024_probe); ++ return rc; +} + -+ +static int -+isl12024_detach_client(struct i2c_client *client) ++isl12024_remove(struct i2c_client *client) +{ -+ int rc; -+ struct rtc_device *const rtc = i2c_get_clientdata(client); ++ struct rtc_device *rtc = i2c_get_clientdata(client); + -+ if (rtc) -+ rtc_device_unregister(rtc); -+ -+ rc = i2c_detach_client(client); -+ if (rc) -+ return rc; -+ -+ kfree(client); ++ rtc_device_unregister(rtc); ++ device_remove_file(&client->dev, &dev_attr_id); + + return 0; +} + ++static const struct i2c_device_id isl12024_id[] = { ++ { "isl12024", 0 }, ++ { } ++}; ++MODULE_DEVICE_TABLE(i2c, isl12024_id); ++ ++static struct i2c_driver isl12024_driver = { ++ .driver = { ++ .name = "rtc-isl12024", ++ }, ++ .probe = isl12024_probe, ++ .remove = isl12024_remove, ++ .id_table = isl12024_id, ++}; + +/* module init/exit */ + 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)) |
