2019-05-27 08:55:06 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2016-12-29 10:45:11 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016 Rockchip Electronics Co. Ltd.
|
|
|
|
* Author: Elaine <zhangqing@rock-chips.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/clk-provider.h>
|
2019-04-18 15:20:22 -07:00
|
|
|
#include <linux/io.h>
|
2016-12-29 10:45:11 +08:00
|
|
|
#include <linux/of.h>
|
|
|
|
#include <linux/of_address.h>
|
|
|
|
#include <linux/syscore_ops.h>
|
|
|
|
#include <dt-bindings/clock/rk3328-cru.h>
|
|
|
|
#include "clk.h"
|
|
|
|
|
2017-02-06 10:50:35 +08:00
|
|
|
#define RK3328_GRF_SOC_CON4 0x410
|
2016-12-29 10:45:11 +08:00
|
|
|
#define RK3328_GRF_SOC_STATUS0 0x480
|
|
|
|
#define RK3328_GRF_MAC_CON1 0x904
|
|
|
|
#define RK3328_GRF_MAC_CON2 0x908
|
|
|
|
|
|
|
|
enum rk3328_plls {
|
|
|
|
apll, dpll, cpll, gpll, npll,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct rockchip_pll_rate_table rk3328_pll_rates[] = {
|
|
|
|
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
|
|
|
|
RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(1000000000, 6, 500, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(984000000, 1, 82, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(960000000, 1, 80, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(936000000, 1, 78, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(900000000, 4, 300, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(888000000, 1, 74, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(864000000, 1, 72, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(840000000, 1, 70, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(800000000, 6, 400, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(700000000, 6, 350, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(696000000, 1, 58, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(600000000, 1, 75, 3, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(504000000, 1, 63, 3, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(500000000, 6, 250, 2, 1, 1, 0),
|
|
|
|
RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
|
|
|
|
RK3036_PLL_RATE(312000000, 1, 52, 2, 2, 1, 0),
|
|
|
|
RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
|
|
|
|
RK3036_PLL_RATE(96000000, 1, 64, 4, 4, 1, 0),
|
|
|
|
{ /* sentinel */ },
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct rockchip_pll_rate_table rk3328_pll_frac_rates[] = {
|
|
|
|
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134218),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 1016064000 */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671089),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 983040000 */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671089),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 983040000 */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671089),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 860156000 */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797895),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 903168000 */
|
2018-12-23 01:42:49 +09:00
|
|
|
RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066330),
|
2016-12-29 10:45:11 +08:00
|
|
|
/* vco = 819200000 */
|
|
|
|
{ /* sentinel */ },
|
|
|
|
};
|
|
|
|
|
|
|
|
#define RK3328_DIV_ACLKM_MASK 0x7
|
|
|
|
#define RK3328_DIV_ACLKM_SHIFT 4
|
|
|
|
#define RK3328_DIV_PCLK_DBG_MASK 0xf
|
|
|
|
#define RK3328_DIV_PCLK_DBG_SHIFT 0
|
|
|
|
|
|
|
|
#define RK3328_CLKSEL1(_aclk_core, _pclk_dbg) \
|
|
|
|
{ \
|
|
|
|
.reg = RK3328_CLKSEL_CON(1), \
|
|
|
|
.val = HIWORD_UPDATE(_aclk_core, RK3328_DIV_ACLKM_MASK, \
|
|
|
|
RK3328_DIV_ACLKM_SHIFT) | \
|
|
|
|
HIWORD_UPDATE(_pclk_dbg, RK3328_DIV_PCLK_DBG_MASK, \
|
|
|
|
RK3328_DIV_PCLK_DBG_SHIFT), \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define RK3328_CPUCLK_RATE(_prate, _aclk_core, _pclk_dbg) \
|
|
|
|
{ \
|
|
|
|
.prate = _prate, \
|
|
|
|
.divs = { \
|
|
|
|
RK3328_CLKSEL1(_aclk_core, _pclk_dbg), \
|
|
|
|
}, \
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct rockchip_cpuclk_rate_table rk3328_cpuclk_rates[] __initdata = {
|
|
|
|
RK3328_CPUCLK_RATE(1800000000, 1, 7),
|
|
|
|
RK3328_CPUCLK_RATE(1704000000, 1, 7),
|
|
|
|
RK3328_CPUCLK_RATE(1608000000, 1, 7),
|
|
|
|
RK3328_CPUCLK_RATE(1512000000, 1, 7),
|
|
|
|
RK3328_CPUCLK_RATE(1488000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1416000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1392000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1296000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1200000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1104000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(1008000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(912000000, 1, 5),
|
|
|
|
RK3328_CPUCLK_RATE(816000000, 1, 3),
|
|
|
|
RK3328_CPUCLK_RATE(696000000, 1, 3),
|
|
|
|
RK3328_CPUCLK_RATE(600000000, 1, 3),
|
|
|
|
RK3328_CPUCLK_RATE(408000000, 1, 1),
|
|
|
|
RK3328_CPUCLK_RATE(312000000, 1, 1),
|
|
|
|
RK3328_CPUCLK_RATE(216000000, 1, 1),
|
|
|
|
RK3328_CPUCLK_RATE(96000000, 1, 1),
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct rockchip_cpuclk_reg_data rk3328_cpuclk_data = {
|
2021-03-15 16:56:07 +08:00
|
|
|
.core_reg[0] = RK3328_CLKSEL_CON(0),
|
|
|
|
.div_core_shift[0] = 0,
|
|
|
|
.div_core_mask[0] = 0x1f,
|
|
|
|
.num_cores = 1,
|
2016-12-29 10:45:11 +08:00
|
|
|
.mux_core_alt = 1,
|
|
|
|
.mux_core_main = 3,
|
|
|
|
.mux_core_shift = 6,
|
|
|
|
.mux_core_mask = 0x3,
|
|
|
|
};
|
|
|
|
|
|
|
|
PNAME(mux_pll_p) = { "xin24m" };
|
|
|
|
|
|
|
|
PNAME(mux_2plls_p) = { "cpll", "gpll" };
|
|
|
|
PNAME(mux_gpll_cpll_p) = { "gpll", "cpll" };
|
|
|
|
PNAME(mux_cpll_gpll_apll_p) = { "cpll", "gpll", "apll" };
|
|
|
|
PNAME(mux_2plls_xin24m_p) = { "cpll", "gpll", "xin24m" };
|
|
|
|
PNAME(mux_2plls_hdmiphy_p) = { "cpll", "gpll",
|
|
|
|
"dummy_hdmiphy" };
|
|
|
|
PNAME(mux_4plls_p) = { "cpll", "gpll",
|
|
|
|
"dummy_hdmiphy",
|
|
|
|
"usb480m" };
|
|
|
|
PNAME(mux_2plls_u480m_p) = { "cpll", "gpll",
|
|
|
|
"usb480m" };
|
|
|
|
PNAME(mux_2plls_24m_u480m_p) = { "cpll", "gpll",
|
|
|
|
"xin24m", "usb480m" };
|
|
|
|
|
|
|
|
PNAME(mux_ddrphy_p) = { "dpll", "apll", "cpll" };
|
|
|
|
PNAME(mux_armclk_p) = { "apll_core",
|
|
|
|
"gpll_core",
|
|
|
|
"dpll_core",
|
|
|
|
"npll_core"};
|
|
|
|
PNAME(mux_hdmiphy_p) = { "hdmi_phy", "xin24m" };
|
|
|
|
PNAME(mux_usb480m_p) = { "usb480m_phy",
|
|
|
|
"xin24m" };
|
|
|
|
|
|
|
|
PNAME(mux_i2s0_p) = { "clk_i2s0_div",
|
|
|
|
"clk_i2s0_frac",
|
|
|
|
"xin12m",
|
|
|
|
"xin12m" };
|
|
|
|
PNAME(mux_i2s1_p) = { "clk_i2s1_div",
|
|
|
|
"clk_i2s1_frac",
|
|
|
|
"clkin_i2s1",
|
|
|
|
"xin12m" };
|
|
|
|
PNAME(mux_i2s2_p) = { "clk_i2s2_div",
|
|
|
|
"clk_i2s2_frac",
|
|
|
|
"clkin_i2s2",
|
|
|
|
"xin12m" };
|
|
|
|
PNAME(mux_i2s1out_p) = { "clk_i2s1", "xin12m"};
|
|
|
|
PNAME(mux_i2s2out_p) = { "clk_i2s2", "xin12m" };
|
|
|
|
PNAME(mux_spdif_p) = { "clk_spdif_div",
|
|
|
|
"clk_spdif_frac",
|
|
|
|
"xin12m",
|
|
|
|
"xin12m" };
|
|
|
|
PNAME(mux_uart0_p) = { "clk_uart0_div",
|
|
|
|
"clk_uart0_frac",
|
|
|
|
"xin24m" };
|
|
|
|
PNAME(mux_uart1_p) = { "clk_uart1_div",
|
|
|
|
"clk_uart1_frac",
|
|
|
|
"xin24m" };
|
|
|
|
PNAME(mux_uart2_p) = { "clk_uart2_div",
|
|
|
|
"clk_uart2_frac",
|
|
|
|
"xin24m" };
|
|
|
|
|
|
|
|
PNAME(mux_sclk_cif_p) = { "clk_cif_src",
|
|
|
|
"xin24m" };
|
|
|
|
PNAME(mux_dclk_lcdc_p) = { "hdmiphy",
|
|
|
|
"dclk_lcdc_src" };
|
|
|
|
PNAME(mux_aclk_peri_pre_p) = { "cpll_peri",
|
|
|
|
"gpll_peri",
|
|
|
|
"hdmiphy_peri" };
|
|
|
|
PNAME(mux_ref_usb3otg_src_p) = { "xin24m",
|
2025-01-15 01:26:22 +00:00
|
|
|
"clk_ref_usb3otg_src" };
|
2016-12-29 10:45:11 +08:00
|
|
|
PNAME(mux_xin24m_32k_p) = { "xin24m",
|
|
|
|
"clk_rtc32k" };
|
|
|
|
PNAME(mux_mac2io_src_p) = { "clk_mac2io_src",
|
|
|
|
"gmac_clkin" };
|
|
|
|
PNAME(mux_mac2phy_src_p) = { "clk_mac2phy_src",
|
|
|
|
"phy_50m_out" };
|
2017-02-06 10:50:35 +08:00
|
|
|
PNAME(mux_mac2io_ext_p) = { "clk_mac2io",
|
|
|
|
"gmac_clkin" };
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
static struct rockchip_pll_clock rk3328_pll_clks[] __initdata = {
|
|
|
|
[apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p,
|
|
|
|
0, RK3328_PLL_CON(0),
|
|
|
|
RK3328_MODE_CON, 0, 4, 0, rk3328_pll_frac_rates),
|
|
|
|
[dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p,
|
|
|
|
0, RK3328_PLL_CON(8),
|
|
|
|
RK3328_MODE_CON, 4, 3, 0, NULL),
|
|
|
|
[cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p,
|
|
|
|
0, RK3328_PLL_CON(16),
|
|
|
|
RK3328_MODE_CON, 8, 2, 0, rk3328_pll_rates),
|
|
|
|
[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
|
|
|
|
0, RK3328_PLL_CON(24),
|
|
|
|
RK3328_MODE_CON, 12, 1, 0, rk3328_pll_frac_rates),
|
|
|
|
[npll] = PLL(pll_rk3328, PLL_NPLL, "npll", mux_pll_p,
|
|
|
|
0, RK3328_PLL_CON(40),
|
|
|
|
RK3328_MODE_CON, 1, 0, 0, rk3328_pll_rates),
|
|
|
|
};
|
|
|
|
|
|
|
|
#define MFLAGS CLK_MUX_HIWORD_MASK
|
|
|
|
#define DFLAGS CLK_DIVIDER_HIWORD_MASK
|
|
|
|
#define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_i2s0_fracmux __initdata =
|
|
|
|
MUX(0, "i2s0_pre", mux_i2s0_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(6), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_i2s1_fracmux __initdata =
|
|
|
|
MUX(0, "i2s1_pre", mux_i2s1_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(8), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_i2s2_fracmux __initdata =
|
|
|
|
MUX(0, "i2s2_pre", mux_i2s2_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(10), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_spdif_fracmux __initdata =
|
|
|
|
MUX(SCLK_SPDIF, "sclk_spdif", mux_spdif_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(12), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_uart0_fracmux __initdata =
|
|
|
|
MUX(SCLK_UART0, "sclk_uart0", mux_uart0_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(14), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_uart1_fracmux __initdata =
|
|
|
|
MUX(SCLK_UART1, "sclk_uart1", mux_uart1_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(16), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_uart2_fracmux __initdata =
|
|
|
|
MUX(SCLK_UART2, "sclk_uart2", mux_uart2_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(18), 8, 2, MFLAGS);
|
|
|
|
|
|
|
|
static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 1
|
|
|
|
*/
|
|
|
|
|
|
|
|
DIV(0, "clk_24m", "xin24m", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(2), 8, 5, DFLAGS),
|
|
|
|
COMPOSITE(SCLK_RTC32K, "clk_rtc32k", mux_2plls_xin24m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(38), 14, 2, MFLAGS, 0, 14, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(0), 11, GFLAGS),
|
|
|
|
|
|
|
|
/* PD_MISC */
|
|
|
|
MUX(HDMIPHY, "hdmiphy", mux_hdmiphy_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_MISC_CON, 13, 1, MFLAGS),
|
|
|
|
MUX(USB480M, "usb480m", mux_usb480m_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_MISC_CON, 15, 1, MFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 2
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_CORE */
|
|
|
|
GATE(0, "apll_core", "apll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(0), 0, GFLAGS),
|
|
|
|
GATE(0, "gpll_core", "gpll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(0), 2, GFLAGS),
|
|
|
|
GATE(0, "dpll_core", "dpll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(0), 1, GFLAGS),
|
|
|
|
GATE(0, "npll_core", "npll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(0), 12, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(0, "pclk_dbg", "armclk", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(1), 0, 4, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
|
|
|
RK3328_CLKGATE_CON(7), 0, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(0, "aclk_core", "armclk", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(1), 4, 3, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
|
|
|
RK3328_CLKGATE_CON(7), 1, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_core_niu", "aclk_core", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(13), 0, GFLAGS),
|
|
|
|
GATE(0, "aclk_gic400", "aclk_core", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(13), 1, GFLAGS),
|
|
|
|
|
|
|
|
GATE(0, "clk_jtag", "jtag_clkin", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(7), 2, GFLAGS),
|
|
|
|
|
|
|
|
/* PD_GPU */
|
|
|
|
COMPOSITE(0, "aclk_gpu_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(44), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 6, GFLAGS),
|
|
|
|
GATE(ACLK_GPU, "aclk_gpu", "aclk_gpu_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(14), 0, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_gpu_niu", "aclk_gpu_pre", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(14), 1, GFLAGS),
|
|
|
|
|
|
|
|
/* PD_DDR */
|
|
|
|
COMPOSITE(0, "clk_ddr", mux_ddrphy_p, CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,
|
|
|
|
RK3328_CLKGATE_CON(0), 4, GFLAGS),
|
|
|
|
GATE(0, "clk_ddrmsch", "clk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 6, GFLAGS),
|
|
|
|
GATE(0, "clk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 5, GFLAGS),
|
|
|
|
GATE(0, "aclk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 4, GFLAGS),
|
|
|
|
GATE(0, "clk_ddrmon", "xin24m", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(0), 6, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(PCLK_DDR, "pclk_ddr", mux_2plls_hdmiphy_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(4), 13, 2, MFLAGS, 8, 3, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(7), 4, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddrupctl", "pclk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 1, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddr_msch", "pclk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 2, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddr_mon", "pclk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 3, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddrstdby", "pclk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 7, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddr_grf", "pclk_ddr", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(18), 9, GFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 3
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_BUS */
|
|
|
|
COMPOSITE(ACLK_BUS_PRE, "aclk_bus_pre", mux_2plls_hdmiphy_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(0), 13, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(8), 0, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(HCLK_BUS_PRE, "hclk_bus_pre", "aclk_bus_pre", 0,
|
|
|
|
RK3328_CLKSEL_CON(1), 8, 2, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(8), 1, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(PCLK_BUS_PRE, "pclk_bus_pre", "aclk_bus_pre", 0,
|
|
|
|
RK3328_CLKSEL_CON(1), 12, 3, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(8), 2, GFLAGS),
|
|
|
|
GATE(0, "pclk_bus", "pclk_bus_pre", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 3, GFLAGS),
|
|
|
|
GATE(0, "pclk_phy_pre", "pclk_bus_pre", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 4, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_TSP, "clk_tsp", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(21), 15, 1, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 5, GFLAGS),
|
|
|
|
GATE(0, "clk_hsadc_tsp", "ext_gpio3a2", 0,
|
|
|
|
RK3328_CLKGATE_CON(17), 13, GFLAGS),
|
|
|
|
|
|
|
|
/* PD_I2S */
|
|
|
|
COMPOSITE(0, "clk_i2s0_div", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(6), 15, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 1, GFLAGS),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_i2s0_frac", "clk_i2s0_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(7), 0,
|
|
|
|
RK3328_CLKGATE_CON(1), 2, GFLAGS,
|
|
|
|
&rk3328_i2s0_fracmux),
|
|
|
|
GATE(SCLK_I2S0, "clk_i2s0", "i2s0_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(1), 3, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(0, "clk_i2s1_div", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(8), 15, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 4, GFLAGS),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_i2s1_frac", "clk_i2s1_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(9), 0,
|
|
|
|
RK3328_CLKGATE_CON(1), 5, GFLAGS,
|
|
|
|
&rk3328_i2s1_fracmux),
|
|
|
|
GATE(SCLK_I2S1, "clk_i2s1", "i2s1_pre", CLK_SET_RATE_PARENT,
|
2018-11-18 13:16:12 +09:00
|
|
|
RK3328_CLKGATE_CON(1), 6, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
COMPOSITE_NODIV(SCLK_I2S1_OUT, "i2s1_out", mux_i2s1out_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(8), 12, 1, MFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 7, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(0, "clk_i2s2_div", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(10), 15, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 8, GFLAGS),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_i2s2_frac", "clk_i2s2_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(11), 0,
|
|
|
|
RK3328_CLKGATE_CON(1), 9, GFLAGS,
|
|
|
|
&rk3328_i2s2_fracmux),
|
|
|
|
GATE(SCLK_I2S2, "clk_i2s2", "i2s2_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(1), 10, GFLAGS),
|
|
|
|
COMPOSITE_NODIV(SCLK_I2S2_OUT, "i2s2_out", mux_i2s2out_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(10), 12, 1, MFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 11, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(0, "clk_spdif_div", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(12), 15, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 12, GFLAGS),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_spdif_frac", "clk_spdif_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(13), 0,
|
|
|
|
RK3328_CLKGATE_CON(1), 13, GFLAGS,
|
|
|
|
&rk3328_spdif_fracmux),
|
|
|
|
|
|
|
|
/* PD_UART */
|
|
|
|
COMPOSITE(0, "clk_uart0_div", mux_2plls_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(14), 12, 2, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(1), 14, GFLAGS),
|
|
|
|
COMPOSITE(0, "clk_uart1_div", mux_2plls_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(16), 12, 2, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 0, GFLAGS),
|
|
|
|
COMPOSITE(0, "clk_uart2_div", mux_2plls_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(18), 12, 2, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 2, GFLAGS),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_uart0_frac", "clk_uart0_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(15), 0,
|
|
|
|
RK3328_CLKGATE_CON(1), 15, GFLAGS,
|
|
|
|
&rk3328_uart0_fracmux),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_uart1_frac", "clk_uart1_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(17), 0,
|
|
|
|
RK3328_CLKGATE_CON(2), 1, GFLAGS,
|
|
|
|
&rk3328_uart1_fracmux),
|
|
|
|
COMPOSITE_FRACMUX(0, "clk_uart2_frac", "clk_uart2_div", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(19), 0,
|
|
|
|
RK3328_CLKGATE_CON(2), 3, GFLAGS,
|
|
|
|
&rk3328_uart2_fracmux),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 4
|
|
|
|
*/
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_I2C0, "clk_i2c0", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(34), 7, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 9, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_I2C1, "clk_i2c1", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(34), 15, 1, MFLAGS, 8, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 10, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_I2C2, "clk_i2c2", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(35), 7, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 11, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_I2C3, "clk_i2c3", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(35), 15, 1, MFLAGS, 8, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 12, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_CRYPTO, "clk_crypto", mux_2plls_p, 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKSEL_CON(20), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(2), 4, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(SCLK_TSADC, "clk_tsadc", "clk_24m", 0,
|
|
|
|
RK3328_CLKSEL_CON(22), 0, 10, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 6, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(SCLK_SARADC, "clk_saradc", "clk_24m", 0,
|
|
|
|
RK3328_CLKSEL_CON(23), 0, 10, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 14, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_SPI, "clk_spi", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(24), 7, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 7, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_PWM, "clk_pwm", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(24), 15, 1, MFLAGS, 8, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 8, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_OTP, "clk_otp", mux_2plls_xin24m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(4), 6, 2, MFLAGS, 0, 6, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(3), 8, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_EFUSE, "clk_efuse", mux_2plls_xin24m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(5), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 13, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_PDM, "clk_pdm", mux_cpll_gpll_apll_p, CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(20), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(2), 15, GFLAGS),
|
|
|
|
|
|
|
|
GATE(SCLK_TIMER0, "sclk_timer0", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 5, GFLAGS),
|
|
|
|
GATE(SCLK_TIMER1, "sclk_timer1", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 6, GFLAGS),
|
|
|
|
GATE(SCLK_TIMER2, "sclk_timer2", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 7, GFLAGS),
|
|
|
|
GATE(SCLK_TIMER3, "sclk_timer3", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 8, GFLAGS),
|
|
|
|
GATE(SCLK_TIMER4, "sclk_timer4", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 9, GFLAGS),
|
|
|
|
GATE(SCLK_TIMER5, "sclk_timer5", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(8), 10, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_WIFI, "clk_wifi", mux_2plls_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(52), 6, 2, MFLAGS, 0, 6, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(0), 10, GFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 5
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_VIDEO */
|
|
|
|
COMPOSITE(ACLK_RKVDEC_PRE, "aclk_rkvdec_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(48), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 0, GFLAGS),
|
|
|
|
FACTOR_GATE(HCLK_RKVDEC_PRE, "hclk_rkvdec_pre", "aclk_rkvdec_pre", 0, 1, 4,
|
|
|
|
RK3328_CLKGATE_CON(11), 0, GFLAGS),
|
|
|
|
GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(24), 0, GFLAGS),
|
|
|
|
GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(24), 1, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_rkvdec_niu", "aclk_rkvdec_pre", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(24), 2, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "hclk_rkvdec_niu", "hclk_rkvdec_pre", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(24), 3, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_VDEC_CABAC, "sclk_vdec_cabac", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(48), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 1, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_VDEC_CORE, "sclk_vdec_core", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(49), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 2, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(ACLK_VPU_PRE, "aclk_vpu_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(50), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 5, GFLAGS),
|
|
|
|
FACTOR_GATE(HCLK_VPU_PRE, "hclk_vpu_pre", "aclk_vpu_pre", 0, 1, 4,
|
|
|
|
RK3328_CLKGATE_CON(11), 8, GFLAGS),
|
|
|
|
GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(23), 0, GFLAGS),
|
|
|
|
GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_pre", CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(23), 1, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_vpu_niu", "aclk_vpu_pre", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(23), 2, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "hclk_vpu_niu", "hclk_vpu_pre", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(23), 3, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(ACLK_RKVENC, "aclk_rkvenc", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(51), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 3, GFLAGS),
|
|
|
|
FACTOR_GATE(HCLK_RKVENC, "hclk_rkvenc", "aclk_rkvenc", 0, 1, 4,
|
|
|
|
RK3328_CLKGATE_CON(11), 4, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_rkvenc_niu", "aclk_rkvenc", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(25), 0, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "hclk_rkvenc_niu", "hclk_rkvenc", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(25), 1, GFLAGS),
|
|
|
|
GATE(ACLK_H265, "aclk_h265", "aclk_rkvenc", 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKGATE_CON(25), 2, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(PCLK_H265, "pclk_h265", "hclk_rkvenc", 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKGATE_CON(25), 3, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(ACLK_H264, "aclk_h264", "aclk_rkvenc", 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKGATE_CON(25), 4, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(HCLK_H264, "hclk_h264", "hclk_rkvenc", 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKGATE_CON(25), 5, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(ACLK_AXISRAM, "aclk_axisram", "aclk_rkvenc", CLK_IGNORE_UNUSED,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKGATE_CON(25), 6, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
COMPOSITE(SCLK_VENC_CORE, "sclk_venc_core", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(51), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 4, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_VENC_DSP, "sclk_venc_dsp", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(52), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(6), 7, GFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 6
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_VIO */
|
|
|
|
COMPOSITE(ACLK_VIO_PRE, "aclk_vio_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(37), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 2, GFLAGS),
|
|
|
|
DIV(HCLK_VIO_PRE, "hclk_vio_pre", "aclk_vio_pre", 0,
|
|
|
|
RK3328_CLKSEL_CON(37), 8, 5, DFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(ACLK_RGA_PRE, "aclk_rga_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(36), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 0, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_RGA, "clk_rga", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(36), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 1, GFLAGS),
|
|
|
|
COMPOSITE(ACLK_VOP_PRE, "aclk_vop_pre", mux_4plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(39), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 5, GFLAGS),
|
2017-12-11 01:11:14 +01:00
|
|
|
GATE(SCLK_HDMI_SFC, "sclk_hdmi_sfc", "xin24m", 0,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(5), 4, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE_NODIV(0, "clk_cif_src", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(42), 7, 1, MFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 3, GFLAGS),
|
|
|
|
COMPOSITE_NOGATE(SCLK_CIF_OUT, "clk_cif_out", mux_sclk_cif_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(42), 5, 1, MFLAGS, 0, 5, DFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(DCLK_LCDC_SRC, "dclk_lcdc_src", mux_gpll_cpll_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(40), 0, 1, MFLAGS, 8, 8, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(5), 6, GFLAGS),
|
|
|
|
DIV(DCLK_HDMIPHY, "dclk_hdmiphy", "dclk_lcdc_src", 0,
|
|
|
|
RK3328_CLKSEL_CON(40), 3, 3, DFLAGS),
|
2017-05-25 18:00:24 +08:00
|
|
|
MUX(DCLK_LCDC, "dclk_lcdc", mux_dclk_lcdc_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKSEL_CON(40), 1, 1, MFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 7
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_PERI */
|
|
|
|
GATE(0, "gpll_peri", "gpll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(4), 0, GFLAGS),
|
|
|
|
GATE(0, "cpll_peri", "cpll", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(4), 1, GFLAGS),
|
|
|
|
GATE(0, "hdmiphy_peri", "hdmiphy", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKGATE_CON(4), 2, GFLAGS),
|
|
|
|
COMPOSITE_NOGATE(ACLK_PERI_PRE, "aclk_peri_pre", mux_aclk_peri_pre_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(28), 6, 2, MFLAGS, 0, 5, DFLAGS),
|
|
|
|
COMPOSITE_NOMUX(PCLK_PERI, "pclk_peri", "aclk_peri_pre", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(29), 0, 2, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(10), 2, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(HCLK_PERI, "hclk_peri", "aclk_peri_pre", CLK_IGNORE_UNUSED,
|
|
|
|
RK3328_CLKSEL_CON(29), 4, 3, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(10), 1, GFLAGS),
|
|
|
|
GATE(ACLK_PERI, "aclk_peri", "aclk_peri_pre", CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKGATE_CON(10), 0, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_SDMMC, "clk_sdmmc", mux_2plls_24m_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(30), 8, 2, MFLAGS, 0, 8, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 3, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_SDIO, "clk_sdio", mux_2plls_24m_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(31), 8, 2, MFLAGS, 0, 8, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 4, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_EMMC, "clk_emmc", mux_2plls_24m_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(32), 8, 2, MFLAGS, 0, 8, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 5, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_SDMMC_EXT, "clk_sdmmc_ext", mux_2plls_24m_u480m_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(43), 8, 2, MFLAGS, 0, 8, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 10, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_REF_USB3OTG_SRC, "clk_ref_usb3otg_src", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(45), 7, 1, MFLAGS, 0, 7, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 9, GFLAGS),
|
|
|
|
|
|
|
|
MUX(SCLK_REF_USB3OTG, "clk_ref_usb3otg", mux_ref_usb3otg_src_p, CLK_SET_RATE_PARENT,
|
|
|
|
RK3328_CLKSEL_CON(45), 8, 1, MFLAGS),
|
|
|
|
|
|
|
|
GATE(SCLK_USB3OTG_REF, "clk_usb3otg_ref", "xin24m", 0,
|
|
|
|
RK3328_CLKGATE_CON(4), 7, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_USB3OTG_SUSPEND, "clk_usb3otg_suspend", mux_xin24m_32k_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(33), 15, 1, MFLAGS, 0, 10, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(4), 8, GFLAGS),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 8
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_GMAC */
|
|
|
|
COMPOSITE(ACLK_GMAC, "aclk_gmac", mux_2plls_hdmiphy_p, 0,
|
2019-03-10 12:00:45 +00:00
|
|
|
RK3328_CLKSEL_CON(25), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_CLKGATE_CON(3), 2, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(PCLK_GMAC, "pclk_gmac", "aclk_gmac", 0,
|
|
|
|
RK3328_CLKSEL_CON(25), 8, 3, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(9), 0, GFLAGS),
|
|
|
|
|
|
|
|
COMPOSITE(SCLK_MAC2IO_SRC, "clk_mac2io_src", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(27), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(3), 1, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2IO_REF, "clk_mac2io_ref", "clk_mac2io", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 7, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2IO_RX, "clk_mac2io_rx", "clk_mac2io", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 4, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2IO_TX, "clk_mac2io_tx", "clk_mac2io", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 5, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2IO_REFOUT, "clk_mac2io_refout", "clk_mac2io", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 6, GFLAGS),
|
|
|
|
COMPOSITE(SCLK_MAC2IO_OUT, "clk_mac2io_out", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(27), 15, 1, MFLAGS, 8, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(3), 5, GFLAGS),
|
2017-02-06 10:50:35 +08:00
|
|
|
MUXGRF(SCLK_MAC2IO, "clk_mac2io", mux_mac2io_src_p, CLK_SET_RATE_NO_REPARENT,
|
clk: rockchip: introduce auxiliary GRFs
The MUXGRF clock branch type depends on having access to some sort of
GRF as a regmap to be registered. So far, we could easily get away with
only ever having one GRF stowed away in the context.
However, newer Rockchip SoCs, such as the RK3576, have several GRFs
which are relevant for clock purposes. It already depends on the pmu0
GRF for MUXGRF reasons, but could get away with not refactoring this
because it didn't need the sysgrf at all, so could overwrite the pointer
in the clock provider to the pmu0 grf regmap handle.
In preparation for needing to finally access more than one GRF per SoC,
let's untangle this. Introduce an auxiliary GRF hashmap, and a GRF type
enum. The hashmap is keyed by the enum, and clock branches now have a
struct member to store the value of that enum, which defaults to the
system GRF.
The SoC-specific _clk_init function can then insert pointers to GRF
regmaps into the hashmap based on the grf type.
During clock branch registration, we then pick the right GRF for each
branch from the hashmap if something other than the sys GRF is
requested.
The reason for doing it with this grf type indirection in the clock
branches is so that we don't need to define the MUXGRF branches in a
separate step, just to have a direct pointer to a regmap available
already.
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/20250502-rk3576-sai-v3-2-376cef19dd7c@collabora.com
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
2025-05-02 13:03:08 +02:00
|
|
|
RK3328_GRF_MAC_CON1, 10, 1, MFLAGS, grf_type_sys),
|
2017-02-06 10:50:35 +08:00
|
|
|
MUXGRF(SCLK_MAC2IO_EXT, "clk_mac2io_ext", mux_mac2io_ext_p, CLK_SET_RATE_NO_REPARENT,
|
clk: rockchip: introduce auxiliary GRFs
The MUXGRF clock branch type depends on having access to some sort of
GRF as a regmap to be registered. So far, we could easily get away with
only ever having one GRF stowed away in the context.
However, newer Rockchip SoCs, such as the RK3576, have several GRFs
which are relevant for clock purposes. It already depends on the pmu0
GRF for MUXGRF reasons, but could get away with not refactoring this
because it didn't need the sysgrf at all, so could overwrite the pointer
in the clock provider to the pmu0 grf regmap handle.
In preparation for needing to finally access more than one GRF per SoC,
let's untangle this. Introduce an auxiliary GRF hashmap, and a GRF type
enum. The hashmap is keyed by the enum, and clock branches now have a
struct member to store the value of that enum, which defaults to the
system GRF.
The SoC-specific _clk_init function can then insert pointers to GRF
regmaps into the hashmap based on the grf type.
During clock branch registration, we then pick the right GRF for each
branch from the hashmap if something other than the sys GRF is
requested.
The reason for doing it with this grf type indirection in the clock
branches is so that we don't need to define the MUXGRF branches in a
separate step, just to have a direct pointer to a regmap available
already.
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/20250502-rk3576-sai-v3-2-376cef19dd7c@collabora.com
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
2025-05-02 13:03:08 +02:00
|
|
|
RK3328_GRF_SOC_CON4, 14, 1, MFLAGS, grf_type_sys),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
COMPOSITE(SCLK_MAC2PHY_SRC, "clk_mac2phy_src", mux_2plls_p, 0,
|
|
|
|
RK3328_CLKSEL_CON(26), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(3), 0, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2PHY_REF, "clk_mac2phy_ref", "clk_mac2phy", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 3, GFLAGS),
|
|
|
|
GATE(SCLK_MAC2PHY_RXTX, "clk_mac2phy_rxtx", "clk_mac2phy", 0,
|
|
|
|
RK3328_CLKGATE_CON(9), 1, GFLAGS),
|
|
|
|
COMPOSITE_NOMUX(SCLK_MAC2PHY_OUT, "clk_mac2phy_out", "clk_mac2phy", 0,
|
|
|
|
RK3328_CLKSEL_CON(26), 8, 2, DFLAGS,
|
|
|
|
RK3328_CLKGATE_CON(9), 2, GFLAGS),
|
2017-02-06 10:50:35 +08:00
|
|
|
MUXGRF(SCLK_MAC2PHY, "clk_mac2phy", mux_mac2phy_src_p, CLK_SET_RATE_NO_REPARENT,
|
clk: rockchip: introduce auxiliary GRFs
The MUXGRF clock branch type depends on having access to some sort of
GRF as a regmap to be registered. So far, we could easily get away with
only ever having one GRF stowed away in the context.
However, newer Rockchip SoCs, such as the RK3576, have several GRFs
which are relevant for clock purposes. It already depends on the pmu0
GRF for MUXGRF reasons, but could get away with not refactoring this
because it didn't need the sysgrf at all, so could overwrite the pointer
in the clock provider to the pmu0 grf regmap handle.
In preparation for needing to finally access more than one GRF per SoC,
let's untangle this. Introduce an auxiliary GRF hashmap, and a GRF type
enum. The hashmap is keyed by the enum, and clock branches now have a
struct member to store the value of that enum, which defaults to the
system GRF.
The SoC-specific _clk_init function can then insert pointers to GRF
regmaps into the hashmap based on the grf type.
During clock branch registration, we then pick the right GRF for each
branch from the hashmap if something other than the sys GRF is
requested.
The reason for doing it with this grf type indirection in the clock
branches is so that we don't need to define the MUXGRF branches in a
separate step, just to have a direct pointer to a regmap available
already.
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/20250502-rk3576-sai-v3-2-376cef19dd7c@collabora.com
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
2025-05-02 13:03:08 +02:00
|
|
|
RK3328_GRF_MAC_CON2, 10, 1, MFLAGS, grf_type_sys),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clock-Architecture Diagram 9
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* PD_VOP */
|
|
|
|
GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", 0, RK3328_CLKGATE_CON(21), 10, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_rga_niu", "aclk_rga_pre", 0, RK3328_CLKGATE_CON(22), 3, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(ACLK_VOP, "aclk_vop", "aclk_vop_pre", 0, RK3328_CLKGATE_CON(21), 2, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_vop_niu", "aclk_vop_pre", 0, RK3328_CLKGATE_CON(21), 4, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
GATE(ACLK_IEP, "aclk_iep", "aclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 6, GFLAGS),
|
|
|
|
GATE(ACLK_CIF, "aclk_cif", "aclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 8, GFLAGS),
|
|
|
|
GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 15, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_vio_niu", "aclk_vio_pre", 0, RK3328_CLKGATE_CON(22), 2, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
GATE(HCLK_VOP, "hclk_vop", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 3, GFLAGS),
|
|
|
|
GATE(0, "hclk_vop_niu", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 5, GFLAGS),
|
|
|
|
GATE(HCLK_IEP, "hclk_iep", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 7, GFLAGS),
|
|
|
|
GATE(HCLK_CIF, "hclk_cif", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 9, GFLAGS),
|
|
|
|
GATE(HCLK_RGA, "hclk_rga", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 11, GFLAGS),
|
|
|
|
GATE(0, "hclk_ahb1tom", "hclk_vio_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(21), 12, GFLAGS),
|
2017-12-23 16:30:19 +01:00
|
|
|
GATE(0, "pclk_vio_h2p", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 13, GFLAGS),
|
|
|
|
GATE(0, "hclk_vio_h2p", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(21), 14, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(22), 0, GFLAGS),
|
2017-12-10 20:03:19 +01:00
|
|
|
GATE(0, "hclk_vio_niu", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(22), 1, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(PCLK_HDMI, "pclk_hdmi", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(22), 4, GFLAGS),
|
|
|
|
GATE(PCLK_HDCP, "pclk_hdcp", "hclk_vio_pre", 0, RK3328_CLKGATE_CON(22), 5, GFLAGS),
|
|
|
|
|
|
|
|
/* PD_PERI */
|
|
|
|
GATE(0, "aclk_peri_noc", "aclk_peri", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(19), 11, GFLAGS),
|
2019-03-10 12:00:45 +00:00
|
|
|
GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_peri", 0, RK3328_CLKGATE_CON(19), 14, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 0, GFLAGS),
|
|
|
|
GATE(HCLK_SDIO, "hclk_sdio", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 1, GFLAGS),
|
|
|
|
GATE(HCLK_EMMC, "hclk_emmc", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 2, GFLAGS),
|
|
|
|
GATE(HCLK_SDMMC_EXT, "hclk_sdmmc_ext", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 15, GFLAGS),
|
|
|
|
GATE(HCLK_HOST0, "hclk_host0", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 6, GFLAGS),
|
|
|
|
GATE(HCLK_HOST0_ARB, "hclk_host0_arb", "hclk_peri", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(19), 7, GFLAGS),
|
|
|
|
GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 8, GFLAGS),
|
|
|
|
GATE(HCLK_OTG_PMU, "hclk_otg_pmu", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 9, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "hclk_peri_niu", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 12, GFLAGS),
|
|
|
|
GATE(0, "pclk_peri_niu", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 13, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
/* PD_GMAC */
|
|
|
|
GATE(ACLK_MAC2PHY, "aclk_mac2phy", "aclk_gmac", 0, RK3328_CLKGATE_CON(26), 0, GFLAGS),
|
|
|
|
GATE(ACLK_MAC2IO, "aclk_mac2io", "aclk_gmac", 0, RK3328_CLKGATE_CON(26), 2, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_gmac_niu", "aclk_gmac", 0, RK3328_CLKGATE_CON(26), 4, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(PCLK_MAC2PHY, "pclk_mac2phy", "pclk_gmac", 0, RK3328_CLKGATE_CON(26), 1, GFLAGS),
|
|
|
|
GATE(PCLK_MAC2IO, "pclk_mac2io", "pclk_gmac", 0, RK3328_CLKGATE_CON(26), 3, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "pclk_gmac_niu", "pclk_gmac", 0, RK3328_CLKGATE_CON(26), 5, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
/* PD_BUS */
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "aclk_bus_niu", "aclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 12, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 11, GFLAGS),
|
|
|
|
GATE(ACLK_TSP, "aclk_tsp", "aclk_bus_pre", 0, RK3328_CLKGATE_CON(17), 12, GFLAGS),
|
|
|
|
GATE(0, "aclk_intmem", "aclk_bus_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(15), 0, GFLAGS),
|
|
|
|
GATE(ACLK_DMAC, "aclk_dmac_bus", "aclk_bus_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(15), 1, GFLAGS),
|
|
|
|
|
|
|
|
GATE(0, "hclk_rom", "hclk_bus_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(15), 2, GFLAGS),
|
|
|
|
GATE(HCLK_I2S0_8CH, "hclk_i2s0_8ch", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 3, GFLAGS),
|
|
|
|
GATE(HCLK_I2S1_8CH, "hclk_i2s1_8ch", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 4, GFLAGS),
|
|
|
|
GATE(HCLK_I2S2_2CH, "hclk_i2s2_2ch", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 5, GFLAGS),
|
|
|
|
GATE(HCLK_SPDIF_8CH, "hclk_spdif_8ch", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 6, GFLAGS),
|
|
|
|
GATE(HCLK_TSP, "hclk_tsp", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(17), 11, GFLAGS),
|
|
|
|
GATE(HCLK_CRYPTO_MST, "hclk_crypto_mst", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 7, GFLAGS),
|
|
|
|
GATE(HCLK_CRYPTO_SLV, "hclk_crypto_slv", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 8, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "hclk_bus_niu", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(15), 13, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(HCLK_PDM, "hclk_pdm", "hclk_bus_pre", 0, RK3328_CLKGATE_CON(28), 0, GFLAGS),
|
|
|
|
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "pclk_bus_niu", "pclk_bus", 0, RK3328_CLKGATE_CON(15), 14, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(0, "pclk_efuse", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(15), 9, GFLAGS),
|
|
|
|
GATE(0, "pclk_otp", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(28), 4, GFLAGS),
|
|
|
|
GATE(PCLK_I2C0, "pclk_i2c0", "pclk_bus", 0, RK3328_CLKGATE_CON(15), 10, GFLAGS),
|
|
|
|
GATE(PCLK_I2C1, "pclk_i2c1", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 0, GFLAGS),
|
|
|
|
GATE(PCLK_I2C2, "pclk_i2c2", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 1, GFLAGS),
|
|
|
|
GATE(PCLK_I2C3, "pclk_i2c3", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 2, GFLAGS),
|
|
|
|
GATE(PCLK_TIMER, "pclk_timer0", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 3, GFLAGS),
|
|
|
|
GATE(0, "pclk_stimer", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 4, GFLAGS),
|
|
|
|
GATE(PCLK_SPI, "pclk_spi", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 5, GFLAGS),
|
|
|
|
GATE(PCLK_PWM, "pclk_rk_pwm", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 6, GFLAGS),
|
|
|
|
GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 7, GFLAGS),
|
|
|
|
GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 8, GFLAGS),
|
|
|
|
GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 9, GFLAGS),
|
|
|
|
GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 10, GFLAGS),
|
|
|
|
GATE(PCLK_UART0, "pclk_uart0", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 11, GFLAGS),
|
|
|
|
GATE(PCLK_UART1, "pclk_uart1", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 12, GFLAGS),
|
|
|
|
GATE(PCLK_UART2, "pclk_uart2", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 13, GFLAGS),
|
|
|
|
GATE(PCLK_TSADC, "pclk_tsadc", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 14, GFLAGS),
|
|
|
|
GATE(PCLK_DCF, "pclk_dcf", "pclk_bus", 0, RK3328_CLKGATE_CON(16), 15, GFLAGS),
|
|
|
|
GATE(PCLK_GRF, "pclk_grf", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 0, GFLAGS),
|
|
|
|
GATE(0, "pclk_cru", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 4, GFLAGS),
|
|
|
|
GATE(0, "pclk_sgrf", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 6, GFLAGS),
|
|
|
|
GATE(0, "pclk_sim", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 10, GFLAGS),
|
|
|
|
GATE(PCLK_SARADC, "pclk_saradc", "pclk_bus", 0, RK3328_CLKGATE_CON(17), 15, GFLAGS),
|
|
|
|
GATE(0, "pclk_pmu", "pclk_bus", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(28), 3, GFLAGS),
|
|
|
|
|
2019-06-15 14:23:28 +02:00
|
|
|
/* Watchdog pclk is controlled from the secure GRF */
|
|
|
|
SGRF_GATE(PCLK_WDT, "pclk_wdt", "pclk_bus"),
|
|
|
|
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(PCLK_USB3PHY_OTG, "pclk_usb3phy_otg", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(28), 1, GFLAGS),
|
|
|
|
GATE(PCLK_USB3PHY_PIPE, "pclk_usb3phy_pipe", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(28), 2, GFLAGS),
|
|
|
|
GATE(PCLK_USB3_GRF, "pclk_usb3_grf", "pclk_phy_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 2, GFLAGS),
|
|
|
|
GATE(PCLK_USB2_GRF, "pclk_usb2_grf", "pclk_phy_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 14, GFLAGS),
|
|
|
|
GATE(0, "pclk_ddrphy", "pclk_phy_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 13, GFLAGS),
|
2018-11-26 02:56:03 +09:00
|
|
|
GATE(PCLK_ACODECPHY, "pclk_acodecphy", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(17), 5, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_phy_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 7, GFLAGS),
|
|
|
|
GATE(0, "pclk_vdacphy", "pclk_phy_pre", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(17), 8, GFLAGS),
|
2017-12-12 22:49:11 +01:00
|
|
|
GATE(0, "pclk_phy_niu", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(15), 15, GFLAGS),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
|
|
|
/* PD_MMC */
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "clk_sdmmc",
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_SDMMC_CON0, 1),
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "clk_sdmmc",
|
2020-06-18 18:56:29 +01:00
|
|
|
RK3328_SDMMC_CON1, 1),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDIO_DRV, "sdio_drv", "clk_sdio",
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_SDIO_CON0, 1),
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDIO_SAMPLE, "sdio_sample", "clk_sdio",
|
2020-06-18 18:56:29 +01:00
|
|
|
RK3328_SDIO_CON1, 1),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_EMMC_DRV, "emmc_drv", "clk_emmc",
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_EMMC_CON0, 1),
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "clk_emmc",
|
2020-06-18 18:56:29 +01:00
|
|
|
RK3328_EMMC_CON1, 1),
|
2016-12-29 10:45:11 +08:00
|
|
|
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDMMC_EXT_DRV, "sdmmc_ext_drv", "clk_sdmmc_ext",
|
2016-12-29 10:45:11 +08:00
|
|
|
RK3328_SDMMC_EXT_CON0, 1),
|
2018-03-21 10:39:18 +08:00
|
|
|
MMC(SCLK_SDMMC_EXT_SAMPLE, "sdmmc_ext_sample", "clk_sdmmc_ext",
|
2020-06-18 18:56:29 +01:00
|
|
|
RK3328_SDMMC_EXT_CON1, 1),
|
2016-12-29 10:45:11 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static const char *const rk3328_critical_clocks[] __initconst = {
|
|
|
|
"aclk_bus",
|
2017-12-12 22:49:11 +01:00
|
|
|
"aclk_bus_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
"pclk_bus",
|
2017-12-12 22:49:11 +01:00
|
|
|
"pclk_bus_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
"hclk_bus",
|
2017-12-12 22:49:11 +01:00
|
|
|
"hclk_bus_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
"aclk_peri",
|
|
|
|
"hclk_peri",
|
2017-12-12 22:49:11 +01:00
|
|
|
"hclk_peri_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
"pclk_peri",
|
2017-12-12 22:49:11 +01:00
|
|
|
"pclk_peri_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
"pclk_dbg",
|
|
|
|
"aclk_core_niu",
|
|
|
|
"aclk_gic400",
|
|
|
|
"aclk_intmem",
|
|
|
|
"hclk_rom",
|
|
|
|
"pclk_grf",
|
|
|
|
"pclk_cru",
|
|
|
|
"pclk_sgrf",
|
|
|
|
"pclk_timer0",
|
|
|
|
"clk_timer0",
|
|
|
|
"pclk_ddr_msch",
|
|
|
|
"pclk_ddr_mon",
|
|
|
|
"pclk_ddr_grf",
|
|
|
|
"clk_ddrupctl",
|
|
|
|
"clk_ddrmsch",
|
|
|
|
"hclk_ahb1tom",
|
|
|
|
"clk_jtag",
|
|
|
|
"pclk_ddrphy",
|
|
|
|
"pclk_pmu",
|
|
|
|
"hclk_otg_pmu",
|
|
|
|
"aclk_rga_niu",
|
|
|
|
"pclk_vio_h2p",
|
|
|
|
"hclk_vio_h2p",
|
2017-12-12 22:49:11 +01:00
|
|
|
"aclk_vio_niu",
|
2017-12-10 20:03:19 +01:00
|
|
|
"hclk_vio_niu",
|
2017-12-12 22:49:11 +01:00
|
|
|
"aclk_vop_niu",
|
|
|
|
"hclk_vop_niu",
|
|
|
|
"aclk_gpu_niu",
|
|
|
|
"aclk_rkvdec_niu",
|
|
|
|
"hclk_rkvdec_niu",
|
|
|
|
"aclk_vpu_niu",
|
|
|
|
"hclk_vpu_niu",
|
|
|
|
"aclk_rkvenc_niu",
|
|
|
|
"hclk_rkvenc_niu",
|
|
|
|
"aclk_gmac_niu",
|
|
|
|
"pclk_gmac_niu",
|
|
|
|
"pclk_phy_niu",
|
2016-12-29 10:45:11 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static void __init rk3328_clk_init(struct device_node *np)
|
|
|
|
{
|
|
|
|
struct rockchip_clk_provider *ctx;
|
2024-08-26 18:39:13 +02:00
|
|
|
unsigned long clk_nr_clks;
|
2016-12-29 10:45:11 +08:00
|
|
|
void __iomem *reg_base;
|
|
|
|
|
|
|
|
reg_base = of_iomap(np, 0);
|
|
|
|
if (!reg_base) {
|
|
|
|
pr_err("%s: could not map cru region\n", __func__);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-08-26 18:39:13 +02:00
|
|
|
clk_nr_clks = rockchip_clk_find_max_clk_id(rk3328_clk_branches,
|
|
|
|
ARRAY_SIZE(rk3328_clk_branches)) + 1;
|
|
|
|
ctx = rockchip_clk_init(np, reg_base, clk_nr_clks);
|
2016-12-29 10:45:11 +08:00
|
|
|
if (IS_ERR(ctx)) {
|
|
|
|
pr_err("%s: rockchip clk init failed\n", __func__);
|
|
|
|
iounmap(reg_base);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
rockchip_clk_register_plls(ctx, rk3328_pll_clks,
|
|
|
|
ARRAY_SIZE(rk3328_pll_clks),
|
|
|
|
RK3328_GRF_SOC_STATUS0);
|
|
|
|
rockchip_clk_register_branches(ctx, rk3328_clk_branches,
|
|
|
|
ARRAY_SIZE(rk3328_clk_branches));
|
|
|
|
rockchip_clk_protect_critical(rk3328_critical_clocks,
|
|
|
|
ARRAY_SIZE(rk3328_critical_clocks));
|
|
|
|
|
|
|
|
rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
|
|
|
|
mux_armclk_p, ARRAY_SIZE(mux_armclk_p),
|
|
|
|
&rk3328_cpuclk_data, rk3328_cpuclk_rates,
|
|
|
|
ARRAY_SIZE(rk3328_cpuclk_rates));
|
|
|
|
|
2019-03-10 12:00:45 +00:00
|
|
|
rockchip_register_softrst(np, 12, reg_base + RK3328_SOFTRST_CON(0),
|
2016-12-29 10:45:11 +08:00
|
|
|
ROCKCHIP_SOFTRST_HIWORD_MASK);
|
|
|
|
|
|
|
|
rockchip_register_restart_notifier(ctx, RK3328_GLB_SRST_FST, NULL);
|
|
|
|
|
|
|
|
rockchip_clk_of_add_provider(np, ctx);
|
|
|
|
}
|
|
|
|
CLK_OF_DECLARE(rk3328_cru, "rockchip,rk3328-cru", rk3328_clk_init);
|