diff -Naur linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-pci.c linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-pci.c --- linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-pci.c 1969-12-31 18:00:00.000000000 -0600 +++ linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-pci.c 2006-06-23 21:40:55.000000000 -0500 @@ -0,0 +1,74 @@ +/* + * DSM-G600 board-level PCI initialization + * + * Copyright (c) 2006 Tower Technologies + * Author: Alessandro Zummo + * + * based on ixdp425-pci.c: + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * Maintainer: http://www.nslu2-linux.org/ + * + * 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 + +void __init dsmg600_pci_preinit(void) +{ + set_irq_type(IRQ_DSMG600_PCI_INTA, IRQT_LOW); + set_irq_type(IRQ_DSMG600_PCI_INTB, IRQT_LOW); + set_irq_type(IRQ_DSMG600_PCI_INTC, IRQT_LOW); + set_irq_type(IRQ_DSMG600_PCI_INTD, IRQT_LOW); + set_irq_type(IRQ_DSMG600_PCI_INTE, IRQT_LOW); + set_irq_type(IRQ_DSMG600_PCI_INTF, IRQT_LOW); + + ixp4xx_pci_preinit(); +} + +static int __init dsmg600_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + static int pci_irq_table[DSMG600_PCI_MAX_DEV][DSMG600_PCI_IRQ_LINES] = + { + { IRQ_DSMG600_PCI_INTE, -1, -1 }, + { IRQ_DSMG600_PCI_INTA, -1, -1 }, + { IRQ_DSMG600_PCI_INTB, IRQ_DSMG600_PCI_INTC, IRQ_DSMG600_PCI_INTD }, + { IRQ_DSMG600_PCI_INTF, -1, -1 }, + }; + + int irq = -1; + + if (slot >= 1 && slot <= DSMG600_PCI_MAX_DEV && + pin >= 1 && pin <= DSMG600_PCI_IRQ_LINES) + irq = pci_irq_table[slot-1][pin-1]; + + return irq; +} + +struct hw_pci __initdata dsmg600_pci = { + .nr_controllers = 1, + .preinit = dsmg600_pci_preinit, + .swizzle = pci_std_swizzle, + .setup = ixp4xx_setup, + .scan = ixp4xx_scan_bus, + .map_irq = dsmg600_map_irq, +}; + +int __init dsmg600_pci_init(void) +{ + if (machine_is_dsmg600()) + pci_common_init(&dsmg600_pci); + + return 0; +} + +subsys_initcall(dsmg600_pci_init); diff -Naur linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-power.c linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-power.c --- linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-power.c 1969-12-31 18:00:00.000000000 -0600 +++ linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-power.c 2006-06-24 00:46:12.000000000 -0500 @@ -0,0 +1,69 @@ +/* + * arch/arm/mach-ixp4xx/dsmg600-power.c + * + * DSM-G600 Power/Reset driver + * Author: Michael Westerhof + * + * Based on nslu2-power.c + * Copyright (C) 2005 Tower Technologies + * Author: Alessandro Zummo + * + * which was based on nslu2-io.c + * Copyright (C) 2004 Karen Spearel + * + * Maintainers: http://www.nslu2-linux.org/ + * + * 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 + +static irqreturn_t dsmg600_reset_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + /* This is the paper-clip reset, it shuts the machine down directly. */ + + machine_power_off(); + + return IRQ_HANDLED; +} + +static int __init dsmg600_power_init(void) +{ + if (!(machine_is_dsmg600())) + return 0; + + set_irq_type(DSMG600_RB_IRQ, IRQT_LOW); + + if (request_irq(DSMG600_RB_IRQ, &dsmg600_reset_handler, + SA_INTERRUPT, "DSM-G600 reset button", NULL) < 0) { + + printk(KERN_DEBUG "Reset Button IRQ %d not available\n", + DSMG600_RB_IRQ); + + return -EIO; + } + + return 0; +} + +static void __exit dsmg600_power_exit(void) +{ + if (!(machine_is_dsmg600())) + return; + + free_irq(DSMG600_RB_IRQ, NULL); +} + +module_init(dsmg600_power_init); +module_exit(dsmg600_power_exit); + +MODULE_AUTHOR("Michael Westerhof "); +MODULE_DESCRIPTION("DSM-G600 Power/Reset driver"); +MODULE_LICENSE("GPL"); diff -Naur linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-setup.c linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-setup.c --- linux-2.6.17/arch/arm/mach-ixp4xx.orig/dsmg600-setup.c 1969-12-31 18:00:00.000000000 -0600 +++ linux-2.6.17/arch/arm/mach-ixp4xx/dsmg600-setup.c 2006-06-23 21:48:33.000000000 -0500 @@ -0,0 +1,176 @@ +/* + * DSM-G600 board-setup + * + * Copyright (c) 2006 Tower Technologies + * Author: Alessandro Zummo + * + * based ixdp425-setup.c: + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * Author: Alessandro Zummo + * Maintainers: http://www.nslu2-linux.org/ + */ + +#include +#include +#include + +#include +#include +#include + +static struct flash_platform_data dsmg600_flash_data = { + .map_name = "cfi_probe", + .width = 2, +}; + +static struct resource dsmg600_flash_resource = { + .flags = IORESOURCE_MEM, +}; + +static struct platform_device dsmg600_flash = { + .name = "IXP4XX-Flash", + .id = 0, + .dev.platform_data = &dsmg600_flash_data, + .num_resources = 1, + .resource = &dsmg600_flash_resource, +}; + +static struct ixp4xx_i2c_pins dsmg600_i2c_gpio_pins = { + .sda_pin = DSMG600_SDA_PIN, + .scl_pin = DSMG600_SCL_PIN, +}; + +static struct platform_device dsmg600_i2c_controller = { + .name = "IXP4XX-I2C", + .id = 0, + .dev.platform_data = &dsmg600_i2c_gpio_pins, + .num_resources = 0, +}; + +#ifdef CONFIG_LEDS_CLASS +static struct resource dsmg600_led_resources[] = { + { + .name = "power", + .start = DSMG600_LED_PWR, + .end = DSMG600_LED_PWR, + .flags = IXP4XX_GPIO_HIGH, + }, + { + .name = "wlan", + .start = DSMG600_LED_WLAN, + .end = DSMG600_LED_WLAN, + .flags = IXP4XX_GPIO_LOW, + }, +}; + +static struct platform_device dsmg600_leds = { + .name = "IXP4XX-GPIO-LED", + .id = -1, + .num_resources = ARRAY_SIZE(dsmg600_led_resources), + .resource = dsmg600_led_resources, +}; +#endif + +static struct resource dsmg600_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 dsmg600_uart_data[] = { + { + .mapbase = IXP4XX_UART1_BASE_PHYS, + .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, + .irq = IRQ_IXP4XX_UART1, + .flags = UPF_BOOT_AUTOCONF, + .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, + .iotype = UPIO_MEM, + .regshift = 2, + .uartclk = IXP4XX_UART_XTAL, + }, + { } +}; + +static struct platform_device dsmg600_uart = { + .name = "serial8250", + .id = PLAT8250_DEV_PLATFORM, + .dev.platform_data = dsmg600_uart_data, + .num_resources = 2, + .resource = dsmg600_uart_resources, +}; + +static struct platform_device *dsmg600_devices[] __initdata = { + &dsmg600_i2c_controller, + &dsmg600_flash, +}; + +static void dsmg600_power_off(void) +{ + /* enable the pwr cntl gpio */ + gpio_line_config(DSMG600_PO_GPIO, IXP4XX_GPIO_OUT); + + /* poweroff */ + gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); +} + +static void __init dsmg600_init(void) +{ + /* The DSM-G600 has a 33MHz crystal on board - 1.01% different + * from the typical value. + */ + +#ifndef FREQ + ixp4xx_set_board_tick_rate(66000000); +#endif + + ixp4xx_sys_init(); + + /* Make sure that GPIO14 and GPIO15 are not used as clocks */ + *IXP4XX_GPIO_GPCLKR = 0; + + dsmg600_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); + dsmg600_flash_resource.end = + IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; + + pm_power_off = dsmg600_power_off; + + /* The UART is required on the DSM-G600 (Redboot cannot use the + * NIC) -- do it here so that it does *not* get removed if + * platform_add_devices fails! + */ + (void)platform_device_register(&dsmg600_uart); + + platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices)); + +#ifdef CONFIG_LEDS_CLASS + /* We don't care whether or not this works. */ + (void)platform_device_register(&dsmg600_leds); +#endif +} + +MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") + /* Maintainer: www.nslu2-linux.org */ + .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, + .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, + .boot_params = 0x00000100, + .map_io = ixp4xx_map_io, + .init_irq = ixp4xx_init_irq, + .timer = &ixp4xx_timer, + .init_machine = dsmg600_init, +MACHINE_END diff -Naur linux-2.6.17/arch/arm/mach-ixp4xx.orig/Kconfig linux-2.6.17/arch/arm/mach-ixp4xx/Kconfig --- linux-2.6.17/arch/arm/mach-ixp4xx.orig/Kconfig 2006-06-23 23:08:53.000000000 -0500 +++ linux-2.6.17/arch/arm/mach-ixp4xx/Kconfig 2006-06-23 21:21:17.000000000 -0500 @@ -84,6 +84,15 @@ NAS 100d device. For more information on this platform, see http://www.nslu2-linux.org/wiki/NAS100d/HomePage +config MACH_DSMG600 + bool + prompt "D-Link DSM-G600 RevA" + select PCI + help + Say 'Y' here if you want your kernel to support D-Link's + DSM-G600 RevA device. For more information on this platform, + see http://www.nslu2-linux.org/wiki/DSMG600/HomePage + # # Avila and IXDP share the same source for now. Will change in future # diff -Naur linux-2.6.17/arch/arm/mach-ixp4xx.orig/Makefile linux-2.6.17/arch/arm/mach-ixp4xx/Makefile --- linux-2.6.17/arch/arm/mach-ixp4xx.orig/Makefile 2006-06-23 23:08:53.000000000 -0500 +++ linux-2.6.17/arch/arm/mach-ixp4xx/Makefile 2006-06-23 21:22:41.000000000 -0500 @@ -11,4 +11,4 @@ obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o gtwx5715-setup.o obj-$(CONFIG_MACH_NSLU2) += nslu2-pci.o nslu2-setup.o nslu2-power.o obj-$(CONFIG_MACH_NAS100D) += nas100d-pci.o nas100d-setup.o nas100d-power.o - +obj-$(CONFIG_MACH_DSMG600) += dsmg600-pci.o dsmg600-setup.o dsmg600-power.o diff -Naur linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/dsmg600.h linux-2.6.17/include/asm-arm/arch-ixp4xx/dsmg600.h --- linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/dsmg600.h 1969-12-31 18:00:00.000000000 -0600 +++ linux-2.6.17/include/asm-arm/arch-ixp4xx/dsmg600.h 2006-06-24 00:39:05.000000000 -0500 @@ -0,0 +1,73 @@ +/* + * DSM-G600 platform specific definitions + * + * Copyright (c) 2006 Tower Technologies + * Author: Alessandro Zummo + * + * based on ixdp425.h: + * 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 DSMG600_SDA_PIN 5 +#define DSMG600_SCL_PIN 4 + +/* + * DSMG600 PCI IRQs + */ +#define DSMG600_PCI_MAX_DEV 4 +#define DSMG600_PCI_IRQ_LINES 3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define DSMG600_PCI_INTA_PIN 11 +#define DSMG600_PCI_INTB_PIN 10 +#define DSMG600_PCI_INTC_PIN 9 +#define DSMG600_PCI_INTD_PIN 8 +#define DSMG600_PCI_INTE_PIN 7 +#define DSMG600_PCI_INTF_PIN 6 + +/* GPIO */ + +#define DSMG600_GPIO0 0 +#define DSMG600_GPIO1 1 +#define DSMG600_GPIO2 2 +#define DSMG600_GPIO3 3 +#define DSMG600_GPIO4 4 +#define DSMG600_GPIO5 5 +#define DSMG600_GPIO6 6 +#define DSMG600_GPIO7 7 +#define DSMG600_GPIO8 8 +#define DSMG600_GPIO9 9 +#define DSMG600_GPIO10 10 +#define DSMG600_GPIO11 11 +#define DSMG600_GPIO12 12 +#define DSMG600_GPIO13 13 +#define DSMG600_GPIO14 14 +#define DSMG600_GPIO15 15 + +/* Buttons */ + +#define DSMG600_PB_GPIO DSMG600_GPIO15 /* power button */ +#define DSMG600_PB_BM (1L << DSMG600_PB_GPIO) + +#define DSMG600_RB_GPIO DSMG600_GPIO3 /* reset button */ + +#define DSMG600_RB_IRQ IRQ_IXP4XX_GPIO3 + +#define DSMG600_PO_GPIO DSMG600_GPIO2 /* power off */ + +/* LEDs */ + +#define DSMG600_LED_PWR DSMG600_GPIO0 +#define DSMG600_LED_PWR_BM (1L << DSMG600_LED_PWR) + +#define DSMG600_LED_WLAN DSMG600_GPIO14 +#define DSMG600_LED_WLAN_BM (1L << DSMG600_LED_WLAN) diff -Naur linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/hardware.h linux-2.6.17/include/asm-arm/arch-ixp4xx/hardware.h --- linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/hardware.h 2006-06-23 23:04:16.000000000 -0500 +++ linux-2.6.17/include/asm-arm/arch-ixp4xx/hardware.h 2006-06-23 21:24:33.000000000 -0500 @@ -46,5 +46,6 @@ #include "prpmc1100.h" #include "nslu2.h" #include "nas100d.h" +#include "dsmg600.h" #endif /* _ASM_ARCH_HARDWARE_H */ diff -Naur linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/irqs.h linux-2.6.17/include/asm-arm/arch-ixp4xx/irqs.h --- linux-2.6.17/include/asm-arm/arch-ixp4xx.orig/irqs.h 2006-06-23 23:04:16.000000000 -0500 +++ linux-2.6.17/include/asm-arm/arch-ixp4xx/irqs.h 2006-06-23 21:26:42.000000000 -0500 @@ -109,4 +109,14 @@ #define IRQ_NAS100D_PCI_INTD IRQ_IXP4XX_GPIO8 #define IRQ_NAS100D_PCI_INTE IRQ_IXP4XX_GPIO7 +/* + * D-Link DSM-G600 RevA board IRQs + */ +#define IRQ_DSMG600_PCI_INTA IRQ_IXP4XX_GPIO11 +#define IRQ_DSMG600_PCI_INTB IRQ_IXP4XX_GPIO10 +#define IRQ_DSMG600_PCI_INTC IRQ_IXP4XX_GPIO9 +#define IRQ_DSMG600_PCI_INTD IRQ_IXP4XX_GPIO8 +#define IRQ_DSMG600_PCI_INTE IRQ_IXP4XX_GPIO7 +#define IRQ_DSMG600_PCI_INTF IRQ_IXP4XX_GPIO6 + #endif