Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: ralink: adds support for MT7620 SoC family

Add support code for mt7620 SOC.

The code detects the SoC and registers the clk / pinmux settings.

Signed-off-by: John Crispin <blogic@openwrt.org>
Acked-by: Gabor Juhos <juhosg@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/5177/

authored by

John Crispin and committed by
Ralf Baechle
594bde68 293840b9

+299
+76
arch/mips/include/asm/mach-ralink/mt7620.h
··· 1 + /* 2 + * This program is free software; you can redistribute it and/or modify it 3 + * under the terms of the GNU General Public License version 2 as published 4 + * by the Free Software Foundation. 5 + * 6 + * Parts of this file are based on Ralink's 2.6.21 BSP 7 + * 8 + * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> 9 + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 10 + * Copyright (C) 2013 John Crispin <blogic@openwrt.org> 11 + */ 12 + 13 + #ifndef _MT7620_REGS_H_ 14 + #define _MT7620_REGS_H_ 15 + 16 + #define MT7620_SYSC_BASE 0x10000000 17 + 18 + #define SYSC_REG_CHIP_NAME0 0x00 19 + #define SYSC_REG_CHIP_NAME1 0x04 20 + #define SYSC_REG_CHIP_REV 0x0c 21 + #define SYSC_REG_SYSTEM_CONFIG0 0x10 22 + #define SYSC_REG_SYSTEM_CONFIG1 0x14 23 + #define SYSC_REG_CPLL_CONFIG0 0x54 24 + #define SYSC_REG_CPLL_CONFIG1 0x58 25 + 26 + #define MT7620N_CHIP_NAME0 0x33365452 27 + #define MT7620N_CHIP_NAME1 0x20203235 28 + 29 + #define MT7620A_CHIP_NAME0 0x3637544d 30 + #define MT7620A_CHIP_NAME1 0x20203032 31 + 32 + #define CHIP_REV_PKG_MASK 0x1 33 + #define CHIP_REV_PKG_SHIFT 16 34 + #define CHIP_REV_VER_MASK 0xf 35 + #define CHIP_REV_VER_SHIFT 8 36 + #define CHIP_REV_ECO_MASK 0xf 37 + 38 + #define CPLL_SW_CONFIG_SHIFT 31 39 + #define CPLL_SW_CONFIG_MASK 0x1 40 + #define CPLL_CPU_CLK_SHIFT 24 41 + #define CPLL_CPU_CLK_MASK 0x1 42 + #define CPLL_MULT_RATIO_SHIFT 16 43 + #define CPLL_MULT_RATIO 0x7 44 + #define CPLL_DIV_RATIO_SHIFT 10 45 + #define CPLL_DIV_RATIO 0x3 46 + 47 + #define SYSCFG0_DRAM_TYPE_MASK 0x3 48 + #define SYSCFG0_DRAM_TYPE_SHIFT 4 49 + #define SYSCFG0_DRAM_TYPE_SDRAM 0 50 + #define SYSCFG0_DRAM_TYPE_DDR1 1 51 + #define SYSCFG0_DRAM_TYPE_DDR2 2 52 + 53 + #define MT7620_GPIO_MODE_I2C BIT(0) 54 + #define MT7620_GPIO_MODE_UART0_SHIFT 2 55 + #define MT7620_GPIO_MODE_UART0_MASK 0x7 56 + #define MT7620_GPIO_MODE_UART0(x) ((x) << MT7620_GPIO_MODE_UART0_SHIFT) 57 + #define MT7620_GPIO_MODE_UARTF 0x0 58 + #define MT7620_GPIO_MODE_PCM_UARTF 0x1 59 + #define MT7620_GPIO_MODE_PCM_I2S 0x2 60 + #define MT7620_GPIO_MODE_I2S_UARTF 0x3 61 + #define MT7620_GPIO_MODE_PCM_GPIO 0x4 62 + #define MT7620_GPIO_MODE_GPIO_UARTF 0x5 63 + #define MT7620_GPIO_MODE_GPIO_I2S 0x6 64 + #define MT7620_GPIO_MODE_GPIO 0x7 65 + #define MT7620_GPIO_MODE_UART1 BIT(5) 66 + #define MT7620_GPIO_MODE_MDIO BIT(8) 67 + #define MT7620_GPIO_MODE_RGMII1 BIT(9) 68 + #define MT7620_GPIO_MODE_RGMII2 BIT(10) 69 + #define MT7620_GPIO_MODE_SPI BIT(11) 70 + #define MT7620_GPIO_MODE_SPI_REF_CLK BIT(12) 71 + #define MT7620_GPIO_MODE_WLED BIT(13) 72 + #define MT7620_GPIO_MODE_JTAG BIT(15) 73 + #define MT7620_GPIO_MODE_EPHY BIT(15) 74 + #define MT7620_GPIO_MODE_WDT BIT(22) 75 + 76 + #endif
+3
arch/mips/ralink/Kconfig
··· 20 20 select USB_ARCH_HAS_OHCI 21 21 select USB_ARCH_HAS_EHCI 22 22 23 + config SOC_MT7620 24 + bool "MT7620" 25 + 23 26 endchoice 24 27 25 28 choice
+1
arch/mips/ralink/Makefile
··· 11 11 obj-$(CONFIG_SOC_RT288X) += rt288x.o 12 12 obj-$(CONFIG_SOC_RT305X) += rt305x.o 13 13 obj-$(CONFIG_SOC_RT3883) += rt3883.o 14 + obj-$(CONFIG_SOC_MT7620) += mt7620.o 14 15 15 16 obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 16 17
+5
arch/mips/ralink/Platform
··· 18 18 # Ralink RT3883 19 19 # 20 20 load-$(CONFIG_SOC_RT3883) += 0xffffffff80000000 21 + 22 + # 23 + # Ralink MT7620 24 + # 25 + load-$(CONFIG_SOC_MT7620) += 0xffffffff80000000
+214
arch/mips/ralink/mt7620.c
··· 1 + /* 2 + * This program is free software; you can redistribute it and/or modify it 3 + * under the terms of the GNU General Public License version 2 as published 4 + * by the Free Software Foundation. 5 + * 6 + * Parts of this file are based on Ralink's 2.6.21 BSP 7 + * 8 + * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> 9 + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 10 + * Copyright (C) 2013 John Crispin <blogic@openwrt.org> 11 + */ 12 + 13 + #include <linux/kernel.h> 14 + #include <linux/init.h> 15 + #include <linux/module.h> 16 + 17 + #include <asm/mipsregs.h> 18 + #include <asm/mach-ralink/ralink_regs.h> 19 + #include <asm/mach-ralink/mt7620.h> 20 + 21 + #include "common.h" 22 + 23 + /* does the board have sdram or ddram */ 24 + static int dram_type; 25 + 26 + /* the pll dividers */ 27 + static u32 mt7620_clk_divider[] = { 2, 3, 4, 8 }; 28 + 29 + static struct ralink_pinmux_grp mode_mux[] = { 30 + { 31 + .name = "i2c", 32 + .mask = MT7620_GPIO_MODE_I2C, 33 + .gpio_first = 1, 34 + .gpio_last = 2, 35 + }, { 36 + .name = "spi", 37 + .mask = MT7620_GPIO_MODE_SPI, 38 + .gpio_first = 3, 39 + .gpio_last = 6, 40 + }, { 41 + .name = "uartlite", 42 + .mask = MT7620_GPIO_MODE_UART1, 43 + .gpio_first = 15, 44 + .gpio_last = 16, 45 + }, { 46 + .name = "wdt", 47 + .mask = MT7620_GPIO_MODE_WDT, 48 + .gpio_first = 17, 49 + .gpio_last = 17, 50 + }, { 51 + .name = "mdio", 52 + .mask = MT7620_GPIO_MODE_MDIO, 53 + .gpio_first = 22, 54 + .gpio_last = 23, 55 + }, { 56 + .name = "rgmii1", 57 + .mask = MT7620_GPIO_MODE_RGMII1, 58 + .gpio_first = 24, 59 + .gpio_last = 35, 60 + }, { 61 + .name = "spi refclk", 62 + .mask = MT7620_GPIO_MODE_SPI_REF_CLK, 63 + .gpio_first = 37, 64 + .gpio_last = 39, 65 + }, { 66 + .name = "jtag", 67 + .mask = MT7620_GPIO_MODE_JTAG, 68 + .gpio_first = 40, 69 + .gpio_last = 44, 70 + }, { 71 + /* shared lines with jtag */ 72 + .name = "ephy", 73 + .mask = MT7620_GPIO_MODE_EPHY, 74 + .gpio_first = 40, 75 + .gpio_last = 44, 76 + }, { 77 + .name = "nand", 78 + .mask = MT7620_GPIO_MODE_JTAG, 79 + .gpio_first = 45, 80 + .gpio_last = 59, 81 + }, { 82 + .name = "rgmii2", 83 + .mask = MT7620_GPIO_MODE_RGMII2, 84 + .gpio_first = 60, 85 + .gpio_last = 71, 86 + }, { 87 + .name = "wled", 88 + .mask = MT7620_GPIO_MODE_WLED, 89 + .gpio_first = 72, 90 + .gpio_last = 72, 91 + }, {0} 92 + }; 93 + 94 + static struct ralink_pinmux_grp uart_mux[] = { 95 + { 96 + .name = "uartf", 97 + .mask = MT7620_GPIO_MODE_UARTF, 98 + .gpio_first = 7, 99 + .gpio_last = 14, 100 + }, { 101 + .name = "pcm uartf", 102 + .mask = MT7620_GPIO_MODE_PCM_UARTF, 103 + .gpio_first = 7, 104 + .gpio_last = 14, 105 + }, { 106 + .name = "pcm i2s", 107 + .mask = MT7620_GPIO_MODE_PCM_I2S, 108 + .gpio_first = 7, 109 + .gpio_last = 14, 110 + }, { 111 + .name = "i2s uartf", 112 + .mask = MT7620_GPIO_MODE_I2S_UARTF, 113 + .gpio_first = 7, 114 + .gpio_last = 14, 115 + }, { 116 + .name = "pcm gpio", 117 + .mask = MT7620_GPIO_MODE_PCM_GPIO, 118 + .gpio_first = 11, 119 + .gpio_last = 14, 120 + }, { 121 + .name = "gpio uartf", 122 + .mask = MT7620_GPIO_MODE_GPIO_UARTF, 123 + .gpio_first = 7, 124 + .gpio_last = 10, 125 + }, { 126 + .name = "gpio i2s", 127 + .mask = MT7620_GPIO_MODE_GPIO_I2S, 128 + .gpio_first = 7, 129 + .gpio_last = 10, 130 + }, { 131 + .name = "gpio", 132 + .mask = MT7620_GPIO_MODE_GPIO, 133 + }, {0} 134 + }; 135 + 136 + struct ralink_pinmux rt_gpio_pinmux = { 137 + .mode = mode_mux, 138 + .uart = uart_mux, 139 + .uart_shift = MT7620_GPIO_MODE_UART0_SHIFT, 140 + .uart_mask = MT7620_GPIO_MODE_UART0_MASK, 141 + }; 142 + 143 + void __init ralink_clk_init(void) 144 + { 145 + unsigned long cpu_rate, sys_rate; 146 + u32 c0 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0); 147 + u32 c1 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1); 148 + u32 swconfig = (c0 >> CPLL_SW_CONFIG_SHIFT) & CPLL_SW_CONFIG_MASK; 149 + u32 cpu_clk = (c1 >> CPLL_CPU_CLK_SHIFT) & CPLL_CPU_CLK_MASK; 150 + 151 + if (cpu_clk) { 152 + cpu_rate = 480000000; 153 + } else if (!swconfig) { 154 + cpu_rate = 600000000; 155 + } else { 156 + u32 m = (c0 >> CPLL_MULT_RATIO_SHIFT) & CPLL_MULT_RATIO; 157 + u32 d = (c0 >> CPLL_DIV_RATIO_SHIFT) & CPLL_DIV_RATIO; 158 + 159 + cpu_rate = ((40 * (m + 24)) / mt7620_clk_divider[d]) * 1000000; 160 + } 161 + 162 + if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM) 163 + sys_rate = cpu_rate / 4; 164 + else 165 + sys_rate = cpu_rate / 3; 166 + 167 + ralink_clk_add("cpu", cpu_rate); 168 + ralink_clk_add("10000100.timer", 40000000); 169 + ralink_clk_add("10000500.uart", 40000000); 170 + ralink_clk_add("10000c00.uartlite", 40000000); 171 + } 172 + 173 + void __init ralink_of_remap(void) 174 + { 175 + rt_sysc_membase = plat_of_remap_node("ralink,mt7620a-sysc"); 176 + rt_memc_membase = plat_of_remap_node("ralink,mt7620a-memc"); 177 + 178 + if (!rt_sysc_membase || !rt_memc_membase) 179 + panic("Failed to remap core resources"); 180 + } 181 + 182 + void prom_soc_init(struct ralink_soc_info *soc_info) 183 + { 184 + void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE); 185 + unsigned char *name = NULL; 186 + u32 n0; 187 + u32 n1; 188 + u32 rev; 189 + u32 cfg0; 190 + 191 + n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0); 192 + n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1); 193 + 194 + if (n0 == MT7620N_CHIP_NAME0 && n1 == MT7620N_CHIP_NAME1) { 195 + name = "MT7620N"; 196 + soc_info->compatible = "ralink,mt7620n-soc"; 197 + } else if (n0 == MT7620A_CHIP_NAME0 && n1 == MT7620A_CHIP_NAME1) { 198 + name = "MT7620A"; 199 + soc_info->compatible = "ralink,mt7620a-soc"; 200 + } else { 201 + panic("mt7620: unknown SoC, n0:%08x n1:%08x\n", n0, n1); 202 + } 203 + 204 + rev = __raw_readl(sysc + SYSC_REG_CHIP_REV); 205 + 206 + snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN, 207 + "Ralink %s ver:%u eco:%u", 208 + name, 209 + (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK, 210 + (rev & CHIP_REV_ECO_MASK)); 211 + 212 + cfg0 = __raw_readl(sysc + SYSC_REG_SYSTEM_CONFIG0); 213 + dram_type = (cfg0 >> SYSCFG0_DRAM_TYPE_SHIFT) & SYSCFG0_DRAM_TYPE_MASK; 214 + }