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.
6 * Parts of this file are based on Ralink's 2.6.21 BSP
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>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/module.h>
17 #include <asm/mipsregs.h>
18 #include <asm/mach-ralink/ralink_regs.h>
19 #include <asm/mach-ralink/mt7620.h>
23 /* does the board have sdram or ddram */
26 /* the pll dividers */
27 static u32 mt7620_clk_divider
[] = { 2, 3, 4, 8 };
29 static struct ralink_pinmux_grp mode_mux
[] = {
32 .mask
= MT7620_GPIO_MODE_I2C
,
37 .mask
= MT7620_GPIO_MODE_SPI
,
42 .mask
= MT7620_GPIO_MODE_UART1
,
47 .mask
= MT7620_GPIO_MODE_WDT
,
52 .mask
= MT7620_GPIO_MODE_MDIO
,
57 .mask
= MT7620_GPIO_MODE_RGMII1
,
62 .mask
= MT7620_GPIO_MODE_SPI_REF_CLK
,
67 .mask
= MT7620_GPIO_MODE_JTAG
,
71 /* shared lines with jtag */
73 .mask
= MT7620_GPIO_MODE_EPHY
,
78 .mask
= MT7620_GPIO_MODE_JTAG
,
83 .mask
= MT7620_GPIO_MODE_RGMII2
,
88 .mask
= MT7620_GPIO_MODE_WLED
,
94 static struct ralink_pinmux_grp uart_mux
[] = {
97 .mask
= MT7620_GPIO_MODE_UARTF
,
102 .mask
= MT7620_GPIO_MODE_PCM_UARTF
,
107 .mask
= MT7620_GPIO_MODE_PCM_I2S
,
112 .mask
= MT7620_GPIO_MODE_I2S_UARTF
,
117 .mask
= MT7620_GPIO_MODE_PCM_GPIO
,
121 .name
= "gpio uartf",
122 .mask
= MT7620_GPIO_MODE_GPIO_UARTF
,
127 .mask
= MT7620_GPIO_MODE_GPIO_I2S
,
132 .mask
= MT7620_GPIO_MODE_GPIO
,
136 struct ralink_pinmux rt_gpio_pinmux
= {
139 .uart_shift
= MT7620_GPIO_MODE_UART0_SHIFT
,
140 .uart_mask
= MT7620_GPIO_MODE_UART0_MASK
,
143 void __init
ralink_clk_init(void)
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
;
152 cpu_rate
= 480000000;
153 } else if (!swconfig
) {
154 cpu_rate
= 600000000;
156 u32 m
= (c0
>> CPLL_MULT_RATIO_SHIFT
) & CPLL_MULT_RATIO
;
157 u32 d
= (c0
>> CPLL_DIV_RATIO_SHIFT
) & CPLL_DIV_RATIO
;
159 cpu_rate
= ((40 * (m
+ 24)) / mt7620_clk_divider
[d
]) * 1000000;
162 if (dram_type
== SYSCFG0_DRAM_TYPE_SDRAM
)
163 sys_rate
= cpu_rate
/ 4;
165 sys_rate
= cpu_rate
/ 3;
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);
173 void __init
ralink_of_remap(void)
175 rt_sysc_membase
= plat_of_remap_node("ralink,mt7620a-sysc");
176 rt_memc_membase
= plat_of_remap_node("ralink,mt7620a-memc");
178 if (!rt_sysc_membase
|| !rt_memc_membase
)
179 panic("Failed to remap core resources");
182 void prom_soc_init(struct ralink_soc_info
*soc_info
)
184 void __iomem
*sysc
= (void __iomem
*) KSEG1ADDR(MT7620_SYSC_BASE
);
185 unsigned char *name
= NULL
;
191 n0
= __raw_readl(sysc
+ SYSC_REG_CHIP_NAME0
);
192 n1
= __raw_readl(sysc
+ SYSC_REG_CHIP_NAME1
);
194 if (n0
== MT7620N_CHIP_NAME0
&& n1
== MT7620N_CHIP_NAME1
) {
196 soc_info
->compatible
= "ralink,mt7620n-soc";
197 } else if (n0
== MT7620A_CHIP_NAME0
&& n1
== MT7620A_CHIP_NAME1
) {
199 soc_info
->compatible
= "ralink,mt7620a-soc";
201 panic("mt7620: unknown SoC, n0:%08x n1:%08x\n", n0
, n1
);
204 rev
= __raw_readl(sysc
+ SYSC_REG_CHIP_REV
);
206 snprintf(soc_info
->sys_type
, RAMIPS_SYS_TYPE_LEN
,
207 "Ralink %s ver:%u eco:%u",
209 (rev
>> CHIP_REV_VER_SHIFT
) & CHIP_REV_VER_MASK
,
210 (rev
& CHIP_REV_ECO_MASK
));
212 cfg0
= __raw_readl(sysc
+ SYSC_REG_SYSTEM_CONFIG0
);
213 dram_type
= (cfg0
>> SYSCFG0_DRAM_TYPE_SHIFT
) & SYSCFG0_DRAM_TYPE_MASK
;
216 case SYSCFG0_DRAM_TYPE_SDRAM
:
217 soc_info
->mem_size_min
= MT7620_SDRAM_SIZE_MIN
;
218 soc_info
->mem_size_max
= MT7620_SDRAM_SIZE_MAX
;
221 case SYSCFG0_DRAM_TYPE_DDR1
:
222 soc_info
->mem_size_min
= MT7620_DDR1_SIZE_MIN
;
223 soc_info
->mem_size_max
= MT7620_DDR1_SIZE_MAX
;
226 case SYSCFG0_DRAM_TYPE_DDR2
:
227 soc_info
->mem_size_min
= MT7620_DDR2_SIZE_MIN
;
228 soc_info
->mem_size_max
= MT7620_DDR2_SIZE_MAX
;
233 soc_info
->mem_base
= MT7620_DRAM_BASE
;