linux-2.6.26: update patches for boc01
authorJeremy Lainé <jeremy.laine@m4x.org>
Wed, 17 Dec 2008 16:39:59 +0000 (17:39 +0100)
committerJeremy Lainé <jeremy.laine@m4x.org>
Wed, 17 Dec 2008 16:39:59 +0000 (17:39 +0100)
packages/linux/linux-2.6.26/boc01/005-081217-isl12024.patch [moved from packages/linux/linux-2.6.26/boc01/005-081127-isl12024.patch with 89% similarity]
packages/linux/linux-2.6.26/boc01/006-081105-at24c32.patch [deleted file]
packages/linux/linux-2.6.26/boc01/006-081216-at24c32.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/007-081216-lm73.patch [moved from packages/linux/linux-2.6.26/boc01/007-081127-lm73.patch with 89% similarity]
packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch [deleted file]
packages/linux/linux-2.6.26/boc01/011-081202-gpio.patch [new file with mode: 0644]
packages/linux/linux-2.6.26/boc01/013-081212-lcd.patch [moved from packages/linux/linux-2.6.26/boc01/013-081127-lcd.patch with 72% similarity]
packages/linux/linux-2.6.26/boc01/defconfig
packages/linux/linux_2.6.26.bb

@@ -1,6 +1,7 @@
-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
+Index: linux-2.6.26-NEW/drivers/i2c/chips/isl12024-eeprom.c
+===================================================================
+--- /dev/null
++++ linux-2.6.26-NEW/drivers/i2c/chips/isl12024-eeprom.c
 @@ -0,0 +1,254 @@
 +/*
 + * Intersil ISL12024 EEPROM class driver
@@ -256,23 +257,11 @@ diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/isl12024-eeprom.c /home/guilig
 +
 +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 @@
+Index: linux-2.6.26-NEW/drivers/i2c/chips/Kconfig
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/i2c/chips/Kconfig
++++ linux-2.6.26-NEW/drivers/i2c/chips/Kconfig
+@@ -14,6 +14,15 @@ config DS1682
          This driver can also be built as a module.  If so, the module
          will be called ds1682.
  
@@ -288,9 +277,10 @@ diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/Kconfig /home/guilig/workspace
  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
+Index: linux-2.6.26-NEW/drivers/i2c/chips/Makefile
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/i2c/chips/Makefile
++++ linux-2.6.26-NEW/drivers/i2c/chips/Makefile
 @@ -9,6 +9,8 @@
  # * I/O expander drivers go to drivers/gpio
  #
@@ -300,10 +290,11 @@ diff -Nru linux-2.6.26-officiel/drivers/i2c/chips/Makefile /home/guilig/workspac
  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 @@
+Index: linux-2.6.26-NEW/drivers/rtc/Kconfig
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/rtc/Kconfig
++++ linux-2.6.26-NEW/drivers/rtc/Kconfig
+@@ -124,6 +124,12 @@ comment "I2C RTC drivers"
  
  if I2C
  
@@ -316,10 +307,11 @@ diff -Nru linux-2.6.26-officiel/drivers/rtc/Kconfig /home/guilig/workspace/kerne
  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 @@
+Index: linux-2.6.26-NEW/drivers/rtc/Makefile
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/rtc/Makefile
++++ linux-2.6.26-NEW/drivers/rtc/Makefile
+@@ -33,6 +33,7 @@ obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds17
  obj-$(CONFIG_RTC_DRV_EP93XX)  += rtc-ep93xx.o
  obj-$(CONFIG_RTC_DRV_FM3130)  += rtc-fm3130.o
  obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o
@@ -327,9 +319,10 @@ diff -Nru linux-2.6.26-officiel/drivers/rtc/Makefile /home/guilig/workspace/kern
  obj-$(CONFIG_RTC_DRV_M41T80)  += rtc-m41t80.o
  obj-$(CONFIG_RTC_DRV_M48T59)  += rtc-m48t59.o
  obj-$(CONFIG_RTC_DRV_M48T86)  += rtc-m48t86.o
-diff -Nru linux-2.6.26/drivers/rtc/rtc-isl12024.c linux-2.6.26.mod/drivers/rtc/rtc-isl12024.c
---- linux-2.6.26/drivers/rtc/rtc-isl12024.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.26.mod/drivers/rtc/rtc-isl12024.c        2008-11-27 12:05:37.000000000 +0100
+Index: linux-2.6.26-NEW/drivers/rtc/rtc-isl12024.c
+===================================================================
+--- /dev/null
++++ linux-2.6.26-NEW/drivers/rtc/rtc-isl12024.c
 @@ -0,0 +1,516 @@
 +/*
 + * Intersil ISL12024 class driver
@@ -847,9 +840,10 @@ diff -Nru linux-2.6.26/drivers/rtc/rtc-isl12024.c linux-2.6.26.mod/drivers/rtc/r
 +
 +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
+Index: linux-2.6.26-NEW/include/i2c/isl12024.h
+===================================================================
+--- /dev/null
++++ linux-2.6.26-NEW/include/i2c/isl12024.h
 @@ -0,0 +1,93 @@
 +#ifndef ISL12024_H_
 +#define 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
deleted file mode 100644 (file)
index 1cd70fe..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-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/006-081216-at24c32.patch b/packages/linux/linux-2.6.26/boc01/006-081216-at24c32.patch
new file mode 100644 (file)
index 0000000..0ffec7f
--- /dev/null
@@ -0,0 +1,361 @@
+Index: linux-2.6.26-NEW/drivers/i2c/chips/Makefile
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/i2c/chips/Makefile
++++ linux-2.6.26-NEW/drivers/i2c/chips/Makefile
+@@ -9,7 +9,6 @@
+ # * 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
+@@ -22,6 +21,7 @@ obj-$(CONFIG_ISP1301_OMAP)   += isp1301_om
+ obj-$(CONFIG_TPS65010)                += tps65010.o
+ obj-$(CONFIG_MENELAUS)                += menelaus.o
+ obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
++obj-$(CONFIG_EEPROM_RW)                += eeprom-rw.o
+ ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
+ EXTRA_CFLAGS += -DDEBUG
+Index: linux-2.6.26-NEW/drivers/i2c/chips/eeprom-rw.c
+===================================================================
+--- /dev/null
++++ linux-2.6.26-NEW/drivers/i2c/chips/eeprom-rw.c
+@@ -0,0 +1,319 @@
++/*
++ eeprom-rw.c
++
++ Mostly rewritten Feb 2008 by Davide Rizzo <[EMAIL PROTECTED]>
++ Starting from drivers/i2c/chips/eeprom.c
++
++ Copyright (C) 1998, 1999  Frodo Looijaard <[EMAIL PROTECTED]> and
++ Philip Edelbrock <[EMAIL PROTECTED]>
++ Copyright (C) 2003 Greg Kroah-Hartman <[EMAIL PROTECTED]>
++ Copyright (C) 2003 IBM Corp.
++
++ 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/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/sched.h>
++#include <linux/jiffies.h>
++#include <linux/i2c.h>
++#include <linux/mutex.h>
++#include <linux/delay.h>
++
++/* To avoid false aliases, it scans only address 0x50.
++   Drawback: it cannot manage chips with hardware strapped address != 0 */
++static unsigned short normal_i2c[] = {0x50, I2C_CLIENT_END};
++
++/* Insmod parameters */
++I2C_CLIENT_INSMOD_1(eeprom);
++
++struct eeprom_device {
++       int double_address, total_size, page_size, virt_device_len;
++       int pin_address_mask;
++       const char *name;
++};
++
++static char *eeprom_name = "2432";
++module_param_named(CHIP, eeprom_name, charp, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(CHIP, "Eeprom type (ex.2408,2416...)");
++
++static const struct eeprom_device eeproms[] = {
++       {0,     16,   1,    16, 0,   "2400"},
++       {0,    128,   8,   128, 0,   "2401"},
++       {0,    128,  16,   128, 7,  "24014"},
++       {0,    256,   8,   256, 0,   "2402"},
++       {0,    256,  16,   256, 7,  "24024"},
++       {0,    256,  16,   256, 7,  "24025"},
++       {0,    512,  16,   256, 0,   "2404"},
++       {0,   1024,  16,   256, 0,   "2408"},
++       {0,   2048,  16,   256, 0,   "2416"},
++       {1,   4096,  32,  4096, 7,   "2432"},
++       {1,   8192,  32,  8192, 7,   "2464"},
++       {1,   8192,  64,  8192, 7,   "2465"},
++       {1,  16384,  64, 16384, 7,  "24128"},
++       {1,  32768,  64, 32768, 7,  "24256"},
++       {1,  65536, 128, 65536, 7,  "24512"},
++       {1,  65536,  64, 32768, 3,  "24515"},
++       {1, 131072, 256, 65536, 2, "241024"},
++       {1, 131072, 128, 65536, 3, "241025"},
++       {0,      0,   0,     0, 0,     NULL}
++};
++
++#define MAX_EEPROM_PAGE_SIZE 256
++
++/* Each client has this additional data */
++struct eeprom_info {
++       struct i2c_client client;
++       struct mutex update_lock;
++       const struct eeprom_device *selected_eeprom;
++       char buf[MAX_EEPROM_PAGE_SIZE + 2];
++};
++
++static ssize_t eeprom_read(struct kobject *kobj, struct bin_attribute *t,
++       char *buf, loff_t loff, size_t count)
++{
++       struct i2c_client *client =
++               to_i2c_client(container_of(kobj, struct device, kobj));
++       struct eeprom_info *info = i2c_get_clientdata(client);
++       char offset[2];
++       int ret, off = (int)loff;
++       struct i2c_msg msgrd[2];
++       if (off >= info->selected_eeprom->total_size)
++               return(-EINVAL);
++       if (off + count > info->selected_eeprom->total_size)
++               count = info->selected_eeprom->total_size - off;
++       if (count == 0)
++               return(-EINVAL);
++       mutex_lock(&info->update_lock);
++       offset[0] = off >> 8;
++       offset[1] = off & 0xFF;
++       msgrd[0].addr = msgrd[1].addr = client->addr + off /
++               info->selected_eeprom->virt_device_len;
++       msgrd[0].flags = 0;
++       if (info->selected_eeprom->double_address) {
++               msgrd[0].len = 2;
++               msgrd[0].buf = offset;
++       } else {
++               msgrd[0].len = 1;
++               msgrd[0].buf = &offset[1];
++       }
++       msgrd[1].flags = I2C_M_RD; /* |I2C_M_NOSTART; */
++       msgrd[1].len = count;
++       msgrd[1].buf = buf;
++       ret = i2c_transfer(client->adapter, msgrd, 2);
++       mutex_unlock(&info->update_lock);
++       return (ret == 2) ? count : ret;
++}
++
++static ssize_t eeprom_write(struct kobject *kobj, struct bin_attribute *t,
++       char *buf, loff_t loff, size_t count)
++{
++       struct i2c_client *client =
++               to_i2c_client(container_of(kobj, struct device, kobj));
++       struct eeprom_info *info = i2c_get_clientdata(client);
++       struct i2c_msg msgwr, msgack;
++       int i, tx = 0, off = (int)loff;
++       if (off >= info->selected_eeprom->total_size)
++               return -EINVAL;
++       if ((off + count) > info->selected_eeprom->total_size)
++               count = info->selected_eeprom->total_size-off;
++       if (count == 0)
++               return -EINVAL;
++       msgwr.flags = 0;
++       msgack.flags = 0;
++       msgack.len = 0;
++       mutex_lock(&info->update_lock);
++       while (count) {
++               int len = info->selected_eeprom->page_size -
++                       (off % info->selected_eeprom->page_size);
++               if (len > count)
++                       len = count;
++               msgwr.addr = msgack.addr = client->addr +
++                       off / info->selected_eeprom->virt_device_len;
++               info->buf[0] = off >> 8;
++               info->buf[1] = off & 0xFF;
++               memcpy(info->buf + 2, buf, len);
++               if (info->selected_eeprom->double_address) {
++                       msgwr.buf = info->buf;
++                       msgwr.len = len + 2;
++               } else {
++                       msgwr.buf = 1 + info->buf;
++                       msgwr.len = len + 1;
++               }
++               if (i2c_transfer(client->adapter, &msgwr, 1) != 1)
++                       break;
++               for (i = 0; i < 20; i++) {
++                       if (i2c_transfer(client->adapter, &msgack, 1) == 1)
++                               break;
++                       mdelay(1);
++               }
++               if (i >= 20)
++                       break;
++               count -= len;
++               off += len;
++               buf += len;
++               tx += len;
++       }
++       mutex_unlock(&info->update_lock);
++       return tx;
++}
++
++static struct bin_attribute eeprom_attr = {
++       .attr =
++       {
++               .name = "data",
++               .mode = S_IRUGO | S_IWUSR,
++               .owner = THIS_MODULE,
++       },
++/*     .size = selected_eeprom->total_size, */
++       .read = eeprom_read,
++       .write = eeprom_write,
++};
++
++static ssize_t chip_show(struct device *dev, struct device_attribute *attr,
++       char *buffer)
++{
++       struct eeprom_info *info = (struct eeprom_info *)dev_get_drvdata(dev);
++       return sprintf(buffer, "%s\n", info->selected_eeprom->name);
++}
++
++static ssize_t chip_store(struct device *dev, struct device_attribute *attr,
++       const char *buffer, size_t count)
++{
++       struct eeprom_info *info = (struct eeprom_info *)dev_get_drvdata(dev);
++       const struct eeprom_device *ei_pt;
++       if (buffer[count - 1] == '\n')
++               count--;
++       for (ei_pt = eeproms; ei_pt->name; ei_pt++)
++               if (strncasecmp(buffer, ei_pt->name, count) == 0) {
++                       mutex_lock(&info->update_lock);
++                       info->selected_eeprom = ei_pt;
++                       sysfs_remove_bin_file(&info->client.dev.kobj,
++                               &eeprom_attr);
++                       eeprom_attr.size = info->selected_eeprom->total_size;
++                       sysfs_create_bin_file(&info->client.dev.kobj,
++                               &eeprom_attr);
++                       mutex_unlock(&info->update_lock);
++               }
++       return count;
++}
++
++static DEVICE_ATTR(chip, S_IRUGO | S_IWUSR, chip_show, chip_store);
++
++static int eeprom_attach_adapter(struct i2c_adapter *adapter);
++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,
++};
++
++/* 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_info *info;
++       struct i2c_msg msg;
++       int err = 0;
++       const struct eeprom_device *ei_pt;
++       if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA |
++               I2C_FUNC_SMBUS_BYTE))
++               goto exit;
++       for (ei_pt = eeproms; ei_pt->name; ei_pt++)
++               if (strcasecmp(eeprom_name, ei_pt->name) == 0)
++                       break;
++/* if((address&0x07)%(ei_pt->total_size/ei_pt->virt_device_len)!=0)
++   goto exit; */
++       msg.addr = address;
++       msg.flags = 0;
++       msg.len = 0;
++       if (i2c_transfer(adapter, &msg, 1) != 1)
++               goto exit;
++       info = kzalloc(sizeof(struct eeprom_info), GFP_KERNEL);
++       if (!info) {
++               err = -ENOMEM;
++               goto exit;
++       }
++       info->selected_eeprom = ei_pt;
++       new_client = &info->client;
++       new_client->addr = address;
++       new_client->adapter = adapter;
++       new_client->driver = &eeprom_driver;
++       new_client->flags = 0;
++       strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE);
++       mutex_init(&info->update_lock);
++       i2c_set_clientdata(new_client, info);
++       err = i2c_attach_client(new_client);
++       if (err)
++               goto exit_kfree;
++       eeprom_attr.size = ei_pt->total_size;
++       err = sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
++       if (err)
++               goto exit_detach;
++       err = sysfs_create_file(&new_client->dev.kobj, &dev_attr_chip.attr);
++       if (err)
++               goto exit_detach2;
++       return 0;
++exit_detach2:
++       sysfs_remove_bin_file(&new_client->dev.kobj, &eeprom_attr);
++exit_detach:
++       i2c_detach_client(new_client);
++exit_kfree:
++       kfree(info);
++exit:
++       return err;
++}
++
++static int eeprom_attach_adapter(struct i2c_adapter *adapter)
++{
++       return(i2c_probe(adapter, &addr_data, eeprom_detect));
++}
++
++static int eeprom_detach_client(struct i2c_client *client)
++{
++       int err;
++       sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr);
++       sysfs_remove_file(&client->dev.kobj, &dev_attr_chip.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("Davide Rizzo <[EMAIL PROTECTED]>");
++MODULE_DESCRIPTION("I2C EEPROM driver");
++MODULE_LICENSE("GPL");
++
++module_init(eeprom_init);
++module_exit(eeprom_exit);
++
+Index: linux-2.6.26-NEW/drivers/i2c/chips/Kconfig
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/i2c/chips/Kconfig
++++ linux-2.6.26-NEW/drivers/i2c/chips/Kconfig
+@@ -148,4 +148,12 @@ config MENELAUS
+         and other features that are often used in portable devices like
+         cell phones and PDAs.
++config EEPROM_RW
++       tristate "EEPROM"
++       help
++         If you say yes here you get read/write access to the EEPROM data
++
++         This driver can also be built as a module.  If so, the module
++         will be called eeprom-rw.
++
+ endmenu
@@ -1,7 +1,8 @@
-diff -Nru linux-2.6.26/drivers/hwmon/Kconfig linux-2.6.26.mod/drivers/hwmon/Kconfig
---- linux-2.6.26/drivers/hwmon/Kconfig 2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.26.mod/drivers/hwmon/Kconfig     2008-11-18 11:54:04.000000000 +0100
-@@ -390,6 +390,15 @@
+Index: linux-2.6.26-NEW/drivers/hwmon/Kconfig
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/hwmon/Kconfig
++++ linux-2.6.26-NEW/drivers/hwmon/Kconfig
+@@ -390,6 +390,15 @@ config SENSORS_LM70
          This driver can also be built as a module.  If so, the module
          will be called lm70.
  
@@ -17,9 +18,22 @@ diff -Nru linux-2.6.26/drivers/hwmon/Kconfig linux-2.6.26.mod/drivers/hwmon/Kcon
  config SENSORS_LM75
        tristate "National Semiconductor LM75 and compatibles"
        depends on I2C
-diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.c
---- linux-2.6.26/drivers/hwmon/lm73.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.26.mod/drivers/hwmon/lm73.c      2008-11-27 11:46:31.000000000 +0100
+Index: linux-2.6.26-NEW/drivers/hwmon/Makefile
+===================================================================
+--- linux-2.6.26-NEW.orig/drivers/hwmon/Makefile
++++ linux-2.6.26-NEW/drivers/hwmon/Makefile
+@@ -47,6 +47,7 @@ obj-$(CONFIG_SENSORS_IT87)   += it87.o
+ 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
+Index: linux-2.6.26-NEW/drivers/hwmon/lm73.c
+===================================================================
+--- /dev/null
++++ linux-2.6.26-NEW/drivers/hwmon/lm73.c
 @@ -0,0 +1,241 @@
 + /*
 + * LM73 Sensor driver
@@ -112,7 +126,7 @@ diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.
 +      struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 +      struct i2c_client *client = to_i2c_client(dev);
 +      int nr = attr->index;
-+      
++
 +      long tmp = simple_strtol(buf, NULL, 10);
 +
 +      lm73_write_value(client, LM73_REG_TEMP[nr], tmp);
@@ -156,7 +170,7 @@ diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.
 +      if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
 +                                   I2C_FUNC_SMBUS_WORD_DATA))
 +              goto exit;
-+      
++
 +      if (!(data = kzalloc(sizeof(struct lm73_data), GFP_KERNEL))) {
 +              err = -ENOMEM;
 +              goto exit;
@@ -215,23 +229,24 @@ diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.
 +static int lm73_read_value(struct i2c_client *client, u8 reg)
 +{
 +      short sVal;
-+      
++
 +      if (reg == LM73_REG_CONF)
 +              return i2c_smbus_read_byte_data(client, reg);
 +      else
 +      {
 +              sVal = swab16(i2c_smbus_read_word_data(client, reg));
 +              sVal = sVal >> 7;
-+                      
-+              if(sVal & 0xFFFF)
-+              {
++
++              if ( sVal & 0xFFFF ) {
 +                      sVal = sVal - 0x1;
 +                      sVal = ~sVal;
-+                      
++
 +                      return -sVal;
 +              }
++              else {
++                      return sVal;
++              }
 +      }
-+      
 +}
 +
 +static int lm73_write_value(struct i2c_client *client, u8 reg, short value)
@@ -239,10 +254,9 @@ diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.
 +      if (reg == LM73_REG_CONF)
 +              return i2c_smbus_write_byte_data(client, reg, value);
 +      else
-+      {               
-+              value = value<<7;       
++      {
++              value = value<<7;
 +              return i2c_smbus_write_word_data(client, reg, swab16(value));
-+              
 +      }
 +}
 +
@@ -262,14 +276,3 @@ diff -Nru linux-2.6.26/drivers/hwmon/lm73.c linux-2.6.26.mod/drivers/hwmon/lm73.
 +
 +module_init(sensors_lm73_init);
 +module_exit(sensors_lm73_exit);
-diff -Nru linux-2.6.26/drivers/hwmon/Makefile linux-2.6.26.mod/drivers/hwmon/Makefile
---- linux-2.6.26/drivers/hwmon/Makefile        2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.26.mod/drivers/hwmon/Makefile    2008-11-18 11:54:04.000000000 +0100
-@@ -47,6 +47,7 @@
- obj-$(CONFIG_SENSORS_K8TEMP)  += k8temp.o
- obj-$(CONFIG_SENSORS_LM63)    += lm63.o
- obj-$(CONFIG_SENSORS_LM70)    += lm70.o
-+obj-$(CONFIG_SENSORS_LM73)    += lm73.o
- obj-$(CONFIG_SENSORS_LM75)    += lm75.o
- obj-$(CONFIG_SENSORS_LM77)    += lm77.o
- obj-$(CONFIG_SENSORS_LM78)    += lm78.o
diff --git a/packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch b/packages/linux/linux-2.6.26/boc01/011-081105-gpio.patch
deleted file mode 100644 (file)
index 86bf4ff..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-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/011-081202-gpio.patch b/packages/linux/linux-2.6.26/boc01/011-081202-gpio.patch
new file mode 100644 (file)
index 0000000..e106526
--- /dev/null
@@ -0,0 +1,365 @@
+diff -Nru linux-2.6.26-010/drivers/char/Kconfig linux-2.6.26-011/drivers/char/Kconfig
+--- linux-2.6.26-010/drivers/char/Kconfig      2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26-011/drivers/char/Kconfig      2008-12-02 09:45:08.000000000 +0100
+@@ -1006,6 +1006,23 @@
+       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
++        Give userspace access to the GPIO pins on the MPC8313E devices.
++        
++config EXIO_MPC8313
++      tristate "mpc8313e exio"
++      depends on PPC_MPC831x
++      select INPUT
++      default y
++      help
++        Give userspace access to the Extenrder IO pins on the CPE board.
++
++        
+ config RAW_DRIVER
+       tristate "RAW driver (/dev/raw/rawN)"
+       depends on BLOCK
+diff -Nru linux-2.6.26-010/drivers/char/Makefile linux-2.6.26-011/drivers/char/Makefile
+--- linux-2.6.26-010/drivers/char/Makefile     2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26-011/drivers/char/Makefile     2008-12-02 09:45:25.000000000 +0100
+@@ -111,6 +111,8 @@
+ obj-$(CONFIG_PS3_FLASH)               += ps3flash.o
+ obj-$(CONFIG_JS_RTC)          += js-rtc.o
++obj-$(CONFIG_GPIO_MPC8313)                    += mpc8313e_gpio.o
++obj-$(CONFIG_EXIO_MPC8313)                    += mpc8313e_exio.o
+ js-rtc-y = rtc.o
+ # Files generated that shall be removed upon make clean
+diff -Nru linux-2.6.26-010/drivers/char/mpc8313e_exio.c linux-2.6.26-011/drivers/char/mpc8313e_exio.c
+--- linux-2.6.26-010/drivers/char/mpc8313e_exio.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.26-011/drivers/char/mpc8313e_exio.c      2008-12-02 10:46:31.000000000 +0100
+@@ -0,0 +1,170 @@
++/*
++* CPE Extender io driver
++*
++*
++* Copyright (C) 2007, CenoSYS (www.cenosys.com).
++* Alexandre Coffignal
++* alexandre.coffignal@cenosys.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
++* 
++* Allows a user space process to control the EXIO 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>
++#include <linux/cdev.h>
++
++static char module_name[] = "exio";
++
++
++#define NB_EXIO               8
++#define DEFAULT_STATE 0x58
++#define EXIO_BASE 0xfa000000
++#define EXIO_SIZE 0x2
++
++static int major = 0;
++static u8 exio_state = DEFAULT_STATE;
++static void *exio_io = NULL;
++static struct resource *exio_mem = NULL;
++
++static ssize_t mpc8313e_exio_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;
++      char mask;
++      int err = 0;
++
++      for (i = 0; i < len; ++i) {
++              char c;
++              if (get_user(c, data + i))
++                      return -EFAULT;
++              //TODO write
++
++              mask=(1<<(7-m));
++              switch (c) {
++              case '0':
++                      /*Clear exio level */ 
++                      exio_state&=~mask;
++                      iowrite8(exio_state, exio_io);
++                      break;
++              case '1':
++                      /*Set exio level */ 
++                      exio_state|=mask;
++                      iowrite8(exio_state, exio_io);
++                      break;
++              default:
++                      printk(KERN_DEBUG "exio%2d bad setting: chr<0x%2x>\n",
++                              m, (int)c);
++                      err++;
++              }
++      }
++      if (err)
++              return -EINVAL; 
++
++      return len;
++}
++
++
++static ssize_t mpc8313e_exio_read(struct file *file, char __user * buf, 
++              size_t len, loff_t * ppos)
++{
++      unsigned m = iminor(file->f_path.dentry->d_inode);
++      int value;
++      char mask;
++      char state=ioread8(exio_io);
++
++      mask=(1<<(7-m));
++      value=state&mask;
++      if (put_user(value ? '1' : '0', buf))
++              return -EFAULT;
++      return 1;
++
++}
++
++static int mpc8313e_exio_open(struct inode *inode, struct file *file)
++{
++    return 0;
++}
++
++static int mpc8313e_exio_close(struct inode *inode, struct file *file)
++{
++    printk(KERN_DEBUG "close()\n");
++    return 0;
++}
++
++struct file_operations mpc8313e_exio_fops =
++{
++      .owner =        THIS_MODULE,
++    .read = mpc8313e_exio_read,
++    .write = mpc8313e_exio_write,
++    .open = mpc8313e_exio_open,
++    .release = mpc8313e_exio_close  /* correspond a close */
++};
++
++static struct class * exio_class;
++
++static int __init mpc8313e_exio_init(void)
++{
++      int rc,i;
++
++      rc = register_chrdev(major, module_name, &mpc8313e_exio_fops);
++      if (rc < 0) {
++              return rc;
++      }
++      
++      if (major == 0) {
++              major = rc;  /* accept dynamic major number */
++              printk(KERN_INFO "%s: successfully loaded with major %d\n",module_name, major);
++      }
++      
++      exio_class = class_create(THIS_MODULE, "exio"); 
++      
++      for (i = 0; i < NB_EXIO; i++)
++      {
++              device_create(exio_class, NULL, MKDEV(major, i) , "%s%i", module_name,i);
++   
++      }
++
++      /* System I/O Configuration Register Low */
++      if (!(exio_mem = request_mem_region(EXIO_BASE, EXIO_SIZE, "mpc8313-exio")))
++              return -ENOMEM;
++      
++      if (!(exio_io = ioremap(EXIO_BASE, EXIO_SIZE)))
++      {
++              release_mem_region(EXIO_BASE, EXIO_SIZE);
++              exio_mem = NULL;
++              return -ENOMEM;
++      }
++      iowrite8(exio_state, exio_io);
++
++      return 0;
++}
++
++static void __exit mpc8313e_exio_cleanup(void)
++{
++      if (exio_mem) release_mem_region(EXIO_BASE, EXIO_SIZE);
++      exio_mem = NULL;
++      
++    unregister_chrdev(major, module_name);
++}
++
++module_param(major, int, 0644);
++MODULE_PARM_DESC(major, "Static major number (none = dynamic)");
++MODULE_AUTHOR("Alexandre Coffignal <alexandre.coffignal@cenosys.com>");
++MODULE_DESCRIPTION("mpc8313e exio");
++MODULE_LICENSE("GPL");
++
++module_init(mpc8313e_exio_init);
++module_exit(mpc8313e_exio_cleanup);
++
++
+diff -Nru linux-2.6.26-010/drivers/char/mpc8313e_gpio.c linux-2.6.26-011/drivers/char/mpc8313e_gpio.c
+--- linux-2.6.26-010/drivers/char/mpc8313e_gpio.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.26-011/drivers/char/mpc8313e_gpio.c      2008-12-02 10:46:35.000000000 +0100
+@@ -0,0 +1,148 @@
++/*
++* mpc8313e gpio driver
++*
++*
++* Copyright (C) 2007, CenoSYS (www.cenosys.com).
++* Alexandre Coffignal
++* alexandre.coffignal@cenosys.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
++* 
++* 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>
++
++static char module_name[] = "gpio";
++#define NB_GPIO       8
++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 (put_user(value ? '1' : '0', buf))
++              return -EFAULT;
++      return 1;
++      
++      
++}
++
++
++
++static int mpc8313e_gpio_open(struct inode *inode, struct file *file)
++{
++    return 0;
++}
++
++static int mpc8313e_gpio_close(struct inode *inode, struct file *file)
++{
++    return 0;
++}
++
++struct file_operations mpc8313e_gpio_fops =
++{
++      .owner =        THIS_MODULE,
++    .read = mpc8313e_gpio_read,
++    .write = mpc8313e_gpio_write,
++    .open = mpc8313e_gpio_open,
++    .release = mpc8313e_gpio_close 
++};
++static struct class * gpio_class;
++static int __init mpc8313e_gpio_init(void)
++{
++      int rc,i;
++
++      rc = register_chrdev(major, module_name, &mpc8313e_gpio_fops);
++      if (rc < 0) {
++              return rc;
++      }
++      
++      if (major == 0) {
++              major = rc;  /* accept dynamic major number */
++              printk(KERN_INFO "%s: successfully loaded with major %d\n",module_name, major);
++
++      }
++      gpio_class = class_create(THIS_MODULE, "gpio"); 
++      
++      for (i = 0; i < NB_GPIO; i++)
++      {
++              device_create(gpio_class, NULL, MKDEV(major, i) , "%s%i", module_name,i);
++   
++      }
++    
++      /* 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, module_name);
++}
++module_param(major, int, 0644);
++MODULE_PARM_DESC(major, "Static major number (none = dynamic)");
++MODULE_AUTHOR("Alexandre Coffignal <alexandre.coffignal@cenosys.com>");
++MODULE_DESCRIPTION("mpc8313e GPIO");
++MODULE_LICENSE("GPL");
++
++module_init(mpc8313e_gpio_init);
++module_exit(mpc8313e_gpio_cleanup);
++
++
@@ -1,6 +1,7 @@
-diff -uNr linux-2.6.26_orig/drivers/video/Kconfig linux-2.6.26/drivers/video/Kconfig
---- linux-2.6.26_orig/drivers/video/Kconfig    2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.26/drivers/video/Kconfig 2008-11-27 18:54:42.000000000 +0100
+Index: linux-2.6.26/drivers/video/Kconfig
+===================================================================
+--- linux-2.6.26.orig/drivers/video/Kconfig    2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26/drivers/video/Kconfig 2008-12-09 10:01:14.000000000 +0100
 @@ -480,6 +480,17 @@
          this driver, say Y or M; otherwise say N. You must specify the
          GPIO IO address to be used for setting control and data.
@@ -15,13 +16,14 @@ diff -uNr linux-2.6.26_orig/drivers/video/Kconfig linux-2.6.26/drivers/video/Kco
 +      help
 +        This enables support for the Nova 7506 Monochrome LCD board. The board
 +        is based on the NT7506 lcd controller.
-+        
++
  config FB_ATARI
        bool "Atari native chipset support"
        depends on (FB = y) && ATARI
-diff -uNr linux-2.6.26_orig/drivers/video/Makefile linux-2.6.26/drivers/video/Makefile
---- linux-2.6.26_orig/drivers/video/Makefile   2008-07-13 23:51:29.000000000 +0200
-+++ linux-2.6.26/drivers/video/Makefile        2008-11-27 18:54:57.000000000 +0100
+Index: linux-2.6.26/drivers/video/Makefile
+===================================================================
+--- linux-2.6.26.orig/drivers/video/Makefile   2008-07-13 23:51:29.000000000 +0200
++++ linux-2.6.26/drivers/video/Makefile        2008-12-09 10:01:14.000000000 +0100
 @@ -13,8 +13,8 @@
  
  obj-$(CONFIG_VT)                += console/
@@ -29,14 +31,15 @@ diff -uNr linux-2.6.26_orig/drivers/video/Makefile linux-2.6.26/drivers/video/Ma
 -obj-y                           += backlight/ display/
 -
 +obj-y                                                 += backlight/ display/
-+obj-$(CONFIG_FB_NOVA)            += N7506fb.o 
++obj-$(CONFIG_FB_NOVA)            += N7506fb.o
  obj-$(CONFIG_FB_CFB_FILLRECT)  += cfbfillrect.o
  obj-$(CONFIG_FB_CFB_COPYAREA)  += cfbcopyarea.o
  obj-$(CONFIG_FB_CFB_IMAGEBLIT) += cfbimgblt.o
-diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N7506fb.c
---- linux-2.6.26_orig/drivers/video/N7506fb.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.26/drivers/video/N7506fb.c       2008-11-27 18:41:29.000000000 +0100
-@@ -0,0 +1,550 @@
+Index: linux-2.6.26/drivers/video/N7506fb.c
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.26/drivers/video/N7506fb.c       2008-12-09 10:03:34.000000000 +0100
+@@ -0,0 +1,631 @@
 +/*
 + * linux/drivers/video/N7506fb.c -- FB driver for Nova NT7506 monochrome LCD board
 + *
@@ -48,14 +51,14 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 + *
 + * Layout is based on arcfb.c by Jaya Kumar
 + *
-+ * This driver was written to be used with the Nova 7506 LCD board. 
-+ * 
-+ * 
-+ * 
-+ * 
++ * This driver was written to be used with the Nova 7506 LCD board.
++ *
++ *
++ *
++ *
 + * Nova uses a
-+ * set of NT7506 chips that control individual 128x128 LCD matrices. 
-+ * The interface between the board and the host is TTL based GPIO. 
++ * set of NT7506 chips that control individual 128x128 LCD matrices.
++ * The interface between the board and the host is TTL based GPIO.
 + *
 + * General notes:
 + * - User must set tuhold. It's in microseconds. According to the 108 spec,
@@ -107,6 +110,9 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +static unsigned long tuhold;
 +struct fb_info *info;
 +static struct timer_list fb_timer;
++static char _refresh;
++static char _fps =FRAME_PER_SECOND;
++static char _backlight=1;
 +
 +struct novafb_par {
 +      atomic_t ref_count;
@@ -139,45 +145,56 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +
 +static void NT7506_init_lcd(char ael);
 +
-+static void NT7506_writeb_ctl(unsigned char value)
++static void NT7506_writeb_ctl(unsigned char value,char backlight)
 +{
 +      unsigned short svalue;
-+      svalue=value<<8 | LCD_RSN | LCD_RST | LCD_ERDN | LCD_BCKLIGH;
++      char bl;
++      if(backlight)
++              bl=LCD_BCKLIGH;
++      else
++              bl=LCD_BCKLIGHN;
++
++      svalue=value<<8 | LCD_RSN | LCD_RST | LCD_ERDN | bl;
 +      iowrite16(svalue, _lcd_io);
 +      udelay(tuhold);
 +      //The data on DB0/7 are latched at the falling edge of the E_RD signal
-+      svalue=value<<8 | LCD_RSN | LCD_RST | LCD_ERD | LCD_BCKLIGH;
++      svalue=value<<8 | LCD_RSN | LCD_RST | LCD_ERD | bl;
 +      iowrite16(svalue, _lcd_io);
 +      udelay(tuhold);
 +}
 +
-+static void NT7506_writeb_data(unsigned char value)
++static void NT7506_writeb_data(unsigned char value,char backlight)
 +{
 +      unsigned short svalue;
-+      svalue=value<<8|LCD_RS |LCD_RST | LCD_ERD | LCD_BCKLIGH ;
++      char bl;
++      if(backlight)
++              bl=LCD_BCKLIGH;
++      else
++              bl=LCD_BCKLIGHN;
++      svalue=value<<8|LCD_RS |LCD_RST | LCD_ERD | bl ;
 +      iowrite16(svalue, _lcd_io);
 +      udelay(tuhold);
 +      //The data on DB0/7 are latched at the falling edge of the E_RD signal
-+      svalue=value<<8|LCD_RS |LCD_RST | LCD_ERDN | LCD_BCKLIGH;
++      svalue=value<<8|LCD_RS |LCD_RST | LCD_ERDN | bl;
 +      iowrite16(svalue, _lcd_io);
 +      udelay(tuhold);
 +}
 +
 +static void NT7506_set_start_line(unsigned char y)
 +{
-+      NT7506_writeb_ctl(NT_START_LINE);
-+      NT7506_writeb_ctl(y);
++      NT7506_writeb_ctl(NT_START_LINE,_backlight);
++      NT7506_writeb_ctl(y,_backlight);
 +}
 +
 +static void NT7506_set_yaddr(unsigned char y)
 +{
-+      NT7506_writeb_ctl(NT_PAGE_ADDR+y);
++      NT7506_writeb_ctl(NT_PAGE_ADDR+y,_backlight);
 +}
 +
 +static void NT7506_set_xaddr(unsigned char x)
 +{
-+      NT7506_writeb_ctl(NT_COL_MSB | (x >> 0x04) ); //Send high nibble 
-+      NT7506_writeb_ctl(NT_COL_LSB | (x & 0x0F) ); //Send low nibble 
++      NT7506_writeb_ctl(NT_COL_MSB | (x >> 0x04),_backlight); //Send high nibble
++      NT7506_writeb_ctl(NT_COL_LSB | (x & 0x0F) ,_backlight); //Send low nibble
 +}
 +
 +/* main novafb functions */
@@ -203,8 +220,8 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +                              struct fb_info *info)
 +{
 +      if ((var->vmode & FB_VMODE_YWRAP) && (var->yoffset < 128)
-+              && (info->var.yres <= 128)) 
-+      {       
++              && (info->var.yres <= 128))
++      {
 +              NT7506_set_start_line(var->yoffset);
 +              info->var.yoffset = var->yoffset;
 +              return 0;
@@ -227,12 +244,12 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +              dest[i]=0;
 +      }
 +      for(x=0;x<128/*(width)*/;x++)
-+      {       
++      {
 +              for(y=0;y<16/*height/8*/;y++)
 +              {
 +                      xfb=x/8;
 +                      yfb=y*8;
-+                      
++
 +                      for(bit=0;bit<8;yfb++,bit++)
 +                      {
 +                              mask = (1<<(7-(x%8)));
@@ -240,31 +257,31 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +                                      value=1;
 +                              else
 +                                      value=0;
-+                              
++
 +                              dest[y*128+x]+= (value<<bit);
 +                      }
 +              }
 +      }
-+      
++
 +      height=16;
 +      width=128;
-+      
++
 +      for (y = 0; y < height; y++)
 +      {
 +              NT7506_set_yaddr(y);
 +              NT7506_set_xaddr(0);
 +              for (x = 0; x < width; x++)
 +              {
-+                      NT7506_writeb_data(dest[y*128+x]);
-+                      NT7506_writeb_data(0x00);
++                      NT7506_writeb_data(dest[y*128+x],_backlight);
++                      NT7506_writeb_data(0x00,_backlight);
 +              }
-+              NT7506_writeb_data((unsigned char)0);
++              NT7506_writeb_data((unsigned char)0,_backlight);
 +      }
 +}
 +
 +static void novafb_fillrect(struct fb_info *info,  const struct fb_fillrect *rect)
 +{
-+      
++
 +//    sys_fillrect(info, rect);
 +
 +}
@@ -281,7 +298,7 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +static void novafb_imageblit(struct fb_info *info, const struct fb_image *image)
 +{
 +      struct novafb_par *par = info->par;
-+      
++
 +      int xfb,yfb,i=0;
 +      char * src = (unsigned char __force *) par->info->screen_base;
 +
@@ -289,10 +306,10 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +      {
 +              for(xfb=(image->dx)/8;xfb<(image->dx+image->width)/8;xfb++)
 +              {
-+                      src[yfb*16+xfb]=image->data[i++];               
-+              }       
++                      src[yfb*16+xfb]=image->data[i++];
++              }
 +      }
-+      
++
 +}
 +
 +/*
@@ -312,7 +329,7 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +      par = info->par;
 +      xres = info->var.xres;
 +      fbmemlength = (xres * info->var.yres)/8;
-+              
++
 +      if (p > fbmemlength)
 +      {
 +              return -ENOSPC;
@@ -370,6 +387,59 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +      return 0;
 +
 +}
++static int novafb_ioctl(struct fb_info *info,
++                        unsigned int cmd, unsigned long arg)
++{
++      unsigned char contrast;
++      unsigned char frame_rate;
++      unsigned char backlight;
++      switch (cmd)
++      {
++              case FBIO_FRAMERATE:
++              {
++
++                      if (get_user(frame_rate, (unsigned char *)arg))
++                              return -EFAULT;
++                      printk(KERN_INFO "fb0: framerate=%d Hz\n",frame_rate);
++                      _fps=frame_rate;
++                      return 0;
++              }
++              case FBIO_CONTRAST:
++              {
++                      _refresh=0;
++                      if (get_user(contrast, (unsigned char *)arg))
++                              return -EFAULT;
++                      printk(KERN_INFO "fb0: contrast=%d\n",contrast);
++                      NT7506_writeb_ctl(NT_ELEC_VOL,_backlight);      NT7506_writeb_ctl(contrast,_backlight);
++                      _refresh=1;
++                      return 0;
++              }
++              case FBIO_BACKLIGHT:
++              {
++                      _refresh=0;
++                      if (get_user(backlight, (unsigned char *)arg))
++                              return -EFAULT;
++                      if(backlight)
++                      {
++                              printk(KERN_INFO "fb0: Backlight ON\n");
++                              _backlight=1;
++                      }
++                      else
++                      {
++                              printk(KERN_INFO "fb0: Backlight OFF\n");
++                              _backlight=0;
++                      }
++                      _refresh=1;
++                      return 0;
++
++              }
++
++
++              default:
++                      return -EINVAL;
++      }
++
++}
 +
 +static struct fb_ops novafb_ops = {
 +      .owner          = THIS_MODULE,
@@ -381,21 +451,29 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +      .fb_fillrect    = novafb_fillrect,
 +      .fb_copyarea    = novafb_copyarea,
 +      .fb_imageblit   = novafb_imageblit,
-+//    .fb_ioctl       = novafb_ioctl,
++      .fb_ioctl               = novafb_ioctl,
 +      .fb_mmap                =novafb_mmap,
 +};
 +
 +
-+static void 
++static void
 +novafb_refresh(int ignore_me )
 +{
 +      struct novafb_par *par = info->par;
-+      novafb_lcd_update(par, 0, 0, 128,128);
-+      fb_timer.expires = jiffies + (HZ/FRAME_PER_SECOND);
-+      add_timer(&fb_timer);
++      if(_refresh)
++      {
++              novafb_lcd_update(par, 0, 0, 128,128);
++              fb_timer.expires = jiffies + (HZ/_fps);
++              add_timer(&fb_timer);
++      }
++      else
++      {
++              fb_timer.expires = jiffies + (HZ/_fps);
++              add_timer(&fb_timer);
++      }
 +}
 +
-+static int 
++static int
 +__init novafb_probe(struct platform_device *dev)
 +{
 +
@@ -424,8 +502,8 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +
 +      info->var = novafb_var;
 +      info->fix = novafb_fix;
-+      info->fix.smem_start=(unsigned long)videomemory;        
-+      info->fix.smem_len      = videomemorysize;                              
++      info->fix.smem_start=(unsigned long)videomemory;
++      info->fix.smem_len      = videomemorysize;
 +
 +      par = info->par;
 +      par->info = info;
@@ -442,10 +520,10 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +      retval = register_framebuffer(info);
 +      if (retval < 0)
 +              goto err1;
-+      
++
 +      init_timer(&fb_timer);
 +      fb_timer.function = novafb_refresh;
-+      fb_timer.expires = jiffies + (HZ / FRAME_PER_SECOND);
++      fb_timer.expires = jiffies + (HZ / _fps);
 +      add_timer(&fb_timer);
 +
 +      printk(KERN_INFO
@@ -485,10 +563,10 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +{
 +      int ret;
 +
-+      
++
 +      if (!(lcd_mem = request_mem_region(LCD_BASE, LCD_SIZE, "mpc8313-lcd")))
 +              return -ENOMEM;
-+      
++
 +      if (!(_lcd_io = ioremap(LCD_BASE, LCD_SIZE)))
 +      {
 +              release_mem_region(LCD_BASE, LCD_SIZE);
@@ -496,26 +574,26 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +              return -ENOMEM;
 +      }
 +      ret = platform_driver_register(&novafb_driver);
-+      
++
 +      if (!ret) {
 +              novafb_device = platform_device_alloc("novafb", 0);
-+              if (novafb_device) 
++              if (novafb_device)
 +              {
 +                      ret = platform_device_add(novafb_device);
-+              } 
-+              else 
++              }
++              else
 +              {
 +                      ret = -ENOMEM;
 +              }
-+              if (ret) 
++              if (ret)
 +              {
 +                      platform_device_put(novafb_device);
 +                      platform_driver_unregister(&novafb_driver);
 +              }
-+              
++
 +      }
-+      
-+      
++
++
 +      return ret;
 +
 +}
@@ -524,53 +602,59 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +static void NT7506_init_lcd(char ael)
 +{
 +      /* this resets the lcd*/
-+      iowrite16(LCD_RSTN | LCD_ERD | LCD_BCKLIGH, _lcd_io);
++      char bl;
++      if(_backlight)
++              bl=LCD_BCKLIGH;
++      else
++              bl=LCD_BCKLIGHN;
++
++      iowrite16(LCD_RSTN | LCD_ERD | bl, _lcd_io);
 +      udelay(100);
-+      iowrite16(LCD_RST| LCD_ERD | LCD_BCKLIGH, _lcd_io);
++      iowrite16(LCD_RST| LCD_ERD | bl, _lcd_io);
 +      udelay(200);
 +      /* Soft reset*/
-+      NT7506_writeb_ctl(NT_RESET);    
++      NT7506_writeb_ctl(NT_RESET,_backlight);
 +      /* Disable ICON display*/
-+      NT7506_writeb_ctl(NT_ICON|OFF); 
++      NT7506_writeb_ctl(NT_ICON|OFF,_backlight);
 +      /* Sets the duty ratio 1/128*/
-+      NT7506_writeb_ctl(NT_DUTY);             NT7506_writeb_ctl(DUTY_1_128);
++      NT7506_writeb_ctl(NT_DUTY,_backlight);          NT7506_writeb_ctl(DUTY_1_128,_backlight);
 +      /* Sets reverse direction between RAM column address and segment driver*/
-+      NT7506_writeb_ctl(NT_ADC_REV);
-+      NT7506_writeb_ctl(NT_SHL_NOR);
++      NT7506_writeb_ctl(NT_ADC_REV,_backlight);
++      NT7506_writeb_ctl(NT_SHL_NOR,_backlight);
 +      /* Enales the built in Oscillator circuit.*/
-+      NT7506_writeb_ctl(NT_OSC);
++      NT7506_writeb_ctl(NT_OSC,_backlight);
 +      /* Set Initial row to 0*/
-+      NT7506_writeb_ctl(NT_COM0);             NT7506_writeb_ctl(0);
++      NT7506_writeb_ctl(NT_COM0,_backlight);          NT7506_writeb_ctl(0,_backlight);
 +      /* Sets DC-DC*/
-+      NT7506_writeb_ctl(NT_DCDC|TIME6);
++      NT7506_writeb_ctl(NT_DCDC|TIME6,_backlight);
 +      /* Selects resistance ratio of the internal resistor*/
-+      NT7506_writeb_ctl(NT_REG_RES|RES_7_2);
++      NT7506_writeb_ctl(NT_REG_RES|RES_7_2,_backlight);
 +      /* set Reference Voltage mode*/
-+      NT7506_writeb_ctl(NT_ELEC_VOL); NT7506_writeb_ctl(ael); 
++      NT7506_writeb_ctl(NT_ELEC_VOL,_backlight);      NT7506_writeb_ctl(ael,_backlight);
 +      /* Selects LCD bias ratio*/
-+      NT7506_writeb_ctl(NT_BIAS|BIAS_1_11);
++      NT7506_writeb_ctl(NT_BIAS|BIAS_1_11,_backlight);
 +
-+      NT7506_writeb_ctl(NT_DATA_DIR); NT7506_writeb_ctl(0);
-+      NT7506_writeb_ctl(NT_FRC_PWM|PWM15);
++      NT7506_writeb_ctl(NT_DATA_DIR,_backlight);      NT7506_writeb_ctl(0,_backlight);
++      NT7506_writeb_ctl(NT_FRC_PWM|PWM15,_backlight);
 +      /* Select power circuit functions */
-+      NT7506_writeb_ctl(NT_POWER|VC);
++      NT7506_writeb_ctl(NT_POWER|VC,_backlight);
 +      udelay(5000);
-+      NT7506_writeb_ctl(NT_POWER|VC|VR);
++      NT7506_writeb_ctl(NT_POWER|VC|VR,_backlight);
 +      udelay(5000);
-+      NT7506_writeb_ctl(NT_POWER|VC|VR|VF);
++      NT7506_writeb_ctl(NT_POWER|VC|VR|VF,_backlight);
 +      udelay(5000);
 +      /* Reverses the display status on LCD panel */
-+      NT7506_writeb_ctl(NT_REV_DISP|OFF);
++      NT7506_writeb_ctl(NT_REV_DISP|OFF,_backlight);
 +      /* Forces the whole LCD points to be turned on regardless of the contents of the display data RAM*/
-+      NT7506_writeb_ctl(NT_DISP|ON);
++      NT7506_writeb_ctl(NT_DISP|ON,_backlight);
 +      /* Set Initial Start Line Address */
-+      NT7506_writeb_ctl(NT_START_LINE);       NT7506_writeb_ctl(0x00);
-+
++      NT7506_writeb_ctl(NT_START_LINE,_backlight);    NT7506_writeb_ctl(0x00,_backlight);
++      _refresh=1;
 +}
 +
 +static void __exit novafb_exit(void)
 +{
-+      if (lcd_mem) 
++      if (lcd_mem)
 +              release_mem_region(LCD_BASE, LCD_SIZE);
 +      lcd_mem = NULL;
 +      platform_device_unregister(novafb_device);
@@ -587,10 +671,11 @@ diff -uNr linux-2.6.26_orig/drivers/video/N7506fb.c linux-2.6.26/drivers/video/N
 +MODULE_AUTHOR("Alexandre Coffignal");
 +MODULE_LICENSE("GPL");
 +
-diff -uNr linux-2.6.26_orig/include/linux/NT7506.h linux-2.6.26/include/linux/NT7506.h
---- linux-2.6.26_orig/include/linux/NT7506.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.26/include/linux/NT7506.h        2008-11-13 12:46:05.000000000 +0100
-@@ -0,0 +1,70 @@
+Index: linux-2.6.26/include/linux/NT7506.h
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.26/include/linux/NT7506.h        2008-12-09 10:04:16.000000000 +0100
+@@ -0,0 +1,73 @@
 +
 +/*
 + * (C) Copyright 2008
@@ -649,7 +734,7 @@ diff -uNr linux-2.6.26_orig/include/linux/NT7506.h linux-2.6.26/include/linux/NT
 +#define       NT_OSC                  0xAB
 +#define NT_RESET              0xE2
 +#define NT_DATA_DIR           0xe8
-+#define NT_FRC_PWM            0x90            
++#define NT_FRC_PWM            0x90
 +#define PWM15                         0x03
 +
 +#define ON            0x01
@@ -657,6 +742,9 @@ diff -uNr linux-2.6.26_orig/include/linux/NT7506.h linux-2.6.26/include/linux/NT
 +
 +
 +
++#define FBIO_FRAMERATE                _IOR('f', 1, char)
++#define FBIO_CONTRAST         _IOR('f', 2, char)
++#define FBIO_BACKLIGHT                _IOR('f', 3, char)
 +
 +
 +#endif
index a61f612..726e955 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.26
-# Tue Dec  9 15:33:40 2008
+# Wed Dec 17 12:15:19 2008
 #
 # CONFIG_PPC64 is not set
 
@@ -1038,6 +1038,7 @@ CONFIG_HW_RANDOM=y
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
 CONFIG_GPIO_MPC8313=y
+CONFIG_EXIO_MPC8313=y
 # CONFIG_RAW_DRIVER is not set
 # CONFIG_TCG_TPM is not set
 CONFIG_DEVPORT=y
@@ -1077,7 +1078,6 @@ 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
@@ -1086,6 +1086,7 @@ CONFIG_ISL12024EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_MAX6875 is not set
 # CONFIG_SENSORS_TSL2550 is not set
+CONFIG_EEPROM_RW=y
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -1282,8 +1283,7 @@ CONFIG_FB_NOVA=y
 #
 # Console display driver support
 #
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
index bb4df19..c3fa981 100644 (file)
@@ -1,6 +1,6 @@
 require linux.inc
 
-PR = "r3"
+PR = "r4"
 
 # Mark archs/machines that this kernel supports
 DEFAULT_PREFERENCE = "-1"
@@ -17,14 +17,14 @@ SRC_URI_append_boc01 = "\
        file://fsl-elbc-nand-backport.patch;patch=1 \
        file://002-081105-headers.patch;patch=1 \
        file://004-081105-usb.patch;patch=1 \
-       file://005-081127-isl12024.patch;patch=1 \
-       file://006-081105-at24c32.patch;patch=1 \
-       file://007-081127-lm73.patch;patch=1 \
+       file://005-081217-isl12024.patch;patch=1 \
+       file://006-081216-at24c32.patch;patch=1 \
+       file://007-081216-lm73.patch;patch=1 \
        file://008-081127-spi.patch;patch=1 \
        file://010-081105-mii.patch;patch=1 \
-       file://011-081105-gpio.patch;patch=1 \
+       file://011-081202-gpio.patch;patch=1 \
        file://012-081121-cy3218-btns.patch;patch=1 \
-       file://013-081127-lcd.patch;patch=1 \
+       file://013-081212-lcd.patch;patch=1 \
        "
 
 SRC_URI_append_mpc8313e-rdb = "\