linux-2.6.27: improve boc01 EEPROM support
authorJeremy Lainé <jeremy.laine@m4x.org>
Thu, 26 Feb 2009 12:11:08 +0000 (13:11 +0100)
committerJeremy Lainé <jeremy.laine@m4x.org>
Thu, 26 Feb 2009 12:11:08 +0000 (13:11 +0100)
packages/linux/linux-2.6.27/boc01/005-090217-isl12024.patch [moved from packages/linux/linux-2.6.27/boc01/005-090112-isl12024.patch with 69% similarity]
packages/linux/linux-2.6.27/boc01/boc01.dts
packages/linux/linux-2.6.27/boc01/defconfig
packages/linux/linux_2.6.27.bb

@@ -1,295 +1,3 @@
-Index: linux-2.6.27/drivers/i2c/chips/isl12024-eeprom.c
-===================================================================
---- /dev/null
-+++ linux-2.6.27/drivers/i2c/chips/isl12024-eeprom.c
-@@ -0,0 +1,254 @@
-+/*
-+ * Intersil ISL12024 EEPROM class driver
-+ *
-+ *
-+ * Copyright (C) 2007, CenoSYS (www.cenosys.com).
-+ * Guillaume Ligneul
-+ * Guillaume.ligneul@gmail.com
-+ *
-+ * Code is based on eeprom.c
-+ *
-+ * This software program is licensed subject to the GNU General Public License
-+ * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+//#include <linux/slab.h>
-+//#include <linux/jiffies.h>
-+#include <linux/i2c.h>
-+#include <linux/mutex.h>
-+#include <linux/i2c/isl12024.h>
-+
-+/* Addresses to scan */
-+static const unsigned short normal_i2c[] = { ISL12024_I2C_EEPROM_ADDR, I2C_CLIENT_END };
-+
-+/* Insmod parameters */
-+I2C_CLIENT_INSMOD_1(eeprom);
-+
-+
-+/* Size of EEPROM in bytes */
-+#define EEPROM_SIZE           4096
-+
-+/* Each client has this additional data */
-+struct eeprom_data {
-+      struct i2c_client client;
-+      struct mutex update_lock;
-+};
-+
-+int
-+isl12024_i2c_read(struct i2c_client *client, u8 reg, u8 buf[],
-+                     unsigned len)
-+{
-+      int ret;
-+      u8  dt_addr[2];
-+
-+      struct i2c_msg msgs[2] = {
-+                      {
-+                                      .addr   = client->addr,
-+                                      .flags  = 0,
-+                                      .len    = 2,
-+                                      .buf    = dt_addr,
-+                      },
-+                      {
-+                                      .addr   = client->addr,
-+                                      .flags  = I2C_M_RD,
-+                                      .len    = len ,
-+                                      .buf    = buf ,
-+                      },
-+      };
-+
-+      dt_addr[0] = 0;
-+      dt_addr[1] = reg;
-+
-+      ret = i2c_transfer(client->adapter, msgs, 2);
-+      if ( ret < 0) {
-+              dev_err(&client->dev, "read error\n");
-+              return -EIO;
-+      }
-+      return ret;
-+}
-+
-+
-+int
-+isl12024_i2c_write(struct i2c_client *client, u8 reg, u8 const buf[],
-+                     unsigned len)
-+{
-+      int ret;
-+      u8 i2c_buf[EEPROM_SIZE];
-+
-+      struct i2c_msg msgs[1] = {
-+                      {
-+                              .addr   = client->addr,
-+                              .flags  = 0,
-+                              .len    = len+2,
-+                              .buf    = i2c_buf,
-+                       },
-+              };
-+
-+      i2c_buf[0] = 0;
-+      i2c_buf[1] = reg;
-+
-+
-+      memcpy(&i2c_buf[2], &buf[0], len );
-+
-+
-+      ret = i2c_transfer(client->adapter, msgs, 1);
-+      printk(KERN_INFO "i2c_transfer %d\n",ret);
-+      return ret;
-+}
-+static int eeprom_attach_adapter(struct i2c_adapter *adapter);
-+static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind);
-+static int eeprom_detach_client(struct i2c_client *client);
-+
-+/* This is the driver that will be inserted */
-+static struct i2c_driver eeprom_driver = {
-+      .driver = {
-+              .name   = "isl12024-eeprom",
-+      },
-+      .attach_adapter = eeprom_attach_adapter,
-+      .detach_client  = eeprom_detach_client,
-+};
-+
-+static ssize_t eeprom_read(struct kobject *kobj, struct bin_attribute *bin_attr,
-+                         char *buf, loff_t off, size_t count)
-+{
-+      struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
-+      struct eeprom_data *data = i2c_get_clientdata(client);
-+      int rc;
-+
-+      mutex_lock(&data->update_lock);
-+
-+      if (off >= EEPROM_SIZE)
-+              return 0;
-+
-+      if (off + count > EEPROM_SIZE)
-+              count = EEPROM_SIZE - off;
-+
-+      rc = isl12024_i2c_read(client,0,buf,EEPROM_SIZE);
-+
-+      if (rc < 0){
-+              mutex_unlock(&data->update_lock);
-+              return -EIO;
-+      }
-+
-+      mutex_unlock(&data->update_lock);
-+      return count;
-+}
-+
-+static ssize_t eeprom_write(struct kobject *kobj, struct bin_attribute *attr,
-+                                 char *buf, loff_t off, size_t count)
-+{
-+      struct i2c_client *client = kobj_to_i2c_client(kobj);
-+      struct eeprom_data *data = i2c_get_clientdata(client);
-+
-+      if (off >= 256)
-+              return -ENOSPC;
-+
-+      if (off + count > 256)
-+              count = 256 - off;
-+
-+      mutex_unlock(&data->update_lock);
-+      if (isl12024_i2c_write(client, off, buf, count) < 0)
-+      {
-+              mutex_unlock(&data->update_lock);
-+              return -EIO;
-+      }
-+
-+      mutex_unlock(&data->update_lock);
-+      return count;
-+}
-+
-+static struct bin_attribute eeprom_attr = {
-+      .attr = {
-+              .name = "eeprom",
-+              .mode = S_IRUGO,
-+      },
-+      .size = EEPROM_SIZE,
-+      .read = eeprom_read,
-+      .write= eeprom_write,
-+};
-+
-+static int eeprom_attach_adapter(struct i2c_adapter *adapter)
-+{
-+      return i2c_probe(adapter, &addr_data, eeprom_detect);
-+}
-+
-+/* This function is called by i2c_probe */
-+static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
-+{
-+      struct i2c_client *new_client;
-+      struct eeprom_data *data;
-+      int err = 0;
-+
-+      if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA
-+                                          | I2C_FUNC_SMBUS_BYTE))
-+              goto exit;
-+
-+      if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) {
-+              err = -ENOMEM;
-+              goto exit;
-+      }
-+
-+      new_client = &data->client;
-+      i2c_set_clientdata(new_client, data);
-+      new_client->addr = address;
-+      new_client->adapter = adapter;
-+      new_client->driver = &eeprom_driver;
-+      new_client->flags = 0;
-+
-+      strlcpy(new_client->name, "isl12024-eeprom", I2C_NAME_SIZE);
-+      mutex_init(&data->update_lock);
-+
-+      /* Tell the I2C layer a new client has arrived */
-+      if ((err = i2c_attach_client(new_client)))
-+              goto exit_kfree;
-+
-+      /* create the sysfs eeprom file */
-+      err = sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
-+      if (err)
-+              goto exit_detach;
-+
-+      return 0;
-+
-+exit_detach:
-+      i2c_detach_client(new_client);
-+exit_kfree:
-+      kfree(data);
-+exit:
-+      return err;
-+}
-+
-+static int eeprom_detach_client(struct i2c_client *client)
-+{
-+      int err;
-+
-+      sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr);
-+
-+      err = i2c_detach_client(client);
-+      if (err)
-+              return err;
-+
-+      kfree(i2c_get_clientdata(client));
-+
-+      return 0;
-+}
-+
-+static int __init eeprom_init(void)
-+{
-+      return i2c_add_driver(&eeprom_driver);
-+}
-+
-+static void __exit eeprom_exit(void)
-+{
-+      i2c_del_driver(&eeprom_driver);
-+}
-+
-+
-+MODULE_AUTHOR("Guillaume Ligneul <guillaume.ligneul@cenosys.com>");
-+MODULE_DESCRIPTION("I2C Intersil12024 EEPROM driver");
-+MODULE_LICENSE("GPL");
-+
-+module_init(eeprom_init);
-+module_exit(eeprom_exit);
-Index: linux-2.6.27/drivers/i2c/chips/Kconfig
-===================================================================
---- linux-2.6.27.orig/drivers/i2c/chips/Kconfig
-+++ linux-2.6.27/drivers/i2c/chips/Kconfig
-@@ -40,6 +40,15 @@ config AT24
-         This driver can also be built as a module.  If so, the module
-         will be called at24.
-+config ISL12024EEPROM
-+      tristate "Intersil 12024 EEPROM"
-+      depends on RTC_DRV_ISL12024
-+      help
-+        If you say yes here you get support for Intersil12024 EEPROM.
-+
-+        This driver can also be built as a module.  If so, the module
-+        will be called isl12024-eeprom.
-+
- config SENSORS_EEPROM
-       tristate "EEPROM reader"
-       depends on EXPERIMENTAL
-Index: linux-2.6.27/drivers/i2c/chips/Makefile
-===================================================================
---- linux-2.6.27.orig/drivers/i2c/chips/Makefile
-+++ linux-2.6.27/drivers/i2c/chips/Makefile
-@@ -9,6 +9,8 @@
- # * I/O expander drivers go to drivers/gpio
- #
-+
-+obj-$(CONFIG_ISL12024EEPROM)          += isl12024-eeprom.o
- obj-$(CONFIG_DS1682)          += ds1682.o
- obj-$(CONFIG_AT24)            += at24.o
- obj-$(CONFIG_SENSORS_EEPROM)  += eeprom.o
 Index: linux-2.6.27/drivers/rtc/Kconfig
 ===================================================================
 --- linux-2.6.27.orig/drivers/rtc/Kconfig
@@ -323,7 +31,7 @@ Index: linux-2.6.27/drivers/rtc/rtc-isl12024.c
 ===================================================================
 --- /dev/null
 +++ linux-2.6.27/drivers/rtc/rtc-isl12024.c
-@@ -0,0 +1,516 @@
+@@ -0,0 +1,517 @@
 +/*
 + * Intersil ISL12024 class driver
 + *
@@ -341,9 +49,10 @@ Index: linux-2.6.27/drivers/rtc/rtc-isl12024.c
 +#include <linux/bcd.h>
 +#include <linux/rtc.h>
 +#include <linux/proc_fs.h>
-+#include <linux/i2c/isl12024.h>
 +#include <linux/delay.h>
 +
++#include "isl12024.h"
++
 +
 +#define DBG 1
 +#undef DBG
@@ -840,11 +549,24 @@ Index: linux-2.6.27/drivers/rtc/rtc-isl12024.c
 +
 +module_init(isl12024_init);
 +module_exit(isl12024_exit);
-Index: linux-2.6.27/include/linux/i2c/isl12024.h
+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/include/linux/i2c/isl12024.h
-@@ -0,0 +1,103 @@
++++ linux-2.6.27/drivers/rtc/isl12024.h
+@@ -0,0 +1,100 @@
 +/*
 + * Intersil ISL12024 chip registers definitions
 + *
@@ -905,17 +627,16 @@ Index: linux-2.6.27/include/linux/i2c/isl12024.h
 +#define ISL12024_HR_MIL               0x80    /* Set in ccr.hour for 24 hr mode */
 +
 +#define ISL12024_INT_AL0E             0x20    /* Alarm 0 enable */
++
 +/* I2C ADDRESS */
 +#define ISL12024_I2C_ADDR 0xDE
 +#define ISL12024_I2C_EEPROM_ADDR 0x57
++
 +/* device id section */
 +#define ISL12024_REG_ID 0x20
++
 +/* Register map */
 +/* rtc section */
-+//#define ISL12024_REG_MSB 0x00
-+//#define ISL12024_REG_SC  0x30 /* Seconds */
-+//#define ISL12024_REG_MN  0x31 /* Minutes */
-+//#define ISL12024_REG_HR  0x32 /* Hours */
 +#define ISL12024_REG_HR_MIL     (1<<7) /* 24h/12h mode */
 +#define ISL12024_REG_HR_PM      (1<<5) /* PM/AM bit in 12h mode */
 +//#define ISL12024_REG_DT  0x33  /* Date */
@@ -925,8 +646,6 @@ Index: linux-2.6.27/include/linux/i2c/isl12024.h
 +//#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 */
index fec7c85..ffc27ab 100644 (file)
                                        compatible = "at24,24c32";
                                        reg = <0x50>;
                                };
+                               at24@57 {
+                                       compatible = "at24,isl12024";
+                                       reg = <0x57>;
+                               };
                        };
 
                        crypto@30000 {
                mdio@24520 {
                        #address-cells = <1>;
                        #size-cells = <0>;
-                       compatible = "fsl,gianfar-mdio";
                        reg = <0x24520 0x20>;
                        phy4: ethernet-phy@4 {
                                interrupt-parent = <&ipic>;
                gtm1: timer@500 {
                        compatible = "fsl,mpc8313-gtm", "fsl,gtm";
                        reg = <0x500 0x100>;
-                       interrupts = <90 8 78 8 84 8 72 8>;
+                       interrupts = <72 8 78 8 84 8 90 8>;
                        interrupt-parent = <&ipic>;
                };
 
index f302f07..bb667bc 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.27
-# Fri Jan 16 19:05:52 2009
+# Thu Feb 26 12:59:36 2009
 #
 # CONFIG_PPC64 is not set
 
@@ -40,7 +40,6 @@ CONFIG_ARCH_HAS_ILOG2_U32=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
 # CONFIG_ARCH_NO_VIRT_TO_BUS is not set
 CONFIG_PPC=y
 CONFIG_EARLY_PRINTK=y
@@ -264,7 +263,6 @@ CONFIG_GENERIC_ISA_DMA=y
 CONFIG_PPC_INDIRECT_PCI=y
 CONFIG_FSL_SOC=y
 CONFIG_FSL_PCI=y
-CONFIG_FSL_LBC=y
 CONFIG_PPC_PCI_CHOICE=y
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
@@ -734,7 +732,6 @@ CONFIG_MTD_NAND_IDS=y
 # CONFIG_MTD_NAND_PLATFORM is not set
 # CONFIG_MTD_ALAUDA is not set
 CONFIG_MTD_NAND_FSL_ELBC=y
-CONFIG_MTD_NAND_FSL_UPM=y
 # CONFIG_MTD_ONENAND is not set
 
 #
@@ -742,7 +739,6 @@ CONFIG_MTD_NAND_FSL_UPM=y
 #
 # CONFIG_MTD_UBI is not set
 CONFIG_OF_DEVICE=y
-CONFIG_OF_GPIO=y
 CONFIG_OF_I2C=y
 CONFIG_OF_SPI=y
 # CONFIG_PARPORT is not set
@@ -1091,7 +1087,6 @@ CONFIG_I2C_HELPER_AUTO=y
 #
 # I2C system bus drivers (mostly embedded / system-on-chip)
 #
-# CONFIG_I2C_GPIO is not set
 CONFIG_I2C_MPC=y
 # CONFIG_I2C_OCORES is not set
 # CONFIG_I2C_SIMTEC is not set
@@ -1119,13 +1114,11 @@ CONFIG_I2C_MPC=y
 #
 # CONFIG_DS1682 is not set
 CONFIG_AT24=y
-CONFIG_ISL12024EEPROM=y
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_PCF8575 is not set
 # CONFIG_SENSORS_PCA9539 is not set
 # CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_TPS65010 is not set
 # CONFIG_SENSORS_MAX6875 is not set
 # CONFIG_SENSORS_TSL2550 is not set
 # CONFIG_I2C_DEBUG_CORE is not set
@@ -1148,26 +1141,7 @@ CONFIG_SPI_MPC83xx=y
 CONFIG_SPI_SPIDEV=y
 # CONFIG_SPI_TLE62X0 is not set
 CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
-CONFIG_GPIOLIB=y
-CONFIG_GPIO_SYSFS=y
-
-#
-# I2C GPIO expanders:
-#
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-
-#
-# PCI GPIO expanders:
-#
-# CONFIG_GPIO_BT8XX is not set
-
-#
-# SPI GPIO expanders:
-#
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MCP23S08 is not set
+# CONFIG_GPIOLIB is not set
 # CONFIG_W1 is not set
 CONFIG_POWER_SUPPLY=y
 CONFIG_POWER_SUPPLY_DEBUG=y
@@ -1528,7 +1502,6 @@ CONFIG_LEDS_CLASS=y
 # LED drivers
 #
 # CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_GPIO is not set
 # CONFIG_LEDS_PCA955X is not set
 
 #
index 0a2055e..0b219ec 100644 (file)
@@ -1,6 +1,6 @@
 require linux.inc
 
-PR = "r5"
+PR = "r6"
 
 # Mark archs/machines that this kernel supports
 DEFAULT_PREFERENCE = "-1"
@@ -15,7 +15,7 @@ SRC_URI_append_boc01 = "\
        file://boc01.dts \
        file://001-090114-sqn11x0-usb-hack.patch;patch=1 \
        file://004-081205-usb.patch;patch=1 \
-       file://005-090112-isl12024.patch;patch=1 \
+       file://005-090217-isl12024.patch;patch=1 \
        file://007-081217-lm73.patch;patch=1 \
        file://008-081208-spi.patch;patch=1 \
        file://010-090112-mii.patch;patch=1 \