1293840b9SJohn Crispin /* 2293840b9SJohn Crispin * This program is free software; you can redistribute it and/or modify it 3293840b9SJohn Crispin * under the terms of the GNU General Public License version 2 as published 4293840b9SJohn Crispin * by the Free Software Foundation. 5293840b9SJohn Crispin * 6293840b9SJohn Crispin * Parts of this file are based on Ralink's 2.6.21 BSP 7293840b9SJohn Crispin * 8293840b9SJohn Crispin * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 9293840b9SJohn Crispin * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> 10293840b9SJohn Crispin * Copyright (C) 2013 John Crispin <blogic@openwrt.org> 11293840b9SJohn Crispin */ 12293840b9SJohn Crispin 13293840b9SJohn Crispin #include <linux/kernel.h> 14293840b9SJohn Crispin #include <linux/init.h> 15293840b9SJohn Crispin #include <linux/module.h> 16293840b9SJohn Crispin 17293840b9SJohn Crispin #include <asm/mipsregs.h> 18293840b9SJohn Crispin #include <asm/mach-ralink/ralink_regs.h> 19293840b9SJohn Crispin #include <asm/mach-ralink/rt3883.h> 20293840b9SJohn Crispin 21293840b9SJohn Crispin #include "common.h" 22293840b9SJohn Crispin 23293840b9SJohn Crispin static struct ralink_pinmux_grp mode_mux[] = { 24293840b9SJohn Crispin { 25293840b9SJohn Crispin .name = "i2c", 26293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_I2C, 27293840b9SJohn Crispin .gpio_first = RT3883_GPIO_I2C_SD, 28293840b9SJohn Crispin .gpio_last = RT3883_GPIO_I2C_SCLK, 29293840b9SJohn Crispin }, { 30293840b9SJohn Crispin .name = "spi", 31293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_SPI, 32293840b9SJohn Crispin .gpio_first = RT3883_GPIO_SPI_CS0, 33293840b9SJohn Crispin .gpio_last = RT3883_GPIO_SPI_MISO, 34293840b9SJohn Crispin }, { 35293840b9SJohn Crispin .name = "uartlite", 36293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_UART1, 37293840b9SJohn Crispin .gpio_first = RT3883_GPIO_UART1_TXD, 38293840b9SJohn Crispin .gpio_last = RT3883_GPIO_UART1_RXD, 39293840b9SJohn Crispin }, { 40293840b9SJohn Crispin .name = "jtag", 41293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_JTAG, 42293840b9SJohn Crispin .gpio_first = RT3883_GPIO_JTAG_TDO, 43293840b9SJohn Crispin .gpio_last = RT3883_GPIO_JTAG_TCLK, 44293840b9SJohn Crispin }, { 45293840b9SJohn Crispin .name = "mdio", 46293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_MDIO, 47293840b9SJohn Crispin .gpio_first = RT3883_GPIO_MDIO_MDC, 48293840b9SJohn Crispin .gpio_last = RT3883_GPIO_MDIO_MDIO, 49293840b9SJohn Crispin }, { 50293840b9SJohn Crispin .name = "ge1", 51293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_GE1, 52293840b9SJohn Crispin .gpio_first = RT3883_GPIO_GE1_TXD0, 53293840b9SJohn Crispin .gpio_last = RT3883_GPIO_GE1_RXCLK, 54293840b9SJohn Crispin }, { 55293840b9SJohn Crispin .name = "ge2", 56293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_GE2, 57293840b9SJohn Crispin .gpio_first = RT3883_GPIO_GE2_TXD0, 58293840b9SJohn Crispin .gpio_last = RT3883_GPIO_GE2_RXCLK, 59293840b9SJohn Crispin }, { 60293840b9SJohn Crispin .name = "pci", 61293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_PCI, 62293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 63293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 64293840b9SJohn Crispin }, { 65293840b9SJohn Crispin .name = "lna a", 66293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_LNA_A, 67293840b9SJohn Crispin .gpio_first = RT3883_GPIO_LNA_PE_A0, 68293840b9SJohn Crispin .gpio_last = RT3883_GPIO_LNA_PE_A2, 69293840b9SJohn Crispin }, { 70293840b9SJohn Crispin .name = "lna g", 71293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_LNA_G, 72293840b9SJohn Crispin .gpio_first = RT3883_GPIO_LNA_PE_G0, 73293840b9SJohn Crispin .gpio_last = RT3883_GPIO_LNA_PE_G2, 74293840b9SJohn Crispin }, {0} 75293840b9SJohn Crispin }; 76293840b9SJohn Crispin 77293840b9SJohn Crispin static struct ralink_pinmux_grp uart_mux[] = { 78293840b9SJohn Crispin { 79293840b9SJohn Crispin .name = "uartf", 80293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_UARTF, 81293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 82293840b9SJohn Crispin .gpio_last = RT3883_GPIO_14, 83293840b9SJohn Crispin }, { 84293840b9SJohn Crispin .name = "pcm uartf", 85293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_PCM_UARTF, 86293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 87293840b9SJohn Crispin .gpio_last = RT3883_GPIO_14, 88293840b9SJohn Crispin }, { 89293840b9SJohn Crispin .name = "pcm i2s", 90293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_PCM_I2S, 91293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 92293840b9SJohn Crispin .gpio_last = RT3883_GPIO_14, 93293840b9SJohn Crispin }, { 94293840b9SJohn Crispin .name = "i2s uartf", 95293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_I2S_UARTF, 96293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 97293840b9SJohn Crispin .gpio_last = RT3883_GPIO_14, 98293840b9SJohn Crispin }, { 99293840b9SJohn Crispin .name = "pcm gpio", 100293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_PCM_GPIO, 101293840b9SJohn Crispin .gpio_first = RT3883_GPIO_11, 102293840b9SJohn Crispin .gpio_last = RT3883_GPIO_14, 103293840b9SJohn Crispin }, { 104293840b9SJohn Crispin .name = "gpio uartf", 105293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_GPIO_UARTF, 106293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 107293840b9SJohn Crispin .gpio_last = RT3883_GPIO_10, 108293840b9SJohn Crispin }, { 109293840b9SJohn Crispin .name = "gpio i2s", 110293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_GPIO_I2S, 111293840b9SJohn Crispin .gpio_first = RT3883_GPIO_7, 112293840b9SJohn Crispin .gpio_last = RT3883_GPIO_10, 113293840b9SJohn Crispin }, { 114293840b9SJohn Crispin .name = "gpio", 115293840b9SJohn Crispin .mask = RT3883_GPIO_MODE_GPIO, 116293840b9SJohn Crispin }, {0} 117293840b9SJohn Crispin }; 118293840b9SJohn Crispin 119293840b9SJohn Crispin static struct ralink_pinmux_grp pci_mux[] = { 120293840b9SJohn Crispin { 121293840b9SJohn Crispin .name = "pci-dev", 122293840b9SJohn Crispin .mask = 0, 123293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 124293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 125293840b9SJohn Crispin }, { 126293840b9SJohn Crispin .name = "pci-host2", 127293840b9SJohn Crispin .mask = 1, 128293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 129293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 130293840b9SJohn Crispin }, { 131293840b9SJohn Crispin .name = "pci-host1", 132293840b9SJohn Crispin .mask = 2, 133293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 134293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 135293840b9SJohn Crispin }, { 136293840b9SJohn Crispin .name = "pci-fnc", 137293840b9SJohn Crispin .mask = 3, 138293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 139293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 140293840b9SJohn Crispin }, { 141293840b9SJohn Crispin .name = "pci-gpio", 142293840b9SJohn Crispin .mask = 7, 143293840b9SJohn Crispin .gpio_first = RT3883_GPIO_PCI_AD0, 144293840b9SJohn Crispin .gpio_last = RT3883_GPIO_PCI_AD31, 145293840b9SJohn Crispin }, {0} 146293840b9SJohn Crispin }; 147293840b9SJohn Crispin 148293840b9SJohn Crispin static void rt3883_wdt_reset(void) 149293840b9SJohn Crispin { 150293840b9SJohn Crispin u32 t; 151293840b9SJohn Crispin 152293840b9SJohn Crispin /* enable WDT reset output on GPIO 2 */ 153293840b9SJohn Crispin t = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG1); 154293840b9SJohn Crispin t |= RT3883_SYSCFG1_GPIO2_AS_WDT_OUT; 155293840b9SJohn Crispin rt_sysc_w32(t, RT3883_SYSC_REG_SYSCFG1); 156293840b9SJohn Crispin } 157293840b9SJohn Crispin 158293840b9SJohn Crispin struct ralink_pinmux rt_gpio_pinmux = { 159293840b9SJohn Crispin .mode = mode_mux, 160293840b9SJohn Crispin .uart = uart_mux, 161293840b9SJohn Crispin .uart_shift = RT3883_GPIO_MODE_UART0_SHIFT, 162293840b9SJohn Crispin .uart_mask = RT3883_GPIO_MODE_UART0_MASK, 163293840b9SJohn Crispin .wdt_reset = rt3883_wdt_reset, 164293840b9SJohn Crispin .pci = pci_mux, 165293840b9SJohn Crispin .pci_shift = RT3883_GPIO_MODE_PCI_SHIFT, 166293840b9SJohn Crispin .pci_mask = RT3883_GPIO_MODE_PCI_MASK, 167293840b9SJohn Crispin }; 168293840b9SJohn Crispin 169293840b9SJohn Crispin void __init ralink_clk_init(void) 170293840b9SJohn Crispin { 171293840b9SJohn Crispin unsigned long cpu_rate, sys_rate; 172293840b9SJohn Crispin u32 syscfg0; 173293840b9SJohn Crispin u32 clksel; 174293840b9SJohn Crispin u32 ddr2; 175293840b9SJohn Crispin 176293840b9SJohn Crispin syscfg0 = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG0); 177293840b9SJohn Crispin clksel = ((syscfg0 >> RT3883_SYSCFG0_CPUCLK_SHIFT) & 178293840b9SJohn Crispin RT3883_SYSCFG0_CPUCLK_MASK); 179293840b9SJohn Crispin ddr2 = syscfg0 & RT3883_SYSCFG0_DRAM_TYPE_DDR2; 180293840b9SJohn Crispin 181293840b9SJohn Crispin switch (clksel) { 182293840b9SJohn Crispin case RT3883_SYSCFG0_CPUCLK_250: 183293840b9SJohn Crispin cpu_rate = 250000000; 184293840b9SJohn Crispin sys_rate = (ddr2) ? 125000000 : 83000000; 185293840b9SJohn Crispin break; 186293840b9SJohn Crispin case RT3883_SYSCFG0_CPUCLK_384: 187293840b9SJohn Crispin cpu_rate = 384000000; 188293840b9SJohn Crispin sys_rate = (ddr2) ? 128000000 : 96000000; 189293840b9SJohn Crispin break; 190293840b9SJohn Crispin case RT3883_SYSCFG0_CPUCLK_480: 191293840b9SJohn Crispin cpu_rate = 480000000; 192293840b9SJohn Crispin sys_rate = (ddr2) ? 160000000 : 120000000; 193293840b9SJohn Crispin break; 194293840b9SJohn Crispin case RT3883_SYSCFG0_CPUCLK_500: 195293840b9SJohn Crispin cpu_rate = 500000000; 196293840b9SJohn Crispin sys_rate = (ddr2) ? 166000000 : 125000000; 197293840b9SJohn Crispin break; 198293840b9SJohn Crispin } 199293840b9SJohn Crispin 200293840b9SJohn Crispin ralink_clk_add("cpu", cpu_rate); 201293840b9SJohn Crispin ralink_clk_add("10000100.timer", sys_rate); 202293840b9SJohn Crispin ralink_clk_add("10000120.watchdog", sys_rate); 203293840b9SJohn Crispin ralink_clk_add("10000500.uart", 40000000); 204293840b9SJohn Crispin ralink_clk_add("10000b00.spi", sys_rate); 205293840b9SJohn Crispin ralink_clk_add("10000c00.uartlite", 40000000); 206293840b9SJohn Crispin ralink_clk_add("10100000.ethernet", sys_rate); 207293840b9SJohn Crispin } 208293840b9SJohn Crispin 209293840b9SJohn Crispin void __init ralink_of_remap(void) 210293840b9SJohn Crispin { 211293840b9SJohn Crispin rt_sysc_membase = plat_of_remap_node("ralink,rt3883-sysc"); 212293840b9SJohn Crispin rt_memc_membase = plat_of_remap_node("ralink,rt3883-memc"); 213293840b9SJohn Crispin 214293840b9SJohn Crispin if (!rt_sysc_membase || !rt_memc_membase) 215293840b9SJohn Crispin panic("Failed to remap core resources"); 216293840b9SJohn Crispin } 217293840b9SJohn Crispin 218293840b9SJohn Crispin void prom_soc_init(struct ralink_soc_info *soc_info) 219293840b9SJohn Crispin { 220293840b9SJohn Crispin void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT3883_SYSC_BASE); 221293840b9SJohn Crispin const char *name; 222293840b9SJohn Crispin u32 n0; 223293840b9SJohn Crispin u32 n1; 224293840b9SJohn Crispin u32 id; 225293840b9SJohn Crispin 226293840b9SJohn Crispin n0 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID0_3); 227293840b9SJohn Crispin n1 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID4_7); 228293840b9SJohn Crispin id = __raw_readl(sysc + RT3883_SYSC_REG_REVID); 229293840b9SJohn Crispin 230293840b9SJohn Crispin if (n0 == RT3883_CHIP_NAME0 && n1 == RT3883_CHIP_NAME1) { 231293840b9SJohn Crispin soc_info->compatible = "ralink,rt3883-soc"; 232293840b9SJohn Crispin name = "RT3883"; 233293840b9SJohn Crispin } else { 234293840b9SJohn Crispin panic("rt3883: unknown SoC, n0:%08x n1:%08x", n0, n1); 235293840b9SJohn Crispin } 236293840b9SJohn Crispin 237293840b9SJohn Crispin snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN, 238293840b9SJohn Crispin "Ralink %s ver:%u eco:%u", 239293840b9SJohn Crispin name, 240293840b9SJohn Crispin (id >> RT3883_REVID_VER_ID_SHIFT) & RT3883_REVID_VER_ID_MASK, 241293840b9SJohn Crispin (id & RT3883_REVID_ECO_ID_MASK)); 242fe98f612SJohn Crispin 243fe98f612SJohn Crispin soc_info->mem_base = RT3883_SDRAM_BASE; 244fe98f612SJohn Crispin soc_info->mem_size_min = RT3883_MEM_SIZE_MIN; 245fe98f612SJohn Crispin soc_info->mem_size_max = RT3883_MEM_SIZE_MAX; 246293840b9SJohn Crispin } 247