linux-2.6.26: add patches for boc01 hardware
authorJeremy Lainé <jeremy.laine@m4x.org>
Mon, 24 Nov 2008 18:27:16 +0000 (19:27 +0100)
committerJeremy Lainé <jeremy.laine@m4x.org>
Mon, 24 Nov 2008 18:27:16 +0000 (19:27 +0100)
13 files changed:
packages/linux/linux-2.6.26/boc01/002-081105-headers.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/003-081124-nand.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/004-081105-usb.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/005-081105-isl12024.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/007-081105-lm73.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/008-081105-spi.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/010-081105-mii.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/012-081121-cy3218-btns.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/boc01.dts
packages/linux/linux-2.6.26/boc01/defconfig
packages/linux/linux_2.6.26.bb

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 (file)
index 0000000..b82dcbc
--- /dev/null
@@ -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 (file)
index 0000000..885bad2
--- /dev/null
@@ -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 (file)
index 0000000..f64119c
--- /dev/null
@@ -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 (file)
index 0000000..538a29c
--- /dev/null
@@ -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 (file)
index 0000000..1cd70fe
--- /dev/null
@@ -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 (file)
index 0000000..4f51d5d
--- /dev/null
@@ -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 (file)
index 0000000..0c2ddf3
--- /dev/null
@@ -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 (file)
index 0000000..0ddcba9
--- /dev/null
@@ -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 (file)
index 0000000..86bf4ff
--- /dev/null
@@ -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 (file)
index 0000000..51d092c
--- /dev/null
@@ -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
index 032a909..725a115 100644 (file)
        #size-cells = <1>;
 
        aliases {
-               ethernet0 = &enet0;
                ethernet1 = &enet1;
                serial0 = &serial0;
-               serial1 = &serial1;
                pci0 = &pci0;
        };
 
                                     "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>;
                        };
                };
        };
                        interrupts = <14 0x8>;
                        interrupt-parent = <&ipic>;
                        dfsrr;
-                       rtc@68 {
-                               compatible = "dallas,ds1339";
-                               reg = <0x68>;
+                       rtc@6f {
+                               compatible = "isl12024";
+                               reg = <0x6f>;
                        };
                };
 
                };
 
                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>;
                        #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 {
                        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>;
                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>;
index 76634da..4b57ab4 100644 (file)
@@ -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
index 67842cf..da84be1 100644 (file)
@@ -13,7 +13,16 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2 \
 
 SRC_URI_append_boc01 = "\
        file://boc01.dts \
-       file://mpc831x-nand.patch;patch=1 \
+       file://002-081105-headers.patch;patch=1 \
+       file://003-081124-nand.patch;patch=1 \
+       file://004-081105-usb.patch;patch=1 \
+       file://005-081105-isl12024.patch;patch=1 \
+       file://006-081105-at24c32.patch;patch=1 \
+       file://007-081105-lm73.patch;patch=1 \
+       file://008-081105-spi.patch;patch=1 \
+       file://010-081105-mii.patch;patch=1 \
+       file://011-081105-gpio.patch;patch=1 \
+       file://012-081121-cy3218-btns.patch;patch=1 \
        "
 
 SRC_URI_append_mpc8313e-rdb = "\