summaryrefslogtreecommitdiff
path: root/packages/linux/linux-2.6.26/boc01
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2008-11-24 19:27:16 +0100
committerJeremy Lainé <jeremy.laine@m4x.org>2008-11-24 19:27:16 +0100
commit30926fd2523fd93741149dd4ccd0e69ed3e1854d (patch)
tree36be7ee263f6590553ee2387c334bce493bfd968 /packages/linux/linux-2.6.26/boc01
parentc7d514e3de6cb0ddad3dbc7efd4428b24cd2d144 (diff)
linux-2.6.26: add patches for boc01 hardware
Diffstat (limited to 'packages/linux/linux-2.6.26/boc01')
-rw-r--r--packages/linux/linux-2.6.26/boc01/002-081105-headers.patch112
-rw-r--r--packages/linux/linux-2.6.26/boc01/003-081124-nand.patch107
-rw-r--r--packages/linux/linux-2.6.26/boc01/004-081105-usb.patch17
-rw-r--r--packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch994
-rw-r--r--packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch284
-rw-r--r--packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch317
-rw-r--r--packages/linux/linux-2.6.26/boc01/008-081105-spi.patch100
-rw-r--r--packages/linux/linux-2.6.26/boc01/010-081105-mii.patch519
-rw-r--r--packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch161
-rw-r--r--packages/linux/linux-2.6.26/boc01/012-081121-cy3218-btns.patch243
-rw-r--r--packages/linux/linux-2.6.26/boc01/boc01.dts67
-rw-r--r--packages/linux/linux-2.6.26/boc01/defconfig371
12 files changed, 2988 insertions, 304 deletions
diff --git a/packages/linux/linux-2.6.26/boc01/002-081105-headers.patch b/packages/linux/linux-2.6.26/boc01/002-081105-headers.patch
new file mode 100644
index 0000000000..b82dcbce4a
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/002-081105-headers.patch
@@ -0,0 +1,112 @@
+diff -Nru /opt/Bollore/dev/oe/build/tmp/work/mpc8313e-rdb-angstrom-linux/linux-2.6.26-r1.1/linux-2.6.26/include/linux/i2c/isl12024.h ../linux-2.6.26.modified/include/linux/i2c/isl12024.h
+--- /opt/Bollore/dev/oe/build/tmp/work/mpc8313e-rdb-angstrom-linux/linux-2.6.26-r1.1/linux-2.6.26/include/linux/i2c/isl12024.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.26.modified/include/linux/i2c/isl12024.h 2008-10-21 10:36:19.000000000 +0200
+@@ -0,0 +1,93 @@
++#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
++
++#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
++/* device id section */
++#define ISL12024_REG_ID 0x20
++/* Register map */
++/* rtc section */
++//#define ISL12024_REG_MSB 0x00
++//#define ISL12024_REG_SC 0x30 /* Seconds */
++//#define ISL12024_REG_MN 0x31 /* Minutes */
++//#define ISL12024_REG_HR 0x32 /* Hours */
++#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_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 CCR_SEC 0
++#define CCR_MIN 1
++#define CCR_HOUR 2
++#define CCR_MDAY 3
++#define CCR_MONTH 4
++#define CCR_YEAR 5
++#define CCR_WDAY 6
++#define CCR_Y2K 7
++
++#endif /*ISL12024_H_*/
+diff -Nru /opt/Bollore/dev/oe/build/tmp/work/mpc8313e-rdb-angstrom-linux/linux-2.6.26-r1.1/linux-2.6.26/include/linux/phy.h ../linux-2.6.26.modified/include/linux/phy.h
+--- /opt/Bollore/dev/oe/build/tmp/work/mpc8313e-rdb-angstrom-linux/linux-2.6.26-r1.1/linux-2.6.26/include/linux/phy.h 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/include/linux/phy.h 2008-10-14 15:12:02.000000000 +0200
+@@ -339,6 +339,11 @@
+ u32 features;
+ u32 flags;
+
++ /* Called during discovery to test if the
++ * device can attach to the bus, even if
++ phy id and mask do not match */
++ bool (*detect)(struct mii_bus *bus, int addr);
++
+ /*
+ * Called to initialize the PHY,
+ * including after a reset
diff --git a/packages/linux/linux-2.6.26/boc01/003-081124-nand.patch b/packages/linux/linux-2.6.26/boc01/003-081124-nand.patch
new file mode 100644
index 0000000000..885bad2715
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/003-081124-nand.patch
@@ -0,0 +1,107 @@
+diff -Nru linux-2.6.26/drivers/mtd/nand/fsl_elbc_nand.c linux-2.6.26.modified/drivers/mtd/nand/fsl_elbc_nand.c
+--- linux-2.6.26/drivers/mtd/nand/fsl_elbc_nand.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/mtd/nand/fsl_elbc_nand.c 2008-10-24 13:43:30.000000000 +0200
+@@ -89,7 +89,7 @@
+ .eccbytes = 3,
+ .eccpos = {6, 7, 8},
+ .oobfree = { {0, 5}, {9, 7} },
+- .oobavail = 12,
++// .oobavail = 12,
+ };
+
+ /* Small Page FLASH with FMR[ECCM] = 1 */
+@@ -97,7 +97,7 @@
+ .eccbytes = 3,
+ .eccpos = {8, 9, 10},
+ .oobfree = { {0, 5}, {6, 2}, {11, 5} },
+- .oobavail = 12,
++ //.oobavail = 12,
+ };
+
+ /* Large Page FLASH with FMR[ECCM] = 0 */
+@@ -105,7 +105,7 @@
+ .eccbytes = 12,
+ .eccpos = {6, 7, 8, 22, 23, 24, 38, 39, 40, 54, 55, 56},
+ .oobfree = { {1, 5}, {9, 13}, {25, 13}, {41, 13}, {57, 7} },
+- .oobavail = 48,
++ //.oobavail = 48,
+ };
+
+ /* Large Page FLASH with FMR[ECCM] = 1 */
+@@ -113,7 +113,48 @@
+ .eccbytes = 12,
+ .eccpos = {8, 9, 10, 24, 25, 26, 40, 41, 42, 56, 57, 58},
+ .oobfree = { {1, 7}, {11, 13}, {27, 13}, {43, 13}, {59, 5} },
+- .oobavail = 48,
++// .oobavail = 48,
++};
++/*
++ * fsl_elbc_oob_lp_eccm* specify that LP NAND's OOB free area starts at offset
++ * 1, so we have to adjust bad block pattern. This pattern should be used for
++ * x8 chips only. So far hardware does not support x16 chips anyway.
++ */
++static u8 scan_ff_pattern[] = { 0xff, };
++
++static struct nand_bbt_descr largepage_memorybased = {
++ .options = 0,
++ .offs = 0,
++ .len = 1,
++ .pattern = scan_ff_pattern,
++};
++
++/*
++ * ELBC may use HW ECC, so that OOB offsets, that NAND core uses for bbt,
++ * interfere with ECC positions, that's why we implement our own descriptors.
++ * OOB {11, 5}, works for both SP and LP chips, with ECCM = 1 and ECCM = 0.
++ */
++static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
++static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
++
++static struct nand_bbt_descr bbt_main_descr = {
++ .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
++ NAND_BBT_2BIT | NAND_BBT_VERSION,
++ .offs = 11,
++ .len = 4,
++ .veroffs = 15,
++ .maxblocks = 4,
++ .pattern = bbt_pattern,
++};
++
++static struct nand_bbt_descr bbt_mirror_descr = {
++ .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
++ NAND_BBT_2BIT | NAND_BBT_VERSION,
++ .offs = 11,
++ .len = 4,
++ .veroffs = 15,
++ .maxblocks = 4,
++ .pattern = mirror_pattern,
+ };
+
+ /*=================================*/
+@@ -687,8 +728,9 @@
+ chip->ecc.layout = (priv->fmr & FMR_ECCM) ?
+ &fsl_elbc_oob_lp_eccm1 :
+ &fsl_elbc_oob_lp_eccm0;
+- mtd->ecclayout = chip->ecc.layout;
+- mtd->oobavail = chip->ecc.layout->oobavail;
++ //mtd->ecclayout = chip->ecc.layout;
++ //mtd->oobavail = chip->ecc.layout->oobavail;
++ chip->badblock_pattern = &largepage_memorybased;
+ }
+ } else {
+ dev_err(ctrl->dev,
+@@ -752,8 +794,12 @@
+ chip->cmdfunc = fsl_elbc_cmdfunc;
+ chip->waitfunc = fsl_elbc_wait;
+
++ chip->bbt_td = &bbt_main_descr;
++ chip->bbt_md = &bbt_mirror_descr;
++
+ /* set up nand options */
+- chip->options = NAND_NO_READRDY | NAND_NO_AUTOINCR;
++ //chip->options = NAND_NO_READRDY | NAND_NO_AUTOINCR;
++ chip->options = NAND_NO_READRDY | NAND_NO_AUTOINCR | NAND_USE_FLASH_BBT;
+
+ chip->controller = &ctrl->controller;
+ chip->priv = priv;
+
diff --git a/packages/linux/linux-2.6.26/boc01/004-081105-usb.patch b/packages/linux/linux-2.6.26/boc01/004-081105-usb.patch
new file mode 100644
index 0000000000..f64119c4fa
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/004-081105-usb.patch
@@ -0,0 +1,17 @@
+diff -Nru linux-2.6.26-officiel/arch/powerpc/platforms/83xx/usb.c /home/guilig/workspace/kernel-goobie-2.6.26/src/arch/powerpc/platforms/83xx/usb.c
+--- linux-2.6.26-officiel/arch/powerpc/platforms/83xx/usb.c 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/arch/powerpc/platforms/83xx/usb.c 2008-10-23 11:34:06.000000000 +0200
+@@ -166,10 +166,10 @@
+ !strcmp(prop, "utmi"))) {
+ u32 refsel;
+
+- if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
++// if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
+ refsel = CONTROL_REFSEL_24MHZ;
+- else
+- refsel = CONTROL_REFSEL_48MHZ;
++// else
++// refsel = CONTROL_REFSEL_48MHZ;
+ /* Set UTMI_PHY_EN and REFSEL */
+ out_be32(usb_regs + FSL_USB2_CONTROL_OFFS,
+ CONTROL_UTMI_PHY_EN | refsel);
diff --git a/packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch b/packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch
new file mode 100644
index 0000000000..538a29ce7e
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch
@@ -0,0 +1,994 @@
+diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/isl12024-eeprom.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/isl12024-eeprom.c
+--- linux-2.6.26-officiel/drivers/i2c/chips/isl12024-eeprom.c 1970-01-01 01:00:00.000000000 +0100
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/isl12024-eeprom.c 2008-11-06 10:41:46.000000000 +0100
+@@ -0,0 +1,254 @@
++/*
++ * Intersil ISL12024 EEPROM class driver
++ *
++ *
++ * Copyright (C) 2007, CenoSYS (www.cenosys.com).
++ * Guillaume Ligneul
++ * Guillaume.ligneul@gmail.com
++ *
++ * Code is based on eeprom.c
++ *
++ * 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/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++//#include <linux/slab.h>
++//#include <linux/jiffies.h>
++#include <linux/i2c.h>
++#include <linux/mutex.h>
++#include <linux/i2c/isl12024.h>
++
++/* Addresses to scan */
++static const unsigned short normal_i2c[] = { ISL12024_I2C_EEPROM_ADDR, I2C_CLIENT_END };
++
++/* Insmod parameters */
++I2C_CLIENT_INSMOD_1(eeprom);
++
++
++/* Size of EEPROM in bytes */
++#define EEPROM_SIZE 4096
++
++/* Each client has this additional data */
++struct eeprom_data {
++ struct i2c_client client;
++ struct mutex update_lock;
++};
++
++int
++isl12024_i2c_read(struct i2c_client *client, u8 reg, u8 buf[],
++ unsigned len)
++{
++ int ret;
++ u8 dt_addr[2];
++
++ struct i2c_msg msgs[2] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = 2,
++ .buf = dt_addr,
++ },
++ {
++ .addr = client->addr,
++ .flags = I2C_M_RD,
++ .len = len ,
++ .buf = buf ,
++ },
++ };
++
++ dt_addr[0] = 0;
++ dt_addr[1] = reg;
++
++ ret = i2c_transfer(client->adapter, msgs, 2);
++ if ( ret < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++ return ret;
++}
++
++
++int
++isl12024_i2c_write(struct i2c_client *client, u8 reg, u8 const buf[],
++ unsigned len)
++{
++ int ret;
++ u8 i2c_buf[EEPROM_SIZE];
++
++ struct i2c_msg msgs[1] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = len+2,
++ .buf = i2c_buf,
++ },
++ };
++
++ i2c_buf[0] = 0;
++ i2c_buf[1] = reg;
++
++
++ memcpy(&i2c_buf[2], &buf[0], len );
++
++
++ ret = i2c_transfer(client->adapter, msgs, 1);
++ printk(KERN_INFO "i2c_transfer %d\n",ret);
++ return ret;
++}
++static int eeprom_attach_adapter(struct i2c_adapter *adapter);
++static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind);
++static int eeprom_detach_client(struct i2c_client *client);
++
++/* This is the driver that will be inserted */
++static struct i2c_driver eeprom_driver = {
++ .driver = {
++ .name = "isl12024-eeprom",
++ },
++ .attach_adapter = eeprom_attach_adapter,
++ .detach_client = eeprom_detach_client,
++};
++
++static ssize_t eeprom_read(struct kobject *kobj, struct bin_attribute *bin_attr,
++ char *buf, loff_t off, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
++ struct eeprom_data *data = i2c_get_clientdata(client);
++ int rc;
++
++ mutex_lock(&data->update_lock);
++
++ if (off >= EEPROM_SIZE)
++ return 0;
++
++ if (off + count > EEPROM_SIZE)
++ count = EEPROM_SIZE - off;
++
++ rc = isl12024_i2c_read(client,0,buf,EEPROM_SIZE);
++
++ if (rc < 0){
++ mutex_unlock(&data->update_lock);
++ return -EIO;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return count;
++}
++
++static ssize_t eeprom_write(struct kobject *kobj, struct bin_attribute *attr,
++ char *buf, loff_t off, size_t count)
++{
++ struct i2c_client *client = kobj_to_i2c_client(kobj);
++ struct eeprom_data *data = i2c_get_clientdata(client);
++
++ if (off >= 256)
++ return -ENOSPC;
++
++ if (off + count > 256)
++ count = 256 - off;
++
++ mutex_unlock(&data->update_lock);
++ if (isl12024_i2c_write(client, off, buf, count) < 0)
++ {
++ mutex_unlock(&data->update_lock);
++ return -EIO;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return count;
++}
++
++static struct bin_attribute eeprom_attr = {
++ .attr = {
++ .name = "eeprom",
++ .mode = S_IRUGO,
++ },
++ .size = EEPROM_SIZE,
++ .read = eeprom_read,
++ .write= eeprom_write,
++};
++
++static int eeprom_attach_adapter(struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, eeprom_detect);
++}
++
++/* This function is called by i2c_probe */
++static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
++{
++ struct i2c_client *new_client;
++ struct eeprom_data *data;
++ int err = 0;
++
++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA
++ | I2C_FUNC_SMBUS_BYTE))
++ goto exit;
++
++ if (!(data = kzalloc(sizeof(struct eeprom_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 = &eeprom_driver;
++ new_client->flags = 0;
++
++ strlcpy(new_client->name, "isl12024-eeprom", I2C_NAME_SIZE);
++ mutex_init(&data->update_lock);
++
++ /* Tell the I2C layer a new client has arrived */
++ if ((err = i2c_attach_client(new_client)))
++ goto exit_kfree;
++
++ /* create the sysfs eeprom file */
++ err = sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
++ if (err)
++ goto exit_detach;
++
++ return 0;
++
++exit_detach:
++ i2c_detach_client(new_client);
++exit_kfree:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int eeprom_detach_client(struct i2c_client *client)
++{
++ int err;
++
++ sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr);
++
++ err = i2c_detach_client(client);
++ if (err)
++ return err;
++
++ kfree(i2c_get_clientdata(client));
++
++ return 0;
++}
++
++static int __init eeprom_init(void)
++{
++ return i2c_add_driver(&eeprom_driver);
++}
++
++static void __exit eeprom_exit(void)
++{
++ i2c_del_driver(&eeprom_driver);
++}
++
++
++MODULE_AUTHOR("Guillaume Ligneul <guillaume.ligneul@cenosys.com>");
++MODULE_DESCRIPTION("I2C Intersil12024 EEPROM driver");
++MODULE_LICENSE("GPL");
++
++module_init(eeprom_init);
++module_exit(eeprom_exit);
+diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/Kconfig /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Kconfig
+--- linux-2.6.26-officiel/drivers/i2c/chips/Kconfig 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Kconfig 2008-11-05 15:49:03.000000000 +0100
+@@ -4,6 +4,12 @@
+
+ menu "Miscellaneous I2C Chip support"
+
++config AT24C32
++ tristate "24C32 EEPROM"
++ depends on SYSFS && EXPERIMENTAL
++ help
++ help not needed :)
++
+ config DS1682
+ tristate "Dallas DS1682 Total Elapsed Time Recorder with Alarm"
+ depends on EXPERIMENTAL
+@@ -14,6 +20,15 @@
+ This driver can also be built as a module. If so, the module
+ will be called ds1682.
+
++config ISL12024EEPROM
++ tristate "Intersil 12024 EEPROM"
++ depends on RTC_DRV_ISL12024
++ help
++ If you say yes here you get support for Intersil12024 EEPROM.
++
++ This driver can also be built as a module. If so, the module
++ will be called isl12024-eeprom.
++
+ config SENSORS_EEPROM
+ tristate "EEPROM reader"
+ depends on EXPERIMENTAL
+diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Makefile
+--- linux-2.6.26-officiel/drivers/i2c/chips/Makefile 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Makefile 2008-11-06 11:04:27.000000000 +0100
+@@ -9,6 +9,8 @@
+ # * I/O expander drivers go to drivers/gpio
+ #
+
++
++obj-$(CONFIG_ISL12024EEPROM) += isl12024-eeprom.o
+ obj-$(CONFIG_DS1682) += ds1682.o
+ obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
+ obj-$(CONFIG_SENSORS_MAX6875) += max6875.o
+diff -Nru linux-2.6.26-officiel/drivers/rtc/Kconfig /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/Kconfig
+--- linux-2.6.26-officiel/drivers/rtc/Kconfig 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/Kconfig 2008-09-26 13:53:16.000000000 +0200
+@@ -124,6 +124,12 @@
+
+ if I2C
+
++config RTC_DRV_ISL12024
++ tristate "Intersil 12024 RTC/ UniqueID"
++ help
++ If you say yes ....
++ This driver can also be built as a module.
++
+ config RTC_DRV_DS1307
+ tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00"
+ help
+diff -Nru linux-2.6.26-officiel/drivers/rtc/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/Makefile
+--- linux-2.6.26-officiel/drivers/rtc/Makefile 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/rtc/Makefile 2008-09-26 14:25:25.000000000 +0200
+@@ -33,6 +33,7 @@
+ obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o
+ obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o
+ obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o
++obj-$(CONFIG_RTC_DRV_ISL12024) += rtc-isl12024.o
+ 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 @@
++/*
++ * Intersil ISL12024 class driver
++ *
++ *
++ * 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/i2c.h>
++#include <linux/bcd.h>
++#include <linux/rtc.h>
++#include <linux/proc_fs.h>
++#include <linux/i2c/isl12024.h>
++#include <linux/delay.h>
++
++
++#define DBG 1
++#undef DBG
++
++static u8 buf_id[ISL12024_RTC_SECTION_LEN] = { 0 ,};
++
++#define DRV_NAME "isl12024"
++#define DRV_VERSION "0.1"
++
++/* i2c configuration */
++
++static const unsigned short normal_i2c[] = {
++ ISL12024_I2C_ADDR >>1, I2C_CLIENT_END
++};
++I2C_CLIENT_INSMOD;
++
++/* Procfs management */
++static struct proc_dir_entry * root_proc = NULL;
++static struct proc_dir_entry * entry_proc = NULL;
++static int read_proc (char * page, char ** start, off_t off, int count, int * eof, void * data);
++
++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);
++
++// To debug (may be add in includ/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,
++};
++
++int
++isl12024_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[],
++ unsigned len)
++{
++ int ret;
++ u8 dt_addr[2];
++
++ struct i2c_msg msgs[2] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = 2,
++ .buf = dt_addr,
++ },
++ {
++ .addr = client->addr,
++ .flags = I2C_M_RD,
++ .len = len ,
++ .buf = buf ,
++ },
++ };
++
++ dt_addr[0] = 0;
++ dt_addr[1] = reg;
++
++ ret = i2c_transfer(client->adapter, msgs, 2);
++ if ( ret < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++ return ret;
++}
++
++EXPORT_SYMBOL(isl12024_i2c_read_regs);
++
++
++int
++isl12024_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[],
++ unsigned len)
++{
++ int ret;
++ u8 i2c_buf[10];
++
++ struct i2c_msg msgs[1] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = len+2,
++ .buf = i2c_buf,
++ },
++ };
++
++ i2c_buf[0] = 0;
++ i2c_buf[1] = reg;
++
++
++ memcpy(&i2c_buf[2], &buf[0], len );
++
++
++ ret = i2c_transfer(client->adapter, msgs, 1);
++ printk(KERN_INFO "i2c_transfer %d\n",ret);
++ return ret;
++}
++
++EXPORT_SYMBOL(isl12024_i2c_set_regs);
++
++static int isl12024_i2c_validate_client(struct i2c_client *client)
++{
++ u8 regs[ISL12024_RTC_SECTION_LEN] = { 0, };
++ u8 zero_mask[ISL12024_RTC_SECTION_LEN] = {
++ 0x80, 0x80, 0x40, 0xc0, 0xe0, 0x00, 0xf8, 0xc6
++ };
++
++ int i;
++ int ret;
++
++ ret = isl12024_i2c_read_regs(client, ISL12024_REG_SC, regs, ISL12024_RTC_SECTION_LEN);
++
++ if (ret < 0)
++ return ret;
++
++ 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)
++{
++ unsigned char sr;
++ int err;
++ u8 regs[ISL12024_RTC_SECTION_LEN] = { 0, };
++
++ printk(KERN_INFO "%s\n ",__FUNCTION__ );
++
++
++ if (isl12024_get_status(client, &sr) < 0) {
++ dev_err(&client->dev, "%s: reading SR failed\n", __func__);
++ 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 "0x%2X\n", regs[i]);
++#endif
++
++ if (err < 0) {
++ dev_err(&client->dev, "%s: reading RTC section failed\n",
++ __func__);
++ return sr;
++ }
++
++ tm->tm_sec = BCD2BIN(regs[0]);
++ tm->tm_min = BCD2BIN(regs[1]);
++
++ { /* HR field has a more complex interpretation */
++ const u8 _hr = regs[2];
++ if (_hr & ISL12024_REG_HR_MIL) /* 24h format */
++ tm->tm_hour = BCD2BIN(_hr & 0x3f);
++ else { // 12h format
++ tm->tm_hour = BCD2BIN(_hr & 0x1f);
++ if (_hr & ISL12024_REG_HR_PM) /* PM flag set */
++ tm->tm_hour += 12;
++ }
++ }
++
++ tm->tm_mday = BCD2BIN(regs[3]);
++ tm->tm_mon = BCD2BIN(regs[4]);
++ tm->tm_year = BCD2BIN(regs[5]) + 100;
++ tm->tm_wday = BCD2BIN(regs[6]);
++
++ 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 };
++
++ struct i2c_msg msgs[] = {
++ { client->addr, 0, 2, sr_addr }, /* setup read ptr */
++ { client->addr, I2C_M_RD, 1, sr }, /* read status */
++ };
++
++ /* read status register */
++ if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) {
++ dev_err(&client->dev, "%s: read error\n", __func__);
++ return -EIO;
++ }
++
++ 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)
++{
++ int i, xfer, nbytes;
++ unsigned char buf[8];
++ unsigned char rdata[10] = { 0, reg_base };
++
++ static const unsigned char wel[3] = { 0, ISL12024_REG_SR,
++ ISL12024_SR_WEL };
++
++ static const unsigned char rwel[3] = { 0, ISL12024_REG_SR,
++ ISL12024_SR_WEL | ISL12024_SR_RWEL };
++
++ static const unsigned char diswe[3] = { 0, ISL12024_REG_SR, 0 };
++
++ dev_dbg(&client->dev,
++ "%s: secs=%d, mins=%d, hours=%d\n",
++ __func__,
++ tm->tm_sec, tm->tm_min, tm->tm_hour);
++
++ buf[CCR_SEC] = BIN2BCD(tm->tm_sec);
++ buf[CCR_MIN] = BIN2BCD(tm->tm_min);
++
++ /* set hour and 24hr bit */
++ buf[CCR_HOUR] = BIN2BCD(tm->tm_hour) | ISL12024_HR_MIL;
++
++ /* should we also set the date? */
++ if (datetoo) {
++ dev_dbg(&client->dev,
++ "%s: mday=%d, mon=%d, year=%d, wday=%d\n",
++ __func__,
++ tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
++
++ buf[CCR_MDAY] = BIN2BCD(tm->tm_mday);
++
++ /* month, 1 - 12 */
++ buf[CCR_MONTH] = BIN2BCD(tm->tm_mon + 1);
++
++ /* year, since the rtc epoch*/
++ buf[CCR_YEAR] = BIN2BCD(tm->tm_year % 100);
++ buf[CCR_WDAY] = tm->tm_wday & 0x07;
++ buf[CCR_Y2K] = BIN2BCD(tm->tm_year / 100);
++ }
++
++ /* If writing alarm registers, set compare bits on registers 0-4 */
++ if (reg_base < ISL12024_CCR_BASE)
++ for (i = 0; i <= 4; i++)
++ buf[i] |= 0x80;
++
++ /* this sequence is required to unlock the chip */
++ if ((xfer = i2c_master_send(client, wel, 3)) != 3) {
++ dev_err(&client->dev, "%s: wel - %d\n", __func__, xfer);
++ return -EIO;
++ }
++
++ if ((xfer = i2c_master_send(client, rwel, 3)) != 3) {
++ dev_err(&client->dev, "%s: rwel - %d\n", __func__, xfer);
++ return -EIO;
++ }
++
++
++ /* write register's data */
++ if (datetoo)
++ nbytes = 8;
++ else
++ nbytes = 3;
++ for (i = 0; i < nbytes; i++)
++ rdata[2+i] = buf[i];
++
++ xfer = i2c_master_send(client, rdata, nbytes+2);
++ if (xfer != nbytes+2) {
++ dev_err(&client->dev,
++ "%s: result=%d addr=%02x, data=%02x\n",
++ __func__,
++ xfer, rdata[1], rdata[2]);
++ return -EIO;
++ }
++
++ /* If we wrote to the nonvolatile region, wait 10msec for write cycle*/
++ if (reg_base < ISL12024_CCR_BASE) {
++ unsigned char al0e[3] = { 0, ISL12024_REG_INT, 0 };
++
++ msleep(10);
++
++ /* ...and set or clear the AL0E bit in the INT register */
++
++ /* Need to set RWEL again as the write has cleared it */
++ xfer = i2c_master_send(client, rwel, 3);
++ if (xfer != 3) {
++ dev_err(&client->dev,
++ "%s: aloe rwel - %d\n",
++ __func__,
++ xfer);
++ return -EIO;
++ }
++
++ if (alm_enable)
++ al0e[2] = ISL12024_INT_AL0E;
++
++ xfer = i2c_master_send(client, al0e, 3);
++ if (xfer != 3) {
++ dev_err(&client->dev,
++ "%s: al0e - %d\n",
++ __func__,
++ xfer);
++ return -EIO;
++ }
++
++ /* and wait 10msec again for this write to complete */
++ msleep(10);
++ }
++
++ /* disable further writes */
++ if ((xfer = i2c_master_send(client, diswe, 3)) != 3) {
++ dev_err(&client->dev, "%s: diswe - %d\n", __func__, xfer);
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int isl12024_fix_osc(struct i2c_client *client)
++{
++ int err;
++ struct rtc_time tm;
++
++ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
++
++ err = isl12024_set_datetime(client, &tm, 0, ISL12024_CCR_BASE, 0);
++ if (err < 0)
++ printk(KERN_INFO "unable to restart the oscillator\n");
++
++ 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)
++{
++
++ /* Nothing to do */
++
++ 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)
++{
++ int i=0;
++
++ printk("id: 0x");
++ for(i=0;i<ISL12024_RTC_SECTION_LEN;i++)
++ printk("%02X",buf_id[i]);
++ printk("\n");
++ return 0;
++}
++
++static int
++isl12024_probe(struct i2c_adapter *adapter, int addr, int kind)
++{
++
++ int rc = 0;
++ int err = 0;
++ unsigned char sr;
++ struct i2c_client *new_client = NULL;
++ struct rtc_device *rtc = NULL;
++
++ 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 (kind < 0) {
++ rc = isl12024_i2c_validate_client(new_client);
++ if (rc < 0)
++ goto failout;
++ }
++
++ rc = i2c_attach_client(new_client);
++ if (rc < 0)
++ goto failout;
++
++ rtc = rtc_device_register(isl12024_driver.driver.name,
++ &new_client->dev,
++ &isl12024_rtc_ops, THIS_MODULE);
++
++ if (IS_ERR(rtc)) {
++ printk("Error during rtc registration\n");
++ rc = PTR_ERR(rtc);
++ goto failout;
++ }
++
++ 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 "power failure detected, "
++ "please set the clock\n");
++ udelay(50);
++ isl12024_fix_osc(new_client);
++ }
++ }
++ else
++ printk(KERN_INFO "couldn't read status\n");
++
++ root_proc = proc_mkdir( "isl12024", 0 );
++ entry_proc = create_proc_entry("id", S_IFREG | S_IRUGO | S_IWUSR, root_proc);
++
++ if (entry_proc == NULL)
++ return -1;
++
++ entry_proc->owner = THIS_MODULE;
++ entry_proc->read_proc = read_proc;
++
++ /* read unique id from eeprom */
++ isl12024_i2c_read_regs(new_client, ISL12024_REG_ID, buf_id, sizeof(buf_id));
++
++
++ return 0;
++
++ failout:
++ kfree(new_client);
++ return rc;
++}
++
++static int
++isl12024_attach_adapter (struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, isl12024_probe);
++}
++
++static int
++isl12024_detach_client(struct i2c_client *client)
++{
++ int rc;
++ struct rtc_device *const rtc = i2c_get_clientdata(client);
++
++ if (rtc)
++ rtc_device_unregister(rtc);
++
++ rc = i2c_detach_client(client);
++ if (rc)
++ return rc;
++
++ kfree(client);
++
++ return 0;
++}
++
++/* module init/exit */
++
++static int __init isl12024_init(void)
++{
++ return i2c_add_driver(&isl12024_driver);
++}
++
++static void __exit isl12024_exit(void)
++{
++ i2c_del_driver(&isl12024_driver);
++}
++
++MODULE_AUTHOR("Guillaume Ligneul <guillaume.ligneul@cenosys.com>");
++MODULE_DESCRIPTION("Intersil ISL12024 driver");
++MODULE_LICENSE("GPL");
++MODULE_VERSION(DRV_VERSION);
++
++module_init(isl12024_init);
++module_exit(isl12024_exit);
+diff -Nru linux-2.6.26-officiel/include/i2c/isl12024.h /home/guilig/workspace/kernel-goobie-2.6.26/src/include/linux/i2c/isl12024.h
+--- linux-2.6.26-officiel/include/i2c/isl12024.h 1970-01-01 01:00:00.000000000 +0100
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/include/linux/i2c/isl12024.h 2008-10-21 10:36:19.000000000 +0200
+@@ -0,0 +1,93 @@
++#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
++
++#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
++/* device id section */
++#define ISL12024_REG_ID 0x20
++/* Register map */
++/* rtc section */
++//#define ISL12024_REG_MSB 0x00
++//#define ISL12024_REG_SC 0x30 /* Seconds */
++//#define ISL12024_REG_MN 0x31 /* Minutes */
++//#define ISL12024_REG_HR 0x32 /* Hours */
++#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_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 CCR_SEC 0
++#define CCR_MIN 1
++#define CCR_HOUR 2
++#define CCR_MDAY 3
++#define CCR_MONTH 4
++#define CCR_YEAR 5
++#define CCR_WDAY 6
++#define CCR_Y2K 7
++
++#endif /*ISL12024_H_*/
diff --git a/packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch b/packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch
new file mode 100644
index 0000000000..1cd70feb4a
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch
@@ -0,0 +1,284 @@
+diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/at24c32.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/at24c32.c
+--- linux-2.6.26-officiel/drivers/i2c/chips/at24c32.c 1970-01-01 01:00:00.000000000 +0100
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/at24c32.c 2008-11-06 10:45:30.000000000 +0100
+@@ -0,0 +1,268 @@
++/*
++ * at24c32.c - Based on eeprom.c
++ *
++ * Copyright (C) 2007, CenoSYS (www.cenosys.com).
++ * Guillaume Ligneul
++ * Guillaume.ligneul@gmail.com
++ *
++ * Code is based on eeprom.c
++ *
++ * 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/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/jiffies.h>
++#include <linux/i2c.h>
++#include <linux/mutex.h>
++
++/* Addresses to scan */
++static const unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54,
++ 0x55, 0x56, I2C_CLIENT_END };
++
++/* Insmod parameters */
++I2C_CLIENT_INSMOD_1(eeprom);
++
++
++/* Size of EEPROM in bytes */
++#define EEPROM_SIZE 32768
++
++/* possible types of eeprom devices */
++enum eeprom_nature {
++ UNKNOWN,
++ VAIO,
++};
++
++/* Each client has this additional data */
++struct eeprom_data {
++ struct i2c_client client;
++ struct mutex update_lock;
++ u8 valid; /* bitfield, bit!=0 if slice is valid */
++ unsigned long last_updated[8]; /* In jiffies, 8 slices */
++ u8 data[EEPROM_SIZE]; /* Register values */
++ enum eeprom_nature nature;
++};
++
++
++static int eeprom_attach_adapter(struct i2c_adapter *adapter);
++static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind);
++static int eeprom_detach_client(struct i2c_client *client);
++
++/* This is the driver that will be inserted */
++static struct i2c_driver eeprom_driver = {
++ .driver = {
++ .name = "eeprom",
++ },
++ .attach_adapter = eeprom_attach_adapter,
++ .detach_client = eeprom_detach_client,
++};
++
++static ssize_t eeprom_write(struct kobject *kobj, struct bin_attribute *bin_attr,
++ char *buf, loff_t off, size_t count)
++{
++ struct i2c_client *client = kobj_to_i2c_client(kobj);
++ struct eeprom_data *data = i2c_get_clientdata(client);
++ int ret;
++ u8 i2c_buf[256];
++
++ if (off >= 32)
++ return -ENOSPC;
++
++ if (off + count > 32)
++ count = 32 - off;
++
++ mutex_unlock(&data->update_lock);
++
++ struct i2c_msg msgs[1] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = count+2,
++ .buf = i2c_buf,
++ },
++ };
++
++ i2c_buf[0] = 0;
++ i2c_buf[1] = off;
++
++
++ memcpy(&i2c_buf[2], &buf[0], count );
++
++
++ ret = i2c_transfer(client->adapter, msgs, 1);
++
++ if(ret<0)
++ {
++ mutex_unlock(&data->update_lock);
++ return -EIO;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return count;
++}
++
++int
++i2c_read(struct i2c_client *client, u8 reg, u8 buf[],
++ unsigned len)
++{
++ int ret;
++ u8 dt_addr[2];
++
++ struct i2c_msg msgs[2] = {
++ {
++ .addr = client->addr,
++ .flags = 0,
++ .len = 2,
++ .buf = dt_addr,
++ },
++ {
++ .addr = client->addr,
++ .flags = I2C_M_RD,
++ .len = len ,
++ .buf = buf ,
++ },
++ };
++
++ dt_addr[0] = 0;
++ dt_addr[1] = reg;
++
++ ret = i2c_transfer(client->adapter, msgs, 2);
++ if ( ret < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++ return ret;
++}
++
++static ssize_t eeprom_read(struct kobject *kobj, struct bin_attribute *bin_attr,
++ char *buf, loff_t off, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
++ struct eeprom_data *data = i2c_get_clientdata(client);
++ int rc;
++
++ mutex_lock(&data->update_lock);
++
++ if (off >= EEPROM_SIZE)
++ return 0;
++
++ if (off + count > EEPROM_SIZE)
++ count = EEPROM_SIZE - off;
++
++ rc = i2c_read(client,off,buf,count);
++ if (rc < 0){
++ mutex_unlock(&data->update_lock);
++ return -EIO;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return count;
++}
++
++static struct bin_attribute eeprom_attr = {
++ .attr = {
++ .name = "eeprom",
++ .mode = S_IRUGO,
++ },
++ .size = EEPROM_SIZE,
++ .read = eeprom_read,
++ .write = eeprom_write,
++
++};
++
++static int eeprom_attach_adapter(struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, eeprom_detect);
++}
++
++/* This function is called by i2c_probe */
++static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
++{
++ struct i2c_client *new_client;
++ struct eeprom_data *data;
++ int err = 0;
++
++ /* There are three ways we can read the EEPROM data:
++ (1) I2C block reads (faster, but unsupported by most adapters)
++ (2) Consecutive byte reads (100% overhead)
++ (3) Regular byte data reads (200% overhead)
++ The third method is not implemented by this driver because all
++ known adapters support at least the second. */
++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA
++ | I2C_FUNC_SMBUS_BYTE))
++ goto exit;
++
++ if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) {
++ err = -ENOMEM;
++ goto exit;
++ }
++
++ new_client = &data->client;
++ memset(data->data, 0xff, EEPROM_SIZE);
++ i2c_set_clientdata(new_client, data);
++ new_client->addr = address;
++ new_client->adapter = adapter;
++ new_client->driver = &eeprom_driver;
++ new_client->flags = 0;
++
++ /* Fill in the remaining client fields */
++ strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE);
++ data->valid = 0;
++ mutex_init(&data->update_lock);
++ data->nature = 0x00;
++
++ /* Tell the I2C layer a new client has arrived */
++ if ((err = i2c_attach_client(new_client)))
++ goto exit_kfree;
++
++ /* create the sysfs eeprom file */
++ err = sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
++ if (err)
++ goto exit_detach;
++
++ return 0;
++
++exit_detach:
++ i2c_detach_client(new_client);
++exit_kfree:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int eeprom_detach_client(struct i2c_client *client)
++{
++ int err;
++
++ sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr);
++
++ err = i2c_detach_client(client);
++ if (err)
++ return err;
++
++ kfree(i2c_get_clientdata(client));
++
++ return 0;
++}
++
++static int __init eeprom_init(void)
++{
++ return i2c_add_driver(&eeprom_driver);
++
++}
++
++static void __exit eeprom_exit(void)
++{
++ i2c_del_driver(&eeprom_driver);
++}
++
++
++MODULE_AUTHOR("Guillaume Ligneul guillaume.ligneul@gmail.com");
++MODULE_DESCRIPTION("I2C EEPROM driver for AT24C32");
++MODULE_LICENSE("GPL");
++
++module_init(eeprom_init);
++module_exit(eeprom_exit);
+diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Makefile
+--- linux-2.6.26-officiel/drivers/i2c/chips/Makefile 2008-11-06 11:12:07.000000000 +0100
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/i2c/chips/Makefile 2008-11-06 11:18:20.000000000 +0100
+@@ -9,7 +9,7 @@
+ # * I/O expander drivers go to drivers/gpio
+ #
+
+-
++obj-$(CONFIG_AT24C32) += at24c32.o
+ obj-$(CONFIG_ISL12024EEPROM) += isl12024-eeprom.o
+ obj-$(CONFIG_DS1682) += ds1682.o
+ obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
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
new file mode 100644
index 0000000000..4f51d5d222
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch
@@ -0,0 +1,317 @@
+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/008-081105-spi.patch b/packages/linux/linux-2.6.26/boc01/008-081105-spi.patch
new file mode 100644
index 0000000000..0c2ddf3383
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/008-081105-spi.patch
@@ -0,0 +1,100 @@
+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/010-081105-mii.patch b/packages/linux/linux-2.6.26/boc01/010-081105-mii.patch
new file mode 100644
index 0000000000..0ddcba984b
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/010-081105-mii.patch
@@ -0,0 +1,519 @@
+diff -Nru linux-2.6.26/drivers/net/gianfar.c linux-2.6.26.modified/drivers/net/gianfar.c
+--- linux-2.6.26/drivers/net/gianfar.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/gianfar.c 2008-10-24 13:45:54.000000000 +0200
+@@ -442,10 +442,10 @@
+ static int init_phy(struct net_device *dev)
+ {
+ struct gfar_private *priv = netdev_priv(dev);
+- uint gigabit_support =
+- priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT ?
+- SUPPORTED_1000baseT_Full : 0;
+- struct phy_device *phydev;
++// uint gigabit_support =
++// priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT ?
++// SUPPORTED_1000baseT_Full : 0;
++// struct phy_device *phydev;
+ char phy_id[BUS_ID_SIZE];
+ phy_interface_t interface;
+
+@@ -455,23 +455,23 @@
+
+ snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, priv->einfo->bus_id, priv->einfo->phy_id);
+
+- interface = gfar_get_interface(dev);
++ interface = PHY_INTERFACE_MODE_MII;//gfar_get_interface(dev);
+
+- phydev = phy_connect(dev, phy_id, &adjust_link, 0, interface);
++// phydev = phy_connect(dev, phy_id, &adjust_link, 0, interface);
+
+- if (interface == PHY_INTERFACE_MODE_SGMII)
+- gfar_configure_serdes(dev);
++// if (interface == PHY_INTERFACE_MODE_SGMII)
++// gfar_configure_serdes(dev);
+
+- if (IS_ERR(phydev)) {
+- printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
+- return PTR_ERR(phydev);
+- }
++// if (IS_ERR(phydev)) {
++// printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
++// return PTR_ERR(phydev);
++// }
+
+ /* Remove any features not supported by the controller */
+- phydev->supported &= (GFAR_SUPPORTED | gigabit_support);
+- phydev->advertising = phydev->supported;
++// phydev->supported &= (GFAR_SUPPORTED | gigabit_support);
++// phydev->advertising = phydev->supported;
+
+- priv->phydev = phydev;
++ //priv->phydev = phydev;
+
+ return 0;
+ }
+@@ -586,7 +586,7 @@
+ struct gfar __iomem *regs = priv->regs;
+ unsigned long flags;
+
+- phy_stop(priv->phydev);
++ //phy_stop(priv->phydev);
+
+ /* Lock it down */
+ spin_lock_irqsave(&priv->txlock, flags);
+@@ -857,7 +857,7 @@
+ }
+ }
+
+- phy_start(priv->phydev);
++ //phy_start(priv->phydev);
+
+ /* Configure the coalescing support */
+ if (priv->txcoalescing)
+@@ -928,7 +928,7 @@
+ tx_irq_fail:
+ free_irq(priv->interruptError, dev);
+ err_irq_fail:
+-err_rxalloc_fail:
++err_rxalloc_fail:
+ rx_skb_fail:
+ free_skb_resources(priv);
+ tx_skb_fail:
+@@ -1135,8 +1135,8 @@
+ stop_gfar(dev);
+
+ /* Disconnect from the PHY */
+- phy_disconnect(priv->phydev);
+- priv->phydev = NULL;
++ //phy_disconnect(priv->phydev);
++ //priv->phydev = NULL;
+
+ netif_stop_queue(dev);
+
+@@ -1723,81 +1723,82 @@
+ * function converts those variables into the appropriate
+ * register values, and can bring down the device if needed.
+ */
+-static void adjust_link(struct net_device *dev)
+-{
+- struct gfar_private *priv = netdev_priv(dev);
+- struct gfar __iomem *regs = priv->regs;
+- unsigned long flags;
+- struct phy_device *phydev = priv->phydev;
+- int new_state = 0;
+-
+- spin_lock_irqsave(&priv->txlock, flags);
+- if (phydev->link) {
+- u32 tempval = gfar_read(&regs->maccfg2);
+- u32 ecntrl = gfar_read(&regs->ecntrl);
+-
+- /* Now we make sure that we can be in full duplex mode.
+- * If not, we operate in half-duplex mode. */
+- if (phydev->duplex != priv->oldduplex) {
+- new_state = 1;
+- if (!(phydev->duplex))
+- tempval &= ~(MACCFG2_FULL_DUPLEX);
+- else
+- tempval |= MACCFG2_FULL_DUPLEX;
+-
+- priv->oldduplex = phydev->duplex;
+- }
+-
+- if (phydev->speed != priv->oldspeed) {
+- new_state = 1;
+- switch (phydev->speed) {
+- case 1000:
+- tempval =
+- ((tempval & ~(MACCFG2_IF)) | MACCFG2_GMII);
+- break;
+- case 100:
+- case 10:
+- tempval =
+- ((tempval & ~(MACCFG2_IF)) | MACCFG2_MII);
+-
+- /* Reduced mode distinguishes
+- * between 10 and 100 */
+- if (phydev->speed == SPEED_100)
+- ecntrl |= ECNTRL_R100;
+- else
+- ecntrl &= ~(ECNTRL_R100);
+- break;
+- default:
+- if (netif_msg_link(priv))
+- printk(KERN_WARNING
+- "%s: Ack! Speed (%d) is not 10/100/1000!\n",
+- dev->name, phydev->speed);
+- break;
+- }
+-
+- priv->oldspeed = phydev->speed;
+- }
+-
+- gfar_write(&regs->maccfg2, tempval);
+- gfar_write(&regs->ecntrl, ecntrl);
+-
+- if (!priv->oldlink) {
+- new_state = 1;
+- priv->oldlink = 1;
+- netif_schedule(dev);
+- }
+- } else if (priv->oldlink) {
+- new_state = 1;
+- priv->oldlink = 0;
+- priv->oldspeed = 0;
+- priv->oldduplex = -1;
+- }
+-
+- if (new_state && netif_msg_link(priv))
+- phy_print_status(phydev);
+-
+- spin_unlock_irqrestore(&priv->txlock, flags);
+-}
++//static void adjust_link(struct net_device *dev)
++//{
++// struct gfar_private *priv = netdev_priv(dev);
++// struct gfar __iomem *regs = priv->regs;
++// unsigned long flags;
++// struct phy_device *phydev = priv->phydev;
++// int new_state = 0;
++//
++//
++// spin_lock_irqsave(&priv->txlock, flags);
++// if (phydev->link) {
++// u32 tempval = gfar_read(&regs->maccfg2);
++// u32 ecntrl = gfar_read(&regs->ecntrl);
++//
++// /* Now we make sure that we can be in full duplex mode.
++// * If not, we operate in half-duplex mode. */
++// if (phydev->duplex != priv->oldduplex) {
++// new_state = 1;
++// if (!(phydev->duplex))
++// tempval &= ~(MACCFG2_FULL_DUPLEX);
++// else
++// tempval |= MACCFG2_FULL_DUPLEX;
++//
++// priv->oldduplex = phydev->duplex;
++// }
++//
++// if (phydev->speed != priv->oldspeed) {
++// new_state = 1;
++// switch (phydev->speed) {
++// case 1000:
++// tempval =
++// ((tempval & ~(MACCFG2_IF)) | MACCFG2_GMII);
++// break;
++// case 100:
++// case 10:
++// tempval =
++// ((tempval & ~(MACCFG2_IF)) | MACCFG2_MII);
++//
++// /* Reduced mode distinguishes
++// * between 10 and 100 */
++// if (phydev->speed == SPEED_100)
++// ecntrl |= ECNTRL_R100;
++// else
++// ecntrl &= ~(ECNTRL_R100);
++// break;
++// default:
++// if (netif_msg_link(priv))
++// printk(KERN_WARNING
++// "%s: Ack! Speed (%d) is not 10/100/1000!\n",
++// dev->name, phydev->speed);
++// break;
++// }
++//
++// priv->oldspeed = phydev->speed;
++// }
++//
++// gfar_write(&regs->maccfg2, tempval);
++// gfar_write(&regs->ecntrl, ecntrl);
++//
++// if (!priv->oldlink) {
++// new_state = 1;
++// priv->oldlink = 1;
++// netif_schedule(dev);
++// }
++// } else if (priv->oldlink) {
++// new_state = 1;
++// priv->oldlink = 0;
++// priv->oldspeed = 0;
++// priv->oldduplex = -1;
++// }
++//
++// if (new_state && netif_msg_link(priv))
++// phy_print_status(phydev);
++//
++// spin_unlock_irqrestore(&priv->txlock, flags);
++//}
+
+ /* Update the hash table based on the current list of multicast
+ * addresses we subscribe to. Also, change the promiscuity of
+diff -Nru linux-2.6.26/drivers/net/gianfar_ethtool.c linux-2.6.26.modified/drivers/net/gianfar_ethtool.c
+--- linux-2.6.26/drivers/net/gianfar_ethtool.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/gianfar_ethtool.c 2008-10-24 13:45:49.000000000 +0200
+@@ -182,13 +182,13 @@
+
+ static int gfar_ssettings(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+- struct gfar_private *priv = netdev_priv(dev);
+- struct phy_device *phydev = priv->phydev;
+-
+- if (NULL == phydev)
+- return -ENODEV;
+-
+- return phy_ethtool_sset(phydev, cmd);
++// struct gfar_private *priv = netdev_priv(dev);
++// struct phy_device *phydev = priv->phydev;
++//
++// if (NULL == phydev)
++// return -ENODEV;
++//
++ return 0;//phy_ethtool_sset(phydev, cmd);
+ }
+
+
+@@ -196,15 +196,15 @@
+ static int gfar_gsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+ struct gfar_private *priv = netdev_priv(dev);
+- struct phy_device *phydev = priv->phydev;
+-
+- if (NULL == phydev)
+- return -ENODEV;
++// struct phy_device *phydev = priv->phydev;
++//
++// if (NULL == phydev)
++// return -ENODEV;
+
+ cmd->maxtxpkt = priv->txcount;
+ cmd->maxrxpkt = priv->rxcount;
+
+- return phy_ethtool_gset(phydev, cmd);
++ return 0;//phy_ethtool_gset(phydev, cmd);
+ }
+
+ /* Return the length of the register structure */
+@@ -232,19 +232,19 @@
+ unsigned int count;
+
+ /* The timer is different, depending on the interface speed */
+- switch (priv->phydev->speed) {
+- case SPEED_1000:
+- count = GFAR_GBIT_TIME;
+- break;
+- case SPEED_100:
++// switch (priv->phydev->speed) {
++// case SPEED_1000:
++// count = GFAR_GBIT_TIME;
++// break;
++// case SPEED_100:
++// count = GFAR_100_TIME;
++// break;
++// case SPEED_10:
++// default:
+ count = GFAR_100_TIME;
+- break;
+- case SPEED_10:
+- default:
+- count = GFAR_10_TIME;
+- break;
+- }
+-
++// break;
++// }
++//
+ /* Make sure we return a number greater than 0
+ * if usecs > 0 */
+ return ((usecs * 1000 + count - 1) / count);
+@@ -256,19 +256,19 @@
+ unsigned int count;
+
+ /* The timer is different, depending on the interface speed */
+- switch (priv->phydev->speed) {
+- case SPEED_1000:
+- count = GFAR_GBIT_TIME;
+- break;
+- case SPEED_100:
++// switch (priv->phydev->speed) {
++// case SPEED_1000:
++// count = GFAR_GBIT_TIME;
++// break;
++// case SPEED_100:
++// count = GFAR_100_TIME;
++// break;
++// case SPEED_10:
++// default:
+ count = GFAR_100_TIME;
+- break;
+- case SPEED_10:
+- default:
+- count = GFAR_10_TIME;
+- break;
+- }
+-
++// break;
++// }
++//
+ /* Make sure we return a number greater than 0 */
+ /* if ticks is > 0 */
+ return ((ticks * count) / 1000);
+@@ -283,8 +283,8 @@
+ if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_COALESCE))
+ return -EOPNOTSUPP;
+
+- if (NULL == priv->phydev)
+- return -ENODEV;
++// if (NULL == priv->phydev)
++// return -ENODEV;
+
+ cvals->rx_coalesce_usecs = gfar_ticks2usecs(priv, priv->rxtime);
+ cvals->rx_max_coalesced_frames = priv->rxcount;
+@@ -342,8 +342,8 @@
+ else
+ priv->rxcoalescing = 1;
+
+- if (NULL == priv->phydev)
+- return -ENODEV;
++// if (NULL == priv->phydev)
++// return -ENODEV;
+
+ /* Check the bounds of the values */
+ if (cvals->rx_coalesce_usecs > GFAR_MAX_COAL_USECS) {
+diff -Nru linux-2.6.26/drivers/net/gianfar.h linux-2.6.26.modified/drivers/net/gianfar.h
+--- linux-2.6.26/drivers/net/gianfar.h 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/gianfar.h 2008-10-24 13:45:55.000000000 +0200
+@@ -161,7 +161,7 @@
+ #define MACCFG1_SYNCD_TX_EN 0x00000002
+ #define MACCFG1_TX_EN 0x00000001
+
+-#define MACCFG2_INIT_SETTINGS 0x00007205
++#define MACCFG2_INIT_SETTINGS 0x00007105
+ #define MACCFG2_FULL_DUPLEX 0x00000001
+ #define MACCFG2_IF 0x00000300
+ #define MACCFG2_MII 0x00000100
+@@ -751,7 +751,7 @@
+ struct gianfar_platform_data *einfo;
+
+ /* PHY stuff */
+- struct phy_device *phydev;
++// struct phy_device *phydev;
+ struct mii_bus *mii_bus;
+ int oldspeed;
+ int oldduplex;
+diff -Nru linux-2.6.26/drivers/net/gianfar_mii.c linux-2.6.26.modified/drivers/net/gianfar_mii.c
+--- linux-2.6.26/drivers/net/gianfar_mii.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/gianfar_mii.c 2008-10-24 13:45:45.000000000 +0200
+@@ -216,24 +216,24 @@
+ r = get_phy_id(new_bus, i, &phy_id);
+ if (r)
+ return r;
+-
+- if (phy_id == 0xffffffff)
+- break;
++printk(KERN_INFO "0x%8X\n",phy_id);
++// if (phy_id == 0xffffffff)
++// break;
+ }
+
+ /* The bus is full. We don't support using 31 PHYs, sorry */
+- if (i == 0)
+- return -EBUSY;
+-
+- gfar_write(&enet_regs->tbipa, i);
+-
+- err = mdiobus_register(new_bus);
+-
+- if (0 != err) {
+- printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
+- new_bus->name);
+- goto bus_register_fail;
+- }
++// if (i == 0)
++// return -EBUSY;
++//
++// gfar_write(&enet_regs->tbipa, i);
++//
++// err = mdiobus_register(new_bus);
++//
++// if (0 != err) {
++// printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
++// new_bus->name);
++// goto bus_register_fail;
++// }
+
+ return 0;
+
+diff -Nru linux-2.6.26/drivers/net/gianfar_mii.h linux-2.6.26.modified/drivers/net/gianfar_mii.h
+--- linux-2.6.26/drivers/net/gianfar_mii.h 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/gianfar_mii.h 2008-10-24 13:45:45.000000000 +0200
+@@ -25,9 +25,6 @@
+
+ #define GFAR_SUPPORTED (SUPPORTED_10baseT_Half \
+ | SUPPORTED_10baseT_Full \
+- | SUPPORTED_100baseT_Half \
+- | SUPPORTED_100baseT_Full \
+- | SUPPORTED_Autoneg \
+ | SUPPORTED_MII)
+
+ struct gfar_mii {
+--- linux-2.6.26/drivers/net/phy/mdio_bus.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/phy/mdio_bus.c 2008-10-24 13:45:39.000000000 +0200
+@@ -135,6 +135,9 @@
+ struct phy_device *phydev = to_phy_device(dev);
+ struct phy_driver *phydrv = to_phy_driver(drv);
+
++ if (phydrv->detect)
++ return (phydrv->detect(phydev->bus, phydev->addr));
++
+ return ((phydrv->phy_id & phydrv->phy_id_mask) ==
+ (phydev->phy_id & phydrv->phy_id_mask));
+ }
+diff -Nru linux-2.6.26/drivers/net/phy/phy_device.c linux-2.6.26.modified/drivers/net/phy/phy_device.c
+--- linux-2.6.26/drivers/net/phy/phy_device.c 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26.modified/drivers/net/phy/phy_device.c 2008-10-24 13:45:39.000000000 +0200
+@@ -281,7 +281,9 @@
+ if (IS_ERR(phydev))
+ return phydev;
+
+- phy_prepare_link(phydev, handler);
++ //cenoys
++ //phy_prepare_link(phydev, handler);
++ phydev->link = 1;
+
+ phy_start_machine(phydev, NULL);
+
+@@ -302,7 +304,7 @@
+ phy_stop_interrupts(phydev);
+
+ phy_stop_machine(phydev);
+-
++
+ phydev->adjust_link = NULL;
+
+ phy_detach(phydev);
+@@ -438,7 +440,7 @@
+ if (adv < 0)
+ return adv;
+
+- adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
++ adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
+ ADVERTISE_PAUSE_ASYM);
+ if (advertise & ADVERTISED_10baseT_Half)
+ adv |= ADVERTISE_10HALF;
+@@ -503,7 +505,7 @@
+
+ if (DUPLEX_FULL == phydev->duplex)
+ ctl |= BMCR_FULLDPLX;
+-
++
+ err = phy_write(phydev, MII_BMCR, ctl);
+
+ if (err < 0)
+@@ -671,7 +673,7 @@
+ phydev->duplex = DUPLEX_FULL;
+ } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
+ phydev->speed = SPEED_100;
+-
++
+ if (lpa & LPA_100FULL)
+ phydev->duplex = DUPLEX_FULL;
+ } else
diff --git a/packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch b/packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch
new file mode 100644
index 0000000000..86bf4ff84b
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch
@@ -0,0 +1,161 @@
+diff -Nru linux-2.6.26-officiel/drivers/char/Kconfig /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Kconfig
+--- linux-2.6.26-officiel/drivers/char/Kconfig 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Kconfig 2008-09-26 14:44:59.000000000 +0200
+@@ -1006,6 +1006,14 @@
+ tristate "NEC VR4100 series General-purpose I/O Unit support"
+ depends on CPU_VR41XX
+
++config GPIO_MPC8313
++ tristate "mpc8313e gpio"
++ depends on PPC_MPC831x
++ select INPUT
++ default y
++ help
++ test
++
+ config RAW_DRIVER
+ tristate "RAW driver (/dev/raw/rawN)"
+ depends on BLOCK
+diff -Nru linux-2.6.26-officiel/drivers/char/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Makefile
+--- linux-2.6.26-officiel/drivers/char/Makefile 2008-07-13 23:51:29.000000000 +0200
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Makefile 2008-09-26 14:44:59.000000000 +0200
+@@ -111,6 +111,8 @@
+ obj-$(CONFIG_PS3_FLASH) += ps3flash.o
+
+ obj-$(CONFIG_JS_RTC) += js-rtc.o
++
++obj-$(CONFIG_GPIO_MPC8313) += mpc8313e_gpio.o
+ js-rtc-y = rtc.o
+
+ # Files generated that shall be removed upon make clean
+diff -Nru linux-2.6.26-officiel/drivers/char/mpc8313e_gpio.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/mpc8313e_gpio.c
+--- linux-2.6.26-officiel/drivers/char/mpc8313e_gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/mpc8313e_gpio.c 2008-09-26 14:44:59.000000000 +0200
+@@ -0,0 +1,127 @@
++/* linux/drivers/char/mpc8313e_gpio.c
++
++ Allows a user space process to control the GPIO pins.
++
++
++*/
++
++#include <linux/fs.h>
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <asm/uaccess.h>
++#include <asm/io.h>
++#include <linux/of_platform.h>
++#include <sysdev/fsl_soc.h>
++
++MODULE_AUTHOR("Alexandre Coffignal <alexandre.coffignal@cenosys.com>");
++MODULE_DESCRIPTION("mpc8313e GPIO");
++MODULE_LICENSE("GPL");
++
++static int major = 0;
++struct gpio {
++ __be32 gpdir;
++ __be32 gpodr;
++ __be32 gpdat;
++ __be32 gpier;
++ __be32 gpimr;
++ __be32 gpicr;
++} __attribute__ ((packed));
++static struct gpio *gpio_regs;
++
++static ssize_t mpc8313e_gpio_write(struct file *file, const char __user *data, size_t len, loff_t *ppos)
++{
++ unsigned m = iminor(file->f_path.dentry->d_inode);
++ size_t i;
++ int err = 0;
++
++ for (i = 0; i < len; ++i) {
++ char c;
++ if (get_user(c, data + i))
++ return -EFAULT;
++ /* set GPIO as output */
++ setbits32(&gpio_regs->gpdir, 1 << (31 - m));
++ clrbits32(&gpio_regs->gpodr, 1 << (31 - m));
++ switch (c) {
++ case '0':
++ /*Set GPIO level */
++ clrbits32(&gpio_regs->gpdat, 1 << (31 - m));
++ break;
++ case '1':
++ /*Set GPIO level */
++ setbits32(&gpio_regs->gpdat, 1 << (31 - m));
++ break;
++ default:
++ printk(KERN_DEBUG "io%2d bad setting: chr<0x%2x>\n",
++ m, (int)c);
++ err++;
++ }
++ }
++ if (err)
++ return -EINVAL;
++
++ return len;
++}
++
++static ssize_t mpc8313e_gpio_read(struct file *file, char __user * buf, size_t len, loff_t * ppos)
++{
++ unsigned m = iminor(file->f_path.dentry->d_inode);
++ int value;
++ value=in_be32(&gpio_regs->gpdat)&(1 << (31 - m));
++ if (value)
++ put_user(1, buf);
++ else
++ put_user(0, buf);
++
++ return 0;
++
++}
++
++static int mpc8313e_gpio_open(struct inode *inode, struct file *file)
++{
++ return 0;
++}
++
++static int mpc8313e_gpio_close(struct inode *inode, struct file *file)
++{
++ printk(KERN_DEBUG "close()\n");
++ return 0;
++}
++
++struct file_operations fops =
++{
++ .read = mpc8313e_gpio_read,
++ .write = mpc8313e_gpio_write,
++ .open = mpc8313e_gpio_open,
++ .release = mpc8313e_gpio_close /* correspond a close */
++};
++
++static int __init mpc8313e_gpio_init(void)
++{
++ int ret;
++
++ ret = register_chrdev(major, "gpio", &fops);
++ if(ret < 0)
++ {
++ printk(KERN_WARNING "Probleme sur le major\n");
++ return ret;
++ }
++
++ /* System I/O Configuration Register Low */
++ gpio_regs = ioremap(get_immrbase() + 0xc00, 0x20);
++ if (!gpio_regs)
++ return -ENOMEM;
++ return 0;
++
++}
++
++static void __exit mpc8313e_gpio_cleanup(void)
++{
++ unregister_chrdev(major, "gpio");
++}
++
++module_init(mpc8313e_gpio_init);
++module_exit(mpc8313e_gpio_cleanup);
++
++
diff --git a/packages/linux/linux-2.6.26/boc01/012-081121-cy3218-btns.patch b/packages/linux/linux-2.6.26/boc01/012-081121-cy3218-btns.patch
new file mode 100644
index 0000000000..51d092c528
--- /dev/null
+++ b/packages/linux/linux-2.6.26/boc01/012-081121-cy3218-btns.patch
@@ -0,0 +1,243 @@
+diff -Nru linux-2.6.26.orig/drivers/input/misc/cy3218-btns.c linux-2.6.26/drivers/input/misc/cy3218-btns.c
+--- linux-2.6.26.orig/drivers/input/misc/cy3218-btns.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.26/drivers/input/misc/cy3218-btns.c 2008-11-21 12:11:43.000000000 +0100
+@@ -0,0 +1,215 @@
++/*
++ * CAPSENSE Interface driver
++ *
++ *
++ * 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/init.h>
++#include <linux/input-polldev.h>
++#include <linux/ioport.h>
++#include <linux/module.h>
++#include <linux/i2c.h>
++
++static int capsense_attach_adapter(struct i2c_adapter *adapter);
++static int capsense_detach_client(struct i2c_client *client);
++
++#define CAPSENSE_NAME "Capsense"
++/* i2c configuration */
++#define CAPSENSE_I2C_ADDR 0x25
++// To debug (may be add in include/linux/i2c-id.h)
++#define I2C_DRIVERID_CAPSENSE 98
++#define BUTTONS_POLL_INTERVAL 30 /* msec */
++#define CAP_STATE_GP0 0x88
++#define CAP_STATE_GP1 0x89
++#define MASK0 0x10
++#define MASK1 0x4
++#define MASK2 0x8
++#define MASK3 0x1
++
++
++static int poll_interval = BUTTONS_POLL_INTERVAL;
++module_param_named(poll, poll_interval, uint, 0);
++MODULE_PARM_DESC(poll, "poll interval in msec (30=default)");
++
++static const unsigned short normal_i2c[] = {
++ CAPSENSE_I2C_ADDR , I2C_CLIENT_END
++};
++I2C_CLIENT_INSMOD;
++
++static struct i2c_driver capsense_driver = {
++ .driver = {
++ .name = CAPSENSE_NAME,
++ },
++ .id = I2C_DRIVERID_CAPSENSE,
++ .attach_adapter = &capsense_attach_adapter,
++ .detach_client = &capsense_detach_client,
++};
++
++struct cy3218 {
++ struct input_polled_dev *ipdev;
++ struct i2c_client client;
++};
++
++static void report_key(struct input_dev *input, unsigned keycode)
++{
++ input_report_key(input, keycode, 1);
++ input_sync(input);
++
++ input_report_key(input, keycode, 0);
++ input_sync(input);
++}
++
++unsigned short keymap[5] = {
++ KEY_A,
++ KEY_B,
++ KEY_C,
++ KEY_D,
++ KEY_E,
++};
++
++static void handle_buttons(struct input_polled_dev *dev)
++{
++ u8 uValue;
++ struct cy3218 *capsense = dev->private;
++ struct input_dev *idev = dev->input;
++
++
++ uValue = i2c_smbus_read_byte_data(&capsense->client, CAP_STATE_GP1);
++
++ if(uValue == MASK0)
++ {
++ report_key(idev, keymap[0]);
++ printk("Bouton A\n");
++ }
++
++ uValue = i2c_smbus_read_byte_data(&capsense->client, CAP_STATE_GP0);
++
++ if(uValue == MASK0)
++ {
++ report_key(idev, keymap[1]);
++ printk("Bouton E\n");
++ }
++
++ if(uValue == MASK1)
++ {
++ report_key(idev, keymap[2]);
++ printk("Bouton B\n");
++ }
++
++ if(uValue == MASK2)
++ {
++ report_key(idev, keymap[3]);
++ printk("Bouton C\n");
++ }
++ if(uValue == MASK3)
++ {
++ report_key(idev, keymap[4]);
++ printk("Bouton D\n");
++ }
++}
++
++static int
++capsense_probe(struct i2c_adapter *adapter, int addr, int kind)
++{
++ struct cy3218 *capsense;
++ struct input_polled_dev *ipdev;
++ struct input_dev *input;
++ int rc = 0, err = -ENOMEM, i=0;
++
++ capsense = kzalloc(sizeof(*capsense), GFP_KERNEL);
++ if (!capsense)
++ goto failout;
++
++ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
++ goto failout;
++ }
++
++ ipdev = input_allocate_polled_device();
++ if (!ipdev)
++ goto failout;
++
++ capsense->ipdev = ipdev;
++ capsense->client.adapter = adapter;
++ capsense->client.addr = addr;
++ capsense->client.driver = &capsense_driver;
++ strlcpy(capsense->client.name, CAPSENSE_NAME, I2C_NAME_SIZE);
++ i2c_set_clientdata(&capsense->client, capsense);
++
++ rc = i2c_attach_client(&capsense->client);
++ if (rc)
++ goto out_attach;
++
++ ipdev->poll = handle_buttons;
++ ipdev->private = capsense;
++ ipdev->poll_interval = poll_interval;
++
++ input = ipdev->input;
++ input->name = "Capsense buttons";
++ input->phys = "capsense/input0";
++ input->id.bustype = BUS_I2C;
++ input->dev.parent = &capsense->client.dev;
++
++ input->keycode = keymap;
++ input->keycodemax = ARRAY_SIZE(keymap);
++ input->keycodesize = sizeof(unsigned short);
++
++ input_set_capability(input, EV_MSC, MSC_SCAN);
++ set_bit(EV_KEY, ipdev->input->evbit);
++
++
++ for (i = 0; i < 3; i++)
++ set_bit(keymap[i], ipdev->input->keybit);
++
++ rc = input_register_polled_device(ipdev);
++ if(rc)
++ goto out_polled;
++
++ return 0;
++
++out_polled:
++ i2c_detach_client(&capsense->client);
++out_attach:
++ input_free_polled_device(ipdev);
++failout:
++ return err;
++}
++
++
++static int
++capsense_attach_adapter (struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, capsense_probe);
++}
++
++static int
++capsense_detach_client(struct i2c_client *client)
++{
++ struct cy3218 *capsense = i2c_get_clientdata(client);
++
++ input_unregister_polled_device(capsense->ipdev);
++ i2c_detach_client(&capsense->client);
++ input_free_polled_device(capsense->ipdev);
++ return 0;
++}
++
++static int __init capsense_buttons_init(void)
++{
++ return i2c_add_driver(&capsense_driver);
++}
++
++static void __exit capsense_buttons_exit(void)
++{
++ i2c_del_driver(&capsense_driver);
++}
++
++MODULE_AUTHOR("Guillaume Ligneul <guillaume.ligneul@cenosys.com>");
++MODULE_DESCRIPTION("Capsense CY3218 Input driver");
++MODULE_LICENSE("GPL");
++module_init(capsense_buttons_init);
++module_exit(capsense_buttons_exit);
+diff -Nru linux-2.6.26.orig/drivers/input/misc/Kconfig linux-2.6.26/drivers/input/misc/Kconfig
+--- linux-2.6.26.orig/drivers/input/misc/Kconfig 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26/drivers/input/misc/Kconfig 2008-11-21 10:50:56.000000000 +0100
+@@ -197,4 +197,12 @@
+ Say Y here if you want to support the built-in real time clock
+ of the HP SDC controller.
+
++config INPUT_CAPSENSE_BTNS
++ tristate "CAPSENSE CY3218 button interface"
++ select INPUT_POLLDEV
++ help
++ To compile this driver as a module, choose M here: the
++ module will be called cy3218-btns.
++ To change poll interval, invoque poll parameter in msecs.
++
+ endif
+diff -Nru linux-2.6.26.orig/drivers/input/misc/Makefile linux-2.6.26/drivers/input/misc/Makefile
+--- linux-2.6.26.orig/drivers/input/misc/Makefile 2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26/drivers/input/misc/Makefile 2008-11-21 10:50:56.000000000 +0100
+@@ -19,3 +19,4 @@
+ obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
+ obj-$(CONFIG_INPUT_UINPUT) += uinput.o
+ obj-$(CONFIG_INPUT_APANEL) += apanel.o
++obj-$(CONFIG_INPUT_CAPSENSE_BTNS) +=cy3218-btns.o
diff --git a/packages/linux/linux-2.6.26/boc01/boc01.dts b/packages/linux/linux-2.6.26/boc01/boc01.dts
index 032a90991b..725a11505f 100644
--- a/packages/linux/linux-2.6.26/boc01/boc01.dts
+++ b/packages/linux/linux-2.6.26/boc01/boc01.dts
@@ -19,10 +19,8 @@
#size-cells = <1>;
aliases {
- ethernet0 = &enet0;
ethernet1 = &enet1;
serial0 = &serial0;
- serial1 = &serial1;
pci0 = &pci0;
};
@@ -80,17 +78,17 @@
"fsl,elbc-fcm-nand";
reg = <0x1 0x0 0x2000>;
- u-boot@0 {
- reg = <0x0 0x100000>;
+ kernel@0 {
+ reg = <0x0 0x400000>;
read-only;
};
- kernel@100000 {
- reg = <0x100000 0x300000>;
+ fs@400000 {
+ reg = <0x400000 0x4000000>;
};
- fs@400000 {
- reg = <0x400000 0x1c00000>;
+ appli@4400000 {
+ reg = <0x4400000 0x3c00000>;
};
};
};
@@ -119,9 +117,9 @@
interrupts = <14 0x8>;
interrupt-parent = <&ipic>;
dfsrr;
- rtc@68 {
- compatible = "dallas,ds1339";
- reg = <0x68>;
+ rtc@6f {
+ compatible = "isl12024";
+ reg = <0x6f>;
};
};
@@ -137,8 +135,10 @@
};
spi@7000 {
+ device_type = "spi";
cell-index = <0>;
- compatible = "fsl,spi";
+ //compatible = "fsl,spi";
+ compatible = "mpc83xx_spi";
reg = <0x7000 0x1000>;
interrupts = <16 0x8>;
interrupt-parent = <&ipic>;
@@ -161,30 +161,13 @@
#size-cells = <0>;
compatible = "fsl,gianfar-mdio";
reg = <0x24520 0x20>;
- phy1: ethernet-phy@1 {
- interrupt-parent = <&ipic>;
- interrupts = <19 0x8>;
- reg = <0x1>;
- device_type = "ethernet-phy";
- };
phy4: ethernet-phy@4 {
interrupt-parent = <&ipic>;
interrupts = <20 0x8>;
reg = <0x4>;
device_type = "ethernet-phy";
};
- };
- enet0: ethernet@24000 {
- cell-index = <0>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
- reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <37 0x8 36 0x8 35 0x8>;
- interrupt-parent = <&ipic>;
- phy-handle = < &phy1 >;
};
enet1: ethernet@25000 {
@@ -199,20 +182,10 @@
phy-handle = < &phy4 >;
};
- serial0: serial@4500 {
+ serial0: serial@4600 {
cell-index = <0>;
device_type = "serial";
compatible = "ns16550";
- reg = <0x4500 0x100>;
- clock-frequency = <0>;
- interrupts = <9 0x8>;
- interrupt-parent = <&ipic>;
- };
-
- serial1: serial@4600 {
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <10 0x8>;
@@ -253,17 +226,11 @@
interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = <
- /* IDSEL 0x0E -mini PCI */
- 0x7000 0x0 0x0 0x1 &ipic 18 0x8
- 0x7000 0x0 0x0 0x2 &ipic 18 0x8
- 0x7000 0x0 0x0 0x3 &ipic 18 0x8
- 0x7000 0x0 0x0 0x4 &ipic 18 0x8
-
/* IDSEL 0x0F - PCI slot */
- 0x7800 0x0 0x0 0x1 &ipic 17 0x8
- 0x7800 0x0 0x0 0x2 &ipic 18 0x8
- 0x7800 0x0 0x0 0x3 &ipic 17 0x8
- 0x7800 0x0 0x0 0x4 &ipic 18 0x8>;
+ 0x7800 0x0 0x0 0x1 &ipic 48 0x8
+ 0x7800 0x0 0x0 0x2 &ipic 48 0x8
+ 0x7800 0x0 0x0 0x3 &ipic 48 0x8
+ 0x7800 0x0 0x0 0x4 &ipic 48 0x8>;
interrupt-parent = <&ipic>;
interrupts = <66 0x8>;
bus-range = <0x0 0x0>;
diff --git a/packages/linux/linux-2.6.26/boc01/defconfig b/packages/linux/linux-2.6.26/boc01/defconfig
index 76634da120..4b57ab4cc7 100644
--- a/packages/linux/linux-2.6.26/boc01/defconfig
+++ b/packages/linux/linux-2.6.26/boc01/defconfig
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.26
-# Wed Aug 27 19:53:28 2008
+# Fri Nov 21 11:33:35 2008
#
# CONFIG_PPC64 is not set
@@ -585,31 +585,7 @@ CONFIG_NET_SCH_FIFO=y
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-CONFIG_BT_HIDP=m
-
-#
-# Bluetooth device drivers
-#
-CONFIG_BT_HCIUSB=m
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIBTSDIO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-# CONFIG_BT_HCIUART_LL is not set
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBPA10X=m
-CONFIG_BT_HCIBFUSB=m
-CONFIG_BT_HCIVHCI=m
+# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
CONFIG_FIB_RULES=y
@@ -637,7 +613,7 @@ CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_MAC80211_RC_DEFAULT="pid"
CONFIG_MAC80211_RC_PID=y
# CONFIG_MAC80211_MESH is not set
-CONFIG_MAC80211_LEDS=y
+# CONFIG_MAC80211_LEDS is not set
# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set
# CONFIG_MAC80211_DEBUG is not set
CONFIG_IEEE80211=m
@@ -645,9 +621,7 @@ CONFIG_IEEE80211=m
CONFIG_IEEE80211_CRYPT_WEP=m
CONFIG_IEEE80211_CRYPT_CCMP=m
CONFIG_IEEE80211_CRYPT_TKIP=m
-CONFIG_RFKILL=m
-CONFIG_RFKILL_INPUT=m
-CONFIG_RFKILL_LEDS=y
+# CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set
#
@@ -790,7 +764,7 @@ CONFIG_HAVE_IDE=y
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=m
+CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
# CONFIG_SCSI_NETLINK is not set
@@ -799,7 +773,7 @@ CONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#
-CONFIG_BLK_DEV_SD=m
+CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not set
@@ -809,7 +783,7 @@ CONFIG_BLK_DEV_SD=m
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
-# CONFIG_SCSI_MULTI_LUN is not set
+CONFIG_SCSI_MULTI_LUN=y
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
# CONFIG_SCSI_SCAN_ASYNC is not set
@@ -846,7 +820,7 @@ CONFIG_NETDEVICES=y
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
+# CONFIG_TUN is not set
# CONFIG_VETH is not set
# CONFIG_ARCNET is not set
CONFIG_PHYLIB=y
@@ -895,38 +869,23 @@ CONFIG_GFAR_NAPI=y
#
# Wireless LAN
#
-# CONFIG_WLAN_PRE80211 is not set
+CONFIG_WLAN_PRE80211=y
+# CONFIG_STRIP is not set
CONFIG_WLAN_80211=y
-CONFIG_IPW2100=m
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2200=m
-CONFIG_IPW2200_MONITOR=y
-CONFIG_IPW2200_RADIOTAP=y
-CONFIG_IPW2200_PROMISCUOUS=y
-CONFIG_IPW2200_QOS=y
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_LIBERTAS=m
-CONFIG_LIBERTAS_USB=m
-# CONFIG_LIBERTAS_SDIO is not set
-# CONFIG_LIBERTAS_DEBUG is not set
-CONFIG_AIRO=m
-CONFIG_HERMES=m
-CONFIG_PLX_HERMES=m
-CONFIG_TMD_HERMES=m
-CONFIG_NORTEL_HERMES=m
-CONFIG_PCI_HERMES=m
-CONFIG_ATMEL=m
-CONFIG_PCI_ATMEL=m
-CONFIG_PRISM54=m
-CONFIG_USB_ZD1201=m
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_AIRO is not set
+# CONFIG_HERMES is not set
+# CONFIG_ATMEL is not set
+# CONFIG_PRISM54 is not set
+# CONFIG_USB_ZD1201 is not set
# CONFIG_USB_NET_RNDIS_WLAN is not set
# CONFIG_RTL8180 is not set
-CONFIG_RTL8187=m
+# CONFIG_RTL8187 is not set
# CONFIG_ADM8211 is not set
# CONFIG_P54_COMMON is not set
-CONFIG_ATH5K=m
-# CONFIG_ATH5K_DEBUG is not set
+# CONFIG_ATH5K is not set
# CONFIG_IWLCORE is not set
# CONFIG_IWLWIFI_LEDS is not set
# CONFIG_IWL4965 is not set
@@ -938,8 +897,7 @@ CONFIG_HOSTAP_PLX=m
CONFIG_HOSTAP_PCI=m
# CONFIG_B43 is not set
# CONFIG_B43LEGACY is not set
-CONFIG_ZD1211RW=m
-# CONFIG_ZD1211RW_DEBUG is not set
+# CONFIG_ZD1211RW is not set
# CONFIG_RT2X00 is not set
#
@@ -984,103 +942,7 @@ CONFIG_SLHC=m
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
-CONFIG_ISDN=m
-CONFIG_ISDN_I4L=m
-# CONFIG_ISDN_PPP is not set
-# CONFIG_ISDN_AUDIO is not set
-
-#
-# ISDN feature submodules
-#
-CONFIG_ISDN_DRV_LOOP=m
-CONFIG_ISDN_DIVERSION=m
-
-#
-# ISDN4Linux hardware drivers
-#
-
-#
-# Passive cards
-#
-CONFIG_ISDN_DRV_HISAX=m
-
-#
-# D-channel protocol features
-#
-CONFIG_HISAX_EURO=y
-CONFIG_DE_AOC=y
-# CONFIG_HISAX_NO_SENDCOMPLETE is not set
-# CONFIG_HISAX_NO_LLC is not set
-# CONFIG_HISAX_NO_KEYPAD is not set
-CONFIG_HISAX_1TR6=y
-CONFIG_HISAX_NI1=y
-CONFIG_HISAX_MAX_CARDS=8
-
-#
-# HiSax supported cards
-#
-CONFIG_HISAX_16_3=y
-CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_FRITZPCI=y
-CONFIG_HISAX_AVM_A1_PCMCIA=y
-CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_BKM_A4T=y
-CONFIG_HISAX_SCT_QUADRO=y
-CONFIG_HISAX_GAZEL=y
-CONFIG_HISAX_W6692=y
-CONFIG_HISAX_HFC_SX=y
-# CONFIG_HISAX_DEBUG is not set
-
-#
-# HiSax PCMCIA card service modules
-#
-
-#
-# HiSax sub driver modules
-#
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_HFC4S8S=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-CONFIG_HISAX_HDLC=y
-
-#
-# Active cards
-#
-CONFIG_HYSDN=m
-CONFIG_HYSDN_CAPI=y
-CONFIG_ISDN_DRV_GIGASET=m
-CONFIG_GIGASET_BASE=m
-CONFIG_GIGASET_M105=m
-CONFIG_GIGASET_M101=m
-# CONFIG_GIGASET_DEBUG is not set
-CONFIG_GIGASET_UNDOCREQ=y
-CONFIG_ISDN_CAPI=m
-CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y
-CONFIG_CAPI_TRACE=y
-# CONFIG_ISDN_CAPI_MIDDLEWARE is not set
-CONFIG_ISDN_CAPI_CAPI20=m
-# CONFIG_ISDN_CAPI_CAPIDRV is not set
-
-#
-# CAPI hardware drivers
-#
-CONFIG_CAPI_AVM=y
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-# CONFIG_ISDN_DRV_AVMB1_B1PCIV4 is not set
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-CONFIG_CAPI_EICON=y
-CONFIG_ISDN_DIVAS=m
-CONFIG_ISDN_DIVAS_BRIPCI=y
-CONFIG_ISDN_DIVAS_PRIPCI=y
-CONFIG_ISDN_DIVAS_DIVACAPI=m
-CONFIG_ISDN_DIVAS_USERIDI=m
-CONFIG_ISDN_DIVAS_MAINT=m
+# CONFIG_ISDN is not set
# CONFIG_PHONE is not set
#
@@ -1088,15 +950,15 @@ CONFIG_ISDN_DIVAS_MAINT=m
#
CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV is not set
+CONFIG_INPUT_POLLDEV=y
#
# Userland interfaces
#
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_EVBUG=y
#
# Input Device Drivers
@@ -1106,7 +968,14 @@ CONFIG_INPUT=y
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_ATI_REMOTE is not set
+# CONFIG_INPUT_ATI_REMOTE2 is not set
+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
+# CONFIG_INPUT_POWERMATE is not set
+# CONFIG_INPUT_YEALINK is not set
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_INPUT_CAPSENSE_BTNS=y
#
# Hardware I/O ports
@@ -1148,6 +1017,7 @@ CONFIG_HW_RANDOM=y
# CONFIG_NVRAM is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
+CONFIG_GPIO_MPC8313=y
# CONFIG_RAW_DRIVER is not set
# CONFIG_TCG_TPM is not set
CONFIG_DEVPORT=y
@@ -1187,7 +1057,9 @@ CONFIG_I2C_MPC=y
#
# Miscellaneous I2C Chip support
#
+CONFIG_AT24C32=y
# CONFIG_DS1682 is not set
+CONFIG_ISL12024EEPROM=y
# CONFIG_SENSORS_EEPROM is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_PCF8575 is not set
@@ -1204,18 +1076,18 @@ CONFIG_SPI_MASTER=y
#
# SPI Master Controller Drivers
#
-CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_BITBANG is not set
CONFIG_SPI_MPC83xx=y
#
# SPI Protocol Masters
#
-CONFIG_SPI_AT25=m
-CONFIG_SPI_SPIDEV=m
-CONFIG_SPI_TLE62X0=m
+# CONFIG_SPI_AT25 is not set
+CONFIG_SPI_SPIDEV=y
+# CONFIG_SPI_TLE62X0 is not set
# CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set
-CONFIG_HWMON=m
+CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set
# CONFIG_SENSORS_AD7418 is not set
# CONFIG_SENSORS_ADM1021 is not set
@@ -1237,7 +1109,8 @@ CONFIG_HWMON=m
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM70 is not set
-CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM73=y
+# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
@@ -1270,7 +1143,8 @@ CONFIG_SENSORS_LM75=m
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_HWMON_DEBUG_CHIP is not set
-# CONFIG_THERMAL is not set
+CONFIG_THERMAL=y
+# CONFIG_THERMAL_HWMON is not set
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
@@ -1326,14 +1200,64 @@ CONFIG_DAB=y
# CONFIG_AGP is not set
# CONFIG_DRM is not set
# CONFIG_VGASTATE is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=m
-# CONFIG_FB is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_OF is not set
+# CONFIG_FB_CT65550 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_FSL_DIU is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_FB_VIRTUAL is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
#
# Display device support
#
# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_LOGO is not set
#
# Sound
@@ -1468,21 +1392,7 @@ CONFIG_SND_USB_AUDIO=m
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=m
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HIDRAW is not set
-
-#
-# USB Input Devices
-#
-# CONFIG_USB_HID is not set
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
+# CONFIG_HID_SUPPORT is not set
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
@@ -1538,7 +1448,7 @@ CONFIG_USB_UHCI_HCD=y
#
# may also be needed; see USB_STORAGE Help for more information
#
-CONFIG_USB_STORAGE=m
+CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
@@ -1591,40 +1501,15 @@ CONFIG_USB_MON=y
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_ATM is not set
-CONFIG_USB_GADGET=y
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_AMD5536UDC is not set
-# CONFIG_USB_GADGET_ATMEL_USBA is not set
-# CONFIG_USB_GADGET_FSL_USB2 is not set
-CONFIG_USB_GADGET_NET2280=y
-CONFIG_USB_NET2280=y
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_M66592 is not set
-# CONFIG_USB_GADGET_PXA27X is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_S3C2410 is not set
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-CONFIG_USB_GADGET_DUALSPEED=y
-# CONFIG_USB_ZERO is not set
-CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
-# CONFIG_USB_GADGETFS is not set
-# CONFIG_USB_FILE_STORAGE is not set
-# CONFIG_USB_G_SERIAL is not set
-# CONFIG_USB_MIDI_GADGET is not set
-# CONFIG_USB_G_PRINTER is not set
-CONFIG_MMC=m
+# CONFIG_USB_GADGET is not set
+CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_UNSAFE_RESUME is not set
#
# MMC/SD Card Drivers
#
-CONFIG_MMC_BLOCK=m
+CONFIG_MMC_BLOCK=y
CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_SDIO_UART is not set
# CONFIG_MMC_TEST is not set
@@ -1635,23 +1520,9 @@ CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_MMC_SDHCI is not set
# CONFIG_MMC_WBSD is not set
# CONFIG_MMC_TIFM_SD is not set
-CONFIG_MMC_SPI=m
+# CONFIG_MMC_SPI is not set
# CONFIG_MEMSTICK is not set
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_MPC8313E_RDB=y
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
+# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
# CONFIG_INFINIBAND is not set
# CONFIG_EDAC is not set
@@ -1673,7 +1544,8 @@ CONFIG_RTC_INTF_DEV_UIE_EMUL=y
#
# I2C RTC drivers
#
-CONFIG_RTC_DRV_DS1307=y
+CONFIG_RTC_DRV_ISL12024=y
+# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
@@ -1736,7 +1608,7 @@ CONFIG_INOTIFY_USER=y
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=m
-CONFIG_FUSE_FS=m
+# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
@@ -1747,12 +1619,12 @@ CONFIG_FUSE_FS=m
#
# DOS/FAT/NT Filesystems
#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-CONFIG_NTFS_FS=m
+CONFIG_NTFS_FS=y
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y
@@ -1802,27 +1674,18 @@ CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
-CONFIG_NFSD=m
-# CONFIG_NFSD_V3 is not set
-# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD is not set
CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
# CONFIG_SUNRPC_BIND34 is not set
CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-# CONFIG_SMB_NLS_DEFAULT is not set
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
@@ -1966,7 +1829,7 @@ CONFIG_CRYPTO_TEST=m
CONFIG_CRYPTO_CBC=y
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
-CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
# CONFIG_CRYPTO_XTS is not set
@@ -1993,9 +1856,9 @@ CONFIG_CRYPTO_WP512=m
#
# Ciphers
#
-CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_ARC4=y
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m