[PATCH] IXP4xx: Add Gateworks Cambria support.
Krzysztof Hałasa
khalasa at piap.pl
Wed Sep 18 03:13:55 EDT 2013
Signed-off-by: Krzysztof Hałasa <khalasa at piap.pl>
diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig
index 676e144..70c5cb9 100644
--- a/arch/arm/mach-ixp4xx/Kconfig
+++ b/arch/arm/mach-ixp4xx/Kconfig
@@ -25,6 +25,14 @@ config MACH_AVILA
Avila Network Platform. For more information on this platform,
see <file:Documentation/arm/IXP4xx>.
+config MACH_CAMBRIA
+ bool "Cambria"
+ select PCI
+ help
+ Say 'Y' here if you want your kernel to support the Gateworks
+ Cambria GW2350 board. For more information on this platform,
+ see <file:Documentation/arm/IXP4xx>.
+
config MACH_LOFT
bool "Loft"
depends on MACH_AVILA
@@ -158,7 +166,7 @@ config CPU_IXP46X
config CPU_IXP43X
bool
- depends on MACH_KIXRP435
+ depends on MACH_KIXRP435 || MACH_CAMBRIA
default y
config MACH_GTWX5715
diff --git a/arch/arm/mach-ixp4xx/Makefile b/arch/arm/mach-ixp4xx/Makefile
index eded94c..a7aa6a5 100644
--- a/arch/arm/mach-ixp4xx/Makefile
+++ b/arch/arm/mach-ixp4xx/Makefile
@@ -23,6 +23,7 @@ obj-y += common.o
obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o
obj-$(CONFIG_MACH_AVILA) += avila-setup.o
+obj-$(CONFIG_MACH_CAMBRIA) += cambria.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/arch/arm/mach-ixp4xx/cambria.c b/arch/arm/mach-ixp4xx/cambria.c
new file mode 100644
index 0000000..30ddfe0
--- /dev/null
+++ b/arch/arm/mach-ixp4xx/cambria.c
@@ -0,0 +1,245 @@
+/*
+ * Gateworks Cambria GW2350 platform support
+ * Portions based on OpenWRT.
+ */
+
+#include <linux/device.h>
+#include <linux/i2c.h>
+#include <linux/i2c-gpio.h>
+#include <linux/i2c/at24.h>
+#include <linux/if_ether.h>
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/kernel.h>
+#include <linux/leds.h>
+#include <linux/pci.h>
+#include <linux/serial_8250.h>
+#include <linux/types.h>
+#include <linux/usb/ehci_pdriver.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
+
+static struct platform_device cambria_flash = {
+ .name = "IXP4XX-Flash",
+ .id = 0,
+ .num_resources = 1,
+ .resource = &(struct resource) {
+ .start = IXP4XX_EXP_BUS_BASE(0),
+ .end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ .dev.platform_data = &(struct flash_platform_data) {
+ .map_name = "cfi_probe",
+ .width = 2,
+ },
+};
+
+static struct platform_device cambria_i2c = {
+ .name = "i2c-gpio",
+ .id = 0,
+ .dev.platform_data = &(struct i2c_gpio_platform_data) {
+ .sda_pin = 7,
+ .scl_pin = 6,
+ },
+};
+
+static struct eth_plat_info cambria_eth0_pdata = {
+ .phy = 1,
+ .rxq = 4,
+ .txreadyq = 21,
+};
+
+static struct eth_plat_info cambria_eth1_pdata = {
+ .phy = 2,
+ .rxq = 2,
+ .txreadyq = 19,
+};
+
+static struct platform_device cambria_eth0 = {
+ .name = "ixp4xx_eth",
+ .id = IXP4XX_ETH_NPEC,
+ .dev.platform_data = &cambria_eth0_pdata,
+};
+
+static struct platform_device cambria_eth1 = {
+ .name = "ixp4xx_eth",
+ .id = IXP4XX_ETH_NPEA,
+ .dev.platform_data = &cambria_eth1_pdata,
+};
+
+static struct platform_device cambria_uart = {
+ .name = "serial8250",
+ .id = PLAT8250_DEV_PLATFORM,
+ .num_resources = 1,
+ .resource = &(struct resource) {
+ .start = IXP4XX_UART1_BASE_PHYS,
+ .end = IXP4XX_UART1_BASE_PHYS + 0x0fff,
+ .flags = IORESOURCE_MEM,
+ },
+ .dev.platform_data = (struct plat_serial8250_port[]) {
+ {
+ .mapbase = IXP4XX_UART1_BASE_PHYS,
+ .membase = (char __iomem *)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,
+ },
+ { },
+ }
+};
+
+static struct platform_device cambria_leds = {
+ .name = "leds-gpio",
+ .id = -1,
+ .dev.platform_data = &(struct gpio_led_platform_data) {
+ .num_leds = 1,
+ .leds = &(struct gpio_led) {
+ .name = "user",
+ .gpio = 5,
+ .active_low = 1,
+ },
+ },
+};
+
+static struct usb_ehci_pdata cambria_usb_pdata = {
+ .caps_offset = 0x100,
+ .has_tt = 1,
+ .big_endian_desc = 1,
+ .big_endian_mmio = 1,
+};
+
+static struct platform_device cambria_usb0 = {
+ .name = "ehci-platform",
+ .id = 0,
+ .resource = (struct resource[]) {
+ {
+ .start = IXP4XX_EHCI1_BASE_PHYS,
+ .end = IXP4XX_EHCI1_BASE_PHYS + IXP4XX_EHCI_REGION_SIZE - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .start = 32,
+ .flags = IORESOURCE_IRQ,
+ },
+ },
+ .num_resources = 2,
+ .dev.platform_data = &cambria_usb_pdata,
+};
+
+static struct platform_device cambria_usb1 = {
+ .name = "ehci-platform",
+ .id = 1,
+ .resource = (struct resource[]) {
+ {
+ .start = IXP4XX_EHCI2_BASE_PHYS,
+ .end = IXP4XX_EHCI2_BASE_PHYS + IXP4XX_EHCI_REGION_SIZE - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .start = 33,
+ .flags = IORESOURCE_IRQ,
+ },
+ },
+ .num_resources = 2,
+ .dev.platform_data = &cambria_usb_pdata,
+};
+
+static struct platform_device *cambria_devices[] __initdata = {
+ &cambria_flash,
+ &cambria_i2c,
+ &cambria_eth0,
+ &cambria_eth1,
+ &cambria_uart,
+ &cambria_leds,
+ &cambria_usb0,
+ &cambria_usb1,
+};
+
+static void at24_setup(struct memory_accessor *mem_acc, void *context)
+{
+ char mac_addr[ETH_ALEN];
+
+ /* Read MAC addresses */
+ if (mem_acc->read(mem_acc, mac_addr, 0x100, ETH_ALEN) == ETH_ALEN)
+ memcpy(&cambria_eth0_pdata.hwaddr, mac_addr, ETH_ALEN);
+
+ if (mem_acc->read(mem_acc, mac_addr, 0x106, ETH_ALEN) == ETH_ALEN)
+ memcpy(&cambria_eth1_pdata.hwaddr, mac_addr, ETH_ALEN);
+}
+
+static struct at24_platform_data cambria_eeprom_info = {
+ .byte_len = 1024,
+ .page_size = 16,
+ .flags = AT24_FLAG_READONLY,
+ .setup = at24_setup,
+};
+
+static struct i2c_board_info __initdata cambria_i2c_board_info[] = {
+ {
+ I2C_BOARD_INFO("ad7418", 0x28),
+ },
+ {
+ I2C_BOARD_INFO("24c08", 0x50),
+ .platform_data = &cambria_eeprom_info,
+ },
+};
+
+static void __init cambria_init(void)
+{
+ ixp4xx_sys_init();
+ platform_add_devices(cambria_devices, ARRAY_SIZE(cambria_devices));
+ i2c_register_board_info(0, cambria_i2c_board_info,
+ ARRAY_SIZE(cambria_i2c_board_info));
+}
+
+#ifdef CONFIG_PCI
+void __init cambria_pci_preinit(void)
+{
+ irq_set_irq_type(IRQ_IXP4XX_GPIO11, IRQ_TYPE_LEVEL_LOW);
+ ixp4xx_pci_preinit();
+}
+
+static int __init cambria_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+{
+ switch (slot) {
+ case 1:
+ return IRQ_IXP4XX_GPIO11;
+ default:
+ return -1;
+ }
+}
+
+struct hw_pci cambria_pci __initdata = {
+ .nr_controllers = 1,
+ .ops = &ixp4xx_ops,
+ .preinit = cambria_pci_preinit,
+ .setup = ixp4xx_setup,
+ .map_irq = cambria_map_irq,
+};
+
+int __init cambria_pci_init(void)
+{
+ if (machine_is_cambria())
+ pci_common_init(&cambria_pci);
+ return 0;
+}
+
+subsys_initcall(cambria_pci_init);
+#endif /* CONFIG_PCI */
+
+MACHINE_START(CAMBRIA, "Gateworks Cambria")
+ /* Maintainer: Krzysztof Halasa */
+ .map_io = ixp4xx_map_io,
+ .init_early = ixp4xx_init_early,
+ .init_irq = ixp4xx_init_irq,
+ .init_time = ixp4xx_timer_init,
+ .atag_offset = 0x0100,
+ .init_machine = cambria_init,
+#ifdef CONFIG_PCI
+ .dma_zone_size = SZ_64M,
+#endif
+ .restart = ixp4xx_restart,
+MACHINE_END
diff --git a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h
index c5bae9c..f6ced67 100644
--- a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h
+++ b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h
@@ -595,6 +595,13 @@
#define DCMD_LENGTH 0x01fff /* length mask (max = 8K - 1) */
+/*
+ * EHCI USB host registers
+ */
+#define IXP4XX_EHCI1_BASE_PHYS 0xCD000000
+#define IXP4XX_EHCI2_BASE_PHYS 0xCE000000
+#define IXP4XX_EHCI_REGION_SIZE 0x00000200
+
/* "fuse" bits of IXP_EXP_CFG2 */
/* All IXP4xx CPUs */
#define IXP4XX_FEATURE_RCOMP (1 << 0)
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
index a10297d..9ada1a7 100644
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -261,6 +261,7 @@ halibut MACH_HALIBUT HALIBUT 1439
trout MACH_TROUT TROUT 1440
tct_hammer MACH_TCT_HAMMER TCT_HAMMER 1460
herald MACH_HERALD HERALD 1461
+cambria MACH_CAMBRIA CAMBRIA 1468
sim_one MACH_SIM_ONE SIM_ONE 1476
jive MACH_JIVE JIVE 1490
sam9_l9260 MACH_SAM9_L9260 SAM9_L9260 1501
More information about the linux-arm-kernel
mailing list