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