126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli/*
28e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss * MTX-1 platform devices registration (Au1500)
326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli *
4a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli * Copyright (C) 2007-2009, Florian Fainelli <florian@openwrt.org>
526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli *
626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * This program is free software; you can redistribute it and/or modify
726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * it under the terms of the GNU General Public License as published by
826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * the Free Software Foundation; either version 2 of the License, or
926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * (at your option) any later version.
1026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli *
1126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * This program is distributed in the hope that it will be useful,
1226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * but WITHOUT ANY WARRANTY; without even the implied warranty of
1326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * GNU General Public License for more details.
1526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli *
1626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * You should have received a copy of the GNU General Public License
1726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * along with this program; if not, write to the Free Software
1826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli */
2026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
2126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli#include <linux/init.h>
228e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <linux/interrupt.h>
238e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <linux/kernel.h>
2426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli#include <linux/platform_device.h>
2526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli#include <linux/leds.h>
261ff1a78cbb6fb6ceafac1b2cbdd72c939a7c9baeSergei Shtylyov#include <linux/gpio.h>
27f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli#include <linux/gpio_keys.h>
28f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli#include <linux/input.h>
299528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa#include <linux/mtd/partitions.h>
309528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa#include <linux/mtd/physmap.h>
319528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa#include <mtd/mtd-abi.h>
328e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <asm/bootinfo.h>
338e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <asm/reboot.h>
348e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <asm/mach-au1x00/au1000.h>
35bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli#include <asm/mach-au1x00/au1xxx_eth.h>
368e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss#include <prom.h>
378e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
388e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussconst char *get_system_type(void)
398e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
408e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	return "MTX-1";
418e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
428e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
438e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussvoid __init prom_init(void)
448e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
458e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	unsigned char *memsize_str;
468e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	unsigned long memsize;
478e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
488e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	prom_argc = fw_arg0;
498e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	prom_argv = (char **)fw_arg1;
508e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	prom_envp = (char **)fw_arg2;
518e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
528e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	prom_init_cmdline();
538e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
548e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	memsize_str = prom_getenv("memsize");
55d334c2b9de03c62767d04d8d927bc6d06f3fbd62Manuel Lauss	if (!memsize_str || kstrtoul(memsize_str, 0, &memsize))
568e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss		memsize = 0x04000000;
578e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	add_memory_region(0, memsize, BOOT_MEM_RAM);
588e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
598e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
608e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussvoid prom_putchar(unsigned char c)
618e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
628e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
638e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
648e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
658e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussstatic void mtx1_reset(char *c)
668e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
678e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	/* Jump to the reset vector */
688e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	__asm__ __volatile__("jr\t%0" : : "r"(0xbfc00000));
698e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
708e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
718e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussstatic void mtx1_power_off(void)
728e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
738e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	while (1)
748e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss		asm volatile (
758e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss		"	.set	mips32					\n"
768e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss		"	wait						\n"
778e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss		"	.set	mips0					\n");
788e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
798e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
808e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Laussvoid __init board_setup(void)
818e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss{
824bd5a5740e9cb20b63763b8b5dd04a51fba09029Florian Fainelli#if IS_ENABLED(CONFIG_USB_OHCI_HCD)
838e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	/* Enable USB power switch */
848e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(204, 0);
854bd5a5740e9cb20b63763b8b5dd04a51fba09029Florian Fainelli#endif /* IS_ENABLED(CONFIG_USB_OHCI_HCD) */
868e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
878e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	/* Initialize sys_pinfunc */
881d09de7dc76ef96a9a2c7c0244e20f12d68e6ef8Manuel Lauss	alchemy_wrsys(SYS_PF_NI2, AU1000_SYS_PINFUNC);
898e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
908e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	/* Initialize GPIO */
911d09de7dc76ef96a9a2c7c0244e20f12d68e6ef8Manuel Lauss	alchemy_wrsys(~0, AU1000_SYS_TRIOUTCLR);
928e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(0, 0);	/* Disable M66EN (PCI 66MHz) */
938e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(3, 1);	/* Disable PCI CLKRUN# */
948e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(1, 1);	/* Enable EXT_IO3 */
958e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(5, 0);	/* Disable eth PHY TX_ER */
968e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
978e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	/* Enable LED and set it to green */
988e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(211, 1);	/* green on */
998e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	alchemy_gpio_direction_output(212, 0);	/* red off */
1008e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
1018e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	pm_power_off = mtx1_power_off;
1028e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	_machine_halt = mtx1_power_off;
1038e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	_machine_restart = mtx1_reset;
1048e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
1058e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	printk(KERN_INFO "4G Systems MTX-1 Board\n");
1068e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss}
1078e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
1088e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss/******************************************************************************/
109bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli
110f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainellistatic struct gpio_keys_button mtx1_gpio_button[] = {
111f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	{
112f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli		.gpio = 207,
113f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli		.code = BTN_0,
114f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli		.desc = "System button",
115f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	}
116f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli};
117f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli
118f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainellistatic struct gpio_keys_platform_data mtx1_buttons_data = {
119f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	.buttons = mtx1_gpio_button,
120f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	.nbuttons = ARRAY_SIZE(mtx1_gpio_button),
121f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli};
122f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli
123f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainellistatic struct platform_device mtx1_button = {
124f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	.name = "gpio-keys",
125f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	.id = -1,
126f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	.dev = {
127f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli		.platform_data = &mtx1_buttons_data,
128f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	}
129f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli};
130f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli
13126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic struct resource mtx1_wdt_res[] = {
13226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	[0] = {
133b7f720d68c0042cc8ce496e31a61df79a77f1b48Manuel Lauss		.start	= 215,
134b7f720d68c0042cc8ce496e31a61df79a77f1b48Manuel Lauss		.end	= 215,
13526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.name	= "mtx1-wdt-gpio",
13626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.flags	= IORESOURCE_IRQ,
13726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	}
13826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
13926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
14026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic struct platform_device mtx1_wdt = {
14126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.name = "mtx1-wdt",
14226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.id = 0,
14326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.num_resources = ARRAY_SIZE(mtx1_wdt_res),
14426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.resource = mtx1_wdt_res,
14526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
14626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
14726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic struct gpio_led default_leds[] = {
14826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	{
14926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.name	= "mtx1:green",
15026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.gpio = 211,
15126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	}, {
15226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.name = "mtx1:red",
15326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.gpio = 212,
15426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	},
15526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
15626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
15726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic struct gpio_led_platform_data mtx1_led_data = {
15826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.num_leds = ARRAY_SIZE(default_leds),
15926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.leds = default_leds,
16026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
16126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
16226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic struct platform_device mtx1_gpio_leds = {
16326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.name = "leds-gpio",
16426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.id = -1,
16526c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	.dev = {
16626c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli		.platform_data = &mtx1_led_data,
16726c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	}
16826c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
16926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
1709528356308ecd2fb6368472615996a8602c02964Yoichi Yuasastatic struct mtd_partition mtx1_mtd_partitions[] = {
1719528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	{
1729528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.name	= "filesystem",
1739528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.size	= 0x01C00000,
1747034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle		.offset = 0,
1759528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	},
1769528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	{
1779528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.name	= "yamon",
1789528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.size	= 0x00100000,
1797034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle		.offset = MTDPART_OFS_APPEND,
1809528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.mask_flags = MTD_WRITEABLE,
1819528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	},
1829528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	{
1839528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.name	= "kernel",
1849528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.size	= 0x002c0000,
1857034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle		.offset = MTDPART_OFS_APPEND,
1869528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	},
1879528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	{
1889528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.name	= "yamon env",
1899528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.size	= 0x00040000,
1907034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle		.offset = MTDPART_OFS_APPEND,
1919528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	},
1929528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa};
1939528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa
1949528356308ecd2fb6368472615996a8602c02964Yoichi Yuasastatic struct physmap_flash_data mtx1_flash_data = {
1959528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.width		= 4,
1969528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.nr_parts	= 4,
1979528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.parts		= mtx1_mtd_partitions,
1989528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa};
1999528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa
2009528356308ecd2fb6368472615996a8602c02964Yoichi Yuasastatic struct resource mtx1_mtd_resource = {
2019528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.start	= 0x1e000000,
2029528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.end	= 0x1fffffff,
2039528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.flags	= IORESOURCE_MEM,
2049528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa};
2059528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa
2069528356308ecd2fb6368472615996a8602c02964Yoichi Yuasastatic struct platform_device mtx1_mtd = {
2079528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.name		= "physmap-flash",
2089528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.dev		= {
2099528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa		.platform_data	= &mtx1_flash_data,
2109528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	},
2119528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.num_resources	= 1,
2129528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	.resource	= &mtx1_mtd_resource,
2139528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa};
2149528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa
2157517de348663b08a808aff44b5300e817157a568Manuel Laussstatic struct resource alchemy_pci_host_res[] = {
2167517de348663b08a808aff44b5300e817157a568Manuel Lauss	[0] = {
2177517de348663b08a808aff44b5300e817157a568Manuel Lauss		.start	= AU1500_PCI_PHYS_ADDR,
2187517de348663b08a808aff44b5300e817157a568Manuel Lauss		.end	= AU1500_PCI_PHYS_ADDR + 0xfff,
2197517de348663b08a808aff44b5300e817157a568Manuel Lauss		.flags	= IORESOURCE_MEM,
2207517de348663b08a808aff44b5300e817157a568Manuel Lauss	},
2217517de348663b08a808aff44b5300e817157a568Manuel Lauss};
2227517de348663b08a808aff44b5300e817157a568Manuel Lauss
2237517de348663b08a808aff44b5300e817157a568Manuel Laussstatic int mtx1_pci_idsel(unsigned int devsel, int assert)
2247517de348663b08a808aff44b5300e817157a568Manuel Lauss{
2257517de348663b08a808aff44b5300e817157a568Manuel Lauss	/* This function is only necessary to support a proprietary Cardbus
2267517de348663b08a808aff44b5300e817157a568Manuel Lauss	 * adapter on the mtx-1 "singleboard" variant. It triggers a custom
2277517de348663b08a808aff44b5300e817157a568Manuel Lauss	 * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals.
2287517de348663b08a808aff44b5300e817157a568Manuel Lauss	 */
229143ec74eb10ac9a8c4357341a03b07ac4f04a761Bruno Randolf	udelay(1);
230143ec74eb10ac9a8c4357341a03b07ac4f04a761Bruno Randolf
2317517de348663b08a808aff44b5300e817157a568Manuel Lauss	if (assert && devsel != 0)
2327517de348663b08a808aff44b5300e817157a568Manuel Lauss		/* Suppress signal to Cardbus */
2337517de348663b08a808aff44b5300e817157a568Manuel Lauss		alchemy_gpio_set_value(1, 0);	/* set EXT_IO3 OFF */
2347517de348663b08a808aff44b5300e817157a568Manuel Lauss	else
2357517de348663b08a808aff44b5300e817157a568Manuel Lauss		alchemy_gpio_set_value(1, 1);	/* set EXT_IO3 ON */
2367517de348663b08a808aff44b5300e817157a568Manuel Lauss
2377517de348663b08a808aff44b5300e817157a568Manuel Lauss	udelay(1);
2387517de348663b08a808aff44b5300e817157a568Manuel Lauss	return 1;
2397517de348663b08a808aff44b5300e817157a568Manuel Lauss}
2407517de348663b08a808aff44b5300e817157a568Manuel Lauss
2417517de348663b08a808aff44b5300e817157a568Manuel Laussstatic const char mtx1_irqtab[][5] = {
2427517de348663b08a808aff44b5300e817157a568Manuel Lauss	[0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 00 - AdapterA-Slot0 (top) */
2437517de348663b08a808aff44b5300e817157a568Manuel Lauss	[1] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */
2447517de348663b08a808aff44b5300e817157a568Manuel Lauss	[2] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 02 - AdapterB-Slot0 (top) */
2457517de348663b08a808aff44b5300e817157a568Manuel Lauss	[3] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */
2467517de348663b08a808aff44b5300e817157a568Manuel Lauss	[4] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 04 - AdapterC-Slot0 (top) */
2477517de348663b08a808aff44b5300e817157a568Manuel Lauss	[5] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */
2487517de348663b08a808aff44b5300e817157a568Manuel Lauss	[6] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 06 - AdapterD-Slot0 (top) */
2497517de348663b08a808aff44b5300e817157a568Manuel Lauss	[7] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */
2507517de348663b08a808aff44b5300e817157a568Manuel Lauss};
2517517de348663b08a808aff44b5300e817157a568Manuel Lauss
2527517de348663b08a808aff44b5300e817157a568Manuel Laussstatic int mtx1_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
2537517de348663b08a808aff44b5300e817157a568Manuel Lauss{
2547517de348663b08a808aff44b5300e817157a568Manuel Lauss	return mtx1_irqtab[slot][pin];
2557517de348663b08a808aff44b5300e817157a568Manuel Lauss}
2567517de348663b08a808aff44b5300e817157a568Manuel Lauss
2577517de348663b08a808aff44b5300e817157a568Manuel Laussstatic struct alchemy_pci_platdata mtx1_pci_pd = {
2587517de348663b08a808aff44b5300e817157a568Manuel Lauss	.board_map_irq	 = mtx1_map_pci_irq,
2597517de348663b08a808aff44b5300e817157a568Manuel Lauss	.board_pci_idsel = mtx1_pci_idsel,
2607517de348663b08a808aff44b5300e817157a568Manuel Lauss	.pci_cfg_set	 = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
2617517de348663b08a808aff44b5300e817157a568Manuel Lauss			   PCI_CONFIG_CH |
2627517de348663b08a808aff44b5300e817157a568Manuel Lauss#if defined(__MIPSEB__)
2637517de348663b08a808aff44b5300e817157a568Manuel Lauss			   PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
2647517de348663b08a808aff44b5300e817157a568Manuel Lauss#else
2657517de348663b08a808aff44b5300e817157a568Manuel Lauss			   0,
2667517de348663b08a808aff44b5300e817157a568Manuel Lauss#endif
2677517de348663b08a808aff44b5300e817157a568Manuel Lauss};
2687517de348663b08a808aff44b5300e817157a568Manuel Lauss
2697517de348663b08a808aff44b5300e817157a568Manuel Laussstatic struct platform_device mtx1_pci_host = {
2707517de348663b08a808aff44b5300e817157a568Manuel Lauss	.dev.platform_data = &mtx1_pci_pd,
2717517de348663b08a808aff44b5300e817157a568Manuel Lauss	.name		= "alchemy-pci",
2727517de348663b08a808aff44b5300e817157a568Manuel Lauss	.id		= 0,
2737517de348663b08a808aff44b5300e817157a568Manuel Lauss	.num_resources	= ARRAY_SIZE(alchemy_pci_host_res),
2747517de348663b08a808aff44b5300e817157a568Manuel Lauss	.resource	= alchemy_pci_host_res,
2757517de348663b08a808aff44b5300e817157a568Manuel Lauss};
2767517de348663b08a808aff44b5300e817157a568Manuel Lauss
27708ebb250ef9473112273f780a777b4624a38856fBartlomiej Zolnierkiewiczstatic struct platform_device *mtx1_devs[] __initdata = {
2787517de348663b08a808aff44b5300e817157a568Manuel Lauss	&mtx1_pci_host,
27926c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	&mtx1_gpio_leds,
280f6ed10ab972b00cd57567a2ac9e393226840e458Florian Fainelli	&mtx1_wdt,
2819528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	&mtx1_button,
2829528356308ecd2fb6368472615996a8602c02964Yoichi Yuasa	&mtx1_mtd,
28326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli};
28426c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli
285bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainellistatic struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = {
286bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli	.phy_search_highest_addr	= 1,
2878e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	.phy1_search_mac0		= 1,
288bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli};
289bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli
29026c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainellistatic int __init mtx1_register_devices(void)
29126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli{
292a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli	int rc;
293a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli
2948e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	irq_set_irq_type(AU1500_GPIO204_INT, IRQ_TYPE_LEVEL_HIGH);
2958e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	irq_set_irq_type(AU1500_GPIO201_INT, IRQ_TYPE_LEVEL_LOW);
2968e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	irq_set_irq_type(AU1500_GPIO202_INT, IRQ_TYPE_LEVEL_LOW);
2978e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	irq_set_irq_type(AU1500_GPIO203_INT, IRQ_TYPE_LEVEL_LOW);
2988e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss	irq_set_irq_type(AU1500_GPIO205_INT, IRQ_TYPE_LEVEL_LOW);
2998e026910fcd46c3cfcdf5cff7ebba013bb8ec85cManuel Lauss
300bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli	au1xxx_override_eth_cfg(0, &mtx1_au1000_eth0_pdata);
301bf3a1eb85967dcbaae42f4fcb53c2392cec32677Florian Fainelli
302a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli	rc = gpio_request(mtx1_gpio_button[0].gpio,
303a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli					mtx1_gpio_button[0].desc);
304a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli	if (rc < 0) {
305a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli		printk(KERN_INFO "mtx1: failed to request %d\n",
306a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli					mtx1_gpio_button[0].gpio);
307a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli		goto out;
308a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli	}
309a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelli	gpio_direction_input(mtx1_gpio_button[0].gpio);
310a1b021d3992d9be03b0abec1a7ed78e713b94206Florian Fainelliout:
31126c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli	return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
31226c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelli}
31326c288f82c74dba08da6321c626c101a7aa8575bFlorian Fainelliarch_initcall(mtx1_register_devices);
314