linux/arch/mips/ralink/mt7620.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *
   4 * Parts of this file are based on Ralink's 2.6.21 BSP
   5 *
   6 * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
   7 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
   8 * Copyright (C) 2013 John Crispin <john@phrozen.org>
   9 */
  10
  11#include <linux/kernel.h>
  12#include <linux/init.h>
  13#include <linux/bug.h>
  14
  15#include <asm/mipsregs.h>
  16#include <asm/mach-ralink/ralink_regs.h>
  17#include <asm/mach-ralink/mt7620.h>
  18
  19#include "common.h"
  20
  21/* analog */
  22#define PMU0_CFG                0x88
  23#define PMU_SW_SET              BIT(28)
  24#define A_DCDC_EN               BIT(24)
  25#define A_SSC_PERI              BIT(19)
  26#define A_SSC_GEN               BIT(18)
  27#define A_SSC_M                 0x3
  28#define A_SSC_S                 16
  29#define A_DLY_M                 0x7
  30#define A_DLY_S                 8
  31#define A_VTUNE_M               0xff
  32
  33/* digital */
  34#define PMU1_CFG                0x8C
  35#define DIG_SW_SEL              BIT(25)
  36
  37/* clock scaling */
  38#define CLKCFG_FDIV_MASK        0x1f00
  39#define CLKCFG_FDIV_USB_VAL     0x0300
  40#define CLKCFG_FFRAC_MASK       0x001f
  41#define CLKCFG_FFRAC_USB_VAL    0x0003
  42
  43/* EFUSE bits */
  44#define EFUSE_MT7688            0x100000
  45
  46/* DRAM type bit */
  47#define DRAM_TYPE_MT7628_MASK   0x1
  48
  49/* does the board have sdram or ddram */
  50static int dram_type;
  51
  52static __init u32
  53mt7620_calc_rate(u32 ref_rate, u32 mul, u32 div)
  54{
  55        u64 t;
  56
  57        t = ref_rate;
  58        t *= mul;
  59        do_div(t, div);
  60
  61        return t;
  62}
  63
  64#define MHZ(x)          ((x) * 1000 * 1000)
  65
  66static __init unsigned long
  67mt7620_get_xtal_rate(void)
  68{
  69        u32 reg;
  70
  71        reg = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG0);
  72        if (reg & SYSCFG0_XTAL_FREQ_SEL)
  73                return MHZ(40);
  74
  75        return MHZ(20);
  76}
  77
  78static __init unsigned long
  79mt7620_get_periph_rate(unsigned long xtal_rate)
  80{
  81        u32 reg;
  82
  83        reg = rt_sysc_r32(SYSC_REG_CLKCFG0);
  84        if (reg & CLKCFG0_PERI_CLK_SEL)
  85                return xtal_rate;
  86
  87        return MHZ(40);
  88}
  89
  90static const u32 mt7620_clk_divider[] __initconst = { 2, 3, 4, 8 };
  91
  92static __init unsigned long
  93mt7620_get_cpu_pll_rate(unsigned long xtal_rate)
  94{
  95        u32 reg;
  96        u32 mul;
  97        u32 div;
  98
  99        reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
 100        if (reg & CPLL_CFG0_BYPASS_REF_CLK)
 101                return xtal_rate;
 102
 103        if ((reg & CPLL_CFG0_SW_CFG) == 0)
 104                return MHZ(600);
 105
 106        mul = (reg >> CPLL_CFG0_PLL_MULT_RATIO_SHIFT) &
 107              CPLL_CFG0_PLL_MULT_RATIO_MASK;
 108        mul += 24;
 109        if (reg & CPLL_CFG0_LC_CURFCK)
 110                mul *= 2;
 111
 112        div = (reg >> CPLL_CFG0_PLL_DIV_RATIO_SHIFT) &
 113              CPLL_CFG0_PLL_DIV_RATIO_MASK;
 114
 115        WARN_ON(div >= ARRAY_SIZE(mt7620_clk_divider));
 116
 117        return mt7620_calc_rate(xtal_rate, mul, mt7620_clk_divider[div]);
 118}
 119
 120static __init unsigned long
 121mt7620_get_pll_rate(unsigned long xtal_rate, unsigned long cpu_pll_rate)
 122{
 123        u32 reg;
 124
 125        reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
 126        if (reg & CPLL_CFG1_CPU_AUX1)
 127                return xtal_rate;
 128
 129        if (reg & CPLL_CFG1_CPU_AUX0)
 130                return MHZ(480);
 131
 132        return cpu_pll_rate;
 133}
 134
 135static __init unsigned long
 136mt7620_get_cpu_rate(unsigned long pll_rate)
 137{
 138        u32 reg;
 139        u32 mul;
 140        u32 div;
 141
 142        reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
 143
 144        mul = reg & CPU_SYS_CLKCFG_CPU_FFRAC_MASK;
 145        div = (reg >> CPU_SYS_CLKCFG_CPU_FDIV_SHIFT) &
 146              CPU_SYS_CLKCFG_CPU_FDIV_MASK;
 147
 148        return mt7620_calc_rate(pll_rate, mul, div);
 149}
 150
 151static const u32 mt7620_ocp_dividers[16] __initconst = {
 152        [CPU_SYS_CLKCFG_OCP_RATIO_2] = 2,
 153        [CPU_SYS_CLKCFG_OCP_RATIO_3] = 3,
 154        [CPU_SYS_CLKCFG_OCP_RATIO_4] = 4,
 155        [CPU_SYS_CLKCFG_OCP_RATIO_5] = 5,
 156        [CPU_SYS_CLKCFG_OCP_RATIO_10] = 10,
 157};
 158
 159static __init unsigned long
 160mt7620_get_dram_rate(unsigned long pll_rate)
 161{
 162        if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM)
 163                return pll_rate / 4;
 164
 165        return pll_rate / 3;
 166}
 167
 168static __init unsigned long
 169mt7620_get_sys_rate(unsigned long cpu_rate)
 170{
 171        u32 reg;
 172        u32 ocp_ratio;
 173        u32 div;
 174
 175        reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
 176
 177        ocp_ratio = (reg >> CPU_SYS_CLKCFG_OCP_RATIO_SHIFT) &
 178                    CPU_SYS_CLKCFG_OCP_RATIO_MASK;
 179
 180        if (WARN_ON(ocp_ratio >= ARRAY_SIZE(mt7620_ocp_dividers)))
 181                return cpu_rate;
 182
 183        div = mt7620_ocp_dividers[ocp_ratio];
 184        if (WARN(!div, "invalid divider for OCP ratio %u", ocp_ratio))
 185                return cpu_rate;
 186
 187        return cpu_rate / div;
 188}
 189
 190void __init ralink_clk_init(void)
 191{
 192        unsigned long xtal_rate;
 193        unsigned long cpu_pll_rate;
 194        unsigned long pll_rate;
 195        unsigned long cpu_rate;
 196        unsigned long sys_rate;
 197        unsigned long dram_rate;
 198        unsigned long periph_rate;
 199        unsigned long pcmi2s_rate;
 200
 201        xtal_rate = mt7620_get_xtal_rate();
 202
 203#define RFMT(label)     label ":%lu.%03luMHz "
 204#define RINT(x)         ((x) / 1000000)
 205#define RFRAC(x)        (((x) / 1000) % 1000)
 206
 207        if (is_mt76x8()) {
 208                if (xtal_rate == MHZ(40))
 209                        cpu_rate = MHZ(580);
 210                else
 211                        cpu_rate = MHZ(575);
 212                dram_rate = sys_rate = cpu_rate / 3;
 213                periph_rate = MHZ(40);
 214                pcmi2s_rate = MHZ(480);
 215
 216                ralink_clk_add("10000d00.uartlite", periph_rate);
 217                ralink_clk_add("10000e00.uartlite", periph_rate);
 218        } else {
 219                cpu_pll_rate = mt7620_get_cpu_pll_rate(xtal_rate);
 220                pll_rate = mt7620_get_pll_rate(xtal_rate, cpu_pll_rate);
 221
 222                cpu_rate = mt7620_get_cpu_rate(pll_rate);
 223                dram_rate = mt7620_get_dram_rate(pll_rate);
 224                sys_rate = mt7620_get_sys_rate(cpu_rate);
 225                periph_rate = mt7620_get_periph_rate(xtal_rate);
 226                pcmi2s_rate = periph_rate;
 227
 228                pr_debug(RFMT("XTAL") RFMT("CPU_PLL") RFMT("PLL"),
 229                         RINT(xtal_rate), RFRAC(xtal_rate),
 230                         RINT(cpu_pll_rate), RFRAC(cpu_pll_rate),
 231                         RINT(pll_rate), RFRAC(pll_rate));
 232
 233                ralink_clk_add("10000500.uart", periph_rate);
 234        }
 235
 236        pr_debug(RFMT("CPU") RFMT("DRAM") RFMT("SYS") RFMT("PERIPH"),
 237                 RINT(cpu_rate), RFRAC(cpu_rate),
 238                 RINT(dram_rate), RFRAC(dram_rate),
 239                 RINT(sys_rate), RFRAC(sys_rate),
 240                 RINT(periph_rate), RFRAC(periph_rate));
 241#undef RFRAC
 242#undef RINT
 243#undef RFMT
 244
 245        ralink_clk_add("cpu", cpu_rate);
 246        ralink_clk_add("10000100.timer", periph_rate);
 247        ralink_clk_add("10000120.watchdog", periph_rate);
 248        ralink_clk_add("10000900.i2c", periph_rate);
 249        ralink_clk_add("10000a00.i2s", pcmi2s_rate);
 250        ralink_clk_add("10000b00.spi", sys_rate);
 251        ralink_clk_add("10000b40.spi", sys_rate);
 252        ralink_clk_add("10000c00.uartlite", periph_rate);
 253        ralink_clk_add("10000d00.uart1", periph_rate);
 254        ralink_clk_add("10000e00.uart2", periph_rate);
 255        ralink_clk_add("10180000.wmac", xtal_rate);
 256
 257        if (IS_ENABLED(CONFIG_USB) && !is_mt76x8()) {
 258                /*
 259                 * When the CPU goes into sleep mode, the BUS clock will be
 260                 * too low for USB to function properly. Adjust the busses
 261                 * fractional divider to fix this
 262                 */
 263                u32 val = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
 264
 265                val &= ~(CLKCFG_FDIV_MASK | CLKCFG_FFRAC_MASK);
 266                val |= CLKCFG_FDIV_USB_VAL | CLKCFG_FFRAC_USB_VAL;
 267
 268                rt_sysc_w32(val, SYSC_REG_CPU_SYS_CLKCFG);
 269        }
 270}
 271
 272void __init ralink_of_remap(void)
 273{
 274        rt_sysc_membase = plat_of_remap_node("ralink,mt7620a-sysc");
 275        rt_memc_membase = plat_of_remap_node("ralink,mt7620a-memc");
 276
 277        if (!rt_sysc_membase || !rt_memc_membase)
 278                panic("Failed to remap core resources");
 279}
 280
 281static __init void
 282mt7620_dram_init(struct ralink_soc_info *soc_info)
 283{
 284        switch (dram_type) {
 285        case SYSCFG0_DRAM_TYPE_SDRAM:
 286                pr_info("Board has SDRAM\n");
 287                soc_info->mem_size_min = MT7620_SDRAM_SIZE_MIN;
 288                soc_info->mem_size_max = MT7620_SDRAM_SIZE_MAX;
 289                break;
 290
 291        case SYSCFG0_DRAM_TYPE_DDR1:
 292                pr_info("Board has DDR1\n");
 293                soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
 294                soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
 295                break;
 296
 297        case SYSCFG0_DRAM_TYPE_DDR2:
 298                pr_info("Board has DDR2\n");
 299                soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
 300                soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
 301                break;
 302        default:
 303                BUG();
 304        }
 305}
 306
 307static __init void
 308mt7628_dram_init(struct ralink_soc_info *soc_info)
 309{
 310        switch (dram_type) {
 311        case SYSCFG0_DRAM_TYPE_DDR1_MT7628:
 312                pr_info("Board has DDR1\n");
 313                soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
 314                soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
 315                break;
 316
 317        case SYSCFG0_DRAM_TYPE_DDR2_MT7628:
 318                pr_info("Board has DDR2\n");
 319                soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
 320                soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
 321                break;
 322        default:
 323                BUG();
 324        }
 325}
 326
 327void __init prom_soc_init(struct ralink_soc_info *soc_info)
 328{
 329        void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE);
 330        unsigned char *name = NULL;
 331        u32 n0;
 332        u32 n1;
 333        u32 rev;
 334        u32 cfg0;
 335        u32 pmu0;
 336        u32 pmu1;
 337        u32 bga;
 338
 339        n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
 340        n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
 341        rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
 342        bga = (rev >> CHIP_REV_PKG_SHIFT) & CHIP_REV_PKG_MASK;
 343
 344        if (n0 == MT7620_CHIP_NAME0 && n1 == MT7620_CHIP_NAME1) {
 345                if (bga) {
 346                        ralink_soc = MT762X_SOC_MT7620A;
 347                        name = "MT7620A";
 348                        soc_info->compatible = "ralink,mt7620a-soc";
 349                } else {
 350                        ralink_soc = MT762X_SOC_MT7620N;
 351                        name = "MT7620N";
 352                        soc_info->compatible = "ralink,mt7620n-soc";
 353                }
 354        } else if (n0 == MT7620_CHIP_NAME0 && n1 == MT7628_CHIP_NAME1) {
 355                u32 efuse = __raw_readl(sysc + SYSC_REG_EFUSE_CFG);
 356
 357                if (efuse & EFUSE_MT7688) {
 358                        ralink_soc = MT762X_SOC_MT7688;
 359                        name = "MT7688";
 360                } else {
 361                        ralink_soc = MT762X_SOC_MT7628AN;
 362                        name = "MT7628AN";
 363                }
 364                soc_info->compatible = "ralink,mt7628an-soc";
 365        } else {
 366                panic("mt762x: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
 367        }
 368
 369        snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
 370                "MediaTek %s ver:%u eco:%u",
 371                name,
 372                (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
 373                (rev & CHIP_REV_ECO_MASK));
 374
 375        cfg0 = __raw_readl(sysc + SYSC_REG_SYSTEM_CONFIG0);
 376        if (is_mt76x8()) {
 377                dram_type = cfg0 & DRAM_TYPE_MT7628_MASK;
 378        } else {
 379                dram_type = (cfg0 >> SYSCFG0_DRAM_TYPE_SHIFT) &
 380                            SYSCFG0_DRAM_TYPE_MASK;
 381                if (dram_type == SYSCFG0_DRAM_TYPE_UNKNOWN)
 382                        dram_type = SYSCFG0_DRAM_TYPE_SDRAM;
 383        }
 384
 385        soc_info->mem_base = MT7620_DRAM_BASE;
 386        if (is_mt76x8())
 387                mt7628_dram_init(soc_info);
 388        else
 389                mt7620_dram_init(soc_info);
 390
 391        pmu0 = __raw_readl(sysc + PMU0_CFG);
 392        pmu1 = __raw_readl(sysc + PMU1_CFG);
 393
 394        pr_info("Analog PMU set to %s control\n",
 395                (pmu0 & PMU_SW_SET) ? ("sw") : ("hw"));
 396        pr_info("Digital PMU set to %s control\n",
 397                (pmu1 & DIG_SW_SEL) ? ("sw") : ("hw"));
 398}
 399