| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | | - * Copyright (c) 2017 Rockchip Electronics Co. Ltd. |
|---|
| 3 | + * Copyright (c) 2019 Rockchip Electronics Co. Ltd. |
|---|
| 3 | 4 | * Author: Finley Xiao <finley.xiao@rock-chips.com> |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 6 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 7 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 8 | | - * (at your option) any later version. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 13 | | - * GNU General Public License for more details. |
|---|
| 14 | 5 | */ |
|---|
| 15 | 6 | |
|---|
| 16 | 7 | #include <linux/clk-provider.h> |
|---|
| 8 | +#include <linux/io.h> |
|---|
| 17 | 9 | #include <linux/of.h> |
|---|
| 18 | 10 | #include <linux/of_address.h> |
|---|
| 11 | +#include <linux/module.h> |
|---|
| 12 | +#include <linux/of_device.h> |
|---|
| 19 | 13 | #include <linux/rockchip/cpu.h> |
|---|
| 20 | 14 | #include <linux/syscore_ops.h> |
|---|
| 21 | 15 | #include <dt-bindings/clock/rk3308-cru.h> |
|---|
| 22 | 16 | #include "clk.h" |
|---|
| 23 | 17 | |
|---|
| 24 | 18 | #define RK3308_GRF_SOC_STATUS0 0x380 |
|---|
| 25 | | -#define RK3308_VOP_FRAC_MAX_PRATE 270000000 |
|---|
| 26 | | -#define RK3308B_VOP_FRAC_MAX_PRATE 800000000 |
|---|
| 27 | | -#define RK3308_UART_FRAC_MAX_PRATE 800000000 |
|---|
| 28 | | -#define RK3308_PDM_FRAC_MAX_PRATE 800000000 |
|---|
| 29 | | -#define RK3308_SPDIF_FRAC_MAX_PRATE 800000000 |
|---|
| 30 | | -#define RK3308_I2S_FRAC_MAX_PRATE 800000000 |
|---|
| 31 | 19 | |
|---|
| 32 | 20 | enum rk3308_plls { |
|---|
| 33 | 21 | apll, dpll, vpll0, vpll1, |
|---|
| .. | .. |
|---|
| 136 | 124 | |
|---|
| 137 | 125 | PNAME(mux_pll_p) = { "xin24m" }; |
|---|
| 138 | 126 | PNAME(mux_usb480m_p) = { "xin24m", "usb480m_phy", "clk_rtc32k" }; |
|---|
| 139 | | -PNAME(mux_armclk_p) = { "apll_core", "vpll0_core", "vpll1_core" }; |
|---|
| 140 | 127 | PNAME(mux_dpll_vpll0_p) = { "dpll", "vpll0" }; |
|---|
| 141 | 128 | PNAME(mux_dpll_vpll0_xin24m_p) = { "dpll", "vpll0", "xin24m" }; |
|---|
| 142 | 129 | PNAME(mux_dpll_vpll0_vpll1_p) = { "dpll", "vpll0", "vpll1" }; |
|---|
| .. | .. |
|---|
| 149 | 136 | PNAME(mux_uart2_p) = { "clk_uart2_src", "dummy", "clk_uart2_frac" }; |
|---|
| 150 | 137 | PNAME(mux_uart3_p) = { "clk_uart3_src", "dummy", "clk_uart3_frac" }; |
|---|
| 151 | 138 | PNAME(mux_uart4_p) = { "clk_uart4_src", "dummy", "clk_uart4_frac" }; |
|---|
| 152 | | -PNAME(mux_timer_src_p) = { "xin24m", "clk_rtc32k" }; |
|---|
| 153 | 139 | PNAME(mux_dclk_vop_p) = { "dclk_vop_src", "dclk_vop_frac", "xin24m" }; |
|---|
| 154 | 140 | PNAME(mux_nandc_p) = { "clk_nandc_div", "clk_nandc_div50" }; |
|---|
| 155 | 141 | PNAME(mux_sdmmc_p) = { "clk_sdmmc_div", "clk_sdmmc_div50" }; |
|---|
| .. | .. |
|---|
| 191 | 177 | PNAME(mux_spdif_tx_p) = { "clk_spdif_tx_src", "clk_spdif_tx_frac", "mclk_i2s0_2ch_in" }; |
|---|
| 192 | 178 | PNAME(mux_spdif_rx_src_p) = { "clk_spdif_rx_div", "clk_spdif_rx_div50" }; |
|---|
| 193 | 179 | PNAME(mux_spdif_rx_p) = { "clk_spdif_rx_src", "clk_spdif_rx_frac" }; |
|---|
| 194 | | -PNAME(mux_uart_src_p) = { "xin24m", "usb480m", "dpll", "vpll0", "vpll1" }; |
|---|
| 195 | | -static u32 uart_src_mux_idx[] = { 4, 3, 0, 1, 2 }; |
|---|
| 180 | +PNAME(mux_uart_src_p) = { "usb480m", "xin24m", "dpll", "vpll0", "vpll1" }; |
|---|
| 181 | +static u32 uart_src_mux_idx[] = { 3, 4, 0, 1, 2 }; |
|---|
| 196 | 182 | |
|---|
| 197 | 183 | static struct rockchip_pll_clock rk3308_pll_clks[] __initdata = { |
|---|
| 198 | 184 | [apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p, |
|---|
| .. | .. |
|---|
| 330 | 316 | * Clock-Architecture Diagram 3 |
|---|
| 331 | 317 | */ |
|---|
| 332 | 318 | |
|---|
| 333 | | - COMPOSITE_NODIV(ACLK_BUS_SRC, "clk_bus_src", mux_dpll_vpll0_vpll1_p, CLK_IGNORE_UNUSED, |
|---|
| 319 | + COMPOSITE_NODIV(ACLK_BUS_SRC, "clk_bus_src", mux_dpll_vpll0_vpll1_p, CLK_IS_CRITICAL, |
|---|
| 334 | 320 | RK3308_CLKSEL_CON(5), 6, 2, MFLAGS, |
|---|
| 335 | 321 | RK3308_CLKGATE_CON(1), 0, GFLAGS), |
|---|
| 336 | | - COMPOSITE_NOMUX(PCLK_BUS, "pclk_bus", "clk_bus_src", CLK_IGNORE_UNUSED, |
|---|
| 322 | + COMPOSITE_NOMUX(PCLK_BUS, "pclk_bus", "clk_bus_src", CLK_IS_CRITICAL, |
|---|
| 337 | 323 | RK3308_CLKSEL_CON(6), 8, 5, DFLAGS, |
|---|
| 338 | 324 | RK3308_CLKGATE_CON(1), 3, GFLAGS), |
|---|
| 339 | 325 | GATE(PCLK_DDR, "pclk_ddr", "pclk_bus", CLK_IGNORE_UNUSED, |
|---|
| 340 | 326 | RK3308_CLKGATE_CON(4), 15, GFLAGS), |
|---|
| 341 | | - COMPOSITE_NOMUX(HCLK_BUS, "hclk_bus", "clk_bus_src", CLK_IGNORE_UNUSED, |
|---|
| 327 | + COMPOSITE_NOMUX(HCLK_BUS, "hclk_bus", "clk_bus_src", CLK_IS_CRITICAL, |
|---|
| 342 | 328 | RK3308_CLKSEL_CON(6), 0, 5, DFLAGS, |
|---|
| 343 | 329 | RK3308_CLKGATE_CON(1), 2, GFLAGS), |
|---|
| 344 | | - COMPOSITE_NOMUX(ACLK_BUS, "aclk_bus", "clk_bus_src", CLK_IGNORE_UNUSED, |
|---|
| 330 | + COMPOSITE_NOMUX(ACLK_BUS, "aclk_bus", "clk_bus_src", CLK_IS_CRITICAL, |
|---|
| 345 | 331 | RK3308_CLKSEL_CON(5), 0, 5, DFLAGS, |
|---|
| 346 | 332 | RK3308_CLKGATE_CON(1), 1, GFLAGS), |
|---|
| 347 | 333 | |
|---|
| .. | .. |
|---|
| 349 | 335 | RK3308_CLKSEL_CON(10), 13, 3, MFLAGS, uart_src_mux_idx, 0, 5, DFLAGS, |
|---|
| 350 | 336 | RK3308_CLKGATE_CON(1), 9, GFLAGS), |
|---|
| 351 | 337 | COMPOSITE_FRACMUX(0, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT, |
|---|
| 352 | | - RK3308_CLKSEL_CON(12), 0, |
|---|
| 338 | + RK3308_CLKSEL_CON(12), CLK_FRAC_DIVIDER_NO_LIMIT, |
|---|
| 353 | 339 | RK3308_CLKGATE_CON(1), 11, GFLAGS, |
|---|
| 354 | | - &rk3308_uart0_fracmux, RK3308_UART_FRAC_MAX_PRATE), |
|---|
| 340 | + &rk3308_uart0_fracmux), |
|---|
| 355 | 341 | GATE(SCLK_UART0, "clk_uart0", "clk_uart0_mux", 0, |
|---|
| 356 | 342 | RK3308_CLKGATE_CON(1), 12, GFLAGS), |
|---|
| 357 | 343 | |
|---|
| .. | .. |
|---|
| 359 | 345 | RK3308_CLKSEL_CON(13), 13, 3, MFLAGS, uart_src_mux_idx, 0, 5, DFLAGS, |
|---|
| 360 | 346 | RK3308_CLKGATE_CON(1), 13, GFLAGS), |
|---|
| 361 | 347 | COMPOSITE_FRACMUX(0, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT, |
|---|
| 362 | | - RK3308_CLKSEL_CON(15), 0, |
|---|
| 348 | + RK3308_CLKSEL_CON(15), CLK_FRAC_DIVIDER_NO_LIMIT, |
|---|
| 363 | 349 | RK3308_CLKGATE_CON(1), 15, GFLAGS, |
|---|
| 364 | | - &rk3308_uart1_fracmux, RK3308_UART_FRAC_MAX_PRATE), |
|---|
| 350 | + &rk3308_uart1_fracmux), |
|---|
| 365 | 351 | GATE(SCLK_UART1, "clk_uart1", "clk_uart1_mux", 0, |
|---|
| 366 | 352 | RK3308_CLKGATE_CON(2), 0, GFLAGS), |
|---|
| 367 | 353 | |
|---|
| .. | .. |
|---|
| 369 | 355 | RK3308_CLKSEL_CON(16), 13, 3, MFLAGS, uart_src_mux_idx, 0, 5, DFLAGS, |
|---|
| 370 | 356 | RK3308_CLKGATE_CON(2), 1, GFLAGS), |
|---|
| 371 | 357 | COMPOSITE_FRACMUX(0, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT, |
|---|
| 372 | | - RK3308_CLKSEL_CON(18), 0, |
|---|
| 358 | + RK3308_CLKSEL_CON(18), CLK_FRAC_DIVIDER_NO_LIMIT, |
|---|
| 373 | 359 | RK3308_CLKGATE_CON(2), 3, GFLAGS, |
|---|
| 374 | | - &rk3308_uart2_fracmux, RK3308_UART_FRAC_MAX_PRATE), |
|---|
| 360 | + &rk3308_uart2_fracmux), |
|---|
| 375 | 361 | GATE(SCLK_UART2, "clk_uart2", "clk_uart2_mux", CLK_SET_RATE_PARENT, |
|---|
| 376 | 362 | RK3308_CLKGATE_CON(2), 4, GFLAGS), |
|---|
| 377 | 363 | |
|---|
| .. | .. |
|---|
| 379 | 365 | RK3308_CLKSEL_CON(19), 13, 3, MFLAGS, uart_src_mux_idx, 0, 5, DFLAGS, |
|---|
| 380 | 366 | RK3308_CLKGATE_CON(2), 5, GFLAGS), |
|---|
| 381 | 367 | COMPOSITE_FRACMUX(0, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT, |
|---|
| 382 | | - RK3308_CLKSEL_CON(21), 0, |
|---|
| 368 | + RK3308_CLKSEL_CON(21), CLK_FRAC_DIVIDER_NO_LIMIT, |
|---|
| 383 | 369 | RK3308_CLKGATE_CON(2), 7, GFLAGS, |
|---|
| 384 | | - &rk3308_uart3_fracmux, RK3308_UART_FRAC_MAX_PRATE), |
|---|
| 370 | + &rk3308_uart3_fracmux), |
|---|
| 385 | 371 | GATE(SCLK_UART3, "clk_uart3", "clk_uart3_mux", 0, |
|---|
| 386 | 372 | RK3308_CLKGATE_CON(2), 8, GFLAGS), |
|---|
| 387 | 373 | |
|---|
| .. | .. |
|---|
| 389 | 375 | RK3308_CLKSEL_CON(22), 13, 3, MFLAGS, uart_src_mux_idx, 0, 5, DFLAGS, |
|---|
| 390 | 376 | RK3308_CLKGATE_CON(2), 9, GFLAGS), |
|---|
| 391 | 377 | COMPOSITE_FRACMUX(0, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT, |
|---|
| 392 | | - RK3308_CLKSEL_CON(24), 0, |
|---|
| 378 | + RK3308_CLKSEL_CON(24), CLK_FRAC_DIVIDER_NO_LIMIT, |
|---|
| 393 | 379 | RK3308_CLKGATE_CON(2), 11, GFLAGS, |
|---|
| 394 | | - &rk3308_uart4_fracmux, RK3308_UART_FRAC_MAX_PRATE), |
|---|
| 380 | + &rk3308_uart4_fracmux), |
|---|
| 395 | 381 | GATE(SCLK_UART4, "clk_uart4", "clk_uart4_mux", 0, |
|---|
| 396 | 382 | RK3308_CLKGATE_CON(2), 12, GFLAGS), |
|---|
| 397 | 383 | |
|---|
| .. | .. |
|---|
| 468 | 454 | COMPOSITE(0, "dclk_vop_src", mux_dpll_vpll0_vpll1_p, 0, |
|---|
| 469 | 455 | RK3308_CLKSEL_CON(8), 10, 2, MFLAGS, 0, 8, DFLAGS, |
|---|
| 470 | 456 | RK3308_CLKGATE_CON(1), 6, GFLAGS), |
|---|
| 457 | + COMPOSITE_FRACMUX(0, "dclk_vop_frac", "dclk_vop_src", CLK_SET_RATE_PARENT, |
|---|
| 458 | + RK3308_CLKSEL_CON(9), 0, |
|---|
| 459 | + RK3308_CLKGATE_CON(1), 7, GFLAGS, |
|---|
| 460 | + &rk3308_dclk_vop_fracmux), |
|---|
| 471 | 461 | GATE(DCLK_VOP, "dclk_vop", "dclk_vop_mux", 0, |
|---|
| 472 | 462 | RK3308_CLKGATE_CON(1), 8, GFLAGS), |
|---|
| 473 | 463 | |
|---|
| .. | .. |
|---|
| 475 | 465 | * Clock-Architecture Diagram 4 |
|---|
| 476 | 466 | */ |
|---|
| 477 | 467 | |
|---|
| 478 | | - COMPOSITE_NODIV(ACLK_PERI_SRC, "clk_peri_src", mux_dpll_vpll0_vpll1_p, CLK_IGNORE_UNUSED, |
|---|
| 468 | + COMPOSITE_NODIV(ACLK_PERI_SRC, "clk_peri_src", mux_dpll_vpll0_vpll1_p, CLK_IS_CRITICAL, |
|---|
| 479 | 469 | RK3308_CLKSEL_CON(36), 6, 2, MFLAGS, |
|---|
| 480 | 470 | RK3308_CLKGATE_CON(8), 0, GFLAGS), |
|---|
| 481 | | - COMPOSITE_NOMUX(ACLK_PERI, "aclk_peri", "clk_peri_src", CLK_IGNORE_UNUSED, |
|---|
| 471 | + COMPOSITE_NOMUX(ACLK_PERI, "aclk_peri", "clk_peri_src", CLK_IS_CRITICAL, |
|---|
| 482 | 472 | RK3308_CLKSEL_CON(36), 0, 5, DFLAGS, |
|---|
| 483 | 473 | RK3308_CLKGATE_CON(8), 1, GFLAGS), |
|---|
| 484 | | - COMPOSITE_NOMUX(HCLK_PERI, "hclk_peri", "clk_peri_src", CLK_IGNORE_UNUSED, |
|---|
| 474 | + COMPOSITE_NOMUX(HCLK_PERI, "hclk_peri", "clk_peri_src", CLK_IS_CRITICAL, |
|---|
| 485 | 475 | RK3308_CLKSEL_CON(37), 0, 5, DFLAGS, |
|---|
| 486 | 476 | RK3308_CLKGATE_CON(8), 2, GFLAGS), |
|---|
| 487 | | - COMPOSITE_NOMUX(PCLK_PERI, "pclk_peri", "clk_peri_src", CLK_IGNORE_UNUSED, |
|---|
| 477 | + COMPOSITE_NOMUX(PCLK_PERI, "pclk_peri", "clk_peri_src", CLK_IS_CRITICAL, |
|---|
| 488 | 478 | RK3308_CLKSEL_CON(37), 8, 5, DFLAGS, |
|---|
| 489 | 479 | RK3308_CLKGATE_CON(8), 3, GFLAGS), |
|---|
| 490 | 480 | |
|---|
| .. | .. |
|---|
| 575 | 565 | GATE(0, "clk_ddr_msch_peribus", "clk_ddrphy1x_out", CLK_IGNORE_UNUSED, |
|---|
| 576 | 566 | RK3308_CLKGATE_CON(4), 13, GFLAGS), |
|---|
| 577 | 567 | |
|---|
| 578 | | - COMPOSITE_DDRCLK(SCLK_DDRCLK, "sclk_ddrc", mux_dpll_vpll0_vpll1_p, 0, |
|---|
| 579 | | - RK3308_CLKSEL_CON(1), 6, 2, 0, 0, ROCKCHIP_DDRCLK_SIP_V2), |
|---|
| 580 | | - COMPOSITE(0, "clk_ddrphy4x_src", mux_dpll_vpll0_vpll1_p, CLK_IGNORE_UNUSED, |
|---|
| 568 | + COMPOSITE(SCLK_DDRCLK, "clk_ddrphy4x_src", mux_dpll_vpll0_vpll1_p, CLK_IS_CRITICAL, |
|---|
| 581 | 569 | RK3308_CLKSEL_CON(1), 6, 2, MFLAGS, 0, 3, DFLAGS, |
|---|
| 582 | 570 | RK3308_CLKGATE_CON(0), 10, GFLAGS), |
|---|
| 583 | | - GATE(0, "clk_ddrphy4x", "clk_ddrphy4x_src", CLK_IGNORE_UNUSED, |
|---|
| 571 | + GATE(0, "clk_ddrphy4x", "clk_ddrphy4x_src", CLK_IS_CRITICAL, |
|---|
| 584 | 572 | RK3308_CLKGATE_CON(0), 11, GFLAGS), |
|---|
| 585 | 573 | FACTOR_GATE(0, "clk_ddr_stdby_div4", "clk_ddrphy4x", CLK_IGNORE_UNUSED, 1, 4, |
|---|
| 586 | 574 | RK3308_CLKGATE_CON(0), 13, GFLAGS), |
|---|
| .. | .. |
|---|
| 600 | 588 | COMPOSITE_FRACMUX(0, "clk_rtc32k_frac", "xin24m", CLK_IGNORE_UNUSED, |
|---|
| 601 | 589 | RK3308_CLKSEL_CON(3), 0, |
|---|
| 602 | 590 | RK3308_CLKGATE_CON(4), 3, GFLAGS, |
|---|
| 603 | | - &rk3308_rtc32k_fracmux, 0), |
|---|
| 591 | + &rk3308_rtc32k_fracmux), |
|---|
| 604 | 592 | MUX(0, "clk_rtc32k_div_src", mux_vpll0_vpll1_p, 0, |
|---|
| 605 | 593 | RK3308_CLKSEL_CON(2), 10, 1, MFLAGS), |
|---|
| 606 | 594 | COMPOSITE_NOMUX(0, "clk_rtc32k_div", "clk_rtc32k_div_src", CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, |
|---|
| .. | .. |
|---|
| 634 | 622 | * Clock-Architecture Diagram 7 |
|---|
| 635 | 623 | */ |
|---|
| 636 | 624 | |
|---|
| 637 | | - COMPOSITE_NODIV(0, "clk_audio_src", mux_vpll0_vpll1_xin24m_p, 0, |
|---|
| 625 | + COMPOSITE_NODIV(0, "clk_audio_src", mux_vpll0_vpll1_xin24m_p, CLK_IS_CRITICAL, |
|---|
| 638 | 626 | RK3308_CLKSEL_CON(45), 6, 2, MFLAGS, |
|---|
| 639 | 627 | RK3308_CLKGATE_CON(10), 0, GFLAGS), |
|---|
| 640 | | - COMPOSITE_NOMUX(HCLK_AUDIO, "hclk_audio", "clk_audio_src", 0, |
|---|
| 628 | + COMPOSITE_NOMUX(HCLK_AUDIO, "hclk_audio", "clk_audio_src", CLK_IS_CRITICAL, |
|---|
| 641 | 629 | RK3308_CLKSEL_CON(45), 0, 5, DFLAGS, |
|---|
| 642 | 630 | RK3308_CLKGATE_CON(10), 1, GFLAGS), |
|---|
| 643 | | - COMPOSITE_NOMUX(PCLK_AUDIO, "pclk_audio", "clk_audio_src", 0, |
|---|
| 631 | + COMPOSITE_NOMUX(PCLK_AUDIO, "pclk_audio", "clk_audio_src", CLK_IS_CRITICAL, |
|---|
| 644 | 632 | RK3308_CLKSEL_CON(45), 8, 5, DFLAGS, |
|---|
| 645 | 633 | RK3308_CLKGATE_CON(10), 2, GFLAGS), |
|---|
| 646 | 634 | |
|---|
| .. | .. |
|---|
| 650 | 638 | COMPOSITE_FRACMUX(0, "clk_pdm_frac", "clk_pdm_src", CLK_SET_RATE_PARENT, |
|---|
| 651 | 639 | RK3308_CLKSEL_CON(47), 0, |
|---|
| 652 | 640 | RK3308_CLKGATE_CON(10), 4, GFLAGS, |
|---|
| 653 | | - &rk3308_pdm_fracmux, RK3308_PDM_FRAC_MAX_PRATE), |
|---|
| 641 | + &rk3308_pdm_fracmux), |
|---|
| 654 | 642 | GATE(SCLK_PDM, "clk_pdm", "clk_pdm_mux", 0, |
|---|
| 655 | 643 | RK3308_CLKGATE_CON(10), 5, GFLAGS), |
|---|
| 656 | 644 | |
|---|
| .. | .. |
|---|
| 660 | 648 | COMPOSITE_FRACMUX(0, "clk_i2s0_8ch_tx_frac", "clk_i2s0_8ch_tx_src", CLK_SET_RATE_PARENT, |
|---|
| 661 | 649 | RK3308_CLKSEL_CON(53), 0, |
|---|
| 662 | 650 | RK3308_CLKGATE_CON(10), 13, GFLAGS, |
|---|
| 663 | | - &rk3308_i2s0_8ch_tx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 651 | + &rk3308_i2s0_8ch_tx_fracmux), |
|---|
| 664 | 652 | COMPOSITE_NODIV(SCLK_I2S0_8CH_TX, "clk_i2s0_8ch_tx", mux_i2s0_8ch_tx_rx_p, CLK_SET_RATE_PARENT, |
|---|
| 665 | 653 | RK3308_CLKSEL_CON(52), 12, 1, MFLAGS, |
|---|
| 666 | 654 | RK3308_CLKGATE_CON(10), 14, GFLAGS), |
|---|
| .. | .. |
|---|
| 674 | 662 | COMPOSITE_FRACMUX(0, "clk_i2s0_8ch_rx_frac", "clk_i2s0_8ch_rx_src", CLK_SET_RATE_PARENT, |
|---|
| 675 | 663 | RK3308_CLKSEL_CON(55), 0, |
|---|
| 676 | 664 | RK3308_CLKGATE_CON(11), 1, GFLAGS, |
|---|
| 677 | | - &rk3308_i2s0_8ch_rx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 665 | + &rk3308_i2s0_8ch_rx_fracmux), |
|---|
| 678 | 666 | COMPOSITE_NODIV(SCLK_I2S0_8CH_RX, "clk_i2s0_8ch_rx", mux_i2s0_8ch_rx_tx_p, CLK_SET_RATE_PARENT, |
|---|
| 679 | 667 | RK3308_CLKSEL_CON(54), 12, 1, MFLAGS, |
|---|
| 680 | 668 | RK3308_CLKGATE_CON(11), 2, GFLAGS), |
|---|
| .. | .. |
|---|
| 687 | 675 | COMPOSITE_FRACMUX(0, "clk_i2s1_8ch_tx_frac", "clk_i2s1_8ch_tx_src", CLK_SET_RATE_PARENT, |
|---|
| 688 | 676 | RK3308_CLKSEL_CON(57), 0, |
|---|
| 689 | 677 | RK3308_CLKGATE_CON(11), 5, GFLAGS, |
|---|
| 690 | | - &rk3308_i2s1_8ch_tx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 678 | + &rk3308_i2s1_8ch_tx_fracmux), |
|---|
| 691 | 679 | COMPOSITE_NODIV(SCLK_I2S1_8CH_TX, "clk_i2s1_8ch_tx", mux_i2s1_8ch_tx_rx_p, CLK_SET_RATE_PARENT, |
|---|
| 692 | 680 | RK3308_CLKSEL_CON(56), 12, 1, MFLAGS, |
|---|
| 693 | 681 | RK3308_CLKGATE_CON(11), 6, GFLAGS), |
|---|
| .. | .. |
|---|
| 701 | 689 | COMPOSITE_FRACMUX(0, "clk_i2s1_8ch_rx_frac", "clk_i2s1_8ch_rx_src", CLK_SET_RATE_PARENT, |
|---|
| 702 | 690 | RK3308_CLKSEL_CON(59), 0, |
|---|
| 703 | 691 | RK3308_CLKGATE_CON(11), 9, GFLAGS, |
|---|
| 704 | | - &rk3308_i2s1_8ch_rx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 692 | + &rk3308_i2s1_8ch_rx_fracmux), |
|---|
| 705 | 693 | COMPOSITE_NODIV(SCLK_I2S1_8CH_RX, "clk_i2s1_8ch_rx", mux_i2s1_8ch_rx_tx_p, CLK_SET_RATE_PARENT, |
|---|
| 706 | 694 | RK3308_CLKSEL_CON(58), 12, 1, MFLAGS, |
|---|
| 707 | 695 | RK3308_CLKGATE_CON(11), 10, GFLAGS), |
|---|
| .. | .. |
|---|
| 714 | 702 | COMPOSITE_FRACMUX(0, "clk_i2s2_8ch_tx_frac", "clk_i2s2_8ch_tx_src", CLK_SET_RATE_PARENT, |
|---|
| 715 | 703 | RK3308_CLKSEL_CON(61), 0, |
|---|
| 716 | 704 | RK3308_CLKGATE_CON(11), 13, GFLAGS, |
|---|
| 717 | | - &rk3308_i2s2_8ch_tx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 705 | + &rk3308_i2s2_8ch_tx_fracmux), |
|---|
| 718 | 706 | COMPOSITE_NODIV(SCLK_I2S2_8CH_TX, "clk_i2s2_8ch_tx", mux_i2s2_8ch_tx_rx_p, CLK_SET_RATE_PARENT, |
|---|
| 719 | 707 | RK3308_CLKSEL_CON(60), 12, 1, MFLAGS, |
|---|
| 720 | 708 | RK3308_CLKGATE_CON(11), 14, GFLAGS), |
|---|
| .. | .. |
|---|
| 728 | 716 | COMPOSITE_FRACMUX(0, "clk_i2s2_8ch_rx_frac", "clk_i2s2_8ch_rx_src", CLK_SET_RATE_PARENT, |
|---|
| 729 | 717 | RK3308_CLKSEL_CON(63), 0, |
|---|
| 730 | 718 | RK3308_CLKGATE_CON(12), 1, GFLAGS, |
|---|
| 731 | | - &rk3308_i2s2_8ch_rx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 719 | + &rk3308_i2s2_8ch_rx_fracmux), |
|---|
| 732 | 720 | COMPOSITE_NODIV(SCLK_I2S2_8CH_RX, "clk_i2s2_8ch_rx", mux_i2s2_8ch_rx_tx_p, CLK_SET_RATE_PARENT, |
|---|
| 733 | 721 | RK3308_CLKSEL_CON(62), 12, 1, MFLAGS, |
|---|
| 734 | 722 | RK3308_CLKGATE_CON(12), 2, GFLAGS), |
|---|
| .. | .. |
|---|
| 741 | 729 | COMPOSITE_FRACMUX(0, "clk_i2s3_8ch_tx_frac", "clk_i2s3_8ch_tx_src", CLK_SET_RATE_PARENT, |
|---|
| 742 | 730 | RK3308_CLKSEL_CON(65), 0, |
|---|
| 743 | 731 | RK3308_CLKGATE_CON(12), 5, GFLAGS, |
|---|
| 744 | | - &rk3308_i2s3_8ch_tx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 732 | + &rk3308_i2s3_8ch_tx_fracmux), |
|---|
| 745 | 733 | COMPOSITE_NODIV(SCLK_I2S3_8CH_TX, "clk_i2s3_8ch_tx", mux_i2s3_8ch_tx_rx_p, CLK_SET_RATE_PARENT, |
|---|
| 746 | 734 | RK3308_CLKSEL_CON(64), 12, 1, MFLAGS, |
|---|
| 747 | 735 | RK3308_CLKGATE_CON(12), 6, GFLAGS), |
|---|
| .. | .. |
|---|
| 755 | 743 | COMPOSITE_FRACMUX(0, "clk_i2s3_8ch_rx_frac", "clk_i2s3_8ch_rx_src", CLK_SET_RATE_PARENT, |
|---|
| 756 | 744 | RK3308_CLKSEL_CON(67), 0, |
|---|
| 757 | 745 | RK3308_CLKGATE_CON(12), 9, GFLAGS, |
|---|
| 758 | | - &rk3308_i2s3_8ch_rx_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 746 | + &rk3308_i2s3_8ch_rx_fracmux), |
|---|
| 759 | 747 | COMPOSITE_NODIV(SCLK_I2S3_8CH_RX, "clk_i2s3_8ch_rx", mux_i2s3_8ch_rx_tx_p, CLK_SET_RATE_PARENT, |
|---|
| 760 | 748 | RK3308_CLKSEL_CON(66), 12, 1, MFLAGS, |
|---|
| 761 | 749 | RK3308_CLKGATE_CON(12), 10, GFLAGS), |
|---|
| .. | .. |
|---|
| 768 | 756 | COMPOSITE_FRACMUX(0, "clk_i2s0_2ch_frac", "clk_i2s0_2ch_src", CLK_SET_RATE_PARENT, |
|---|
| 769 | 757 | RK3308_CLKSEL_CON(69), 0, |
|---|
| 770 | 758 | RK3308_CLKGATE_CON(12), 13, GFLAGS, |
|---|
| 771 | | - &rk3308_i2s0_2ch_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 759 | + &rk3308_i2s0_2ch_fracmux), |
|---|
| 772 | 760 | GATE(SCLK_I2S0_2CH, "clk_i2s0_2ch", "clk_i2s0_2ch_mux", 0, |
|---|
| 773 | 761 | RK3308_CLKGATE_CON(12), 14, GFLAGS), |
|---|
| 774 | 762 | COMPOSITE_NODIV(SCLK_I2S0_2CH_OUT, "clk_i2s0_2ch_out", mux_i2s0_2ch_out_p, CLK_SET_RATE_PARENT, |
|---|
| .. | .. |
|---|
| 781 | 769 | COMPOSITE_FRACMUX(0, "clk_i2s1_2ch_frac", "clk_i2s1_2ch_src", CLK_SET_RATE_PARENT, |
|---|
| 782 | 770 | RK3308_CLKSEL_CON(71), 0, |
|---|
| 783 | 771 | RK3308_CLKGATE_CON(13), 1, GFLAGS, |
|---|
| 784 | | - &rk3308_i2s1_2ch_fracmux, RK3308_I2S_FRAC_MAX_PRATE), |
|---|
| 772 | + &rk3308_i2s1_2ch_fracmux), |
|---|
| 785 | 773 | GATE(SCLK_I2S1_2CH, "clk_i2s1_2ch", "clk_i2s1_2ch_mux", 0, |
|---|
| 786 | 774 | RK3308_CLKGATE_CON(13), 2, GFLAGS), |
|---|
| 787 | 775 | COMPOSITE_NODIV(SCLK_I2S1_2CH_OUT, "clk_i2s1_2ch_out", mux_i2s1_2ch_out_p, CLK_SET_RATE_PARENT, |
|---|
| .. | .. |
|---|
| 799 | 787 | COMPOSITE_FRACMUX(0, "clk_spdif_tx_frac", "clk_spdif_tx_src", CLK_SET_RATE_PARENT, |
|---|
| 800 | 788 | RK3308_CLKSEL_CON(49), 0, |
|---|
| 801 | 789 | RK3308_CLKGATE_CON(10), 7, GFLAGS, |
|---|
| 802 | | - &rk3308_spdif_tx_fracmux, RK3308_SPDIF_FRAC_MAX_PRATE), |
|---|
| 790 | + &rk3308_spdif_tx_fracmux), |
|---|
| 803 | 791 | GATE(SCLK_SPDIF_TX, "clk_spdif_tx", "clk_spdif_tx_mux", 0, |
|---|
| 804 | 792 | RK3308_CLKGATE_CON(10), 8, GFLAGS), |
|---|
| 805 | 793 | |
|---|
| .. | .. |
|---|
| 814 | 802 | COMPOSITE_FRACMUX(0, "clk_spdif_rx_frac", "clk_spdif_rx_src", CLK_SET_RATE_PARENT, |
|---|
| 815 | 803 | RK3308_CLKSEL_CON(51), 0, |
|---|
| 816 | 804 | RK3308_CLKGATE_CON(10), 10, GFLAGS, |
|---|
| 817 | | - &rk3308_spdif_rx_fracmux, RK3308_SPDIF_FRAC_MAX_PRATE), |
|---|
| 805 | + &rk3308_spdif_rx_fracmux), |
|---|
| 818 | 806 | GATE(SCLK_SPDIF_RX, "clk_spdif_rx", "clk_spdif_rx_mux", 0, |
|---|
| 819 | 807 | RK3308_CLKGATE_CON(10), 11, GFLAGS), |
|---|
| 820 | 808 | |
|---|
| .. | .. |
|---|
| 865 | 853 | GATE(ACLK_CRYPTO, "aclk_crypto", "aclk_bus", 0, RK3308_CLKGATE_CON(5), 2, GFLAGS), |
|---|
| 866 | 854 | GATE(ACLK_VOP, "aclk_vop", "aclk_bus", 0, RK3308_CLKGATE_CON(5), 3, GFLAGS), |
|---|
| 867 | 855 | GATE(0, "aclk_gic", "aclk_bus", CLK_IGNORE_UNUSED, RK3308_CLKGATE_CON(5), 4, GFLAGS), |
|---|
| 856 | + /* aclk_dmaci0 is controlled by sgrf_clkgat_con. */ |
|---|
| 857 | + SGRF_GATE(ACLK_DMAC0, "aclk_dmac0", "aclk_bus"), |
|---|
| 858 | + /* aclk_dmac1 is controlled by sgrf_clkgat_con. */ |
|---|
| 859 | + SGRF_GATE(ACLK_DMAC1, "aclk_dmac1", "aclk_bus"), |
|---|
| 860 | + /* watchdog pclk is controlled by sgrf_clkgat_con. */ |
|---|
| 861 | + SGRF_GATE(PCLK_WDT, "pclk_wdt", "pclk_bus"), |
|---|
| 868 | 862 | |
|---|
| 869 | 863 | GATE(0, "hclk_bus_niu", "hclk_bus", CLK_IGNORE_UNUSED, RK3308_CLKGATE_CON(5), 5, GFLAGS), |
|---|
| 870 | 864 | GATE(0, "hclk_rom", "hclk_bus", CLK_IGNORE_UNUSED, RK3308_CLKGATE_CON(5), 6, GFLAGS), |
|---|
| .. | .. |
|---|
| 915 | 909 | COMPOSITE_FRACMUX(0, "dclk_vop_frac", "dclk_vop_src", CLK_SET_RATE_PARENT, |
|---|
| 916 | 910 | RK3308_CLKSEL_CON(9), 0, |
|---|
| 917 | 911 | RK3308_CLKGATE_CON(1), 7, GFLAGS, |
|---|
| 918 | | - &rk3308_dclk_vop_fracmux, RK3308_VOP_FRAC_MAX_PRATE), |
|---|
| 912 | + &rk3308_dclk_vop_fracmux), |
|---|
| 919 | 913 | }; |
|---|
| 920 | 914 | |
|---|
| 921 | 915 | static struct rockchip_clk_branch rk3308b_dclk_vop_frac[] __initdata = { |
|---|
| 922 | 916 | COMPOSITE_FRACMUX(0, "dclk_vop_frac", "dclk_vop_src", CLK_SET_RATE_PARENT, |
|---|
| 923 | 917 | RK3308_CLKSEL_CON(9), 0, |
|---|
| 924 | 918 | RK3308_CLKGATE_CON(1), 7, GFLAGS, |
|---|
| 925 | | - &rk3308_dclk_vop_fracmux, RK3308B_VOP_FRAC_MAX_PRATE), |
|---|
| 926 | | -}; |
|---|
| 927 | | - |
|---|
| 928 | | -static const char *const rk3308_critical_clocks[] __initconst = { |
|---|
| 929 | | - "aclk_bus", |
|---|
| 930 | | - "hclk_bus", |
|---|
| 931 | | - "pclk_bus", |
|---|
| 932 | | - "aclk_peri", |
|---|
| 933 | | - "hclk_peri", |
|---|
| 934 | | - "pclk_peri", |
|---|
| 935 | | - "hclk_audio", |
|---|
| 936 | | - "pclk_audio", |
|---|
| 937 | | - "sclk_ddrc", |
|---|
| 919 | + &rk3308_dclk_vop_fracmux), |
|---|
| 938 | 920 | }; |
|---|
| 939 | 921 | |
|---|
| 940 | 922 | static void __iomem *rk3308_cru_base; |
|---|
| .. | .. |
|---|
| 948 | 930 | 0x500, false); |
|---|
| 949 | 931 | } |
|---|
| 950 | 932 | } |
|---|
| 951 | | -EXPORT_SYMBOL_GPL(rk3308_dump_cru); |
|---|
| 952 | | - |
|---|
| 953 | | -static int rk3308_clk_panic(struct notifier_block *this, |
|---|
| 954 | | - unsigned long ev, void *ptr) |
|---|
| 955 | | -{ |
|---|
| 956 | | - rk3308_dump_cru(); |
|---|
| 957 | | - return NOTIFY_DONE; |
|---|
| 958 | | -} |
|---|
| 959 | | - |
|---|
| 960 | | -static struct notifier_block rk3308_clk_panic_block = { |
|---|
| 961 | | - .notifier_call = rk3308_clk_panic, |
|---|
| 962 | | -}; |
|---|
| 963 | 933 | |
|---|
| 964 | 934 | static void __init rk3308_clk_init(struct device_node *np) |
|---|
| 965 | 935 | { |
|---|
| 966 | 936 | struct rockchip_clk_provider *ctx; |
|---|
| 967 | 937 | void __iomem *reg_base; |
|---|
| 968 | | - struct clk *clk; |
|---|
| 938 | + struct clk **clks; |
|---|
| 969 | 939 | |
|---|
| 970 | 940 | reg_base = of_iomap(np, 0); |
|---|
| 971 | 941 | if (!reg_base) { |
|---|
| .. | .. |
|---|
| 973 | 943 | return; |
|---|
| 974 | 944 | } |
|---|
| 975 | 945 | |
|---|
| 976 | | - rk3308_cru_base = reg_base; |
|---|
| 977 | | - |
|---|
| 978 | 946 | ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); |
|---|
| 979 | 947 | if (IS_ERR(ctx)) { |
|---|
| 980 | 948 | pr_err("%s: rockchip clk init failed\n", __func__); |
|---|
| 981 | 949 | iounmap(reg_base); |
|---|
| 982 | 950 | return; |
|---|
| 983 | 951 | } |
|---|
| 984 | | - |
|---|
| 985 | | - /* aclk_dmac0 is controlled by sgrf. */ |
|---|
| 986 | | - clk = clk_register_fixed_factor(NULL, "aclk_dmac0", "aclk_bus", 0, 1, 1); |
|---|
| 987 | | - if (IS_ERR(clk)) |
|---|
| 988 | | - pr_warn("%s: could not register clock aclk_dmac0: %ld\n", |
|---|
| 989 | | - __func__, PTR_ERR(clk)); |
|---|
| 990 | | - else |
|---|
| 991 | | - rockchip_clk_add_lookup(ctx, clk, ACLK_DMAC0); |
|---|
| 992 | | - |
|---|
| 993 | | - /* aclk_dmac1 is controlled by sgrf. */ |
|---|
| 994 | | - clk = clk_register_fixed_factor(NULL, "aclk_dmac1", "aclk_bus", 0, 1, 1); |
|---|
| 995 | | - if (IS_ERR(clk)) |
|---|
| 996 | | - pr_warn("%s: could not register clock aclk_dmac1: %ld\n", |
|---|
| 997 | | - __func__, PTR_ERR(clk)); |
|---|
| 998 | | - else |
|---|
| 999 | | - rockchip_clk_add_lookup(ctx, clk, ACLK_DMAC1); |
|---|
| 1000 | | - |
|---|
| 1001 | | - /* watchdog pclk is controlled by sgrf. */ |
|---|
| 1002 | | - clk = clk_register_fixed_factor(NULL, "pclk_wdt", "pclk_bus", 0, 1, 1); |
|---|
| 1003 | | - if (IS_ERR(clk)) |
|---|
| 1004 | | - pr_warn("%s: could not register clock pclk_wdt: %ld\n", |
|---|
| 1005 | | - __func__, PTR_ERR(clk)); |
|---|
| 1006 | | - else |
|---|
| 1007 | | - rockchip_clk_add_lookup(ctx, clk, PCLK_WDT); |
|---|
| 952 | + clks = ctx->clk_data.clks; |
|---|
| 1008 | 953 | |
|---|
| 1009 | 954 | rockchip_clk_register_plls(ctx, rk3308_pll_clks, |
|---|
| 1010 | 955 | ARRAY_SIZE(rk3308_pll_clks), |
|---|
| .. | .. |
|---|
| 1018 | 963 | else |
|---|
| 1019 | 964 | rockchip_clk_register_branches(ctx, rk3308_dclk_vop_frac, |
|---|
| 1020 | 965 | ARRAY_SIZE(rk3308_dclk_vop_frac)); |
|---|
| 1021 | | - rockchip_clk_protect_critical(rk3308_critical_clocks, |
|---|
| 1022 | | - ARRAY_SIZE(rk3308_critical_clocks)); |
|---|
| 1023 | 966 | |
|---|
| 1024 | 967 | rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", |
|---|
| 1025 | | - mux_armclk_p, ARRAY_SIZE(mux_armclk_p), |
|---|
| 968 | + 3, clks[PLL_APLL], clks[PLL_VPLL0], |
|---|
| 1026 | 969 | &rk3308_cpuclk_data, rk3308_cpuclk_rates, |
|---|
| 1027 | 970 | ARRAY_SIZE(rk3308_cpuclk_rates)); |
|---|
| 1028 | 971 | |
|---|
| .. | .. |
|---|
| 1033 | 976 | |
|---|
| 1034 | 977 | rockchip_clk_of_add_provider(np, ctx); |
|---|
| 1035 | 978 | |
|---|
| 1036 | | - atomic_notifier_chain_register(&panic_notifier_list, |
|---|
| 1037 | | - &rk3308_clk_panic_block); |
|---|
| 979 | + if (!rk_dump_cru) { |
|---|
| 980 | + rk3308_cru_base = reg_base; |
|---|
| 981 | + rk_dump_cru = rk3308_dump_cru; |
|---|
| 982 | + } |
|---|
| 1038 | 983 | } |
|---|
| 1039 | 984 | |
|---|
| 1040 | 985 | CLK_OF_DECLARE(rk3308_cru, "rockchip,rk3308-cru", rk3308_clk_init); |
|---|
| 986 | + |
|---|
| 987 | +static int __init clk_rk3308_probe(struct platform_device *pdev) |
|---|
| 988 | +{ |
|---|
| 989 | + struct device_node *np = pdev->dev.of_node; |
|---|
| 990 | + |
|---|
| 991 | + rk3308_clk_init(np); |
|---|
| 992 | + |
|---|
| 993 | + return 0; |
|---|
| 994 | +} |
|---|
| 995 | + |
|---|
| 996 | +static const struct of_device_id clk_rk3308_match_table[] = { |
|---|
| 997 | + { |
|---|
| 998 | + .compatible = "rockchip,rk3308-cru", |
|---|
| 999 | + }, |
|---|
| 1000 | + { } |
|---|
| 1001 | +}; |
|---|
| 1002 | +MODULE_DEVICE_TABLE(of, clk_rk3308_match_table); |
|---|
| 1003 | + |
|---|
| 1004 | +static struct platform_driver clk_rk3308_driver = { |
|---|
| 1005 | + .driver = { |
|---|
| 1006 | + .name = "clk-rk3308", |
|---|
| 1007 | + .of_match_table = clk_rk3308_match_table, |
|---|
| 1008 | + }, |
|---|
| 1009 | +}; |
|---|
| 1010 | +builtin_platform_driver_probe(clk_rk3308_driver, clk_rk3308_probe); |
|---|
| 1011 | + |
|---|
| 1012 | +MODULE_DESCRIPTION("Rockchip RK3308 Clock Driver"); |
|---|
| 1013 | +MODULE_LICENSE("GPL"); |
|---|