uboot/drivers/clk/mediatek/clk-mt8516.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * MediaTek clock driver for MT8516 SoC
   4 *
   5 * Copyright (C) 2018 BayLibre, SAS
   6 * Author: Fabien Parent <fparent@baylibre.com>
   7 */
   8
   9#include <common.h>
  10#include <dm.h>
  11#include <asm/io.h>
  12#include <dt-bindings/clock/mt8516-clk.h>
  13#include <linux/bitops.h>
  14
  15#include "clk-mtk.h"
  16
  17#define MT8516_PLL_FMAX         (1502UL * MHZ)
  18#define MT8516_CON0_RST_BAR     BIT(27)
  19
  20/* apmixedsys */
  21#define PLL(_id, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, _pd_reg,   \
  22            _pd_shift, _pcw_reg, _pcw_shift) {                          \
  23                .id = _id,                                              \
  24                .reg = _reg,                                            \
  25                .pwr_reg = _pwr_reg,                                    \
  26                .en_mask = _en_mask,                                    \
  27                .rst_bar_mask = MT8516_CON0_RST_BAR,                    \
  28                .fmax = MT8516_PLL_FMAX,                                \
  29                .flags = _flags,                                        \
  30                .pcwbits = _pcwbits,                                    \
  31                .pd_reg = _pd_reg,                                      \
  32                .pd_shift = _pd_shift,                                  \
  33                .pcw_reg = _pcw_reg,                                    \
  34                .pcw_shift = _pcw_shift,                                \
  35        }
  36
  37static const struct mtk_pll_data apmixed_plls[] = {
  38        PLL(CLK_APMIXED_ARMPLL, 0x0100, 0x0110, 0x00000001, 0,
  39                21, 0x0104, 24, 0x0104, 0),
  40        PLL(CLK_APMIXED_MAINPLL, 0x0120, 0x0130, 0x00000001,
  41                HAVE_RST_BAR, 21, 0x0124, 24, 0x0124, 0),
  42        PLL(CLK_APMIXED_UNIVPLL, 0x0140, 0x0150, 0x30000001,
  43                HAVE_RST_BAR, 7, 0x0144, 24, 0x0144, 0),
  44        PLL(CLK_APMIXED_MMPLL, 0x0160, 0x0170, 0x00000001, 0,
  45                21, 0x0164, 24, 0x0164, 0),
  46        PLL(CLK_APMIXED_APLL1, 0x0180, 0x0190, 0x00000001, 0,
  47                31, 0x0180, 1, 0x0184, 0),
  48        PLL(CLK_APMIXED_APLL2, 0x01A0, 0x01B0, 0x00000001, 0,
  49                31, 0x01A0, 1, 0x01A4, 0),
  50};
  51
  52/* topckgen */
  53#define FACTOR0(_id, _parent, _mult, _div)      \
  54        FACTOR(_id, _parent, _mult, _div, CLK_PARENT_APMIXED)
  55
  56#define FACTOR1(_id, _parent, _mult, _div)      \
  57        FACTOR(_id, _parent, _mult, _div, CLK_PARENT_TOPCKGEN)
  58
  59#define FACTOR2(_id, _parent, _mult, _div)      \
  60        FACTOR(_id, _parent, _mult, _div, 0)
  61
  62static const struct mtk_fixed_clk top_fixed_clks[] = {
  63        FIXED_CLK(CLK_TOP_CLK_NULL, CLK_XTAL, 26000000),
  64        FIXED_CLK(CLK_TOP_I2S_INFRA_BCK, CLK_TOP_CLK_NULL, 26000000),
  65        FIXED_CLK(CLK_TOP_MEMPLL, CLK_TOP_CLK26M, 800000000),
  66};
  67
  68static const struct mtk_fixed_factor top_fixed_divs[] = {
  69        FACTOR1(CLK_TOP_DMPLL, CLK_TOP_MEMPLL, 1, 1),
  70        FACTOR0(CLK_TOP_MAINPLL_D2, CLK_APMIXED_MAINPLL, 1, 2),
  71        FACTOR0(CLK_TOP_MAINPLL_D4, CLK_APMIXED_MAINPLL, 1, 4),
  72        FACTOR0(CLK_TOP_MAINPLL_D8, CLK_APMIXED_MAINPLL, 1, 8),
  73        FACTOR0(CLK_TOP_MAINPLL_D16, CLK_APMIXED_MAINPLL, 1, 16),
  74        FACTOR0(CLK_TOP_MAINPLL_D11, CLK_APMIXED_MAINPLL, 1, 11),
  75        FACTOR0(CLK_TOP_MAINPLL_D22, CLK_APMIXED_MAINPLL, 1, 22),
  76        FACTOR0(CLK_TOP_MAINPLL_D3, CLK_APMIXED_MAINPLL, 1, 3),
  77        FACTOR0(CLK_TOP_MAINPLL_D6, CLK_APMIXED_MAINPLL, 1, 6),
  78        FACTOR0(CLK_TOP_MAINPLL_D12, CLK_APMIXED_MAINPLL, 1, 12),
  79        FACTOR0(CLK_TOP_MAINPLL_D5, CLK_APMIXED_MAINPLL, 1, 5),
  80        FACTOR0(CLK_TOP_MAINPLL_D10, CLK_APMIXED_MAINPLL, 1, 10),
  81        FACTOR0(CLK_TOP_MAINPLL_D20, CLK_APMIXED_MAINPLL, 1, 20),
  82        FACTOR0(CLK_TOP_MAINPLL_D40, CLK_APMIXED_MAINPLL, 1, 40),
  83        FACTOR0(CLK_TOP_MAINPLL_D7, CLK_APMIXED_MAINPLL, 1, 7),
  84        FACTOR0(CLK_TOP_MAINPLL_D14, CLK_APMIXED_MAINPLL, 1, 14),
  85        FACTOR0(CLK_TOP_UNIVPLL_D2, CLK_APMIXED_UNIVPLL, 1, 2),
  86        FACTOR0(CLK_TOP_UNIVPLL_D4, CLK_APMIXED_UNIVPLL, 1, 4),
  87        FACTOR0(CLK_TOP_UNIVPLL_D8, CLK_APMIXED_UNIVPLL, 1, 8),
  88        FACTOR0(CLK_TOP_UNIVPLL_D16, CLK_APMIXED_UNIVPLL, 1, 16),
  89        FACTOR0(CLK_TOP_UNIVPLL_D3, CLK_APMIXED_UNIVPLL, 1, 3),
  90        FACTOR0(CLK_TOP_UNIVPLL_D6, CLK_APMIXED_UNIVPLL, 1, 6),
  91        FACTOR0(CLK_TOP_UNIVPLL_D12, CLK_APMIXED_UNIVPLL, 1, 12),
  92        FACTOR0(CLK_TOP_UNIVPLL_D24, CLK_APMIXED_UNIVPLL, 1, 24),
  93        FACTOR0(CLK_TOP_UNIVPLL_D5, CLK_APMIXED_UNIVPLL, 1, 5),
  94        FACTOR0(CLK_TOP_UNIVPLL_D20, CLK_APMIXED_UNIVPLL, 1, 20),
  95        FACTOR0(CLK_TOP_MMPLL380M, CLK_APMIXED_MMPLL, 1, 1),
  96        FACTOR0(CLK_TOP_MMPLL_D2, CLK_APMIXED_MMPLL, 1, 2),
  97        FACTOR0(CLK_TOP_MMPLL_200M, CLK_APMIXED_MMPLL, 1, 3),
  98        FACTOR0(CLK_TOP_USB_PHY48M, CLK_APMIXED_UNIVPLL, 1, 26),
  99        FACTOR0(CLK_TOP_APLL1, CLK_APMIXED_APLL1, 1, 1),
 100        FACTOR1(CLK_TOP_APLL1_D2, CLK_TOP_APLL1, 1, 2),
 101        FACTOR1(CLK_TOP_APLL1_D4, CLK_TOP_RG_APLL1_D2_EN, 1, 2),
 102        FACTOR1(CLK_TOP_APLL1_D8, CLK_TOP_RG_APLL1_D4_EN, 1, 2),
 103        FACTOR0(CLK_TOP_APLL2, CLK_APMIXED_APLL2, 1, 1),
 104        FACTOR1(CLK_TOP_APLL2_D2, CLK_TOP_APLL2, 1, 2),
 105        FACTOR1(CLK_TOP_APLL2_D4, CLK_TOP_RG_APLL2_D2_EN, 1, 2),
 106        FACTOR1(CLK_TOP_APLL2_D8, CLK_TOP_RG_APLL2_D4_EN, 1, 2),
 107        FACTOR2(CLK_TOP_CLK26M, CLK_XTAL, 1, 1),
 108        FACTOR2(CLK_TOP_CLK26M_D2, CLK_XTAL, 1, 2),
 109        FACTOR1(CLK_TOP_AHB_INFRA_D2, CLK_TOP_AHB_INFRA_SEL, 1, 2),
 110        FACTOR1(CLK_TOP_NFI1X, CLK_TOP_NFI2X_PAD_SEL, 1, 2),
 111        FACTOR1(CLK_TOP_ETH_D2, CLK_TOP_ETH_SEL, 1, 2),
 112};
 113
 114static const int uart0_parents[] = {
 115        CLK_TOP_CLK26M,
 116        CLK_TOP_UNIVPLL_D24,
 117};
 118
 119static const int gfmux_emi1x_parents[] = {
 120        CLK_TOP_CLK26M,
 121        CLK_TOP_DMPLL,
 122};
 123
 124static const int emi_ddrphy_parents[] = {
 125        CLK_TOP_GFMUX_EMI1X_SEL,
 126        CLK_TOP_GFMUX_EMI1X_SEL,
 127};
 128
 129static const int ahb_infra_parents[] = {
 130        CLK_TOP_CLK_NULL,
 131        CLK_TOP_CLK26M,
 132        CLK_TOP_MAINPLL_D11,
 133        CLK_TOP_CLK_NULL,
 134        CLK_TOP_MAINPLL_D12,
 135        CLK_TOP_CLK_NULL,
 136        CLK_TOP_CLK_NULL,
 137        CLK_TOP_CLK_NULL,
 138        CLK_TOP_CLK_NULL,
 139        CLK_TOP_CLK_NULL,
 140        CLK_TOP_CLK_NULL,
 141        CLK_TOP_CLK_NULL,
 142        CLK_TOP_MAINPLL_D10,
 143};
 144
 145static const int csw_mux_mfg_parents[] = {
 146        CLK_TOP_CLK_NULL,
 147        CLK_TOP_CLK_NULL,
 148        CLK_TOP_UNIVPLL_D3,
 149        CLK_TOP_UNIVPLL_D2,
 150        CLK_TOP_CLK26M,
 151        CLK_TOP_MAINPLL_D4,
 152        CLK_TOP_UNIVPLL_D24,
 153        CLK_TOP_MMPLL380M,
 154};
 155
 156static const int msdc0_parents[] = {
 157        CLK_TOP_CLK26M,
 158        CLK_TOP_UNIVPLL_D6,
 159        CLK_TOP_MAINPLL_D8,
 160        CLK_TOP_UNIVPLL_D8,
 161        CLK_TOP_MAINPLL_D16,
 162        CLK_TOP_MMPLL_200M,
 163        CLK_TOP_MAINPLL_D12,
 164        CLK_TOP_MMPLL_D2,
 165};
 166
 167static const int pwm_mm_parents[] = {
 168        CLK_TOP_CLK26M,
 169        CLK_TOP_UNIVPLL_D12,
 170};
 171
 172static const int uart1_parents[] = {
 173        CLK_TOP_CLK26M,
 174        CLK_TOP_UNIVPLL_D24,
 175};
 176
 177static const int msdc1_parents[] = {
 178        CLK_TOP_CLK26M,
 179        CLK_TOP_UNIVPLL_D6,
 180        CLK_TOP_MAINPLL_D8,
 181        CLK_TOP_UNIVPLL_D8,
 182        CLK_TOP_MAINPLL_D16,
 183        CLK_TOP_MMPLL_200M,
 184        CLK_TOP_MAINPLL_D12,
 185        CLK_TOP_MMPLL_D2,
 186};
 187
 188static const int spm_52m_parents[] = {
 189        CLK_TOP_CLK26M,
 190        CLK_TOP_UNIVPLL_D24,
 191};
 192
 193static const int pmicspi_parents[] = {
 194        CLK_TOP_UNIVPLL_D20,
 195        CLK_TOP_USB_PHY48M,
 196        CLK_TOP_UNIVPLL_D16,
 197        CLK_TOP_CLK26M,
 198};
 199
 200static const int qaxi_aud26m_parents[] = {
 201        CLK_TOP_CLK26M,
 202        CLK_TOP_AHB_INFRA_SEL,
 203};
 204
 205static const int aud_intbus_parents[] = {
 206        CLK_TOP_CLK_NULL,
 207        CLK_TOP_CLK26M,
 208        CLK_TOP_MAINPLL_D22,
 209        CLK_TOP_CLK_NULL,
 210        CLK_TOP_MAINPLL_D11,
 211};
 212
 213static const int nfi2x_pad_parents[] = {
 214        CLK_TOP_CLK_NULL,
 215        CLK_TOP_CLK_NULL,
 216        CLK_TOP_CLK_NULL,
 217        CLK_TOP_CLK_NULL,
 218        CLK_TOP_CLK_NULL,
 219        CLK_TOP_CLK_NULL,
 220        CLK_TOP_CLK_NULL,
 221        CLK_TOP_CLK_NULL,
 222        CLK_TOP_CLK26M,
 223        CLK_TOP_CLK_NULL,
 224        CLK_TOP_CLK_NULL,
 225        CLK_TOP_CLK_NULL,
 226        CLK_TOP_CLK_NULL,
 227        CLK_TOP_CLK_NULL,
 228        CLK_TOP_CLK_NULL,
 229        CLK_TOP_CLK_NULL,
 230        CLK_TOP_CLK_NULL,
 231        CLK_TOP_MAINPLL_D12,
 232        CLK_TOP_MAINPLL_D8,
 233        CLK_TOP_CLK_NULL,
 234        CLK_TOP_MAINPLL_D6,
 235        CLK_TOP_CLK_NULL,
 236        CLK_TOP_CLK_NULL,
 237        CLK_TOP_CLK_NULL,
 238        CLK_TOP_CLK_NULL,
 239        CLK_TOP_CLK_NULL,
 240        CLK_TOP_CLK_NULL,
 241        CLK_TOP_CLK_NULL,
 242        CLK_TOP_CLK_NULL,
 243        CLK_TOP_CLK_NULL,
 244        CLK_TOP_CLK_NULL,
 245        CLK_TOP_CLK_NULL,
 246        CLK_TOP_MAINPLL_D4,
 247        CLK_TOP_CLK_NULL,
 248        CLK_TOP_CLK_NULL,
 249        CLK_TOP_CLK_NULL,
 250        CLK_TOP_CLK_NULL,
 251        CLK_TOP_CLK_NULL,
 252        CLK_TOP_CLK_NULL,
 253        CLK_TOP_CLK_NULL,
 254        CLK_TOP_CLK_NULL,
 255        CLK_TOP_CLK_NULL,
 256        CLK_TOP_CLK_NULL,
 257        CLK_TOP_CLK_NULL,
 258        CLK_TOP_CLK_NULL,
 259        CLK_TOP_CLK_NULL,
 260        CLK_TOP_CLK_NULL,
 261        CLK_TOP_CLK_NULL,
 262        CLK_TOP_CLK_NULL,
 263        CLK_TOP_CLK_NULL,
 264        CLK_TOP_CLK_NULL,
 265        CLK_TOP_CLK_NULL,
 266        CLK_TOP_CLK_NULL,
 267        CLK_TOP_CLK_NULL,
 268        CLK_TOP_CLK_NULL,
 269        CLK_TOP_CLK_NULL,
 270        CLK_TOP_CLK_NULL,
 271        CLK_TOP_CLK_NULL,
 272        CLK_TOP_CLK_NULL,
 273        CLK_TOP_CLK_NULL,
 274        CLK_TOP_CLK_NULL,
 275        CLK_TOP_CLK_NULL,
 276        CLK_TOP_CLK_NULL,
 277        CLK_TOP_CLK_NULL,
 278        CLK_TOP_CLK_NULL,
 279        CLK_TOP_CLK_NULL,
 280        CLK_TOP_CLK_NULL,
 281        CLK_TOP_CLK_NULL,
 282        CLK_TOP_CLK_NULL,
 283        CLK_TOP_CLK_NULL,
 284        CLK_TOP_CLK_NULL,
 285        CLK_TOP_CLK_NULL,
 286        CLK_TOP_CLK_NULL,
 287        CLK_TOP_CLK_NULL,
 288        CLK_TOP_CLK_NULL,
 289        CLK_TOP_CLK_NULL,
 290        CLK_TOP_CLK_NULL,
 291        CLK_TOP_CLK_NULL,
 292        CLK_TOP_CLK_NULL,
 293        CLK_TOP_CLK_NULL,
 294        CLK_TOP_CLK_NULL,
 295        CLK_TOP_MAINPLL_D10,
 296        CLK_TOP_MAINPLL_D7,
 297        CLK_TOP_CLK_NULL,
 298        CLK_TOP_MAINPLL_D5
 299};
 300
 301static const int nfi1x_pad_parents[] = {
 302        CLK_TOP_AHB_INFRA_SEL,
 303        CLK_TOP_NFI1X,
 304};
 305
 306static const int mfg_mm_parents[] = {
 307        CLK_TOP_CLK_NULL,
 308        CLK_TOP_CLK_NULL,
 309        CLK_TOP_CLK_NULL,
 310        CLK_TOP_CLK_NULL,
 311        CLK_TOP_CLK_NULL,
 312        CLK_TOP_CLK_NULL,
 313        CLK_TOP_CLK_NULL,
 314        CLK_TOP_CLK_NULL,
 315        CLK_TOP_CSW_MUX_MFG_SEL,
 316        CLK_TOP_CLK_NULL,
 317        CLK_TOP_CLK_NULL,
 318        CLK_TOP_CLK_NULL,
 319        CLK_TOP_CLK_NULL,
 320        CLK_TOP_CLK_NULL,
 321        CLK_TOP_CLK_NULL,
 322        CLK_TOP_CLK_NULL,
 323        CLK_TOP_MAINPLL_D3,
 324        CLK_TOP_CLK_NULL,
 325        CLK_TOP_CLK_NULL,
 326        CLK_TOP_CLK_NULL,
 327        CLK_TOP_CLK_NULL,
 328        CLK_TOP_CLK_NULL,
 329        CLK_TOP_CLK_NULL,
 330        CLK_TOP_CLK_NULL,
 331        CLK_TOP_CLK_NULL,
 332        CLK_TOP_CLK_NULL,
 333        CLK_TOP_CLK_NULL,
 334        CLK_TOP_CLK_NULL,
 335        CLK_TOP_CLK_NULL,
 336        CLK_TOP_CLK_NULL,
 337        CLK_TOP_CLK_NULL,
 338        CLK_TOP_CLK_NULL,
 339        CLK_TOP_CLK_NULL,
 340        CLK_TOP_MAINPLL_D5,
 341        CLK_TOP_MAINPLL_D7,
 342        CLK_TOP_CLK_NULL,
 343        CLK_TOP_MAINPLL_D14
 344};
 345
 346static const int ddrphycfg_parents[] = {
 347        CLK_TOP_CLK26M,
 348        CLK_TOP_MAINPLL_D16
 349};
 350
 351static const int usb_78m_parents[] = {
 352        CLK_TOP_CLK_NULL,
 353        CLK_TOP_CLK26M,
 354        CLK_TOP_UNIVPLL_D16,
 355        CLK_TOP_CLK_NULL,
 356        CLK_TOP_MAINPLL_D20,
 357};
 358
 359static const int spinor_parents[] = {
 360        CLK_TOP_CLK26M_D2,
 361        CLK_TOP_CLK26M,
 362        CLK_TOP_MAINPLL_D40,
 363        CLK_TOP_UNIVPLL_D24,
 364        CLK_TOP_UNIVPLL_D20,
 365        CLK_TOP_MAINPLL_D20,
 366        CLK_TOP_MAINPLL_D16,
 367        CLK_TOP_UNIVPLL_D12
 368};
 369
 370static const int msdc2_parents[] = {
 371        CLK_TOP_CLK26M,
 372        CLK_TOP_UNIVPLL_D6,
 373        CLK_TOP_MAINPLL_D8,
 374        CLK_TOP_UNIVPLL_D8,
 375        CLK_TOP_MAINPLL_D16,
 376        CLK_TOP_MMPLL_200M,
 377        CLK_TOP_MAINPLL_D12,
 378        CLK_TOP_MMPLL_D2
 379};
 380
 381static const int eth_parents[] = {
 382        CLK_TOP_CLK26M,
 383        CLK_TOP_MAINPLL_D40,
 384        CLK_TOP_UNIVPLL_D24,
 385        CLK_TOP_UNIVPLL_D20,
 386        CLK_TOP_MAINPLL_D20
 387};
 388
 389static const int axi_mfg_in_parents[] = {
 390        CLK_TOP_CLK26M,
 391        CLK_TOP_MAINPLL_D11,
 392        CLK_TOP_UNIVPLL_D24,
 393        CLK_TOP_MMPLL380M,
 394};
 395
 396static const int slow_mfg_parents[] = {
 397        CLK_TOP_CLK26M,
 398        CLK_TOP_UNIVPLL_D12,
 399        CLK_TOP_UNIVPLL_D24
 400};
 401
 402static const int aud1_parents[] = {
 403        CLK_TOP_CLK26M,
 404        CLK_TOP_APLL1
 405};
 406
 407static const int aud2_parents[] = {
 408        CLK_TOP_CLK26M,
 409        CLK_TOP_APLL2
 410};
 411
 412static const int aud_engen1_parents[] = {
 413        CLK_TOP_CLK26M,
 414        CLK_TOP_RG_APLL1_D2_EN,
 415        CLK_TOP_RG_APLL1_D4_EN,
 416        CLK_TOP_RG_APLL1_D8_EN
 417};
 418
 419static const int aud_engen2_parents[] = {
 420        CLK_TOP_CLK26M,
 421        CLK_TOP_RG_APLL2_D2_EN,
 422        CLK_TOP_RG_APLL2_D4_EN,
 423        CLK_TOP_RG_APLL2_D8_EN
 424};
 425
 426static const int i2c_parents[] = {
 427        CLK_TOP_CLK26M,
 428        CLK_TOP_UNIVPLL_D20,
 429        CLK_TOP_UNIVPLL_D16,
 430        CLK_TOP_UNIVPLL_D12
 431};
 432
 433static const int aud_i2s0_m_parents[] = {
 434        CLK_TOP_RG_AUD1,
 435        CLK_TOP_RG_AUD2
 436};
 437
 438static const int pwm_parents[] = {
 439        CLK_TOP_CLK26M,
 440        CLK_TOP_UNIVPLL_D12
 441};
 442
 443static const int spi_parents[] = {
 444        CLK_TOP_CLK26M,
 445        CLK_TOP_UNIVPLL_D12,
 446        CLK_TOP_UNIVPLL_D8,
 447        CLK_TOP_UNIVPLL_D6
 448};
 449
 450static const int aud_spdifin_parents[] = {
 451        CLK_TOP_CLK26M,
 452        CLK_TOP_UNIVPLL_D2
 453};
 454
 455static const int uart2_parents[] = {
 456        CLK_TOP_CLK26M,
 457        CLK_TOP_UNIVPLL_D24
 458};
 459
 460static const int bsi_parents[] = {
 461        CLK_TOP_CLK26M,
 462        CLK_TOP_MAINPLL_D10,
 463        CLK_TOP_MAINPLL_D12,
 464        CLK_TOP_MAINPLL_D20
 465};
 466
 467static const int dbg_atclk_parents[] = {
 468        CLK_TOP_CLK_NULL,
 469        CLK_TOP_CLK26M,
 470        CLK_TOP_MAINPLL_D5,
 471        CLK_TOP_CLK_NULL,
 472        CLK_TOP_UNIVPLL_D5
 473};
 474
 475static const int csw_nfiecc_parents[] = {
 476        CLK_TOP_CLK_NULL,
 477        CLK_TOP_MAINPLL_D7,
 478        CLK_TOP_MAINPLL_D6,
 479        CLK_TOP_CLK_NULL,
 480        CLK_TOP_MAINPLL_D5
 481};
 482
 483static const int nfiecc_parents[] = {
 484        CLK_TOP_CLK_NULL,
 485        CLK_TOP_NFI2X_PAD_SEL,
 486        CLK_TOP_MAINPLL_D4,
 487        CLK_TOP_CLK_NULL,
 488        CLK_TOP_CSW_NFIECC_SEL,
 489};
 490
 491static const struct mtk_composite top_muxes[] = {
 492        /* CLK_MUX_SEL0 */
 493        MUX(CLK_TOP_UART0_SEL, uart0_parents, 0x000, 0, 1),
 494        MUX(CLK_TOP_GFMUX_EMI1X_SEL, gfmux_emi1x_parents, 0x000, 1, 1),
 495        MUX(CLK_TOP_EMI_DDRPHY_SEL, emi_ddrphy_parents, 0x000, 2, 1),
 496        MUX(CLK_TOP_AHB_INFRA_SEL, ahb_infra_parents, 0x000, 4, 4),
 497        MUX(CLK_TOP_CSW_MUX_MFG_SEL, csw_mux_mfg_parents, 0x000, 8, 3),
 498        MUX(CLK_TOP_MSDC0_SEL, msdc0_parents, 0x000, 11, 3),
 499        MUX(CLK_TOP_PWM_MM_SEL, pwm_mm_parents, 0x000, 18, 1),
 500        MUX(CLK_TOP_UART1_SEL, uart1_parents, 0x000, 19, 1),
 501        MUX(CLK_TOP_MSDC1_SEL, msdc1_parents, 0x000, 20, 3),
 502        MUX(CLK_TOP_SPM_52M_SEL, spm_52m_parents, 0x000, 23, 1),
 503        MUX(CLK_TOP_PMICSPI_SEL, pmicspi_parents, 0x000, 24, 2),
 504        MUX(CLK_TOP_QAXI_AUD26M_SEL, qaxi_aud26m_parents, 0x000, 26, 1),
 505        MUX(CLK_TOP_AUD_INTBUS_SEL, aud_intbus_parents, 0x000, 27, 3),
 506        /* CLK_MUX_SEL1 */
 507        MUX(CLK_TOP_NFI2X_PAD_SEL, nfi2x_pad_parents, 0x004, 0, 7),
 508        MUX(CLK_TOP_NFI1X_PAD_SEL, nfi1x_pad_parents, 0x004, 7, 1),
 509        MUX(CLK_TOP_MFG_MM_SEL, mfg_mm_parents, 0x004, 8, 6),
 510        MUX(CLK_TOP_DDRPHYCFG_SEL, ddrphycfg_parents, 0x004, 15, 1),
 511        MUX(CLK_TOP_USB_78M_SEL, usb_78m_parents, 0x004, 20, 3),
 512        /* CLK_MUX_SEL8 */
 513        MUX(CLK_TOP_SPINOR_SEL, spinor_parents, 0x040, 0, 3),
 514        MUX(CLK_TOP_MSDC2_SEL, msdc2_parents, 0x040, 3, 3),
 515        MUX(CLK_TOP_ETH_SEL, eth_parents, 0x040, 6, 3),
 516        MUX(CLK_TOP_AXI_MFG_IN_SEL, axi_mfg_in_parents, 0x040, 18, 2),
 517        MUX(CLK_TOP_SLOW_MFG_SEL, slow_mfg_parents, 0x040, 20, 2),
 518        MUX(CLK_TOP_AUD1_SEL, aud1_parents, 0x040, 22, 1),
 519        MUX(CLK_TOP_AUD2_SEL, aud2_parents, 0x040, 23, 1),
 520        MUX(CLK_TOP_AUD_ENGEN1_SEL, aud_engen1_parents, 0x040, 24, 2),
 521        MUX(CLK_TOP_AUD_ENGEN2_SEL, aud_engen2_parents, 0x040, 26, 2),
 522        MUX(CLK_TOP_I2C_SEL, i2c_parents, 0x040, 28, 2),
 523        /* CLK_MUX_SEL9 */
 524        MUX(CLK_TOP_AUD_I2S0_M_SEL, aud_i2s0_m_parents, 0x044, 12, 1),
 525        MUX(CLK_TOP_AUD_I2S1_M_SEL, aud_i2s0_m_parents, 0x044, 13, 1),
 526        MUX(CLK_TOP_AUD_I2S2_M_SEL, aud_i2s0_m_parents, 0x044, 14, 1),
 527        MUX(CLK_TOP_AUD_I2S3_M_SEL, aud_i2s0_m_parents, 0x044, 15, 1),
 528        MUX(CLK_TOP_AUD_I2S4_M_SEL, aud_i2s0_m_parents, 0x044, 16, 1),
 529        MUX(CLK_TOP_AUD_I2S5_M_SEL, aud_i2s0_m_parents, 0x044, 17, 1),
 530        MUX(CLK_TOP_AUD_SPDIF_B_SEL, aud_i2s0_m_parents, 0x044, 18, 1),
 531        /* CLK_MUX_SEL13 */
 532        MUX(CLK_TOP_PWM_SEL, pwm_parents, 0x07c, 0, 1),
 533        MUX(CLK_TOP_SPI_SEL, spi_parents, 0x07c, 1, 2),
 534        MUX(CLK_TOP_AUD_SPDIFIN_SEL, aud_spdifin_parents, 0x07c, 3, 1),
 535        MUX(CLK_TOP_UART2_SEL, uart2_parents, 0x07c, 4, 1),
 536        MUX(CLK_TOP_BSI_SEL, bsi_parents, 0x07c, 5, 2),
 537        MUX(CLK_TOP_DBG_ATCLK_SEL, dbg_atclk_parents, 0x07c, 7, 3),
 538        MUX(CLK_TOP_CSW_NFIECC_SEL, csw_nfiecc_parents, 0x07c, 10, 3),
 539        MUX(CLK_TOP_NFIECC_SEL, nfiecc_parents, 0x07c, 13, 3),
 540};
 541
 542static const struct mtk_gate_regs top0_cg_regs = {
 543        .set_ofs = 0x50,
 544        .clr_ofs = 0x80,
 545        .sta_ofs = 0x20,
 546};
 547
 548static const struct mtk_gate_regs top1_cg_regs = {
 549        .set_ofs = 0x54,
 550        .clr_ofs = 0x84,
 551        .sta_ofs = 0x24,
 552};
 553
 554static const struct mtk_gate_regs top2_cg_regs = {
 555        .set_ofs = 0x6c,
 556        .clr_ofs = 0x9c,
 557        .sta_ofs = 0x3c,
 558};
 559
 560static const struct mtk_gate_regs top3_cg_regs = {
 561        .set_ofs = 0xa0,
 562        .clr_ofs = 0xb0,
 563        .sta_ofs = 0x70,
 564};
 565
 566static const struct mtk_gate_regs top4_cg_regs = {
 567        .set_ofs = 0xa4,
 568        .clr_ofs = 0xb4,
 569        .sta_ofs = 0x74,
 570};
 571
 572static const struct mtk_gate_regs top5_cg_regs = {
 573        .set_ofs = 0x44,
 574        .clr_ofs = 0x44,
 575        .sta_ofs = 0x44,
 576};
 577
 578#define GATE_TOP0(_id, _parent, _shift) {                       \
 579                .id = _id,                                      \
 580                .parent = _parent,                              \
 581                .regs = &top0_cg_regs,                          \
 582                .shift = _shift,                                \
 583                .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
 584        }
 585
 586#define GATE_TOP1(_id, _parent, _shift) {                       \
 587                .id = _id,                                      \
 588                .parent = _parent,                              \
 589                .regs = &top1_cg_regs,                          \
 590                .shift = _shift,                                \
 591                .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
 592        }
 593
 594#define GATE_TOP2(_id, _parent, _shift) {                       \
 595                .id = _id,                                      \
 596                .parent = _parent,                              \
 597                .regs = &top2_cg_regs,                          \
 598                .shift = _shift,                                \
 599                .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
 600        }
 601
 602#define GATE_TOP2_I(_id, _parent, _shift) {                             \
 603                .id = _id,                                              \
 604                .parent = _parent,                                      \
 605                .regs = &top2_cg_regs,                                  \
 606                .shift = _shift,                                        \
 607                .flags = CLK_GATE_SETCLR_INV | CLK_PARENT_TOPCKGEN,     \
 608        }
 609
 610#define GATE_TOP3(_id, _parent, _shift) {                       \
 611                .id = _id,                                      \
 612                .parent = _parent,                              \
 613                .regs = &top3_cg_regs,                          \
 614                .shift = _shift,                                \
 615                .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN, \
 616        }
 617
 618#define GATE_TOP4_I(_id, _parent, _shift) {                             \
 619                .id = _id,                                              \
 620                .parent = _parent,                                      \
 621                .regs = &top4_cg_regs,                                  \
 622                .shift = _shift,                                        \
 623                .flags = CLK_GATE_SETCLR_INV | CLK_PARENT_TOPCKGEN,     \
 624        }
 625
 626#define GATE_TOP5(_id, _parent, _shift) {                               \
 627                .id = _id,                                              \
 628                .parent = _parent,                                      \
 629                .regs = &top5_cg_regs,                                  \
 630                .shift = _shift,                                        \
 631                .flags = CLK_GATE_NO_SETCLR | CLK_PARENT_TOPCKGEN,      \
 632        }
 633
 634static const struct mtk_gate top_clks[] = {
 635        /* TOP0 */
 636        GATE_TOP0(CLK_TOP_PWM_MM, CLK_TOP_PWM_MM_SEL, 0),
 637        GATE_TOP0(CLK_TOP_MFG_MM, CLK_TOP_MFG_MM_SEL, 2),
 638        GATE_TOP0(CLK_TOP_SPM_52M, CLK_TOP_SPM_52M_SEL, 3),
 639        /* TOP1 */
 640        GATE_TOP1(CLK_TOP_THEM, CLK_TOP_AHB_INFRA_SEL, 1),
 641        GATE_TOP1(CLK_TOP_APDMA, CLK_TOP_AHB_INFRA_SEL, 2),
 642        GATE_TOP1(CLK_TOP_I2C0, CLK_IFR_I2C0_SEL, 3),
 643        GATE_TOP1(CLK_TOP_I2C1, CLK_IFR_I2C1_SEL, 4),
 644        GATE_TOP1(CLK_TOP_AUXADC1, CLK_TOP_AHB_INFRA_SEL, 5),
 645        GATE_TOP1(CLK_TOP_NFI, CLK_TOP_NFI1X_PAD_SEL, 6),
 646        GATE_TOP1(CLK_TOP_NFIECC, CLK_TOP_RG_NFIECC, 7),
 647        GATE_TOP1(CLK_TOP_DEBUGSYS, CLK_TOP_RG_DBG_ATCLK, 8),
 648        GATE_TOP1(CLK_TOP_PWM, CLK_TOP_AHB_INFRA_SEL, 9),
 649        GATE_TOP1(CLK_TOP_UART0, CLK_TOP_UART0_SEL, 10),
 650        GATE_TOP1(CLK_TOP_UART1, CLK_TOP_UART1_SEL, 11),
 651        GATE_TOP1(CLK_TOP_BTIF, CLK_TOP_AHB_INFRA_SEL, 12),
 652        GATE_TOP1(CLK_TOP_USB, CLK_TOP_USB_78M, 13),
 653        GATE_TOP1(CLK_TOP_FLASHIF_26M, CLK_TOP_CLK26M, 14),
 654        GATE_TOP1(CLK_TOP_AUXADC2, CLK_TOP_AHB_INFRA_SEL, 15),
 655        GATE_TOP1(CLK_TOP_I2C2, CLK_IFR_I2C2_SEL, 16),
 656        GATE_TOP1(CLK_TOP_MSDC0, CLK_TOP_MSDC0_SEL, 17),
 657        GATE_TOP1(CLK_TOP_MSDC1, CLK_TOP_MSDC1_SEL, 18),
 658        GATE_TOP1(CLK_TOP_NFI2X, CLK_TOP_NFI2X_PAD_SEL, 19),
 659        GATE_TOP1(CLK_TOP_PMICWRAP_AP, CLK_TOP_CLK26M, 20),
 660        GATE_TOP1(CLK_TOP_SEJ, CLK_TOP_AHB_INFRA_SEL, 21),
 661        GATE_TOP1(CLK_TOP_MEMSLP_DLYER, CLK_TOP_CLK26M, 22),
 662        GATE_TOP1(CLK_TOP_SPI, CLK_TOP_SPI_SEL, 23),
 663        GATE_TOP1(CLK_TOP_APXGPT, CLK_TOP_CLK26M, 24),
 664        GATE_TOP1(CLK_TOP_AUDIO, CLK_TOP_CLK26M, 25),
 665        GATE_TOP1(CLK_TOP_PMICWRAP_MD, CLK_TOP_CLK26M, 27),
 666        GATE_TOP1(CLK_TOP_PMICWRAP_CONN, CLK_TOP_CLK26M, 28),
 667        GATE_TOP1(CLK_TOP_PMICWRAP_26M, CLK_TOP_CLK26M, 29),
 668        GATE_TOP1(CLK_TOP_AUX_ADC, CLK_TOP_CLK26M, 30),
 669        GATE_TOP1(CLK_TOP_AUX_TP, CLK_TOP_CLK26M, 31),
 670        /* TOP2 */
 671        GATE_TOP2(CLK_TOP_MSDC2, CLK_TOP_AHB_INFRA_SEL, 0),
 672        GATE_TOP2(CLK_TOP_RBIST, CLK_TOP_UNIVPLL_D12, 1),
 673        GATE_TOP2(CLK_TOP_NFI_BUS, CLK_TOP_AHB_INFRA_SEL, 2),
 674        GATE_TOP2(CLK_TOP_GCE, CLK_TOP_AHB_INFRA_SEL, 4),
 675        GATE_TOP2(CLK_TOP_TRNG, CLK_TOP_AHB_INFRA_SEL, 5),
 676        GATE_TOP2(CLK_TOP_SEJ_13M, CLK_TOP_CLK26M, 6),
 677        GATE_TOP2(CLK_TOP_AES, CLK_TOP_AHB_INFRA_SEL, 7),
 678        GATE_TOP2(CLK_TOP_PWM_B, CLK_TOP_RG_PWM_INFRA, 8),
 679        GATE_TOP2(CLK_TOP_PWM1_FB, CLK_TOP_RG_PWM_INFRA, 9),
 680        GATE_TOP2(CLK_TOP_PWM2_FB, CLK_TOP_RG_PWM_INFRA, 10),
 681        GATE_TOP2(CLK_TOP_PWM3_FB, CLK_TOP_RG_PWM_INFRA, 11),
 682        GATE_TOP2(CLK_TOP_PWM4_FB, CLK_TOP_RG_PWM_INFRA, 12),
 683        GATE_TOP2(CLK_TOP_PWM5_FB, CLK_TOP_RG_PWM_INFRA, 13),
 684        GATE_TOP2(CLK_TOP_USB_1P, CLK_TOP_USB_78M, 14),
 685        GATE_TOP2(CLK_TOP_FLASHIF_FREERUN, CLK_TOP_AHB_INFRA_SEL, 15),
 686        GATE_TOP2(CLK_TOP_66M_ETH, CLK_TOP_AHB_INFRA_D2, 19),
 687        GATE_TOP2(CLK_TOP_133M_ETH, CLK_TOP_AHB_INFRA_SEL, 20),
 688        GATE_TOP2(CLK_TOP_FETH_25M, CLK_IFR_ETH_25M_SEL, 21),
 689        GATE_TOP2(CLK_TOP_FETH_50M, CLK_TOP_RG_ETH, 22),
 690        GATE_TOP2(CLK_TOP_FLASHIF_AXI, CLK_TOP_AHB_INFRA_SEL, 23),
 691        GATE_TOP2(CLK_TOP_USBIF, CLK_TOP_AHB_INFRA_SEL, 24),
 692        GATE_TOP2(CLK_TOP_UART2, CLK_TOP_RG_UART2, 25),
 693        GATE_TOP2(CLK_TOP_BSI, CLK_TOP_AHB_INFRA_SEL, 26),
 694        GATE_TOP2_I(CLK_TOP_MSDC0_INFRA, CLK_TOP_MSDC0, 28),
 695        GATE_TOP2_I(CLK_TOP_MSDC1_INFRA, CLK_TOP_MSDC1, 29),
 696        GATE_TOP2_I(CLK_TOP_MSDC2_INFRA, CLK_TOP_RG_MSDC2, 30),
 697        GATE_TOP2(CLK_TOP_USB_78M, CLK_TOP_USB_78M_SEL, 31),
 698        /* TOP3 */
 699        GATE_TOP3(CLK_TOP_RG_SPINOR, CLK_TOP_SPINOR_SEL, 0),
 700        GATE_TOP3(CLK_TOP_RG_MSDC2, CLK_TOP_MSDC2_SEL, 1),
 701        GATE_TOP3(CLK_TOP_RG_ETH, CLK_TOP_ETH_SEL, 2),
 702        GATE_TOP3(CLK_TOP_RG_AXI_MFG, CLK_TOP_AXI_MFG_IN_SEL, 6),
 703        GATE_TOP3(CLK_TOP_RG_SLOW_MFG, CLK_TOP_SLOW_MFG_SEL, 7),
 704        GATE_TOP3(CLK_TOP_RG_AUD1, CLK_TOP_AUD1_SEL, 8),
 705        GATE_TOP3(CLK_TOP_RG_AUD2, CLK_TOP_AUD2_SEL, 9),
 706        GATE_TOP3(CLK_TOP_RG_AUD_ENGEN1, CLK_TOP_AUD_ENGEN1_SEL, 10),
 707        GATE_TOP3(CLK_TOP_RG_AUD_ENGEN2, CLK_TOP_AUD_ENGEN2_SEL, 11),
 708        GATE_TOP3(CLK_TOP_RG_I2C, CLK_TOP_I2C_SEL, 12),
 709        GATE_TOP3(CLK_TOP_RG_PWM_INFRA, CLK_TOP_PWM_SEL, 13),
 710        GATE_TOP3(CLK_TOP_RG_AUD_SPDIF_IN, CLK_TOP_AUD_SPDIFIN_SEL, 14),
 711        GATE_TOP3(CLK_TOP_RG_UART2, CLK_TOP_UART2_SEL, 15),
 712        GATE_TOP3(CLK_TOP_RG_BSI, CLK_TOP_BSI_SEL, 16),
 713        GATE_TOP3(CLK_TOP_RG_DBG_ATCLK, CLK_TOP_DBG_ATCLK_SEL, 17),
 714        GATE_TOP3(CLK_TOP_RG_NFIECC, CLK_TOP_NFIECC_SEL, 18),
 715        /* TOP4 */
 716        GATE_TOP4_I(CLK_TOP_RG_APLL1_D2_EN, CLK_TOP_APLL1_D2, 8),
 717        GATE_TOP4_I(CLK_TOP_RG_APLL1_D4_EN, CLK_TOP_APLL1_D4, 9),
 718        GATE_TOP4_I(CLK_TOP_RG_APLL1_D8_EN, CLK_TOP_APLL1_D8, 10),
 719        GATE_TOP4_I(CLK_TOP_RG_APLL2_D2_EN, CLK_TOP_APLL2_D2, 11),
 720        GATE_TOP4_I(CLK_TOP_RG_APLL2_D4_EN, CLK_TOP_APLL2_D4, 12),
 721        GATE_TOP4_I(CLK_TOP_RG_APLL2_D8_EN, CLK_TOP_APLL2_D8, 13),
 722        /* TOP5 */
 723        GATE_TOP5(CLK_TOP_APLL12_DIV0, CLK_TOP_APLL12_CK_DIV0, 0),
 724        GATE_TOP5(CLK_TOP_APLL12_DIV1, CLK_TOP_APLL12_CK_DIV1, 1),
 725        GATE_TOP5(CLK_TOP_APLL12_DIV2, CLK_TOP_APLL12_CK_DIV2, 2),
 726        GATE_TOP5(CLK_TOP_APLL12_DIV3, CLK_TOP_APLL12_CK_DIV3, 3),
 727        GATE_TOP5(CLK_TOP_APLL12_DIV4, CLK_TOP_APLL12_CK_DIV4, 4),
 728        GATE_TOP5(CLK_TOP_APLL12_DIV4B, CLK_TOP_APLL12_CK_DIV4B, 5),
 729        GATE_TOP5(CLK_TOP_APLL12_DIV5, CLK_TOP_APLL12_CK_DIV5, 6),
 730        GATE_TOP5(CLK_TOP_APLL12_DIV5B, CLK_TOP_APLL12_CK_DIV5B, 7),
 731        GATE_TOP5(CLK_TOP_APLL12_DIV6, CLK_TOP_APLL12_CK_DIV6, 8),
 732};
 733
 734static const struct mtk_clk_tree mt8516_clk_tree = {
 735        .xtal_rate = 26 * MHZ,
 736        .xtal2_rate = 26 * MHZ,
 737        .fdivs_offs = CLK_TOP_DMPLL,
 738        .muxes_offs = CLK_TOP_UART0_SEL,
 739        .plls = apmixed_plls,
 740        .fclks = top_fixed_clks,
 741        .fdivs = top_fixed_divs,
 742        .muxes = top_muxes,
 743};
 744
 745static int mt8516_apmixedsys_probe(struct udevice *dev)
 746{
 747        return mtk_common_clk_init(dev, &mt8516_clk_tree);
 748}
 749
 750static int mt8516_topckgen_probe(struct udevice *dev)
 751{
 752        return mtk_common_clk_init(dev, &mt8516_clk_tree);
 753}
 754
 755static int mt8516_topckgen_cg_probe(struct udevice *dev)
 756{
 757        return mtk_common_clk_gate_init(dev, &mt8516_clk_tree, top_clks);
 758}
 759
 760static const struct udevice_id mt8516_apmixed_compat[] = {
 761        { .compatible = "mediatek,mt8516-apmixedsys", },
 762        { }
 763};
 764
 765static const struct udevice_id mt8516_topckgen_compat[] = {
 766        { .compatible = "mediatek,mt8516-topckgen", },
 767        { }
 768};
 769
 770static const struct udevice_id mt8516_topckgen_cg_compat[] = {
 771        { .compatible = "mediatek,mt8516-topckgen-cg", },
 772        { }
 773};
 774
 775U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
 776        .name = "mt8516-apmixedsys",
 777        .id = UCLASS_CLK,
 778        .of_match = mt8516_apmixed_compat,
 779        .probe = mt8516_apmixedsys_probe,
 780        .priv_auto      = sizeof(struct mtk_clk_priv),
 781        .ops = &mtk_clk_apmixedsys_ops,
 782        .flags = DM_FLAG_PRE_RELOC,
 783};
 784
 785U_BOOT_DRIVER(mtk_clk_topckgen) = {
 786        .name = "mt8516-topckgen",
 787        .id = UCLASS_CLK,
 788        .of_match = mt8516_topckgen_compat,
 789        .probe = mt8516_topckgen_probe,
 790        .priv_auto      = sizeof(struct mtk_clk_priv),
 791        .ops = &mtk_clk_topckgen_ops,
 792        .flags = DM_FLAG_PRE_RELOC,
 793};
 794
 795U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
 796        .name = "mt8516-topckgen-cg",
 797        .id = UCLASS_CLK,
 798        .of_match = mt8516_topckgen_cg_compat,
 799        .probe = mt8516_topckgen_cg_probe,
 800        .priv_auto      = sizeof(struct mtk_cg_priv),
 801        .ops = &mtk_clk_gate_ops,
 802        .flags = DM_FLAG_PRE_RELOC,
 803};
 804