+Index: linux-2.6.27/drivers/i2c/chips/at24.c
+===================================================================
+--- linux-2.6.27.orig/drivers/i2c/chips/at24.c
++++ linux-2.6.27/drivers/i2c/chips/at24.c
+@@ -114,6 +114,8 @@ static const struct i2c_device_id at24_i
+ { "spd", AT24_DEVICE_MAGIC(2048 / 8,
+ AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },
+ { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },
++ /* Intersil RTC/Unique-ID isl12024 eeprom handled here */
++ { "isl12024",AT24_DEVICE_MAGIC(4096 / 8, AT24_FLAG_ADDR16) },
+ /* 24rf08 quirk is handled at i2c-core */
+ { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) },
+ { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) },
Index: linux-2.6.27/drivers/rtc/Kconfig
===================================================================
--- linux-2.6.27.orig/drivers/rtc/Kconfig
obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o
obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t94.o
obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o
+Index: linux-2.6.27/drivers/rtc/isl12024.h
+===================================================================
+--- /dev/null
++++ linux-2.6.27/drivers/rtc/isl12024.h
+@@ -0,0 +1,100 @@
++/*
++ * Intersil ISL12024 chip registers definitions
++ *
++ *
++ * Copyright (C) 2008, 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
++ */
++
++#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_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_*/
Index: linux-2.6.27/drivers/rtc/rtc-isl12024.c
===================================================================
--- /dev/null
+++ linux-2.6.27/drivers/rtc/rtc-isl12024.c
-@@ -0,0 +1,517 @@
+@@ -0,0 +1,541 @@
+/*
+ * Intersil ISL12024 class driver
+ *
+ *
+ * Copyright (C) 2007, CenoSYS (www.cenosys.com).
-+ * Guillaume Ligneul
-+ * Guillaume.ligneul@gmail.com
++ *
++ * Guillaume Ligneul <guillaume.ligneul@gmail.com>
++ * Sylvain Giroudon <sylvain.giroudon@goobie.fr>
+ *
+ * This software program is licensed subject to the GNU General Public License
+ * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
+#define DBG 1
+#undef DBG
+
-+static u8 buf_id[ISL12024_RTC_SECTION_LEN] = { 0 ,};
-+
+#define DRV_NAME "isl12024"
-+#define DRV_VERSION "0.1"
++#define DRV_VERSION "0.2"
+
+/* 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)
++
++/* Bufer to store unique identifier in */
++static u8 buf_id[ISL12024_RTC_SECTION_LEN] = { 0 };
++
++
++// To debug (may be added in include/linux/i2c-id.h)
+#define I2C_DRIVERID_ISL12024 97
+
++
+static struct i2c_driver isl12024_driver = {
+ .driver = {
+ .name = DRV_NAME,
+ .detach_client = &isl12024_detach_client,
+};
+
++
+int
+isl12024_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[],
+ unsigned len)
+
+ memcpy(&i2c_buf[2], &buf[0], len );
+
-+
+ ret = i2c_transfer(client->adapter, msgs, 1);
-+ printk(KERN_INFO "i2c_transfer %d\n",ret);
++ if ( ret < 0 )
++ printk(KERN_ERR DRV_NAME ": i2c_transfer failed (%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, };
+ return 0;
+}
+
++
+static int isl12024_read_time(struct i2c_client *client,
+ struct rtc_time *tm)
+{
+ int err;
+ u8 regs[ISL12024_RTC_SECTION_LEN] = { 0, };
+
-+ printk(KERN_INFO "%s\n ",__FUNCTION__ );
-+
++ //printk(KERN_INFO DRV_NAME "%s\n ",__FUNCTION__ );
+
+ if (isl12024_get_status(client, &sr) < 0) {
+ dev_err(&client->dev, "%s: reading SR failed\n", __func__);
+#ifdef DBG
+ int i;
+ for(i=0; i<ISL12024_RTC_SECTION_LEN; i++)
-+ printk(KERN_INFO "0x%2X\n", regs[i]);
++ printk(KERN_INFO DRV_NAME "0x%2X\n", regs[i]);
+#endif
+
+ if (err < 0) {
+ 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 };
+ return 0;
+}
+
++
+static int isl12024_set_datetime(struct i2c_client *client, struct rtc_time *tm,
+ int datetoo, u8 reg_base, unsigned char alm_enable)
+{
+ return 0;
+}
+
++
+static int isl12024_fix_osc(struct i2c_client *client)
+{
+ int err;
+ 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");
++ if ( err < 0 )
++ printk(KERN_ERR DRV_NAME ": Unable to restart the oscillator (%d)\n", err);
+
+ return err;
+}
+
++
+static int isl12024_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+ return isl12024_read_time(to_i2c_client(dev), tm);
+
+}
+
++
+static int isl12024_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ return isl12024_set_datetime(to_i2c_client(dev),
+ tm, 1, ISL12024_CCR_BASE, 0);
+}
+
++
+static int
+isl12024_rtc_proc(struct device *dev, struct seq_file *seq)
+{
+ return 0;
+}
+
++
+static const struct rtc_class_ops isl12024_rtc_ops = {
+ .proc = isl12024_rtc_proc,
+ .read_time = isl12024_rtc_read_time,
+ .set_time = isl12024_rtc_set_time,
+};
+
-+static int read_proc (char * page, char ** start, off_t off, int count, int * eof, void * data)
++static int
++read_proc(char * page, char ** start, off_t off, int count, int * eof, void * data)
+{
-+ int i=0;
++ int len = 0;
++ int i;
+
-+ printk("id: 0x");
-+ for(i=0;i<ISL12024_RTC_SECTION_LEN;i++)
-+ printk("%02X",buf_id[i]);
-+ printk("\n");
-+ return 0;
++ for (i = 0; i < ISL12024_RTC_SECTION_LEN; i++)
++ len += sprintf(page+len, "%02X", buf_id[i]);
++ len += sprintf(page+len, "\n");
++
++ len -= off;
++ if ( len < count ) {
++ *eof = 1;
++ if ( len <= 0 )
++ return 0;
++ } else {
++ len = count;
++ }
++
++ *start = page + off;
++
++ return len;
+}
+
++
+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;
++ struct proc_dir_entry *proc_root;
++ struct proc_dir_entry *proc_entry;
+
+ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
+ rc = -ENODEV;
+ &isl12024_rtc_ops, THIS_MODULE);
+
+ if (IS_ERR(rtc)) {
-+ printk("Error during rtc registration\n");
++ printk(KERN_ERR DRV_NAME ": 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);
-+ }
++ if ((err = isl12024_get_status(new_client, &sr)) == 0) {
++ if (sr & ISL12024_SR_RTCF) {
++ printk(KERN_INFO DRV_NAME ": Power failure detected, please set the clock\n");
++ udelay(50);
++ isl12024_fix_osc(new_client);
+ }
-+ else
-+ printk(KERN_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);
++ }
++ else {
++ printk(KERN_ERR DRV_NAME ": Couldn't read status\n");
++ }
+
-+ if (entry_proc == NULL)
-+ return -1;
++ proc_root = proc_mkdir(DRV_NAME, 0);
++ proc_entry = create_proc_entry("id", S_IFREG | S_IRUGO, proc_root);
++ if (proc_entry == NULL)
++ return -1;
+
-+ entry_proc->owner = THIS_MODULE;
-+ entry_proc->read_proc = read_proc;
++ proc_entry->owner = THIS_MODULE;
++ proc_entry->read_proc = read_proc;
+
-+ /* read unique id from eeprom */
++ /* Read unique id from eeprom */
+ isl12024_i2c_read_regs(new_client, ISL12024_REG_ID, buf_id, sizeof(buf_id));
+
-+
+ return 0;
+
+ failout:
+ 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)
+{
+ return 0;
+}
+
++
+/* module init/exit */
+
+static int __init isl12024_init(void)
+
+module_init(isl12024_init);
+module_exit(isl12024_exit);
-Index: linux-2.6.27/drivers/i2c/chips/at24.c
-===================================================================
---- linux-2.6.27.orig/drivers/i2c/chips/at24.c
-+++ linux-2.6.27/drivers/i2c/chips/at24.c
-@@ -114,6 +114,8 @@ static const struct i2c_device_id at24_i
- { "spd", AT24_DEVICE_MAGIC(2048 / 8,
- AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },
- { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },
-+ /* Intersil RTC/Unique-ID isl12024 eeprom handled here */
-+ { "isl12024",AT24_DEVICE_MAGIC(4096 / 8, AT24_FLAG_ADDR16) },
- /* 24rf08 quirk is handled at i2c-core */
- { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) },
- { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) },
-Index: linux-2.6.27/drivers/rtc/isl12024.h
-===================================================================
---- /dev/null
-+++ linux-2.6.27/drivers/rtc/isl12024.h
-@@ -0,0 +1,100 @@
-+/*
-+ * Intersil ISL12024 chip registers definitions
-+ *
-+ *
-+ * Copyright (C) 2008, 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
-+ */
-+
-+#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_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_*/
===================================================================
--- /dev/null
+++ linux-2.6.27/drivers/video/nt7506fb.c
-@@ -0,0 +1,847 @@
+@@ -0,0 +1,880 @@
+/*
+ * linux/drivers/video/nt7506fb.c -- FB driver for NT7506 monochrome LCD board
+ *
+#define GRAY_BLACK_AB 6
+#define GRAY_BLACK_CD 7
+
++#define GRAY_INDEX_WHITE GRAY_WHITE_AB
++#define GRAY_INDEX_LIGHT GRAY_LIGHT_AB
++#define GRAY_INDEX_DARK GRAY_DARK_AB
++#define GRAY_INDEX_BLACK GRAY_BLACK_AB
++
++#define GRAY_LEVEL_WHITE 0
++#define GRAY_LEVEL_LIGHT 5
++#define GRAY_LEVEL_DARK 10
++#define GRAY_LEVEL_BLACK 15
++#define GRAY_LEVEL_MAX 15
++
++#define GRAY_VALUE(level) (((level)<<4)+(level))
++
+// Geometric settings
+#define LCD_WIDTH 128
+#define LCD_HEIGHT 128
+ NT7506_writeb_data(plane1);
+ NT7506_writeb_data(plane2);
+ }
-+ NT7506_writeb_data((unsigned char)0);
+ }
+
+ } else {
+ NT7506_writeb_data(plane1);
+ NT7506_writeb_data(plane2);
+ }
-+ NT7506_writeb_data((unsigned char)0);
+ }
+
+ }
+ unsigned int fbmemlength;
+ int err = 0;
+
-+ fbmemlength = (info->var.xres * info->var.yres)/8;
++ fbmemlength = (info->var.xres * info->var.yres) / (8 / info->var.bits_per_pixel);
+
+ if ( p > fbmemlength ) {
+ return -EFBIG;
+ nt7506fb_start_timer();
+}
+
++/*
++ * Grayscale levels adjustment
++ */
++
++#ifdef CONFIG_FB_NT7506_GRAYSCALE
++
++static void nt7506fb_set_gray_level(unsigned char index, unsigned char level)
++{
++ NT7506_writeb_ctl(NT_GRAY_SCALE | index);
++ NT7506_writeb_ctl(GRAY_VALUE(level));
++ NT7506_writeb_ctl(NT_GRAY_SCALE | (index+1));
++ NT7506_writeb_ctl(GRAY_VALUE(level));
++}
++
++#ifdef CONFIG_PROC_FS
++#include "nt7506fb-procfs.c"
++#endif
++
++#endif
++
++
++/*
++ * Device driver intialisation
++ */
++
+static int __init
+nt7506fb_probe(struct platform_device *dev)
+{
+ "fb%d: nt7506 frame buffer device, using %dK of video memory\n",
+ info->node, videomemorysize >> 10);
+
++ /* Create procfs entries for grayscale levels adjustment */
++#ifdef CONFIG_PROC_FS
++#ifdef CONFIG_FB_NT7506_GRAYSCALE
++ nt7506fb_proc_init(par);
++#endif
++#endif
++
+ /* Initialize backlight and contrast control (do not abort driver if it fails) */
+ nt7506fb_bl_init(par);
+ nt7506fb_lcd_init(par);
+{
+ struct fb_info *info = platform_get_drvdata(dev);
+
-+ printk(KERN_INFO DRIVER_NAME ": Switching to Power Save mode\n");
++ printk(KERN_INFO DRIVER_NAME ": suspend\n");
+
+ info->bl_dev->props.power = FB_BLANK_POWERDOWN;
+ nt7506fb_bl_update_status(info->bl_dev);
+{
+ struct fb_info *info = platform_get_drvdata(dev);
+
++ printk(KERN_INFO DRIVER_NAME ": resume\n");
++
+ info->bl_dev->props.power = FB_BLANK_UNBLANK;
+ nt7506fb_bl_update_status(info->bl_dev);
+
+
+#ifdef CONFIG_FB_NT7506_GRAYSCALE
+ /* Feed grayscale palette */
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_WHITE_AB);
-+ NT7506_writeb_ctl(0x00);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_WHITE_CD);
-+ NT7506_writeb_ctl(0x00);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_LIGHT_AB);
-+ NT7506_writeb_ctl(0x55);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_LIGHT_CD);
-+ NT7506_writeb_ctl(0x55);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_DARK_AB);
-+ NT7506_writeb_ctl(0xAA);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_DARK_CD);
-+ NT7506_writeb_ctl(0xAA);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_BLACK_AB);
-+ NT7506_writeb_ctl(0xFF);
-+ NT7506_writeb_ctl(NT_GRAY_SCALE | GRAY_BLACK_CD);
-+ NT7506_writeb_ctl(0xFF);
++ nt7506fb_set_gray_level(GRAY_INDEX_WHITE, GRAY_LEVEL_WHITE);
++ nt7506fb_set_gray_level(GRAY_INDEX_LIGHT, GRAY_LEVEL_LIGHT);
++ nt7506fb_set_gray_level(GRAY_INDEX_DARK, GRAY_LEVEL_DARK);
++ nt7506fb_set_gray_level(GRAY_INDEX_BLACK, GRAY_LEVEL_BLACK);
+#endif
+
+ /* Select power circuit functions */
+#define FBIO_FRAMERATE _IOR('f', 1, char)
+
+#endif
+Index: linux-2.6.27/drivers/video/nt7506fb-procfs.c
+===================================================================
+--- /dev/null
++++ linux-2.6.27/drivers/video/nt7506fb-procfs.c
+@@ -0,0 +1,119 @@
++/*
++ * FB driver for NT7506 monochrome/grayscale LCD board
++ * Device setup using procfs
++ *
++ * Copyright (C) 2009, Goobie (www.goobie.fr).
++ *
++ * Sylvain Giroudon <sylvain.giroudon@goobie.fr>
++ *
++ * This software program is licensed subject to the GNU General Public License
++ * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
++ */
++
++#include <linux/proc_fs.h>
++#include <linux/uaccess.h>
++
++struct nt7506fb_proc_entry {
++ char *name;
++ unsigned char index;
++ unsigned char level;
++ struct nt7506fb_par *par;
++};
++
++static struct nt7506fb_proc_entry nt7506fb_proc_entries[] = {
++ { "white", GRAY_INDEX_WHITE, GRAY_LEVEL_WHITE },
++ { "light", GRAY_INDEX_LIGHT, GRAY_LEVEL_LIGHT },
++ { "dark", GRAY_INDEX_DARK, GRAY_LEVEL_DARK },
++ { "black", GRAY_INDEX_BLACK, GRAY_LEVEL_BLACK },
++};
++
++static int nt7506fb_proc_read(char *page, char **start, off_t off, int count,
++ int *eof, void *data)
++{
++ struct nt7506fb_proc_entry *entry = data;
++ int len;
++
++ len = sprintf(page, "%d\n", entry->level);
++
++ len -= off;
++ if ( len < count ) {
++ *eof = 1;
++ if ( len <= 0 )
++ return 0;
++ } else {
++ len = count;
++ }
++
++ *start = page + off;
++
++ return len;
++}
++
++
++static int nt7506fb_proc_write(struct file *file, const char *buf,
++ unsigned long count, void *data)
++{
++ struct nt7506fb_proc_entry *entry = data;
++ char lbuf[count+1];
++
++ /* Only root can do this */
++ if ( !capable(CAP_SYS_ADMIN) )
++ return -EACCES;
++
++ memset(lbuf, 0, sizeof(lbuf));
++
++ if (copy_from_user(lbuf, buf, count))
++ return -EFAULT;
++
++ if ( sscanf(lbuf, "%hhi", &entry->level) == 1 ) {
++ if ( entry->level > GRAY_LEVEL_MAX )
++ entry->level = GRAY_LEVEL_MAX;
++
++ /* Set grayscale palette entry */
++ nt7506fb_set_gray_level(entry->index, entry->level);
++ }
++ else {
++ printk(KERN_INFO DRIVER_NAME ": [%s] Syntax error in expression\n", entry->name);
++ return -EINVAL;
++ }
++
++ return count;
++}
++
++
++static int nt7506fb_proc_init(struct nt7506fb_par *par)
++{
++ struct proc_dir_entry *root;
++ struct proc_dir_entry *ent;
++ int i;
++
++ /* Create nt7506fb proc directory */
++ printk(KERN_INFO DRIVER_NAME ": Creating setup entries in /proc/" DRIVER_NAME "/\n");
++
++ root = proc_mkdir(DRIVER_NAME, NULL);
++ if ( root == NULL ) {
++ printk(KERN_WARNING DRIVER_NAME ": Cannot create directory /proc/" DRIVER_NAME "\n");
++ return -1;
++ }
++
++ root->owner = THIS_MODULE;
++
++ /* Create gray level entries */
++ for (i = 0; i < ARRAY_SIZE(nt7506fb_proc_entries); i++) {
++ struct nt7506fb_proc_entry *entry = &nt7506fb_proc_entries[i];
++
++ entry->par = par;
++
++ ent = create_proc_entry(entry->name, S_IFREG|S_IWUSR, root);
++ if ( ent == NULL ) {
++ printk(KERN_WARNING DRIVER_NAME ": Cannot create entry /proc/" DRIVER_NAME "/%s\n", entry->name);
++ return -1;
++ }
++
++ ent->owner = THIS_MODULE;
++ ent->data = entry;
++ ent->write_proc = nt7506fb_proc_write;
++ ent->read_proc = nt7506fb_proc_read;
++ }
++ return 0;
++}
+++ /dev/null
-Index: linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig
-===================================================================
---- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Kconfig 2008-10-10 00:13:53.000000000 +0200
-+++ linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig 2009-01-23 10:54:03.000000000 +0100
-@@ -104,6 +104,13 @@
-
- endif
-
-+
-+config WAKEUP_IT
-+ tristate "83xx interrupt for PM wakeup"
-+ help
-+ This enables a driver to be used as a wakeup source .
-+
-+
- # used for usb
- config PPC_MPC831x
- bool
-Index: linux-2.6.27/arch/powerpc/platforms/83xx/Makefile
-===================================================================
---- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Makefile 2008-10-10 00:13:53.000000000 +0200
-+++ linux-2.6.27/arch/powerpc/platforms/83xx/Makefile 2009-01-23 10:54:03.000000000 +0100
-@@ -14,3 +14,4 @@
- obj-$(CONFIG_SBC834x) += sbc834x.o
- obj-$(CONFIG_MPC837x_RDB) += mpc837x_rdb.o
- obj-$(CONFIG_ASP834x) += asp834x.o
-+obj-$(CONFIG_WAKEUP_IT) += wakeup-it.o
-Index: linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c 2009-01-23 10:49:09.000000000 +0100
-@@ -0,0 +1,163 @@
-+/*
-+ * This support a driver to be used as a wakeup source on the MPC8313.
-+ *
-+ * Copyright (c) 2008 Cenosys
-+ *
-+ * Alexandre Coffignal <alexandre.coffignal@censoys.com>
-+ * Sylvain Giroudon <sylvain.giroudon@goobie.fr>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/of_platform.h>
-+#include <linux/reboot.h>
-+#include <linux/irq.h>
-+
-+#include <sysdev/fsl_soc.h>
-+
-+#define DRIVER_NAME "wakeup-it"
-+
-+char suspend = 0;
-+
-+static char *wakeup_irq_ids[] = {
-+ "capsense",
-+ "rfid",
-+};
-+
-+struct wakeup_priv {
-+ int nirq;
-+ int irq[ARRAY_SIZE(wakeup_irq_ids)];
-+ spinlock_t lock;
-+};
-+
-+struct wakeup_irq_desc {
-+ char *name;
-+ int index;
-+};
-+
-+static irqreturn_t wakeup(int irq, void *dev_id)
-+{
-+ //printk(KERN_INFO "===== WAKEUP INTERRUPT %d !!\n", irq);
-+
-+// if ( suspend )
-+// kernel_restart(NULL);
-+ return IRQ_HANDLED ;
-+}
-+
-+
-+static void wakeup_free(struct wakeup_priv *priv)
-+{
-+ int i;
-+
-+ for (i = 0; i < priv->nirq; i++) {
-+ free_irq(priv->irq[i], priv);
-+ }
-+
-+ kfree(priv);
-+}
-+
-+
-+static int __devinit wakeup_probe(struct of_device *dev, const struct of_device_id *match)
-+{
-+ struct device_node *np = dev->node;
-+ struct resource res;
-+ int ret = 0;
-+ struct wakeup_priv *priv;
-+ int i;
-+
-+ priv = kmalloc(sizeof(struct wakeup_priv), GFP_KERNEL);
-+ if (!priv)
-+ return -ENOMEM;
-+
-+ priv->nirq = 0;
-+ spin_lock_init(&priv->lock);
-+ dev_set_drvdata(&dev->dev, priv);
-+
-+ ret = of_address_to_resource(np, 0, &res);
-+ if (ret)
-+ goto out;
-+
-+ for (i = 0; i < ARRAY_SIZE(wakeup_irq_ids); i++) {
-+ char *id = wakeup_irq_ids[i];
-+ char it_name[32];
-+ int it_num;
-+
-+ it_num = irq_of_parse_and_map(np, i);
-+ if ( it_num == NO_IRQ ) {
-+ dev_err(&dev->dev, DRIVER_NAME ": interrupt #%d (%s) does not exist in device tree.\n", i, id);
-+ ret = -ENODEV;
-+ goto out;
-+ }
-+
-+ set_irq_type(it_num, IRQ_TYPE_EDGE_FALLING);
-+
-+ snprintf(it_name, sizeof(it_name), DRIVER_NAME ":%s", id);
-+
-+ ret = request_irq(it_num, wakeup, 0, it_name, priv);
-+ if ( ret ) {
-+ printk(KERN_WARNING DRIVER_NAME ": cannot request interrupt %d (%s)\n", it_num, id);
-+ goto out;
-+ }
-+
-+ printk(KERN_INFO DRIVER_NAME ": accepting wakeup event from %s (%d)\n", id, it_num);
-+
-+ priv->irq[priv->nirq++] = it_num;
-+ }
-+
-+ return 0;
-+
-+out:
-+ wakeup_free(priv);
-+ return ret;
-+}
-+
-+static int __devexit wakeup_remove(struct of_device *dev)
-+{
-+ struct wakeup_priv *priv = dev_get_drvdata(&dev->dev);
-+ wakeup_free(priv);
-+ return 0;
-+}
-+
-+static struct of_device_id wakeup_match[] = {
-+ {
-+ .compatible = "fsl,wakeup-it",
-+ },
-+ {},
-+};
-+
-+static int wakeup_suspend(struct of_device * dev, pm_message_t state)
-+{
-+ int ret = 0;
-+ printk(KERN_INFO DRIVER_NAME ": suspend\n");
-+ suspend=1;
-+ return ret;
-+}
-+
-+
-+static struct of_platform_driver wakeup_driver = {
-+ .name = DRIVER_NAME,
-+ .match_table = wakeup_match,
-+ .probe = wakeup_probe,
-+ .suspend = wakeup_suspend,
-+ .remove = __devexit_p(wakeup_remove)
-+
-+};
-+
-+static int __init wakeup_init(void)
-+{
-+ return of_register_platform_driver(&wakeup_driver);
-+}
-+
-+static void __exit wakeup_exit(void)
-+{
-+ of_unregister_platform_driver(&wakeup_driver);
-+}
-+
-+module_init(wakeup_init);
-+module_exit(wakeup_exit);