summaryrefslogtreecommitdiffstats
path: root/target/linux/ixp4xx
diff options
context:
space:
mode:
authorkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-11-30 18:12:21 +0000
committerkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-11-30 18:12:21 +0000
commitff53a4a17c5acfa705b127ac02e2a4d70e3ff6fe (patch)
tree563182b88f9ca8f00b1ee32673fd1a94044e650f /target/linux/ixp4xx
parent3bedd206ff99279034442b09b5d1fb00f1cc6cb0 (diff)
migrate gateworks board support to the new at24 eeprom driver
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13450 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ixp4xx')
-rw-r--r--target/linux/ixp4xx/config-2.6.274
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/010-ixp43x_pci_fixup.patch11
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/190-cambria_support.patch262
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/191-cambria_optional_uart.patch12
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/192-cambria_gpio_device.patch9
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/294-eeprom_new_notifier.patch183
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/296-avila_mac_plat_info.patch43
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/300-avila_fetch_mac.patch133
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/301-avila_led.patch17
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/302-avila_gpio_device.patch2
-rw-r--r--target/linux/ixp4xx/patches-2.6.27/303-avila_gw23x7_phy_quirk.patch4
11 files changed, 227 insertions, 453 deletions
diff --git a/target/linux/ixp4xx/config-2.6.27 b/target/linux/ixp4xx/config-2.6.27
index a73f35faa..faf24a3e6 100644
--- a/target/linux/ixp4xx/config-2.6.27
+++ b/target/linux/ixp4xx/config-2.6.27
@@ -55,7 +55,7 @@ CONFIG_ARM=y
# CONFIG_ARM_THUMB is not set
# CONFIG_ARPD is not set
# CONFIG_ARTHUR is not set
-# CONFIG_AT24 is not set
+CONFIG_AT24=y
CONFIG_ATA=m
# CONFIG_ATA_NONSTANDARD is not set
# CONFIG_ATA_PIIX is not set
@@ -297,7 +297,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_SCSI_WAIT_SCAN=m
# CONFIG_SENSORS_AD7414 is not set
CONFIG_SENSORS_AD7418=y
-CONFIG_SENSORS_EEPROM=y
+# CONFIG_SENSORS_EEPROM is not set
CONFIG_SENSORS_MAX6650=y
# CONFIG_SENSORS_PC87360 is not set
CONFIG_SENSORS_W83781D=y
diff --git a/target/linux/ixp4xx/patches-2.6.27/010-ixp43x_pci_fixup.patch b/target/linux/ixp4xx/patches-2.6.27/010-ixp43x_pci_fixup.patch
new file mode 100644
index 000000000..35af7f4fa
--- /dev/null
+++ b/target/linux/ixp4xx/patches-2.6.27/010-ixp43x_pci_fixup.patch
@@ -0,0 +1,11 @@
+--- a/arch/arm/mach-ixp4xx/include/mach/hardware.h
++++ b/arch/arm/mach-ixp4xx/include/mach/hardware.h
+@@ -18,7 +18,7 @@
+ #define __ASM_ARCH_HARDWARE_H__
+
+ #define PCIBIOS_MIN_IO 0x00001000
+-#define PCIBIOS_MIN_MEM (cpu_is_ixp43x() ? 0x40000000 : 0x48000000)
++#define PCIBIOS_MIN_MEM 0x48000000
+
+ /*
+ * We override the standard dma-mask routines for bouncing.
diff --git a/target/linux/ixp4xx/patches-2.6.27/190-cambria_support.patch b/target/linux/ixp4xx/patches-2.6.27/190-cambria_support.patch
index 2089fe270..87bfd09a4 100644
--- a/target/linux/ixp4xx/patches-2.6.27/190-cambria_support.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/190-cambria_support.patch
@@ -1,47 +1,3 @@
---- a/arch/arm/mach-ixp4xx/Kconfig
-+++ b/arch/arm/mach-ixp4xx/Kconfig
-@@ -25,6 +25,14 @@ config MACH_AVILA
- Avila Network Platform. For more information on this platform,
- see <file:Documentation/arm/IXP4xx>.
-
-+config MACH_CAMBRIA
-+ bool "Cambria"
-+ select PCI
-+ help
-+ Say 'Y' here if you want your kernel to support the Gateworks
-+ Cambria series. For more information on this platform,
-+ see <file:Documentation/arm/IXP4xx>.
-+
- config MACH_LOFT
- bool "Loft"
- depends on MACH_AVILA
-@@ -208,7 +216,7 @@ config CPU_IXP46X
-
- config CPU_IXP43X
- bool
-- depends on MACH_KIXRP435
-+ depends on MACH_KIXRP435 || MACH_CAMBRIA
- default y
-
- config MACH_GTWX5715
---- a/arch/arm/mach-ixp4xx/Makefile
-+++ b/arch/arm/mach-ixp4xx/Makefile
-@@ -7,6 +7,7 @@ obj-pci-n :=
-
- obj-pci-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o
- obj-pci-$(CONFIG_MACH_AVILA) += avila-pci.o
-+obj-pci-$(CONFIG_MACH_CAMBRIA) += cambria-pci.o
- obj-pci-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o
- obj-pci-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o
- obj-pci-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o
-@@ -28,6 +29,7 @@ obj-y += common.o
-
- obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o
- obj-$(CONFIG_MACH_AVILA) += avila-setup.o
-+obj-$(CONFIG_MACH_CAMBRIA) += cambria-setup.o
- obj-$(CONFIG_MACH_IXDPG425) += coyote-setup.o
- obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-setup.o
- obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-setup.o
--- /dev/null
+++ b/arch/arm/mach-ixp4xx/cambria-pci.c
@@ -0,0 +1,74 @@
@@ -121,49 +77,47 @@
+subsys_initcall(cambria_pci_init);
--- /dev/null
+++ b/arch/arm/mach-ixp4xx/cambria-setup.c
-@@ -0,0 +1,444 @@
+@@ -0,0 +1,429 @@
+/*
+ * arch/arm/mach-ixp4xx/cambria-setup.c
+ *
+ * Board setup for the Gateworks Cambria series
+ *
-+ * Copyright (C) 2008 Imre Kaloz <Kaloz@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ * based on coyote-setup.c:
+ * Copyright (C) 2003-2005 MontaVista Software, Inc.
+ *
-+ * Author: Imre Kaloz <Kaloz@openwrt.org>
++ * Author: Imre Kaloz <kaloz@openwrt.org>
+ */
+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
+#include <linux/device.h>
++#include <linux/i2c.h>
++#include <linux/i2c-gpio.h>
++#include <linux/i2c/at24.h>
+#include <linux/if_ether.h>
-+#include <linux/socket.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/leds.h>
++#include <linux/memory.h>
+#include <linux/netdevice.h>
+#include <linux/serial.h>
-+#include <linux/tty.h>
+#include <linux/serial_8250.h>
+#include <linux/slab.h>
-+#ifdef CONFIG_SENSORS_EEPROM
-+# include <linux/i2c.h>
-+# include <linux/eeprom.h>
-+#endif
++#include <linux/socket.h>
++#include <linux/types.h>
++#include <linux/tty.h>
+
-+#include <linux/leds.h>
-+#include <linux/i2c-gpio.h>
-+#include <asm/types.h>
-+#include <asm/setup.h>
-+#include <asm/memory.h>
+#include <mach/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
++#include <asm/setup.h>
+
+struct cambria_board_info {
+ unsigned char *model;
-+ void (* setup)(void);
++ void (*setup)(void);
+};
+
+static struct cambria_board_info *cambria_info __initdata;
@@ -200,6 +154,30 @@
+ },
+};
+
++static struct eth_plat_info cambria_npec_data = {
++ .phy = 1,
++ .rxq = 4,
++ .txreadyq = 21,
++};
++
++static struct eth_plat_info cambria_npea_data = {
++ .phy = 2,
++ .rxq = 2,
++ .txreadyq = 19,
++};
++
++static struct platform_device cambria_npec_device = {
++ .name = "ixp4xx_eth",
++ .id = IXP4XX_ETH_NPEC,
++ .dev.platform_data = &cambria_npec_data,
++};
++
++static struct platform_device cambria_npea_device = {
++ .name = "ixp4xx_eth",
++ .id = IXP4XX_ETH_NPEA,
++ .dev.platform_data = &cambria_npea_data,
++};
++
+static struct resource cambria_uart_resource = {
+ .start = IXP4XX_UART1_BASE_PHYS,
+ .end = IXP4XX_UART1_BASE_PHYS + 0x0fff,
@@ -257,30 +235,6 @@
+ .resource = cambria_pata_resources,
+};
+
-+static struct eth_plat_info cambria_npec_data = {
-+ .phy = 1,
-+ .rxq = 4,
-+ .txreadyq = 21,
-+};
-+
-+static struct eth_plat_info cambria_npea_data = {
-+ .phy = 2,
-+ .rxq = 2,
-+ .txreadyq = 19,
-+};
-+
-+static struct platform_device cambria_npec_device = {
-+ .name = "ixp4xx_eth",
-+ .id = IXP4XX_ETH_NPEC,
-+ .dev.platform_data = &cambria_npec_data,
-+};
-+
-+static struct platform_device cambria_npea_device = {
-+ .name = "ixp4xx_eth",
-+ .id = IXP4XX_ETH_NPEA,
-+ .dev.platform_data = &cambria_npea_data,
-+};
-+
+static struct gpio_led cambria_gpio_leds[] = {
+ {
+ .name = "user", /* green led */
@@ -300,7 +254,6 @@
+ .dev.platform_data = &cambria_gpio_leds_data,
+};
+
-+
+static struct latch_led cambria_latch_leds[] = {
+ {
+ .name = "ledA", /* green led */
@@ -408,7 +361,6 @@
+ platform_device_register(&cambria_npea_device);
+}
+
-+#ifdef CONFIG_SENSORS_EEPROM
+static void __init cambria_gw2350_setup(void)
+{
+ platform_device_register(&cambria_npec_device);
@@ -449,66 +401,57 @@
+
+ for (i = 0; i < ARRAY_SIZE(cambria_boards); i++) {
+ struct cambria_board_info *info = &cambria_boards[i];
-+ if (strncmp(info->model, model, strlen(info->model)) == 0)
++ if (strcmp(info->model, model) == 0)
+ return info;
+ }
+
+ return NULL;
+}
+
-+struct cambria_eeprom_header {
-+ unsigned char mac0[ETH_ALEN];
-+ unsigned char mac1[ETH_ALEN];
-+ unsigned char res0[4];
-+ unsigned char magic[2];
-+ unsigned char config[14];
-+ unsigned char model[16];
-+};
++static struct at24_iface *at24_if;
+
-+static int __init cambria_eeprom_notify(struct notifier_block *self,
-+ unsigned long event, void *t)
++static int at24_setup(struct at24_iface *iface, void *context)
+{
-+ struct eeprom_data *ee = t;
-+ struct cambria_eeprom_header hdr;
-+
-+ if (cambria_info)
-+ return NOTIFY_DONE;
-+
-+ /* The eeprom is at address 0x51 */
-+ if (event != EEPROM_REGISTER || ee->client.addr != 0x51)
-+ return NOTIFY_DONE;
++ char mac_addr[ETH_ALEN];
++ char model[6];
+
-+ ee->attr->read(&ee->client.dev.kobj, ee->attr, (char *)&hdr,
-+ 0, sizeof(hdr));
++ at24_if = iface;
+
-+ if (hdr.magic[0] != 'G' || hdr.magic[1] != 'W')
-+ return NOTIFY_DONE;
-+
-+ memcpy(&cambria_npec_data.hwaddr, hdr.mac0, ETH_ALEN);
-+ memcpy(&cambria_npea_data.hwaddr, hdr.mac1, ETH_ALEN);
++ /* Read MAC addresses */
++ if (at24_if->read(at24_if, mac_addr, 0x0, 6) == 6) {
++ memcpy(&cambria_npec_data.hwaddr, mac_addr, ETH_ALEN);
++ }
++ if (at24_if->read(at24_if, mac_addr, 0x6, 6) == 6) {
++ memcpy(&cambria_npea_data.hwaddr, mac_addr, ETH_ALEN);
++ }
+
-+ cambria_info = cambria_find_board_info(hdr.model);
++ /* Read the first 6 bytes of the model number */
++ if (at24_if->read(at24_if, model, 0x20, 6) == 6) {
++ cambria_info = cambria_find_board_info(model);
++ }
+
-+ return NOTIFY_OK;
++ return 0;
+}
+
-+static struct notifier_block cambria_eeprom_notifier __initdata = {
-+ .notifier_call = cambria_eeprom_notify
++static struct at24_platform_data cambria_eeprom_info = {
++ .byte_len = 1024,
++ .page_size = 16,
++ .flags = AT24_FLAG_READONLY,
++ .setup = at24_setup,
+};
+
-+static void __init cambria_register_eeprom_notifier(void)
-+{
-+ register_eeprom_notifier(&cambria_eeprom_notifier);
-+}
-+
-+static void __init cambria_unregister_eeprom_notifier(void)
-+{
-+ unregister_eeprom_notifier(&cambria_eeprom_notifier);
-+}
-+#else /* CONFIG_SENSORS_EEPROM */
-+static inline void cambria_register_eeprom_notifier(void) {};
-+static inline void cambria_unregister_eeprom_notifier(void) {};
-+#endif /* CONFIG_SENSORS_EEPROM */
++static struct i2c_board_info __initdata cambria_i2c_board_info[] = {
++/* {
++ I2C_BOARD_INFO("rtc-ds1672", 0x68),
++ },*/
++ {
++ I2C_BOARD_INFO("ad7418", 0x28),
++ },
++ {
++ I2C_BOARD_INFO("24c08", 0x51),
++ .platform_data = &cambria_eeprom_info
++ },
++};
+
+static void __init cambria_init(void)
+{
@@ -531,7 +474,8 @@
+ cambria_pata_data.cs0_cfg = IXP4XX_EXP_CS3;
+ cambria_pata_data.cs1_cfg = IXP4XX_EXP_CS3;
+
-+ cambria_register_eeprom_notifier();
++ i2c_register_board_info(0, cambria_i2c_board_info,
++ ARRAY_SIZE(cambria_i2c_board_info));
+}
+
+static int __init cambria_model_setup(void)
@@ -549,12 +493,10 @@
+ cambria_gw23xx_setup();
+ }
+
-+ cambria_unregister_eeprom_notifier();
+ return 0;
+}
+late_initcall(cambria_model_setup);
+
-+#ifdef CONFIG_MACH_CAMBRIA
+MACHINE_START(CAMBRIA, "Gateworks Cambria series")
+ /* Maintainer: Imre Kaloz <kaloz@openwrt.org> */
+ .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
@@ -565,15 +507,47 @@
+ .boot_params = 0x0100,
+ .init_machine = cambria_init,
+MACHINE_END
-+#endif
---- a/arch/arm/mach-ixp4xx/include/mach/hardware.h
-+++ b/arch/arm/mach-ixp4xx/include/mach/hardware.h
-@@ -18,7 +18,7 @@
- #define __ASM_ARCH_HARDWARE_H__
+--- a/arch/arm/mach-ixp4xx/Kconfig
++++ b/arch/arm/mach-ixp4xx/Kconfig
+@@ -25,6 +25,14 @@ config MACH_AVILA
+ Avila Network Platform. For more information on this platform,
+ see <file:Documentation/arm/IXP4xx>.
- #define PCIBIOS_MIN_IO 0x00001000
--#define PCIBIOS_MIN_MEM (cpu_is_ixp43x() ? 0x40000000 : 0x48000000)
-+#define PCIBIOS_MIN_MEM (cpu_is_ixp43x() ? 0x48000000 : 0x48000000)
++config MACH_CAMBRIA
++ bool "Cambria"
++ select PCI
++ help
++ Say 'Y' here if you want your kernel to support the Gateworks
++ Cambria series. For more information on this platform,
++ see <file:Documentation/arm/IXP4xx>.
++
+ config MACH_LOFT
+ bool "Loft"
+ depends on MACH_AVILA
+@@ -208,7 +216,7 @@ config CPU_IXP46X
- /*
- * We override the standard dma-mask routines for bouncing.
+ config CPU_IXP43X
+ bool
+- depends on MACH_KIXRP435
++ depends on MACH_KIXRP435 || MACH_CAMBRIA
+ default y
+
+ config MACH_GTWX5715
+--- a/arch/arm/mach-ixp4xx/Makefile
++++ b/arch/arm/mach-ixp4xx/Makefile
+@@ -7,6 +7,7 @@ obj-pci-n :=
+
+ obj-pci-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o
+ obj-pci-$(CONFIG_MACH_AVILA) += avila-pci.o
++obj-pci-$(CONFIG_MACH_CAMBRIA) += cambria-pci.o
+ obj-pci-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o
+ obj-pci-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o
+ obj-pci-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o
+@@ -29,6 +30,7 @@ obj-y += common.o
+
+ obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o
+ obj-$(CONFIG_MACH_AVILA) += avila-setup.o
++obj-$(CONFIG_MACH_CAMBRIA) += cambria-setup.o
+ obj-$(CONFIG_MACH_IXDPG425) += coyote-setup.o
+ obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-setup.o
+ obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-setup.o
diff --git a/target/linux/ixp4xx/patches-2.6.27/191-cambria_optional_uart.patch b/target/linux/ixp4xx/patches-2.6.27/191-cambria_optional_uart.patch
index 5305417ab..946d685a1 100644
--- a/target/linux/ixp4xx/patches-2.6.27/191-cambria_optional_uart.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/191-cambria_optional_uart.patch
@@ -1,14 +1,14 @@
--- a/arch/arm/mach-ixp4xx/cambria-setup.c
+++ b/arch/arm/mach-ixp4xx/cambria-setup.c
-@@ -36,6 +36,7 @@
- #include <asm/mach-types.h>
+@@ -34,6 +34,7 @@
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>
+ #include <asm/setup.h>
+#include <linux/irq.h>
struct cambria_board_info {
unsigned char *model;
-@@ -105,6 +106,43 @@ static struct platform_device cambria_ua
+@@ -127,6 +128,43 @@ static struct platform_device cambria_ua
.resource = &cambria_uart_resource,
};
@@ -52,8 +52,8 @@
static struct resource cambria_pata_resources[] = {
{
.flags = IORESOURCE_MEM
-@@ -287,6 +325,19 @@ static void __init cambria_gw23xx_setup(
- #ifdef CONFIG_SENSORS_EEPROM
+@@ -283,6 +321,19 @@ static void __init cambria_gw23xx_setup(
+
static void __init cambria_gw2350_setup(void)
{
+ *IXP4XX_EXP_CS2 = 0xbfff0003;
@@ -72,7 +72,7 @@
platform_device_register(&cambria_npec_device);
platform_device_register(&cambria_npea_device);
-@@ -294,10 +345,26 @@ static void __init cambria_gw2350_setup(
+@@ -290,10 +341,26 @@ static void __init cambria_gw2350_setup(
platform_device_register(&cambria_usb1_device);
platform_device_register(&cambria_gpio_leds_device);
diff --git a/target/linux/ixp4xx/patches-2.6.27/192-cambria_gpio_device.patch b/target/linux/ixp4xx/patches-2.6.27/192-cambria_gpio_device.patch
index a9ade5939..706d65e2f 100644
--- a/target/linux/ixp4xx/patches-2.6.27/192-cambria_gpio_device.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/192-cambria_gpio_device.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/mach-ixp4xx/cambria-setup.c
+++ b/arch/arm/mach-ixp4xx/cambria-setup.c
-@@ -214,6 +214,21 @@ static struct platform_device cambria_gp
+@@ -212,6 +212,20 @@ static struct platform_device cambria_gp
.dev.platform_data = &cambria_gpio_leds_data,
};
@@ -18,11 +18,10 @@
+ .resource = cambria_gpio_resources,
+};
+
-+
-
static struct latch_led cambria_latch_leds[] = {
{
-@@ -337,6 +352,11 @@ static void __init cambria_gw2350_setup(
+ .name = "ledA", /* green led */
+@@ -333,6 +347,11 @@ static void __init cambria_gw2350_setup(
cambria_optional_uart_data[1].membase = (void __iomem *)ioremap(0x53FF0000, 0x0fff);
cambria_optional_uart_data[1].irq = IRQ_IXP4XX_GPIO4;
@@ -34,7 +33,7 @@
platform_device_register(&cambria_optional_uart);
platform_device_register(&cambria_npec_device);
platform_device_register(&cambria_npea_device);
-@@ -363,6 +383,10 @@ static void __init cambria_gw2358_setup(
+@@ -359,6 +378,10 @@ static void __init cambria_gw2358_setup(
cambria_optional_uart_data[1].membase = (void __iomem *)ioremap(0x53F80000, 0x0fff);
cambria_optional_uart_data[1].irq = IRQ_IXP4XX_GPIO4;
diff --git a/target/linux/ixp4xx/patches-2.6.27/294-eeprom_new_notifier.patch b/target/linux/ixp4xx/patches-2.6.27/294-eeprom_new_notifier.patch
deleted file mode 100644
index d11f8f01d..000000000
--- a/target/linux/ixp4xx/patches-2.6.27/294-eeprom_new_notifier.patch
+++ /dev/null
@@ -1,183 +0,0 @@
---- a/drivers/i2c/chips/eeprom.c
-+++ b/drivers/i2c/chips/eeprom.c
-@@ -27,6 +27,8 @@
- #include <linux/jiffies.h>
- #include <linux/i2c.h>
- #include <linux/mutex.h>
-+#include <linux/notifier.h>
-+#include <linux/eeprom.h>
-
- /* Addresses to scan */
- static const unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54,
-@@ -35,25 +37,7 @@ static const unsigned short normal_i2c[]
- /* Insmod parameters */
- I2C_CLIENT_INSMOD_1(eeprom);
-
--
--/* Size of EEPROM in bytes */
--#define EEPROM_SIZE 256
--
--/* possible types of eeprom devices */
--enum eeprom_nature {
-- UNKNOWN,
-- VAIO,
--};
--
--/* Each client has this additional data */
--struct eeprom_data {
-- 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;
--};
--
-+ATOMIC_NOTIFIER_HEAD(eeprom_chain);
-
- static void eeprom_update_client(struct i2c_client *client, u8 slice)
- {
-@@ -178,6 +162,7 @@ static int eeprom_probe(struct i2c_clien
- i2c_set_clientdata(client, data);
- mutex_init(&data->update_lock);
- data->nature = UNKNOWN;
-+ data->attr = &eeprom_attr;
-
- /* Detect the Vaio nature of EEPROMs.
- We use the "PCG-" or "VGN-" prefix as the signature. */
-@@ -202,6 +187,9 @@ static int eeprom_probe(struct i2c_clien
- if (err)
- goto exit_kfree;
-
-+ /* call the notifier chain */
-+ atomic_notifier_call_chain(&eeprom_chain, EEPROM_REGISTER, data);
-+
- return 0;
-
- exit_kfree:
-@@ -236,6 +224,41 @@ static struct i2c_driver eeprom_driver =
- .address_data = &addr_data,
- };
-
-+/**
-+ * register_eeprom_notifier - register a 'user' of EEPROM devices.
-+ * @nb: pointer to notifier info structure
-+ *
-+ * Registers a callback function to be called upon detection
-+ * of an EEPROM device. Detection invokes the 'add' callback
-+ * with the kobj of the mutex and a bin_attribute which allows
-+ * read from the EEPROM. The intention is that the notifier
-+ * will be able to read system configuration from the notifier.
-+ *
-+ * Only EEPROMs detected *after* the addition of the notifier
-+ * are notified. I.e. EEPROMs already known to the system
-+ * will not be notified - add the notifier from board level
-+ * code!
-+ */
-+int register_eeprom_notifier(struct notifier_block *nb)
-+{
-+ return atomic_notifier_chain_register(&eeprom_chain, nb);
-+}
-+
-+/**
-+ * unregister_eeprom_notifier - unregister a 'user' of EEPROM devices.
-+ * @old: pointer to notifier info structure
-+ *
-+ * Removes a callback function from the list of 'users' to be
-+ * notified upon detection of EEPROM devices.
-+ */
-+int unregister_eeprom_notifier(struct notifier_block *nb)
-+{
-+ return atomic_notifier_chain_unregister(&eeprom_chain, nb);
-+}
-+
-+EXPORT_SYMBOL_GPL(register_eeprom_notifier);
-+EXPORT_SYMBOL_GPL(unregister_eeprom_notifier);
-+
- static int __init eeprom_init(void)
- {
- return i2c_add_driver(&eeprom_driver);
---- /dev/null
-+++ b/include/linux/eeprom.h
-@@ -0,0 +1,71 @@
-+#ifndef _LINUX_EEPROM_H
-+#define _LINUX_EEPROM_H
-+/*
-+ * EEPROM notifier header
-+ *
-+ * Copyright (C) 2006 John Bowler
-+ */
-+
-+/*
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef __KERNEL__
-+#error This is a kernel header
-+#endif
-+
-+#include <linux/list.h>
-+#include <linux/kobject.h>
-+#include <linux/sysfs.h>
-+
-+/* Size of EEPROM in bytes */
-+#define EEPROM_SIZE 256
-+
-+/* 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;
-+ struct bin_attribute *attr;
-+};
-+
-+/*
-+ * This is very basic.
-+ *
-+ * If an EEPROM is detected on the I2C bus (this only works for
-+ * I2C EEPROMs) the notifier chain is called with
-+ * both the I2C information and the kobject for the sysfs
-+ * device which has been registers. It is then possible to
-+ * read from the device via the bin_attribute::read method
-+ * to extract configuration information.
-+ *
-+ * Register the notifier in the board level code, there is no
-+ * need to unregister it but you can if you want (it will save
-+ * a little bit or kernel memory to do so).
-+ */
-+
-+extern int register_eeprom_notifier(struct notifier_block *nb);
-+extern int unregister_eeprom_notifier(struct notifier_block *nb);
-+
-+#endif /* _LINUX_EEPROM_H */
---- a/include/linux/notifier.h
-+++ b/include/linux/notifier.h
-@@ -256,5 +256,8 @@ extern struct blocking_notifier_head reb
- #define VT_UPDATE 0x0004 /* A bigger update occurred */
- #define VT_PREWRITE 0x0005 /* A char is about to be written to the console */
-
-+/* eeprom notifier chain */
-+#define EEPROM_REGISTER 0x0001
-+
- #endif /* __KERNEL__ */
- #endif /* _LINUX_NOTIFIER_H */
diff --git a/target/linux/ixp4xx/patches-2.6.27/296-avila_mac_plat_info.patch b/target/linux/ixp4xx/patches-2.6.27/296-avila_mac_plat_info.patch
deleted file mode 100644
index 8ea879fad..000000000
--- a/target/linux/ixp4xx/patches-2.6.27/296-avila_mac_plat_info.patch
+++ /dev/null
@@ -1,43 +0,0 @@
---- a/arch/arm/mach-ixp4xx/avila-setup.c
-+++ b/arch/arm/mach-ixp4xx/avila-setup.c
-@@ -132,6 +132,31 @@ static struct platform_device avila_pata
- .resource = avila_pata_resources,
- };
-
-+/* Built-in 10/100 Ethernet MAC interfaces */
-+static struct eth_plat_info avila_npeb_data = {
-+ .phy = 0,
-+ .rxq = 3,
-+ .txreadyq = 20,
-+};
-+
-+static struct eth_plat_info avila_npec_data = {
-+ .phy = 1,
-+ .rxq = 4,
-+ .txreadyq = 21,
-+};
-+
-+static struct platform_device avila_npeb_device = {
-+ .name = "ixp4xx_eth",
-+ .id = IXP4XX_ETH_NPEB,
-+ .dev.platform_data = &avila_npeb_data,
-+};
-+
-+static struct platform_device avila_npec_device = {
-+ .name = "ixp4xx_eth",
-+ .id = IXP4XX_ETH_NPEC,
-+ .dev.platform_data = &avila_npec_data,
-+};
-+
- static struct platform_device *avila_devices[] __initdata = {
- &avila_i2c_gpio,
- &avila_flash,
-@@ -159,6 +184,8 @@ static void __init avila_init(void)
-
- platform_device_register(&avila_pata);
-
-+ platform_device_register(avila_npeb_device);
-+ platform_device_register(avila_npec_device);
- }
-
- MACHINE_START(AVILA, "Gateworks Avila Network Platform")
diff --git a/target/linux/ixp4xx/patches-2.6.27/300-avila_fetch_mac.patch b/target/linux/ixp4xx/patches-2.6.27/300-avila_fetch_mac.patch
index aef7558dc..2c87aadd9 100644
--- a/target/linux/ixp4xx/patches-2.6.27/300-avila_fetch_mac.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/300-avila_fetch_mac.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/mach-ixp4xx/avila-setup.c
+++ b/arch/arm/mach-ixp4xx/avila-setup.c
-@@ -14,10 +14,18 @@
+@@ -14,10 +14,16 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
@@ -11,21 +11,19 @@
#include <linux/tty.h>
#include <linux/serial_8250.h>
#include <linux/slab.h>
-+#ifdef CONFIG_SENSORS_EEPROM
-+# include <linux/i2c.h>
-+# include <linux/eeprom.h>
-+#endif
++#include <linux/i2c.h>
++#include <linux/i2c/at24.h>
+
#include <linux/i2c-gpio.h>
#include <asm/types.h>
-@@ -29,6 +37,13 @@
+@@ -29,6 +35,13 @@
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>
+struct avila_board_info {
+ unsigned char *model;
-+ void (* setup)(void);
++ void (*setup)(void);
+};
+
+static struct avila_board_info *avila_info __initdata;
@@ -33,7 +31,38 @@
static struct flash_platform_data avila_flash_data = {
.map_name = "cfi_probe",
.width = 2,
-@@ -163,10 +178,160 @@ static struct platform_device *avila_dev
+@@ -132,16 +145,181 @@ static struct platform_device avila_pata
+ .resource = avila_pata_resources,
+ };
+
++/* Built-in 10/100 Ethernet MAC interfaces */
++static struct eth_plat_info avila_npeb_data = {
++ .phy = 0,
++ .rxq = 3,
++ .txreadyq = 20,
++};
++
++static struct eth_plat_info avila_npec_data = {
++ .phy = 1,
++ .rxq = 4,
++ .txreadyq = 21,
++};
++
++static struct platform_device avila_npeb_device = {
++ .name = "ixp4xx_eth",
++ .id = IXP4XX_ETH_NPEB,
++ .dev.platform_data = &avila_npeb_data,
++};
++
++static struct platform_device avila_npec_device = {
++ .name = "ixp4xx_eth",
++ .id = IXP4XX_ETH_NPEC,
++ .dev.platform_data = &avila_npec_data,
++};
++
+ static struct platform_device *avila_devices[] __initdata = {
+ &avila_i2c_gpio,
+ &avila_flash,
&avila_uart
};
@@ -43,7 +72,6 @@
+ platform_device_register(&avila_npec_device);
+}
+
-+#ifdef CONFIG_SENSORS_EEPROM
+static void __init avila_gw2342_setup(void)
+{
+ platform_device_register(&avila_npeb_device);
@@ -122,66 +150,57 @@
+
+ for (i = 0; i < ARRAY_SIZE(avila_boards); i++) {
+ struct avila_board_info *info = &avila_boards[i];
-+ if (strncmp(info->model, model, strlen(info->model)) == 0)
++ if (strcmp(info->model, model) == 0)
+ return info;
+ }
+
+ return NULL;
+}
+
-+struct avila_eeprom_header {
-+ unsigned char mac0[ETH_ALEN];
-+ unsigned char mac1[ETH_ALEN];
-+ unsigned char res0[4];
-+ unsigned char magic[2];
-+ unsigned char config[14];
-+ unsigned char model[16];
-+};
++static struct at24_iface *at24_if;
+
-+static int __init avila_eeprom_notify(struct notifier_block *self,
-+ unsigned long event, void *t)
++static int at24_setup(struct at24_iface *iface, void *context)
+{
-+ struct eeprom_data *ee = t;
-+ struct avila_eeprom_header hdr;
-+
-+ if (avila_info)
-+ return NOTIFY_DONE;
-+
-+ /* The eeprom is at address 0x51 */
-+ if (event != EEPROM_REGISTER || ee->client.addr != 0x51)
-+ return NOTIFY_DONE;
++ char mac_addr[ETH_ALEN];
++ char model[6];
+
-+ ee->attr->read(&ee->client.dev.kobj, ee->attr, (char *)&hdr,
-+ 0, sizeof(hdr));
++ at24_if = iface;
+
-+ if (hdr.magic[0] != 'G' || hdr.magic[1] != 'W')
-+ return NOTIFY_DONE;
-+
-+ memcpy(&avila_npeb_data.hwaddr, hdr.mac0, ETH_ALEN);
-+ memcpy(&avila_npec_data.hwaddr, hdr.mac1, ETH_ALEN);
++ /* Read MAC addresses */
++ if (at24_if->read(at24_if, mac_addr, 0x0, 6) == 6) {
++ memcpy(&avila_npeb_data.hwaddr, mac_addr, ETH_ALEN);
++ }
++ if (at24_if->read(at24_if, mac_addr, 0x6, 6) == 6) {
++ memcpy(&avila_npec_data.hwaddr, mac_addr, ETH_ALEN);
++ }
+
-+ avila_info = avila_find_board_info(hdr.model);
++ /* Read the first 6 bytes of the model number */
++ if (at24_if->read(at24_if, model, 0x20, 6) == 6) {
++ avila_info = avila_find_board_info(model);
++ }
+
-+ return NOTIFY_OK;
++ return 0;
+}
+
-+static struct notifier_block avila_eeprom_notifier __initdata = {
-+ .notifier_call = avila_eeprom_notify
++static struct at24_platform_data avila_eeprom_info = {
++ .byte_len = 1024,
++ .page_size = 16,
++ .flags = AT24_FLAG_READONLY,
++ .setup = at24_setup,
+};
+
-+static void __init avila_register_eeprom_notifier(void)
-+{
-+ register_eeprom_notifier(&avila_eeprom_notifier);
-+}
-+
-+static void __init avila_unregister_eeprom_notifier(void)
-+{
-+ unregister_eeprom_notifier(&avila_eeprom_notifier);
-+}
-+#else /* CONFIG_SENSORS_EEPROM */
-+static inline void avila_register_eeprom_notifier(void) {};
-+static inline void avila_unregister_eeprom_notifier(void) {};
-+#endif /* CONFIG_SENSORS_EEPROM */
++static struct i2c_board_info __initdata avila_i2c_board_info[] = {
++/* {
++ I2C_BOARD_INFO("rtc-ds1672", 0x68),
++ },*/
++ {
++ I2C_BOARD_INFO("ad7418", 0x28),
++ },
++ {
++ I2C_BOARD_INFO("24c08", 0x51),
++ .platform_data = &avila_eeprom_info
++ },
++};
+
static void __init avila_init(void)
{
@@ -194,13 +213,12 @@
avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
avila_flash_resource.end =
IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
-@@ -184,9 +349,28 @@ static void __init avila_init(void)
+@@ -159,7 +337,28 @@ static void __init avila_init(void)
platform_device_register(&avila_pata);
-- platform_device_register(avila_npeb_device);
-- platform_device_register(avila_npec_device);
-+ avila_register_eeprom_notifier();
++ i2c_register_board_info(0, avila_i2c_board_info,
++ ARRAY_SIZE(avila_i2c_board_info));
+}
+
+static int __init avila_model_setup(void)
@@ -218,7 +236,6 @@
+ avila_gw23xx_setup();
+ }
+
-+ avila_unregister_eeprom_notifier();
+ return 0;
}
+late_initcall(avila_model_setup);
diff --git a/target/linux/ixp4xx/patches-2.6.27/301-avila_led.patch b/target/linux/ixp4xx/patches-2.6.27/301-avila_led.patch
index 44aea4a78..2bd0e1609 100644
--- a/target/linux/ixp4xx/patches-2.6.27/301-avila_led.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/301-avila_led.patch
@@ -1,14 +1,14 @@
--- a/arch/arm/mach-ixp4xx/avila-setup.c
+++ b/arch/arm/mach-ixp4xx/avila-setup.c
-@@ -26,6 +26,7 @@
- # include <linux/eeprom.h>
- #endif
+@@ -24,6 +24,7 @@
+ #include <linux/i2c.h>
+ #include <linux/i2c/at24.h>
+#include <linux/leds.h>
#include <linux/i2c-gpio.h>
#include <asm/types.h>
-@@ -172,6 +173,72 @@ static struct platform_device avila_npec
+@@ -170,6 +171,72 @@ static struct platform_device avila_npec
.dev.platform_data = &avila_npec_data,
};
@@ -81,7 +81,7 @@
static struct platform_device *avila_devices[] __initdata = {
&avila_i2c_gpio,
&avila_flash,
-@@ -182,6 +249,8 @@ static void __init avila_gw23xx_setup(vo
+@@ -180,12 +247,16 @@ static void __init avila_gw23xx_setup(vo
{
platform_device_register(&avila_npeb_device);
platform_device_register(&avila_npec_device);
@@ -89,8 +89,7 @@
+ platform_device_register(&avila_gpio_leds_device);
}
- #ifdef CONFIG_SENSORS_EEPROM
-@@ -189,6 +258,8 @@ static void __init avila_gw2342_setup(vo
+ static void __init avila_gw2342_setup(void)
{
platform_device_register(&avila_npeb_device);
platform_device_register(&avila_npec_device);
@@ -99,7 +98,7 @@
}
static void __init avila_gw2345_setup(void)
-@@ -199,22 +270,30 @@ static void __init avila_gw2345_setup(vo
+@@ -196,22 +267,30 @@ static void __init avila_gw2345_setup(vo
avila_npec_data.phy = 5; /* port 5 of the KS8995 switch */
platform_device_register(&avila_npec_device);
@@ -130,7 +129,7 @@
}
static void __init avila_gw2355_setup(void)
-@@ -225,11 +304,29 @@ static void __init avila_gw2355_setup(vo
+@@ -222,11 +301,29 @@ static void __init avila_gw2355_setup(vo
avila_npec_data.phy = 16;
platform_device_register(&avila_npec_device);
diff --git a/target/linux/ixp4xx/patches-2.6.27/302-avila_gpio_device.patch b/target/linux/ixp4xx/patches-2.6.27/302-avila_gpio_device.patch
index f6bf36f27..3b75a59f7 100644
--- a/target/linux/ixp4xx/patches-2.6.27/302-avila_gpio_device.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/302-avila_gpio_device.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/mach-ixp4xx/avila-setup.c
+++ b/arch/arm/mach-ixp4xx/avila-setup.c
-@@ -239,10 +239,28 @@ static struct platform_device avila_latc
+@@ -237,10 +237,28 @@ static struct platform_device avila_latc
.dev.platform_data = &avila_latch_leds_data,
};
diff --git a/target/linux/ixp4xx/patches-2.6.27/303-avila_gw23x7_phy_quirk.patch b/target/linux/ixp4xx/patches-2.6.27/303-avila_gw23x7_phy_quirk.patch
index f2ee488b9..5810d68b2 100644
--- a/target/linux/ixp4xx/patches-2.6.27/303-avila_gw23x7_phy_quirk.patch
+++ b/target/linux/ixp4xx/patches-2.6.27/303-avila_gw23x7_phy_quirk.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/mach-ixp4xx/avila-setup.c
+++ b/arch/arm/mach-ixp4xx/avila-setup.c
-@@ -294,6 +294,7 @@ static void __init avila_gw2345_setup(vo
+@@ -291,6 +291,7 @@ static void __init avila_gw2345_setup(vo
static void __init avila_gw2347_setup(void)
{
@@ -8,7 +8,7 @@
platform_device_register(&avila_npeb_device);
avila_gpio_leds[0].gpio = AVILA_GW23X7_LED_USER_GPIO;
-@@ -338,6 +339,7 @@ static void __init avila_gw2355_setup(vo
+@@ -335,6 +336,7 @@ static void __init avila_gw2355_setup(vo
static void __init avila_gw2357_setup(void)
{