From a5471b525063ba94c6f704d1b2c29add3fd9e9a8 Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 10 May 2007 11:29:43 +0000 Subject: fixup avila networking, add support for the loft git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7168 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/ixp4xx-2.6/config/default | 5 +- .../patches/700-remove_avila_ixdp425_setup.patch | 39 +++ .../ixp4xx-2.6/patches/710-avila_loft_setup.patch | 381 +++++++++++++++++++++ .../ixp4xx-2.6/patches/720-avila_setup_mac.patch | 70 ++++ .../patches/740-avila_loft_mac_platform.patch | 50 +++ .../patches/750-avila_mtd_microcode.patch | 28 ++ .../patches/800-eeprom_new_notifier.patch | 201 +++++++++++ 7 files changed, 772 insertions(+), 2 deletions(-) create mode 100644 target/linux/ixp4xx-2.6/patches/700-remove_avila_ixdp425_setup.patch create mode 100644 target/linux/ixp4xx-2.6/patches/710-avila_loft_setup.patch create mode 100644 target/linux/ixp4xx-2.6/patches/720-avila_setup_mac.patch create mode 100644 target/linux/ixp4xx-2.6/patches/740-avila_loft_mac_platform.patch create mode 100644 target/linux/ixp4xx-2.6/patches/750-avila_mtd_microcode.patch create mode 100644 target/linux/ixp4xx-2.6/patches/800-eeprom_new_notifier.patch (limited to 'target') diff --git a/target/linux/ixp4xx-2.6/config/default b/target/linux/ixp4xx-2.6/config/default index 41396f823..39521838c 100644 --- a/target/linux/ixp4xx-2.6/config/default +++ b/target/linux/ixp4xx-2.6/config/default @@ -5,7 +5,6 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ARCH_AAEC2000 is not set # CONFIG_ARCH_ADI_COYOTE is not set # CONFIG_ARCH_AT91 is not set -CONFIG_ARCH_AVILA=y # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS7500 is not set # CONFIG_ARCH_CO285 is not set @@ -211,11 +210,13 @@ CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_LIBCRC32C is not set # CONFIG_LLC2 is not set +CONFIG_MACH_AVILA=y CONFIG_MACH_COMPEX=y CONFIG_MACH_GATEWAY7001=y # CONFIG_MACH_GTWX5715 is not set # CONFIG_MACH_IXDP465 is not set # CONFIG_MACH_IXDPG425 is not set +CONFIG_MACH_LOFT=y CONFIG_MACH_NAS100D=y CONFIG_MACH_NSLU2=y CONFIG_MACH_PRONGHORNMETRO=y @@ -395,7 +396,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_SENSORS_DS1337 is not set # CONFIG_SENSORS_DS1374 is not set # CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_EEPROM is not set +CONFIG_SENSORS_EEPROM=y # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set diff --git a/target/linux/ixp4xx-2.6/patches/700-remove_avila_ixdp425_setup.patch b/target/linux/ixp4xx-2.6/patches/700-remove_avila_ixdp425_setup.patch new file mode 100644 index 000000000..852f6558b --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/700-remove_avila_ixdp425_setup.patch @@ -0,0 +1,39 @@ +diff -Nur linux-2.6.19.2/arch/arm/mach-ixp4xx/ixdp425-pci.c linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c +--- linux-2.6.19.2/arch/arm/mach-ixp4xx/ixdp425-pci.c 2007-04-15 14:26:04.000000000 +0200 ++++ linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c 2007-05-10 11:10:40.000000000 +0200 +@@ -66,7 +66,7 @@ + int __init ixdp425_pci_init(void) + { + if (machine_is_ixdp425() || machine_is_ixcdp1100() || +- machine_is_avila() || machine_is_ixdp465() || machine_is_compex()) ++ machine_is_ixdp465() || machine_is_compex()) + pci_common_init(&ixdp425_pci); + return 0; + } +diff -Nur linux-2.6.19.2/arch/arm/mach-ixp4xx/ixdp425-setup.c linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/ixdp425-setup.c +--- linux-2.6.19.2/arch/arm/mach-ixp4xx/ixdp425-setup.c 2007-04-15 14:26:49.000000000 +0200 ++++ linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/ixdp425-setup.c 2007-05-10 11:10:01.000000000 +0200 +@@ -205,23 +205,3 @@ + .init_machine = ixdp425_init, + MACHINE_END + #endif +- +-/* +- * Avila is functionally equivalent to IXDP425 except that it adds +- * a CF IDE slot hanging off the expansion bus. When we have a +- * driver for IXP4xx CF IDE with driver model support we'll move +- * Avila to it's own setup file. +- */ +-#ifdef CONFIG_ARCH_AVILA +-MACHINE_START(AVILA, "Gateworks Avila Network Platform") +- /* Maintainer: Deepak Saxena */ +- .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, +- .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, +- .map_io = ixp4xx_map_io, +- .init_irq = ixp4xx_init_irq, +- .timer = &ixp4xx_timer, +- .boot_params = 0x0100, +- .init_machine = ixdp425_init, +-MACHINE_END +-#endif +- diff --git a/target/linux/ixp4xx-2.6/patches/710-avila_loft_setup.patch b/target/linux/ixp4xx-2.6/patches/710-avila_loft_setup.patch new file mode 100644 index 000000000..4fb597d7d --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/710-avila_loft_setup.patch @@ -0,0 +1,381 @@ +This patch adds support for the Gateworks Avila Network Platform in +a separate set of setup files to the IXDP425. This is necessary now +that a driver for the Avila CF card slot is available. It also adds +support for a minor variant on the Avila board known as the Loft, +which has a different number of maximum PCI devices. + +Signed-off-by: Michael-Luke Jones cam.ac.uk> + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/Kconfig +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/Kconfig ++++ linux-2.6.19/arch/arm/mach-ixp4xx/Kconfig +@@ -17,7 +17,7 @@ config MACH_NSLU2 + NSLU2 NAS device. For more information on this platform, + see http://www.nslu2-linux.org + +-config ARCH_AVILA ++config MACH_AVILA + bool "Avila" + select PCI + help +@@ -25,6 +25,14 @@ config ARCH_AVILA + Avila Network Platform. For more information on this platform, + see . + ++config MACH_LOFT ++ bool "Loft" ++ depends on MACH_AVILA ++ help ++ Say 'Y' here if you want your kernel to support the Giant ++ Shoulder Inc Loft board (a minor variation on the standard ++ Gateworks Avila Network Platform). ++ + config ARCH_ADI_COYOTE + bool "Coyote" + select PCI +@@ -86,7 +94,7 @@ config MACH_NAS100D + # + config ARCH_IXDP4XX + bool +- depends on ARCH_IXDP425 || ARCH_AVILA || MACH_IXDP465 ++ depends on ARCH_IXDP425 || MACH_IXDP465 + default y + + # +Index: linux-2.6.19/arch/arm/mach-ixp4xx/Makefile +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/Makefile ++++ linux-2.6.19/arch/arm/mach-ixp4xx/Makefile +@@ -6,6 +6,7 @@ obj-pci-y := + obj-pci-n := + + obj-pci-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o ++obj-pci-$(CONFIG_MACH_AVILA) += avila-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 +@@ -15,6 +16,7 @@ obj-pci-$(CONFIG_MACH_NAS100D) += nas10 + obj-y += common.o + + obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o ++obj-$(CONFIG_MACH_AVILA) += avila-setup.o + obj-$(CONFIG_MACH_IXDPG425) += coyote-setup.o + obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-setup.o + obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-setup.o +Index: linux-2.6.19/arch/arm/mach-ixp4xx/avila-pci.c +=================================================================== +--- /dev/null ++++ linux-2.6.19/arch/arm/mach-ixp4xx/avila-pci.c +@@ -0,0 +1,78 @@ ++/* ++ * arch/arm/mach-ixp4xx/avila-pci.c ++ * ++ * Gateworks Avila board-level PCI initialization ++ * ++ * Author: Michael-Luke Jones ++ * ++ * Based on ixdp-pci.c ++ * Copyright (C) 2002 Intel Corporation. ++ * Copyright (C) 2003-2004 MontaVista Software, Inc. ++ * ++ * Maintainer: Deepak Saxena ++ * ++ * 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 ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++void __init avila_pci_preinit(void) ++{ ++ set_irq_type(IRQ_AVILA_PCI_INTA, IRQT_LOW); ++ set_irq_type(IRQ_AVILA_PCI_INTB, IRQT_LOW); ++ set_irq_type(IRQ_AVILA_PCI_INTC, IRQT_LOW); ++ set_irq_type(IRQ_AVILA_PCI_INTD, IRQT_LOW); ++ ++ ixp4xx_pci_preinit(); ++} ++ ++static int __init avila_map_irq(struct pci_dev *dev, u8 slot, u8 pin) ++{ ++ static int pci_irq_table[AVILA_PCI_IRQ_LINES] = { ++ IRQ_AVILA_PCI_INTA, ++ IRQ_AVILA_PCI_INTB, ++ IRQ_AVILA_PCI_INTC, ++ IRQ_AVILA_PCI_INTD ++ }; ++ ++ int irq = -1; ++ ++ if (slot >= 1 && ++ slot <= (machine_is_loft() ? LOFT_PCI_MAX_DEV : AVILA_PCI_MAX_DEV) && ++ pin >= 1 && pin <= AVILA_PCI_IRQ_LINES) { ++ irq = pci_irq_table[(slot + pin - 2) % 4]; ++ } ++ ++ return irq; ++} ++ ++struct hw_pci avila_pci __initdata = { ++ .nr_controllers = 1, ++ .preinit = avila_pci_preinit, ++ .swizzle = pci_std_swizzle, ++ .setup = ixp4xx_setup, ++ .scan = ixp4xx_scan_bus, ++ .map_irq = avila_map_irq, ++}; ++ ++int __init avila_pci_init(void) ++{ ++ if (machine_is_avila() || machine_is_loft()) ++ pci_common_init(&avila_pci); ++ return 0; ++} ++ ++subsys_initcall(avila_pci_init); ++ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c +=================================================================== +--- /dev/null ++++ linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c +@@ -0,0 +1,152 @@ ++/* ++ * arch/arm/mach-ixp4xx/avila-setup.c ++ * ++ * Gateworks Avila board-setup ++ * ++ * Author: Michael-Luke Jones ++ * ++ * Based on ixdp-setup.c ++ * Copyright (C) 2003-2005 MontaVista Software, Inc. ++ * ++ * Author: Deepak Saxena ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static struct flash_platform_data avila_flash_data = { ++ .map_name = "cfi_probe", ++ .width = 2, ++}; ++ ++static struct resource avila_flash_resource = { ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct platform_device avila_flash = { ++ .name = "IXP4XX-Flash", ++ .id = 0, ++ .dev = { ++ .platform_data = &avila_flash_data, ++ }, ++ .num_resources = 1, ++ .resource = &avila_flash_resource, ++}; ++ ++static struct ixp4xx_i2c_pins avila_i2c_gpio_pins = { ++ .sda_pin = AVILA_SDA_PIN, ++ .scl_pin = AVILA_SCL_PIN, ++}; ++ ++static struct platform_device avila_i2c_controller = { ++ .name = "IXP4XX-I2C", ++ .id = 0, ++ .dev = { ++ .platform_data = &avila_i2c_gpio_pins, ++ }, ++ .num_resources = 0 ++}; ++ ++static struct resource avila_uart_resources[] = { ++ { ++ .start = IXP4XX_UART1_BASE_PHYS, ++ .end = IXP4XX_UART1_BASE_PHYS + 0x0fff, ++ .flags = IORESOURCE_MEM ++ }, ++ { ++ .start = IXP4XX_UART2_BASE_PHYS, ++ .end = IXP4XX_UART2_BASE_PHYS + 0x0fff, ++ .flags = IORESOURCE_MEM ++ } ++}; ++ ++static struct plat_serial8250_port avila_uart_data[] = { ++ { ++ .mapbase = IXP4XX_UART1_BASE_PHYS, ++ .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, ++ .irq = IRQ_IXP4XX_UART1, ++ .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, ++ .iotype = UPIO_MEM, ++ .regshift = 2, ++ .uartclk = IXP4XX_UART_XTAL, ++ }, ++ { ++ .mapbase = IXP4XX_UART2_BASE_PHYS, ++ .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, ++ .irq = IRQ_IXP4XX_UART2, ++ .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, ++ .iotype = UPIO_MEM, ++ .regshift = 2, ++ .uartclk = IXP4XX_UART_XTAL, ++ }, ++ { }, ++}; ++ ++static struct platform_device avila_uart = { ++ .name = "serial8250", ++ .id = PLAT8250_DEV_PLATFORM, ++ .dev.platform_data = avila_uart_data, ++ .num_resources = 2, ++ .resource = avila_uart_resources ++}; ++ ++static struct platform_device *avila_devices[] __initdata = { ++ &avila_i2c_controller, ++ &avila_flash, ++ &avila_uart ++}; ++ ++static void __init avila_init(void) ++{ ++ ixp4xx_sys_init(); ++ ++ avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); ++ avila_flash_resource.end = ++ IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; ++ ++ platform_add_devices(avila_devices, ARRAY_SIZE(avila_devices)); ++} ++ ++MACHINE_START(AVILA, "Gateworks Avila Network Platform") ++ /* Maintainer: Deepak Saxena */ ++ .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, ++ .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, ++ .map_io = ixp4xx_map_io, ++ .init_irq = ixp4xx_init_irq, ++ .timer = &ixp4xx_timer, ++ .boot_params = 0x0100, ++ .init_machine = avila_init, ++MACHINE_END ++ ++ /* ++ * Loft is functionally equivalent to Avila except that it has a ++ * different number for the maximum PCI devices. The MACHINE ++ * structure below is identical to Avila except for the comment. ++ */ ++#ifdef CONFIG_MACH_LOFT ++MACHINE_START(LOFT, "Giant Shoulder Inc Loft board") ++ /* Maintainer: Tom Billman */ ++ .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, ++ .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, ++ .map_io = ixp4xx_map_io, ++ .init_irq = ixp4xx_init_irq, ++ .timer = &ixp4xx_timer, ++ .boot_params = 0x0100, ++ .init_machine = avila_init, ++MACHINE_END ++#endif ++ +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/avila.h +=================================================================== +--- /dev/null ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/avila.h +@@ -0,0 +1,39 @@ ++/* ++ * include/asm-arm/arch-ixp4xx/avila.h ++ * ++ * Gateworks Avila platform specific definitions ++ * ++ * Author: Michael-Luke Jones ++ * ++ * Based on ixdp425.h ++ * Author: Deepak Saxena ++ * ++ * Copyright 2004 (c) MontaVista, Software, Inc. ++ * ++ * This file is licensed under the terms of the GNU General Public ++ * License version 2. This program is licensed "as is" without any ++ * warranty of any kind, whether express or implied. ++ */ ++ ++#ifndef __ASM_ARCH_HARDWARE_H__ ++#error "Do not include this directly, instead #include " ++#endif ++ ++#define AVILA_SDA_PIN 7 ++#define AVILA_SCL_PIN 6 ++ ++/* ++ * AVILA PCI IRQs ++ */ ++#define AVILA_PCI_MAX_DEV 4 ++#define LOFT_PCI_MAX_DEV 6 ++#define AVILA_PCI_IRQ_LINES 4 ++ ++ ++/* PCI controller GPIO to IRQ pin mappings */ ++#define AVILA_PCI_INTA_PIN 11 ++#define AVILA_PCI_INTB_PIN 10 ++#define AVILA_PCI_INTC_PIN 9 ++#define AVILA_PCI_INTD_PIN 8 ++ ++ +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/hardware.h +=================================================================== +--- linux-2.6.19.orig/include/asm-arm/arch-ixp4xx/hardware.h ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/hardware.h +@@ -42,6 +42,7 @@ extern unsigned int processor_id; + + /* Platform specific details */ + #include "ixdp425.h" ++#include "avila.h" + #include "coyote.h" + #include "prpmc1100.h" + #include "nslu2.h" +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/irqs.h +=================================================================== +--- linux-2.6.19.orig/include/asm-arm/arch-ixp4xx/irqs.h ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/irqs.h +@@ -79,6 +79,15 @@ + #define IRQ_IXDP425_PCI_INTD IRQ_IXP4XX_GPIO8 + + /* ++ * Gateworks Avila board IRQs ++ */ ++#define IRQ_AVILA_PCI_INTA IRQ_IXP4XX_GPIO11 ++#define IRQ_AVILA_PCI_INTB IRQ_IXP4XX_GPIO10 ++#define IRQ_AVILA_PCI_INTC IRQ_IXP4XX_GPIO9 ++#define IRQ_AVILA_PCI_INTD IRQ_IXP4XX_GPIO8 ++ ++ ++/* + * PrPMC1100 Board IRQs + */ + #define IRQ_PRPMC1100_PCI_INTA IRQ_IXP4XX_GPIO11 diff --git a/target/linux/ixp4xx-2.6/patches/720-avila_setup_mac.patch b/target/linux/ixp4xx-2.6/patches/720-avila_setup_mac.patch new file mode 100644 index 000000000..3784852e3 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/720-avila_setup_mac.patch @@ -0,0 +1,70 @@ +--- + arch/arm/mach-ixp4xx/avila-setup.c | 50 ++++++++++++++++++++++++++++++++++++- + 1 file changed, 49 insertions(+), 1 deletion(-) + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/avila-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c +@@ -104,10 +104,60 @@ static struct platform_device avila_uart + .resource = avila_uart_resources + }; + ++/* MACs */ ++static struct resource res_mac0 = { ++ .start = IXP4XX_EthB_BASE_PHYS, ++ .end = IXP4XX_EthB_BASE_PHYS + 0x1ff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct resource res_mac1 = { ++ .start = IXP4XX_EthC_BASE_PHYS, ++ .end = IXP4XX_EthC_BASE_PHYS + 0x1ff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct mac_plat_info plat_mac0 = { ++ .npe_id = 1, ++ .phy_id = 0, ++ .eth_id = 0, ++ .rxq_id = 27, ++ .txq_id = 24, ++ .rxdoneq_id = 4, ++}; ++ ++static struct mac_plat_info plat_mac1 = { ++ .npe_id = 2, ++ .phy_id = 1, ++ .eth_id = 1, ++ .rxq_id = 28, ++ .txq_id = 25, ++ .rxdoneq_id = 5, ++}; ++ ++static struct platform_device mac0 = { ++ .name = "ixp4xx_mac", ++ .id = 0, ++ .dev.platform_data = &plat_mac0, ++ .num_resources = 1, ++ .resource = &res_mac0, ++}; ++ ++static struct platform_device mac1 = { ++ .name = "ixp4xx_mac", ++ .id = 1, ++ .dev.platform_data = &plat_mac1, ++ .num_resources = 1, ++ .resource = &res_mac1, ++}; ++ + static struct platform_device *avila_devices[] __initdata = { + &avila_i2c_controller, + &avila_flash, +- &avila_uart ++ &avila_uart, ++ &mac0, ++ &mac1, ++ + }; + + static void __init avila_init(void) diff --git a/target/linux/ixp4xx-2.6/patches/740-avila_loft_mac_platform.patch b/target/linux/ixp4xx-2.6/patches/740-avila_loft_mac_platform.patch new file mode 100644 index 000000000..952a05506 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/740-avila_loft_mac_platform.patch @@ -0,0 +1,50 @@ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/avila-setup.c 2007-01-23 03:12:36.000000000 -0800 ++++ linux-2.6.19/arch/arm/mach-ixp4xx/avila-setup.c 2007-01-23 03:12:47.000000000 -0800 +@@ -18,6 +18,10 @@ + #include + #include + #include ++#ifdef CONFIG_SENSORS_EEPROM ++#include ++#include ++#endif + + #include + #include +@@ -198,9 +202,34 @@ + &avila_npe_ucode, + }; + ++#ifdef CONFIG_SENSORS_EEPROM ++static int loft_eeprom_do(struct notifier_block *self, unsigned long event, void *t) ++{ ++ struct eeprom_data *data = t; ++ ++ char macs[12]; ++ ++ /* The MACs are the first 12 bytes in the eeprom at address 0x51 */ ++ if (event == EEPROM_REGISTER && data->client.addr == 0x51) { ++ data->attr->read(&data->client.dev.kobj, macs, 0, 12); ++ memcpy(&plat_mac0.hwaddr, macs, 6); ++ memcpy(&plat_mac1.hwaddr, macs + 6, 6); ++ } ++ ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block loft_eeprom_notifier = { ++ .notifier_call = loft_eeprom_do ++}; ++#endif ++ + static void __init avila_init(void) + { + ixp4xx_sys_init(); ++#ifdef CONFIG_SENSORS_EEPROM ++ register_eeprom_notifier(&loft_eeprom_notifier); ++#endif + + avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); + avila_flash_resource.end = diff --git a/target/linux/ixp4xx-2.6/patches/750-avila_mtd_microcode.patch b/target/linux/ixp4xx-2.6/patches/750-avila_mtd_microcode.patch new file mode 100644 index 000000000..0ecd3a561 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/750-avila_mtd_microcode.patch @@ -0,0 +1,28 @@ +diff -Nur linux-2.6.19.2/arch/arm/mach-ixp4xx/avila-setup.c linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/avila-setup.c +--- linux-2.6.19.2/arch/arm/mach-ixp4xx/avila-setup.c 2007-05-10 12:30:54.000000000 +0200 ++++ linux-2.6.19.2-owrt/arch/arm/mach-ixp4xx/avila-setup.c 2007-05-10 12:33:08.000000000 +0200 +@@ -155,13 +155,23 @@ + .resource = &res_mac1, + }; + ++struct npe_ucode_platform_data avila_npe_ucode_data = { ++ .mtd_partition = "RedBoot", ++}; ++ ++static struct platform_device avila_npe_ucode = { ++ .name = "ixp4xx_npe_ucode", ++ .id = 0, ++ .dev.platform_data = &avila_npe_ucode_data, ++}; ++ + static struct platform_device *avila_devices[] __initdata = { + &avila_i2c_controller, + &avila_flash, + &avila_uart, + &mac0, + &mac1, +- ++ &avila_npe_ucode, + }; + + #ifdef CONFIG_SENSORS_EEPROM diff --git a/target/linux/ixp4xx-2.6/patches/800-eeprom_new_notifier.patch b/target/linux/ixp4xx-2.6/patches/800-eeprom_new_notifier.patch new file mode 100644 index 000000000..6c461089a --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/800-eeprom_new_notifier.patch @@ -0,0 +1,201 @@ +Add EEPROM notifiers + +These help board level code by allowing a callback when EEPROMs are +loaded, this permits system level configuration to be loaded from the +EEPROM. This is particularly useful when the ethernet MAC ids are +stored in EEPROM and when the ethernet hardware is generic (so it +has no board level knowledge), then the MACs can be loaded into +the 'maclist' code and read out by the ethernet config. + +Signed-off-by: John Bowler + +Index: linux-2.6.19/drivers/i2c/chips/eeprom.c +=================================================================== +--- linux-2.6.19.orig/drivers/i2c/chips/eeprom.c ++++ linux-2.6.19/drivers/i2c/chips/eeprom.c +@@ -34,6 +34,8 @@ + #include + #include + #include ++#include ++#include + + /* Addresses to scan */ + static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, +@@ -42,26 +44,7 @@ static unsigned short normal_i2c[] = { 0 + /* 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 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; +-}; +- ++ATOMIC_NOTIFIER_HEAD(eeprom_chain); + + static int eeprom_attach_adapter(struct i2c_adapter *adapter); + static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind); +@@ -190,6 +173,7 @@ static int eeprom_detect(struct i2c_adap + data->valid = 0; + mutex_init(&data->update_lock); + data->nature = UNKNOWN; ++ data->attr = &eeprom_attr; + + /* Tell the I2C layer a new client has arrived */ + if ((err = i2c_attach_client(new_client))) +@@ -213,6 +197,9 @@ static int eeprom_detect(struct i2c_adap + if (err) + goto exit_detach; + ++ /* call the notifier chain */ ++ atomic_notifier_call_chain(&eeprom_chain, EEPROM_REGISTER, data); ++ + return 0; + + exit_detach: +@@ -238,6 +225,41 @@ static int eeprom_detach_client(struct i + return 0; + } + ++/** ++ * 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); +Index: linux-2.6.19/include/linux/eeprom.h +=================================================================== +--- /dev/null ++++ linux-2.6.19/include/linux/eeprom.h +@@ -0,0 +1,71 @@ ++#ifndef _LINUX_EEPROM_H ++#define _LINUX_EEPROM_H ++/* ++ * $Id: 45-eeprom-new-notifier.patch,v 1.2 2006/03/27 11:10:19 azummo Exp $ ++ * ++ * 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 ++#include ++#include ++ ++/* 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 */ +Index: linux-2.6.19/include/linux/notifier.h +=================================================================== +--- linux-2.6.19.orig/include/linux/notifier.h ++++ linux-2.6.19/include/linux/notifier.h +@@ -187,5 +187,8 @@ extern int srcu_notifier_call_chain(stru + #define CPU_DOWN_FAILED 0x0006 /* CPU (unsigned)v NOT going down */ + #define CPU_DEAD 0x0007 /* CPU (unsigned)v dead */ + ++/* eeprom notifier chain */ ++#define EEPROM_REGISTER 0x0001 ++ + #endif /* __KERNEL__ */ + #endif /* _LINUX_NOTIFIER_H */ -- cgit v1.2.3