diff options
author | Imre Kaloz <kaloz@openwrt.org> | 2008-07-12 02:02:58 +0000 |
---|---|---|
committer | Imre Kaloz <kaloz@openwrt.org> | 2008-07-12 02:02:58 +0000 |
commit | 75aa30ada882353a8477ac83a609d4012726c540 (patch) | |
tree | a9007f11ef59f23ec761997f6092a6f517aaa501 /target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch | |
parent | fc80a0718439b330f4405d9875e936e2c783f43c (diff) | |
download | mtk-20170518-75aa30ada882353a8477ac83a609d4012726c540.zip mtk-20170518-75aa30ada882353a8477ac83a609d4012726c540.tar.gz mtk-20170518-75aa30ada882353a8477ac83a609d4012726c540.tar.bz2 |
nuke most of the old ixp4xx patchsets
SVN-Revision: 11778
Diffstat (limited to 'target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch')
-rw-r--r-- | target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch | 772 |
1 files changed, 0 insertions, 772 deletions
diff --git a/target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch b/target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch deleted file mode 100644 index bf77df7..0000000 --- a/target/linux/ixp4xx/patches-2.6.24/030-ixp4xx_fsg_board_support.patch +++ /dev/null @@ -1,772 +0,0 @@ -Index: linux-2.6.24.7/arch/arm/mach-ixp4xx/Kconfig -=================================================================== ---- linux-2.6.24.7.orig/arch/arm/mach-ixp4xx/Kconfig -+++ linux-2.6.24.7/arch/arm/mach-ixp4xx/Kconfig -@@ -125,6 +125,15 @@ config ARCH_IXDP4XX - depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435 - default y - -+config MACH_FSG -+ bool -+ prompt "Freecom FSG-3" -+ select PCI -+ help -+ Say 'Y' here if you want your kernel to support Freecom's -+ FSG-3 device. For more information on this platform, -+ see http://www.nslu2-linux.org/wiki/FSG3/HomePage -+ - # - # Certain registers and IRQs are only enabled if supporting IXP465 CPUs - # -Index: linux-2.6.24.7/arch/arm/mach-ixp4xx/Makefile -=================================================================== ---- linux-2.6.24.7.orig/arch/arm/mach-ixp4xx/Makefile -+++ linux-2.6.24.7/arch/arm/mach-ixp4xx/Makefile -@@ -15,6 +15,7 @@ obj-pci-$(CONFIG_MACH_NAS100D) += nas10 - obj-pci-$(CONFIG_MACH_DSMG600) += dsmg600-pci.o - obj-pci-$(CONFIG_MACH_GATEWAY7001) += gateway7001-pci.o - obj-pci-$(CONFIG_MACH_WG302V2) += wg302v2-pci.o -+obj-pci-$(CONFIG_MACH_FSG) += fsg-pci.o - - obj-y += common.o - -@@ -28,5 +29,6 @@ obj-$(CONFIG_MACH_NAS100D) += nas100d-se - obj-$(CONFIG_MACH_DSMG600) += dsmg600-setup.o dsmg600-power.o - obj-$(CONFIG_MACH_GATEWAY7001) += gateway7001-setup.o - obj-$(CONFIG_MACH_WG302V2) += wg302v2-setup.o -+obj-$(CONFIG_MACH_FSG) += fsg-setup.o - - obj-$(CONFIG_PCI) += $(obj-pci-$(CONFIG_PCI)) common-pci.o -Index: linux-2.6.24.7/arch/arm/mach-ixp4xx/fsg-pci.c -=================================================================== ---- /dev/null -+++ linux-2.6.24.7/arch/arm/mach-ixp4xx/fsg-pci.c -@@ -0,0 +1,71 @@ -+/* -+ * arch/arch/mach-ixp4xx/fsg-pci.c -+ * -+ * FSG board-level PCI initialization -+ * -+ * Author: Rod Whitby <rod@whitby.id.au> -+ * Maintainer: http://www.nslu2-linux.org/ -+ * -+ * based on ixdp425-pci.c: -+ * Copyright (C) 2002 Intel Corporation. -+ * Copyright (C) 2003-2004 MontaVista Software, Inc. -+ * -+ * 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 <linux/pci.h> -+#include <linux/init.h> -+#include <linux/irq.h> -+ -+#include <asm/mach/pci.h> -+#include <asm/mach-types.h> -+ -+void __init fsg_pci_preinit(void) -+{ -+ set_irq_type(IRQ_FSG_PCI_INTA, IRQT_LOW); -+ set_irq_type(IRQ_FSG_PCI_INTB, IRQT_LOW); -+ set_irq_type(IRQ_FSG_PCI_INTC, IRQT_LOW); -+ -+ ixp4xx_pci_preinit(); -+} -+ -+static int __init fsg_map_irq(struct pci_dev *dev, u8 slot, u8 pin) -+{ -+ static int pci_irq_table[FSG_PCI_IRQ_LINES] = { -+ IRQ_FSG_PCI_INTC, -+ IRQ_FSG_PCI_INTB, -+ IRQ_FSG_PCI_INTA, -+ }; -+ -+ int irq = -1; -+ slot = slot - 11; -+ -+ if (slot >= 1 && slot <= FSG_PCI_MAX_DEV && -+ pin >= 1 && pin <= FSG_PCI_IRQ_LINES) -+ irq = pci_irq_table[(slot - 1)]; -+ printk(KERN_INFO "%s: Mapped slot %d pin %d to IRQ %d\n", -+ __func__, slot, pin, irq); -+ -+ return irq; -+} -+ -+struct hw_pci fsg_pci __initdata = { -+ .nr_controllers = 1, -+ .preinit = fsg_pci_preinit, -+ .swizzle = pci_std_swizzle, -+ .setup = ixp4xx_setup, -+ .scan = ixp4xx_scan_bus, -+ .map_irq = fsg_map_irq, -+}; -+ -+int __init fsg_pci_init(void) -+{ -+ if (machine_is_fsg()) -+ pci_common_init(&fsg_pci); -+ return 0; -+} -+ -+subsys_initcall(fsg_pci_init); -Index: linux-2.6.24.7/arch/arm/mach-ixp4xx/fsg-setup.c -=================================================================== ---- /dev/null -+++ linux-2.6.24.7/arch/arm/mach-ixp4xx/fsg-setup.c -@@ -0,0 +1,275 @@ -+/* -+ * arch/arm/mach-ixp4xx/fsg-setup.c -+ * -+ * FSG board-setup -+ * -+ * Copyright (C) 2008 Rod Whitby <rod@whitby.id.au> -+ * -+ * based on ixdp425-setup.c: -+ * Copyright (C) 2003-2004 MontaVista Software, Inc. -+ * based on nslu2-power.c -+ * Copyright (C) 2005 Tower Technologies -+ * -+ * Author: Rod Whitby <rod@whitby.id.au> -+ * Maintainers: http://www.nslu2-linux.org/ -+ * -+ */ -+ -+#include <linux/if_ether.h> -+#include <linux/irq.h> -+#include <linux/serial.h> -+#include <linux/serial_8250.h> -+#include <linux/leds.h> -+#include <linux/reboot.h> -+#include <linux/i2c.h> -+#include <linux/i2c-gpio.h> -+ -+#include <asm/mach-types.h> -+#include <asm/mach/arch.h> -+#include <asm/mach/flash.h> -+#include <asm/io.h> -+#include <asm/gpio.h> -+ -+static struct flash_platform_data fsg_flash_data = { -+ .map_name = "cfi_probe", -+ .width = 2, -+}; -+ -+static struct resource fsg_flash_resource = { -+ .flags = IORESOURCE_MEM, -+}; -+ -+static struct platform_device fsg_flash = { -+ .name = "IXP4XX-Flash", -+ .id = 0, -+ .dev.platform_data = &fsg_flash_data, -+ .num_resources = 1, -+ .resource = &fsg_flash_resource, -+}; -+ -+static struct i2c_gpio_platform_data fsg_i2c_gpio_data = { -+ .sda_pin = FSG_SDA_PIN, -+ .scl_pin = FSG_SCL_PIN, -+}; -+ -+static struct platform_device fsg_i2c_gpio = { -+ .name = "i2c-gpio", -+ .id = 0, -+ .dev = { -+ .platform_data = &fsg_i2c_gpio_data, -+ }, -+}; -+ -+static struct i2c_board_info __initdata fsg_i2c_board_info [] = { -+ { -+ I2C_BOARD_INFO("rtc-isl1208", 0x6f), -+ }, -+}; -+ -+static struct resource fsg_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 fsg_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 fsg_uart = { -+ .name = "serial8250", -+ .id = PLAT8250_DEV_PLATFORM, -+ .dev.platform_data = fsg_uart_data, -+ .num_resources = ARRAY_SIZE(fsg_uart_resources), -+ .resource = fsg_uart_resources, -+}; -+ -+static struct platform_device fsg_leds = { -+ .name = "fsg-led", -+ .id = -1, -+}; -+ -+/* Built-in 10/100 Ethernet MAC interfaces */ -+static struct eth_plat_info fsg_plat_eth[] = { -+ { -+ .phy = 5, -+ .rxq = 3, -+ .txreadyq = 20, -+ }, { -+ .phy = 4, -+ .rxq = 4, -+ .txreadyq = 21, -+ } -+}; -+ -+static struct platform_device fsg_eth[] = { -+ { -+ .name = "ixp4xx_eth", -+ .id = IXP4XX_ETH_NPEB, -+ .dev.platform_data = fsg_plat_eth, -+ }, { -+ .name = "ixp4xx_eth", -+ .id = IXP4XX_ETH_NPEC, -+ .dev.platform_data = fsg_plat_eth + 1, -+ } -+}; -+ -+static struct platform_device *fsg_devices[] __initdata = { -+ &fsg_i2c_gpio, -+ &fsg_flash, -+ &fsg_leds, -+ &fsg_eth[0], -+ &fsg_eth[1], -+}; -+ -+static void fsg_power_off(void) -+{ -+ printk(KERN_INFO "Restarting system.\n"); -+ machine_restart(NULL); -+} -+ -+static irqreturn_t fsg_power_handler(int irq, void *dev_id) -+{ -+ /* Signal init to do the ctrlaltdel action, this will bypass init if -+ * it hasn't started and do a kernel_restart. -+ */ -+ ctrl_alt_del(); -+ -+ return IRQ_HANDLED; -+} -+ -+static irqreturn_t fsg_reset_handler(int irq, void *dev_id) -+{ -+ /* This is the paper-clip reset, it shuts the machine down directly. -+ */ -+ machine_power_off(); -+ -+ return IRQ_HANDLED; -+} -+ -+static void __init fsg_init(void) -+{ -+ DECLARE_MAC_BUF(mac_buf); -+ uint8_t __iomem *f; -+ int i; -+ -+ ixp4xx_sys_init(); -+ -+ fsg_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); -+ fsg_flash_resource.end = -+ IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; -+ -+ *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; -+ *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; -+ -+ /* Configure CS2 for operation, 8bit and writable */ -+ *IXP4XX_EXP_CS2 = 0xbfff0002; -+ -+ i2c_register_board_info(0, fsg_i2c_board_info, -+ ARRAY_SIZE(fsg_i2c_board_info)); -+ -+ /* This is only useful on a modified machine, but it is valuable -+ * to have it first in order to see debug messages, and so that -+ * it does *not* get removed if platform_add_devices fails! -+ */ -+ (void)platform_device_register(&fsg_uart); -+ -+ platform_add_devices(fsg_devices, ARRAY_SIZE(fsg_devices)); -+ -+ pm_power_off = fsg_power_off; -+ -+ set_irq_type(gpio_to_irq(FSG_RB_GPIO), IRQT_LOW); -+ if (request_irq(gpio_to_irq(FSG_RB_GPIO), &fsg_reset_handler, -+ IRQF_DISABLED, "FSG reset button", NULL) < 0) { -+ -+ printk(KERN_DEBUG "Reset Button IRQ %d not available\n", -+ gpio_to_irq(FSG_RB_GPIO)); -+ } -+ -+ set_irq_type(gpio_to_irq(FSG_SB_GPIO), IRQT_LOW); -+ if (request_irq(gpio_to_irq(FSG_SB_GPIO), &fsg_power_handler, -+ IRQF_DISABLED, "FSG power button", NULL) < 0) { -+ -+ printk(KERN_DEBUG "Power Button IRQ %d not available\n", -+ gpio_to_irq(FSG_SB_GPIO)); -+ } -+ -+ /* -+ * Map in a portion of the flash and read the MAC addresses. -+ * Since it is stored in BE in the flash itself, we need to -+ * byteswap it if we're in LE mode. -+ */ -+ f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); -+ if (f) { -+#ifdef __ARMEB__ -+ for (i = 0; i < 6; i++) { -+ fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); -+ fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); -+ } -+#else -+ -+ /* -+ Endian-swapped reads from unaligned addresses are -+ required to extract the two MACs from the big-endian -+ Redboot config area in flash. -+ */ -+ -+ fsg_plat_eth[0].hwaddr[0] = readb(f + 0x3C0421); -+ fsg_plat_eth[0].hwaddr[1] = readb(f + 0x3C0420); -+ fsg_plat_eth[0].hwaddr[2] = readb(f + 0x3C0427); -+ fsg_plat_eth[0].hwaddr[3] = readb(f + 0x3C0426); -+ fsg_plat_eth[0].hwaddr[4] = readb(f + 0x3C0425); -+ fsg_plat_eth[0].hwaddr[5] = readb(f + 0x3C0424); -+ -+ fsg_plat_eth[1].hwaddr[0] = readb(f + 0x3C0439); -+ fsg_plat_eth[1].hwaddr[1] = readb(f + 0x3C043F); -+ fsg_plat_eth[1].hwaddr[2] = readb(f + 0x3C043E); -+ fsg_plat_eth[1].hwaddr[3] = readb(f + 0x3C043D); -+ fsg_plat_eth[1].hwaddr[4] = readb(f + 0x3C043C); -+ fsg_plat_eth[1].hwaddr[5] = readb(f + 0x3C0443); -+#endif -+ iounmap(f); -+ } -+ printk(KERN_INFO "FSG: Using MAC address %s for port 0\n", -+ print_mac(mac_buf, fsg_plat_eth[0].hwaddr)); -+ printk(KERN_INFO "FSG: Using MAC address %s for port 1\n", -+ print_mac(mac_buf, fsg_plat_eth[1].hwaddr)); -+ -+} -+ -+MACHINE_START(FSG, "Freecom FSG-3") -+ /* Maintainer: www.nslu2-linux.org */ -+ .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 = fsg_init, -+MACHINE_END -+ -Index: linux-2.6.24.7/include/asm-arm/arch-ixp4xx/fsg.h -=================================================================== ---- /dev/null -+++ linux-2.6.24.7/include/asm-arm/arch-ixp4xx/fsg.h -@@ -0,0 +1,50 @@ -+/* -+ * include/asm-arm/arch-ixp4xx/fsg.h -+ * -+ * Freecom FSG-3 platform specific definitions -+ * -+ * Author: Rod Whitby <rod@whitby.id.au> -+ * Author: Tomasz Chmielewski <mangoo@wpkg.org> -+ * Maintainers: http://www.nslu2-linux.org -+ * -+ * Based on coyote.h by -+ * 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 <asm/hardware.h>" -+#endif -+ -+#define FSG_SDA_PIN 12 -+#define FSG_SCL_PIN 13 -+ -+/* -+ * FSG PCI IRQs -+ */ -+#define FSG_PCI_MAX_DEV 3 -+#define FSG_PCI_IRQ_LINES 3 -+ -+ -+/* PCI controller GPIO to IRQ pin mappings */ -+#define FSG_PCI_INTA_PIN 6 -+#define FSG_PCI_INTB_PIN 7 -+#define FSG_PCI_INTC_PIN 5 -+ -+/* Buttons */ -+ -+#define FSG_SB_GPIO 4 /* sync button */ -+#define FSG_RB_GPIO 9 /* reset button */ -+#define FSG_UB_GPIO 10 /* usb button */ -+ -+/* LEDs */ -+ -+#define FSG_LED_WLAN_BIT 0 -+#define FSG_LED_WAN_BIT 1 -+#define FSG_LED_SATA_BIT 2 -+#define FSG_LED_USB_BIT 4 -+#define FSG_LED_RING_BIT 5 -+#define FSG_LED_SYNC_BIT 7 -Index: linux-2.6.24.7/include/asm-arm/arch-ixp4xx/hardware.h -=================================================================== ---- linux-2.6.24.7.orig/include/asm-arm/arch-ixp4xx/hardware.h -+++ linux-2.6.24.7/include/asm-arm/arch-ixp4xx/hardware.h -@@ -45,5 +45,6 @@ - #include "nslu2.h" - #include "nas100d.h" - #include "dsmg600.h" -+#include "fsg.h" - - #endif /* _ASM_ARCH_HARDWARE_H */ -Index: linux-2.6.24.7/include/asm-arm/arch-ixp4xx/irqs.h -=================================================================== ---- linux-2.6.24.7.orig/include/asm-arm/arch-ixp4xx/irqs.h -+++ linux-2.6.24.7/include/asm-arm/arch-ixp4xx/irqs.h -@@ -128,4 +128,11 @@ - #define IRQ_DSMG600_PCI_INTE IRQ_IXP4XX_GPIO7 - #define IRQ_DSMG600_PCI_INTF IRQ_IXP4XX_GPIO6 - -+/* -+ * Freecom FSG-3 Board IRQs -+ */ -+#define IRQ_FSG_PCI_INTA IRQ_IXP4XX_GPIO6 -+#define IRQ_FSG_PCI_INTB IRQ_IXP4XX_GPIO7 -+#define IRQ_FSG_PCI_INTC IRQ_IXP4XX_GPIO5 -+ - #endif -Index: linux-2.6.24.7/drivers/leds/Kconfig -=================================================================== ---- linux-2.6.24.7.orig/drivers/leds/Kconfig -+++ linux-2.6.24.7/drivers/leds/Kconfig -@@ -48,6 +48,12 @@ config LEDS_IXP4XX - particular board must have LEDs and they must be connected - to the GPIO lines. If unsure, say Y. - -+config LEDS_FSG -+ tristate "LED Support for the Freecom FSG-3" -+ depends on LEDS_CLASS && MACH_FSG -+ help -+ This option enables support for the LEDs on the Freecom FSG-3. -+ - config LEDS_TOSA - tristate "LED Support for the Sharp SL-6000 series" - depends on LEDS_CLASS && PXA_SHARPSL -Index: linux-2.6.24.7/drivers/leds/Makefile -=================================================================== ---- linux-2.6.24.7.orig/drivers/leds/Makefile -+++ linux-2.6.24.7/drivers/leds/Makefile -@@ -20,6 +20,7 @@ obj-$(CONFIG_LEDS_COBALT_QUBE) += leds- - obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o - obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o - obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o -+obj-$(CONFIG_LEDS_FSG) += leds-fsg.o - - # LED Triggers - obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o -Index: linux-2.6.24.7/drivers/leds/leds-fsg.c -=================================================================== ---- /dev/null -+++ linux-2.6.24.7/drivers/leds/leds-fsg.c -@@ -0,0 +1,261 @@ -+/* -+ * LED Driver for the Freecom FSG-3 -+ * -+ * Copyright (c) 2008 Rod Whitby <rod@whitby.id.au> -+ * -+ * Author: Rod Whitby <rod@whitby.id.au> -+ * -+ * Based on leds-spitz.c -+ * Copyright 2005-2006 Openedhand Ltd. -+ * Author: Richard Purdie <rpurdie@openedhand.com> -+ * -+ * 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 <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/platform_device.h> -+#include <linux/leds.h> -+#include <asm/arch/hardware.h> -+#include <asm/io.h> -+ -+static short __iomem *latch_address; -+static unsigned short latch_value; -+ -+ -+static void fsg_led_wlan_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_WLAN_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_WLAN_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+static void fsg_led_wan_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_WAN_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_WAN_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+static void fsg_led_sata_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_SATA_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_SATA_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+static void fsg_led_usb_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_USB_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_USB_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+static void fsg_led_sync_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_SYNC_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_SYNC_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+static void fsg_led_ring_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ if (value) { -+ latch_value &= ~(1 << FSG_LED_RING_BIT); -+ *latch_address = latch_value; -+ } else { -+ latch_value |= (1 << FSG_LED_RING_BIT); -+ *latch_address = latch_value; -+ } -+} -+ -+ -+ -+static struct led_classdev fsg_wlan_led = { -+ .name = "fsg:blue:wlan", -+ .brightness_set = fsg_led_wlan_set, -+}; -+ -+static struct led_classdev fsg_wan_led = { -+ .name = "fsg:blue:wan", -+ .brightness_set = fsg_led_wan_set, -+}; -+ -+static struct led_classdev fsg_sata_led = { -+ .name = "fsg:blue:sata", -+ .brightness_set = fsg_led_sata_set, -+}; -+ -+static struct led_classdev fsg_usb_led = { -+ .name = "fsg:blue:usb", -+ .brightness_set = fsg_led_usb_set, -+}; -+ -+static struct led_classdev fsg_sync_led = { -+ .name = "fsg:blue:sync", -+ .brightness_set = fsg_led_sync_set, -+}; -+ -+static struct led_classdev fsg_ring_led = { -+ .name = "fsg:blue:ring", -+ .brightness_set = fsg_led_ring_set, -+}; -+ -+ -+ -+#ifdef CONFIG_PM -+static int fsg_led_suspend(struct platform_device *dev, pm_message_t state) -+{ -+ led_classdev_suspend(&fsg_wlan_led); -+ led_classdev_suspend(&fsg_wan_led); -+ led_classdev_suspend(&fsg_sata_led); -+ led_classdev_suspend(&fsg_usb_led); -+ led_classdev_suspend(&fsg_sync_led); -+ led_classdev_suspend(&fsg_ring_led); -+ return 0; -+} -+ -+static int fsg_led_resume(struct platform_device *dev) -+{ -+ led_classdev_resume(&fsg_wlan_led); -+ led_classdev_resume(&fsg_wan_led); -+ led_classdev_resume(&fsg_sata_led); -+ led_classdev_resume(&fsg_usb_led); -+ led_classdev_resume(&fsg_sync_led); -+ led_classdev_resume(&fsg_ring_led); -+ return 0; -+} -+#endif -+ -+ -+static int fsg_led_probe(struct platform_device *pdev) -+{ -+ int ret; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); -+ if (ret < 0) -+ goto failwlan; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_wan_led); -+ if (ret < 0) -+ goto failwan; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_sata_led); -+ if (ret < 0) -+ goto failsata; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_usb_led); -+ if (ret < 0) -+ goto failusb; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_sync_led); -+ if (ret < 0) -+ goto failsync; -+ -+ ret = led_classdev_register(&pdev->dev, &fsg_ring_led); -+ if (ret < 0) -+ goto failring; -+ -+ /* Map the LED chip select address space */ -+ latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); -+ if (!latch_address) { -+ ret = -ENOMEM; -+ goto failremap; -+ } -+ -+ latch_value = 0xffff; -+ *latch_address = latch_value; -+ -+ return ret; -+ -+ failremap: -+ led_classdev_unregister(&fsg_ring_led); -+ failring: -+ led_classdev_unregister(&fsg_sync_led); -+ failsync: -+ led_classdev_unregister(&fsg_usb_led); -+ failusb: -+ led_classdev_unregister(&fsg_sata_led); -+ failsata: -+ led_classdev_unregister(&fsg_wan_led); -+ failwan: -+ led_classdev_unregister(&fsg_wlan_led); -+ failwlan: -+ -+ return ret; -+} -+ -+static int fsg_led_remove(struct platform_device *pdev) -+{ -+ iounmap(latch_address); -+ -+ led_classdev_unregister(&fsg_wlan_led); -+ led_classdev_unregister(&fsg_wan_led); -+ led_classdev_unregister(&fsg_sata_led); -+ led_classdev_unregister(&fsg_usb_led); -+ led_classdev_unregister(&fsg_sync_led); -+ led_classdev_unregister(&fsg_ring_led); -+ -+ return 0; -+} -+ -+ -+static struct platform_driver fsg_led_driver = { -+ .probe = fsg_led_probe, -+ .remove = fsg_led_remove, -+#ifdef CONFIG_PM -+ .suspend = fsg_led_suspend, -+ .resume = fsg_led_resume, -+#endif -+ .driver = { -+ .name = "fsg-led", -+ }, -+}; -+ -+ -+static int __init fsg_led_init(void) -+{ -+ return platform_driver_register(&fsg_led_driver); -+} -+ -+static void __exit fsg_led_exit(void) -+{ -+ platform_driver_unregister(&fsg_led_driver); -+} -+ -+ -+module_init(fsg_led_init); -+module_exit(fsg_led_exit); -+ -+MODULE_AUTHOR("Rod Whitby <rod@whitby.id.au>"); -+MODULE_DESCRIPTION("Freecom FSG-3 LED driver"); -+MODULE_LICENSE("GPL"); |