diff options
author | Jeremy Lainé <jeremy.laine@m4x.org> | 2009-02-26 13:11:08 +0100 |
---|---|---|
committer | Michael 'Mickey' Lauer <mickey@vanille-media.de> | 2009-02-27 14:11:35 +0100 |
commit | f1d4b0b58acecef4033fbc309d7ff0187930f77c (patch) | |
tree | e58952b4839eb146f6d790efdac96d0e21803d8b | |
parent | b6ccea256e20f1efdd5635fb52a815fd9e3bd771 (diff) |
linux-2.6.27: improve boc01 EEPROM support
-rw-r--r-- | packages/linux/linux-2.6.27/boc01/005-090217-isl12024.patch (renamed from packages/linux/linux-2.6.27/boc01/005-090112-isl12024.patch) | 325 | ||||
-rw-r--r-- | packages/linux/linux-2.6.27/boc01/boc01.dts | 7 | ||||
-rw-r--r-- | packages/linux/linux-2.6.27/boc01/defconfig | 31 | ||||
-rw-r--r-- | packages/linux/linux_2.6.27.bb | 4 |
4 files changed, 31 insertions, 336 deletions
diff --git a/packages/linux/linux-2.6.27/boc01/005-090112-isl12024.patch b/packages/linux/linux-2.6.27/boc01/005-090217-isl12024.patch index 32bde9dfc8..672e405de0 100644 --- a/packages/linux/linux-2.6.27/boc01/005-090112-isl12024.patch +++ b/packages/linux/linux-2.6.27/boc01/005-090217-isl12024.patch @@ -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 */ diff --git a/packages/linux/linux-2.6.27/boc01/boc01.dts b/packages/linux/linux-2.6.27/boc01/boc01.dts index fec7c85673..ffc27abb31 100644 --- a/packages/linux/linux-2.6.27/boc01/boc01.dts +++ b/packages/linux/linux-2.6.27/boc01/boc01.dts @@ -132,6 +132,10 @@ compatible = "at24,24c32"; reg = <0x50>; }; + at24@57 { + compatible = "at24,isl12024"; + reg = <0x57>; + }; }; crypto@30000 { @@ -184,7 +188,6 @@ mdio@24520 { #address-cells = <1>; #size-cells = <0>; - compatible = "fsl,gianfar-mdio"; reg = <0x24520 0x20>; phy4: ethernet-phy@4 { interrupt-parent = <&ipic>; @@ -252,7 +255,7 @@ 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>; }; diff --git a/packages/linux/linux-2.6.27/boc01/defconfig b/packages/linux/linux-2.6.27/boc01/defconfig index f302f0747d..bb667bcd10 100644 --- a/packages/linux/linux-2.6.27/boc01/defconfig +++ b/packages/linux/linux-2.6.27/boc01/defconfig @@ -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 # diff --git a/packages/linux/linux_2.6.27.bb b/packages/linux/linux_2.6.27.bb index 0a2055e58e..0b219ec705 100644 --- a/packages/linux/linux_2.6.27.bb +++ b/packages/linux/linux_2.6.27.bb @@ -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 \ |