From 083320dbe2b4027dc4e6bbd9a14aa87d76c8a2bb Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Sun, 30 Nov 2008 18:12:21 +0000 Subject: [PATCH] migrate gateworks board support to the new at24 eeprom driver SVN-Revision: 13450 --- ...at24_add_kernel_interface_read_write.patch | 134 +++++++++ target/linux/ixp4xx/config-2.6.27 | 4 +- .../patches-2.6.27/010-ixp43x_pci_fixup.patch | 11 + .../patches-2.6.27/190-cambria_support.patch | 262 ++++++++---------- .../191-cambria_optional_uart.patch | 12 +- .../192-cambria_gpio_device.patch | 9 +- .../294-eeprom_new_notifier.patch | 183 ------------ .../296-avila_mac_plat_info.patch | 43 --- .../patches-2.6.27/300-avila_fetch_mac.patch | 133 +++++---- .../ixp4xx/patches-2.6.27/301-avila_led.patch | 17 +- .../302-avila_gpio_device.patch | 2 +- .../303-avila_gw23x7_phy_quirk.patch | 4 +- 12 files changed, 361 insertions(+), 453 deletions(-) create mode 100644 target/linux/generic-2.6/patches-2.6.27/450-i2c_at24_add_kernel_interface_read_write.patch create mode 100644 target/linux/ixp4xx/patches-2.6.27/010-ixp43x_pci_fixup.patch delete mode 100644 target/linux/ixp4xx/patches-2.6.27/294-eeprom_new_notifier.patch delete mode 100644 target/linux/ixp4xx/patches-2.6.27/296-avila_mac_plat_info.patch diff --git a/target/linux/generic-2.6/patches-2.6.27/450-i2c_at24_add_kernel_interface_read_write.patch b/target/linux/generic-2.6/patches-2.6.27/450-i2c_at24_add_kernel_interface_read_write.patch new file mode 100644 index 0000000000..36a3e69125 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.27/450-i2c_at24_add_kernel_interface_read_write.patch @@ -0,0 +1,134 @@ +Subject: [PATCH 2/3] I2C: at24: add kernel interface for reading/writing EEPROM +Date: Monday 25 August 2008 +From: Kevin Hilman +To: davinci-linux-open-source@linux.davincidsp.com + +This patch adds an interface by which other kernel code can read/write +detected EEPROM. + +The platform code registers a 'setup' callback with the +at24_platform_data. When the at24 driver detects an EEPROM, it fills +out the read and write functions of at24_iface and calls the setup +callback. The platform code can then use the read/write functions in +the at24_iface struct for reading and writing the EEPROM. + +Original idea, review and updates by David Brownell + +Signed-off-by: Kevin Hilman +--- + drivers/i2c/chips/at24.c | 42 +++++++++++++++++++++++++++++++++++------- + include/linux/i2c/at24.h | 10 ++++++++++ + 2 files changed, 45 insertions(+), 7 deletions(-) + +--- a/drivers/i2c/chips/at24.c ++++ b/drivers/i2c/chips/at24.c +@@ -53,6 +53,7 @@ + + struct at24_data { + struct at24_platform_data chip; ++ struct at24_iface iface; + bool use_smbus; + + /* +@@ -264,13 +265,6 @@ static ssize_t at24_bin_read(struct kobj + + + /* +- * REVISIT: export at24_bin{read,write}() to let other kernel code use +- * eeprom data. For example, it might hold a board's Ethernet address, or +- * board-specific calibration data generated on the manufacturing floor. +- */ +- +- +-/* + * Note that if the hardware write-protect pin is pulled high, the whole + * chip is normally write protected. But there are plenty of product + * variants here, including OTP fuses and partial chip protect. +@@ -386,6 +380,30 @@ static ssize_t at24_bin_write(struct kob + + /*-------------------------------------------------------------------------*/ + ++/* ++ * This lets other kernel code access the eeprom data. For example, it ++ * might hold a board's Ethernet address, or board-specific calibration ++ * data generated on the manufacturing floor. ++ */ ++ ++static ssize_t at24_iface_read(struct at24_iface *iface, char *buf, ++ off_t offset, size_t count) ++{ ++ struct at24_data *at24 = container_of(iface, struct at24_data, iface); ++ ++ return at24_eeprom_read(at24, buf, offset, count); ++} ++ ++static ssize_t at24_iface_write(struct at24_iface *iface, char *buf, ++ off_t offset, size_t count) ++{ ++ struct at24_data *at24 = container_of(iface, struct at24_data, iface); ++ ++ return at24_eeprom_write(at24, buf, offset, count); ++} ++ ++/*-------------------------------------------------------------------------*/ ++ + static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) + { + struct at24_platform_data chip; +@@ -413,6 +431,9 @@ static int at24_probe(struct i2c_client + * is recommended anyhow. + */ + chip.page_size = 1; ++ ++ chip.setup = NULL; ++ chip.context = NULL; + } + + if (!is_power_of_2(chip.byte_len)) +@@ -449,6 +470,9 @@ static int at24_probe(struct i2c_client + goto err_out; + } + ++ at24->iface.read = at24_iface_read; ++ at24->iface.write = at24_iface_write; ++ + mutex_init(&at24->lock); + at24->use_smbus = use_smbus; + at24->chip = chip; +@@ -521,6 +545,10 @@ static int at24_probe(struct i2c_client + at24->write_max, + use_smbus ? ", use_smbus" : ""); + ++ /* export data to kernel code */ ++ if (chip.setup) ++ chip.setup(&at24->iface, chip.context); ++ + return 0; + + err_clients: +--- a/include/linux/i2c/at24.h ++++ b/include/linux/i2c/at24.h +@@ -15,6 +15,13 @@ + * is bigger than what the chip actually supports! + */ + ++struct at24_iface { ++ ssize_t (*read)(struct at24_iface *, char *buf, off_t offset, ++ size_t count); ++ ssize_t (*write)(struct at24_iface *, char *buf, off_t offset, ++ size_t count); ++}; ++ + struct at24_platform_data { + u32 byte_len; /* size (sum of all addr) */ + u16 page_size; /* for writes */ +@@ -23,6 +30,9 @@ struct at24_platform_data { + #define AT24_FLAG_READONLY 0x40 /* sysfs-entry will be read-only */ + #define AT24_FLAG_IRUGO 0x20 /* sysfs-entry will be world-readable */ + #define AT24_FLAG_TAKE8ADDR 0x10 /* take always 8 addresses (24c00) */ ++ ++ int (*setup)(struct at24_iface *, void *context); ++ void *context; + }; + + #endif /* _LINUX_AT24_H */ diff --git a/target/linux/ixp4xx/config-2.6.27 b/target/linux/ixp4xx/config-2.6.27 index a73f35faae..faf24a3e6b 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 0000000000..35af7f4fae --- /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 2089fe2700..87bfd09a4f 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 . - -+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 . -+ - 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 ++ * Copyright (C) 2008 Imre Kaloz + * + * based on coyote-setup.c: + * Copyright (C) 2003-2005 MontaVista Software, Inc. + * -+ * Author: Imre Kaloz ++ * Author: Imre Kaloz + */ + -+#include -+#include +#include ++#include ++#include ++#include +#include -+#include ++#include ++#include ++#include ++#include +#include +#include -+#include +#include +#include -+#ifdef CONFIG_SENSORS_EEPROM -+# include -+# include -+#endif ++#include ++#include ++#include + -+#include -+#include -+#include -+#include -+#include +#include +#include +#include +#include +#include ++#include + +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 */ + .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 . - #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 . ++ + 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 5305417ab9..946d685a19 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 +@@ -34,6 +34,7 @@ #include #include + #include +#include 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 a9ade59399..706d65e2f1 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 d11f8f01d4..0000000000 --- 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 - #include - #include -+#include -+#include - - /* 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 -+#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 */ ---- 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 8ea879fad8..0000000000 --- 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 aef7558dc4..2c87aadd97 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 #include #include @@ -11,21 +11,19 @@ #include #include #include -+#ifdef CONFIG_SENSORS_EEPROM -+# include -+# include -+#endif ++#include ++#include + #include #include -@@ -29,6 +37,13 @@ +@@ -29,6 +35,13 @@ #include #include +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 44aea4a78a..2bd0e16095 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 - #endif +@@ -24,6 +24,7 @@ + #include + #include +#include #include #include -@@ -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 f6bf36f27d..3b75a59f7e 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 f2ee488b90..5810d68b27 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) { -- 2.30.2