Merge tag 'v6.16-rockchip-clk1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-rockchip
Pull Rockchip clk driver updates from Heiko Stuebner: - Ability to handle different "General Register Files" syscons, not just a single system-one, plus ability to model individual gates found there. - For whatever reason Rockchip also moved the mmc-phase-clocks from the clock-unit for the GRF on some newer socs like the rk3528 (before moving them fully to the mmc controller itself on the rk3576), so add a new clock-variant for the phases, reusing the new GRF handling. - The old rk3036 got real handling of the usb480m mux and some PLL rates were added. * tag 'v6.16-rockchip-clk1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip: clk: rockchip: rk3528: add slab.h header include clk: rockchip: rk3576: add missing slab.h include clk: rockchip: rename gate-grf clk file clk: rockchip: rename branch_muxgrf to branch_grf_mux clk: rockchip: Pass NULL as reg pointer when registering GRF MMC clocks clk: rockchip: rk3036: mark ddrphy as critical clk: rockchip: rk3036: fix implementation of usb480m clock mux dt-bindings: clock: rk3036: add SCLK_USB480M clock-id clk: rockchip: rk3528: Add SD/SDIO tuning clocks in GRF region clk: rockchip: Support MMC clocks in GRF region dt-bindings: clock: Add GRF clock definition for RK3528 clk: rockchip: add GATE_GRFs for SAI MCLKOUT to rk3576 clk: rockchip: introduce GRF gates clk: rockchip: introduce auxiliary GRFs dt-bindings: clock: rk3576: add IOC gated clocks clk: rockchip: rk3568: Add PLL rate for 33.3MHz clk: rockchip: Drop empty init callback for rk3588 PLL type clk: rockchip: rk3588: Add PLL rate for 1500 MHz
This commit is contained in:
@@ -8,6 +8,7 @@ obj-$(CONFIG_COMMON_CLK_ROCKCHIP) += clk-rockchip.o
|
||||
clk-rockchip-y += clk.o
|
||||
clk-rockchip-y += clk-pll.o
|
||||
clk-rockchip-y += clk-cpu.o
|
||||
clk-rockchip-y += clk-gate-grf.o
|
||||
clk-rockchip-y += clk-half-divider.o
|
||||
clk-rockchip-y += clk-inverter.o
|
||||
clk-rockchip-y += clk-mmc-phase.o
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Copyright (c) 2025 Collabora Ltd.
|
||||
* Author: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
|
||||
*
|
||||
* Certain clocks on Rockchip are "gated" behind an additional register bit
|
||||
* write in a GRF register, such as the SAI MCLKs on RK3576. This code
|
||||
* implements a clock driver for these types of gates, based on regmaps.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
#include "clk.h"
|
||||
|
||||
struct rockchip_gate_grf {
|
||||
struct clk_hw hw;
|
||||
struct regmap *regmap;
|
||||
unsigned int reg;
|
||||
unsigned int shift;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
#define to_gate_grf(_hw) container_of(_hw, struct rockchip_gate_grf, hw)
|
||||
|
||||
static int rockchip_gate_grf_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct rockchip_gate_grf *gate = to_gate_grf(hw);
|
||||
u32 val = !(gate->flags & CLK_GATE_SET_TO_DISABLE) ? BIT(gate->shift) : 0;
|
||||
u32 hiword = ((gate->flags & CLK_GATE_HIWORD_MASK) ? 1 : 0) << (gate->shift + 16);
|
||||
int ret;
|
||||
|
||||
ret = regmap_update_bits(gate->regmap, gate->reg,
|
||||
hiword | BIT(gate->shift), hiword | val);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rockchip_gate_grf_disable(struct clk_hw *hw)
|
||||
{
|
||||
struct rockchip_gate_grf *gate = to_gate_grf(hw);
|
||||
u32 val = !(gate->flags & CLK_GATE_SET_TO_DISABLE) ? 0 : BIT(gate->shift);
|
||||
u32 hiword = ((gate->flags & CLK_GATE_HIWORD_MASK) ? 1 : 0) << (gate->shift + 16);
|
||||
|
||||
regmap_update_bits(gate->regmap, gate->reg,
|
||||
hiword | BIT(gate->shift), hiword | val);
|
||||
}
|
||||
|
||||
static int rockchip_gate_grf_is_enabled(struct clk_hw *hw)
|
||||
{
|
||||
struct rockchip_gate_grf *gate = to_gate_grf(hw);
|
||||
bool invert = !!(gate->flags & CLK_GATE_SET_TO_DISABLE);
|
||||
int ret;
|
||||
|
||||
ret = regmap_test_bits(gate->regmap, gate->reg, BIT(gate->shift));
|
||||
if (ret < 0)
|
||||
ret = 0;
|
||||
|
||||
return invert ? 1 - ret : ret;
|
||||
|
||||
}
|
||||
|
||||
static const struct clk_ops rockchip_gate_grf_ops = {
|
||||
.enable = rockchip_gate_grf_enable,
|
||||
.disable = rockchip_gate_grf_disable,
|
||||
.is_enabled = rockchip_gate_grf_is_enabled,
|
||||
};
|
||||
|
||||
struct clk *rockchip_clk_register_gate_grf(const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
struct regmap *regmap, unsigned int reg, unsigned int shift,
|
||||
u8 gate_flags)
|
||||
{
|
||||
struct rockchip_gate_grf *gate;
|
||||
struct clk_init_data init;
|
||||
struct clk *clk;
|
||||
|
||||
if (IS_ERR(regmap)) {
|
||||
pr_err("%s: regmap not available\n", __func__);
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
gate = kzalloc(sizeof(*gate), GFP_KERNEL);
|
||||
if (!gate)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
init.name = name;
|
||||
init.flags = flags;
|
||||
init.num_parents = parent_name ? 1 : 0;
|
||||
init.parent_names = parent_name ? &parent_name : NULL;
|
||||
init.ops = &rockchip_gate_grf_ops;
|
||||
|
||||
gate->hw.init = &init;
|
||||
gate->regmap = regmap;
|
||||
gate->reg = reg;
|
||||
gate->shift = shift;
|
||||
gate->flags = gate_flags;
|
||||
|
||||
clk = clk_register(NULL, &gate->hw);
|
||||
if (IS_ERR(clk))
|
||||
kfree(gate);
|
||||
|
||||
return clk;
|
||||
}
|
||||
@@ -9,11 +9,14 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/regmap.h>
|
||||
#include "clk.h"
|
||||
|
||||
struct rockchip_mmc_clock {
|
||||
struct clk_hw hw;
|
||||
void __iomem *reg;
|
||||
struct regmap *grf;
|
||||
int grf_reg;
|
||||
int shift;
|
||||
int cached_phase;
|
||||
struct notifier_block clk_rate_change_nb;
|
||||
@@ -54,7 +57,12 @@ static int rockchip_mmc_get_phase(struct clk_hw *hw)
|
||||
if (!rate)
|
||||
return 0;
|
||||
|
||||
raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift);
|
||||
if (mmc_clock->grf)
|
||||
regmap_read(mmc_clock->grf, mmc_clock->grf_reg, &raw_value);
|
||||
else
|
||||
raw_value = readl(mmc_clock->reg);
|
||||
|
||||
raw_value >>= mmc_clock->shift;
|
||||
|
||||
degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
|
||||
|
||||
@@ -134,8 +142,12 @@ static int rockchip_mmc_set_phase(struct clk_hw *hw, int degrees)
|
||||
raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0;
|
||||
raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET;
|
||||
raw_value |= nineties;
|
||||
writel(HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift),
|
||||
mmc_clock->reg);
|
||||
raw_value = HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift);
|
||||
|
||||
if (mmc_clock->grf)
|
||||
regmap_write(mmc_clock->grf, mmc_clock->grf_reg, raw_value);
|
||||
else
|
||||
writel(raw_value, mmc_clock->reg);
|
||||
|
||||
pr_debug("%s->set_phase(%d) delay_nums=%u reg[0x%p]=0x%03x actual_degrees=%d\n",
|
||||
clk_hw_get_name(hw), degrees, delay_num,
|
||||
@@ -189,7 +201,9 @@ static int rockchip_mmc_clk_rate_notify(struct notifier_block *nb,
|
||||
|
||||
struct clk *rockchip_clk_register_mmc(const char *name,
|
||||
const char *const *parent_names, u8 num_parents,
|
||||
void __iomem *reg, int shift)
|
||||
void __iomem *reg,
|
||||
struct regmap *grf, int grf_reg,
|
||||
int shift)
|
||||
{
|
||||
struct clk_init_data init;
|
||||
struct rockchip_mmc_clock *mmc_clock;
|
||||
@@ -208,6 +222,8 @@ struct clk *rockchip_clk_register_mmc(const char *name,
|
||||
|
||||
mmc_clock->hw.init = &init;
|
||||
mmc_clock->reg = reg;
|
||||
mmc_clock->grf = grf;
|
||||
mmc_clock->grf_reg = grf_reg;
|
||||
mmc_clock->shift = shift;
|
||||
|
||||
clk = clk_register(NULL, &mmc_clock->hw);
|
||||
|
||||
@@ -1027,16 +1027,6 @@ static int rockchip_rk3588_pll_is_enabled(struct clk_hw *hw)
|
||||
return !(pllcon & RK3588_PLLCON1_PWRDOWN);
|
||||
}
|
||||
|
||||
static int rockchip_rk3588_pll_init(struct clk_hw *hw)
|
||||
{
|
||||
struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw);
|
||||
|
||||
if (!(pll->flags & ROCKCHIP_PLL_SYNC_RATE))
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct clk_ops rockchip_rk3588_pll_clk_norate_ops = {
|
||||
.recalc_rate = rockchip_rk3588_pll_recalc_rate,
|
||||
.enable = rockchip_rk3588_pll_enable,
|
||||
@@ -1051,7 +1041,6 @@ static const struct clk_ops rockchip_rk3588_pll_clk_ops = {
|
||||
.enable = rockchip_rk3588_pll_enable,
|
||||
.disable = rockchip_rk3588_pll_disable,
|
||||
.is_enabled = rockchip_rk3588_pll_is_enabled,
|
||||
.init = rockchip_rk3588_pll_init,
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -123,6 +123,7 @@ PNAME(mux_timer_p) = { "xin24m", "pclk_peri_src" };
|
||||
PNAME(mux_pll_src_apll_dpll_gpll_usb480m_p) = { "apll", "dpll", "gpll", "usb480m" };
|
||||
PNAME(mux_pll_src_dmyapll_dpll_gpll_xin24_p) = { "dummy_apll", "dpll", "gpll", "xin24m" };
|
||||
|
||||
PNAME(mux_usb480m_p) = { "usb480m_phy", "xin24m" };
|
||||
PNAME(mux_mmc_src_p) = { "apll", "dpll", "gpll", "xin24m" };
|
||||
PNAME(mux_i2s_pre_p) = { "i2s_src", "i2s_frac", "ext_i2s", "xin12m" };
|
||||
PNAME(mux_i2s_clkout_p) = { "i2s_pre", "xin12m" };
|
||||
@@ -423,6 +424,9 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
|
||||
GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 9, GFLAGS),
|
||||
GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 10, GFLAGS),
|
||||
GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 11, GFLAGS),
|
||||
|
||||
MUX(SCLK_USB480M, "usb480m", mux_usb480m_p, CLK_SET_RATE_PARENT,
|
||||
RK2928_MISC_CON, 15, 1, MFLAGS),
|
||||
};
|
||||
|
||||
static const char *const rk3036_critical_clocks[] __initconst = {
|
||||
@@ -431,6 +435,7 @@ static const char *const rk3036_critical_clocks[] __initconst = {
|
||||
"hclk_peri",
|
||||
"pclk_peri",
|
||||
"pclk_ddrupctl",
|
||||
"ddrphy",
|
||||
};
|
||||
|
||||
static void __init rk3036_clk_init(struct device_node *np)
|
||||
@@ -438,7 +443,6 @@ static void __init rk3036_clk_init(struct device_node *np)
|
||||
struct rockchip_clk_provider *ctx;
|
||||
unsigned long clk_nr_clks;
|
||||
void __iomem *reg_base;
|
||||
struct clk *clk;
|
||||
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base) {
|
||||
@@ -462,11 +466,6 @@ static void __init rk3036_clk_init(struct device_node *np)
|
||||
return;
|
||||
}
|
||||
|
||||
clk = clk_register_fixed_factor(NULL, "usb480m", "xin24m", 0, 20, 1);
|
||||
if (IS_ERR(clk))
|
||||
pr_warn("%s: could not register clock usb480m: %ld\n",
|
||||
__func__, PTR_ERR(clk));
|
||||
|
||||
rockchip_clk_register_plls(ctx, rk3036_pll_clks,
|
||||
ARRAY_SIZE(rk3036_pll_clks),
|
||||
RK3036_GRF_SOC_STATUS0);
|
||||
|
||||
@@ -418,7 +418,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
RK3288_CLKSEL_CON(32), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3288_CLKGATE_CON(3), 11, GFLAGS),
|
||||
MUXGRF(0, "aclk_vcodec_pre", mux_aclk_vcodec_pre_p, CLK_SET_RATE_PARENT,
|
||||
RK3288_GRF_SOC_CON(0), 7, 1, MFLAGS),
|
||||
RK3288_GRF_SOC_CON(0), 7, 1, MFLAGS, grf_type_sys),
|
||||
GATE(ACLK_VCODEC, "aclk_vcodec", "aclk_vcodec_pre", 0,
|
||||
RK3288_CLKGATE_CON(9), 0, GFLAGS),
|
||||
|
||||
|
||||
@@ -677,9 +677,9 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
RK3328_CLKSEL_CON(27), 15, 1, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3328_CLKGATE_CON(3), 5, GFLAGS),
|
||||
MUXGRF(SCLK_MAC2IO, "clk_mac2io", mux_mac2io_src_p, CLK_SET_RATE_NO_REPARENT,
|
||||
RK3328_GRF_MAC_CON1, 10, 1, MFLAGS),
|
||||
RK3328_GRF_MAC_CON1, 10, 1, MFLAGS, grf_type_sys),
|
||||
MUXGRF(SCLK_MAC2IO_EXT, "clk_mac2io_ext", mux_mac2io_ext_p, CLK_SET_RATE_NO_REPARENT,
|
||||
RK3328_GRF_SOC_CON4, 14, 1, MFLAGS),
|
||||
RK3328_GRF_SOC_CON4, 14, 1, MFLAGS, grf_type_sys),
|
||||
|
||||
COMPOSITE(SCLK_MAC2PHY_SRC, "clk_mac2phy_src", mux_2plls_p, 0,
|
||||
RK3328_CLKSEL_CON(26), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
||||
@@ -692,7 +692,7 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
RK3328_CLKSEL_CON(26), 8, 2, DFLAGS,
|
||||
RK3328_CLKGATE_CON(9), 2, GFLAGS),
|
||||
MUXGRF(SCLK_MAC2PHY, "clk_mac2phy", mux_mac2phy_src_p, CLK_SET_RATE_NO_REPARENT,
|
||||
RK3328_GRF_MAC_CON2, 10, 1, MFLAGS),
|
||||
RK3328_GRF_MAC_CON2, 10, 1, MFLAGS, grf_type_sys),
|
||||
|
||||
FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <dt-bindings/clock/rockchip,rk3528-cru.h>
|
||||
|
||||
@@ -1061,23 +1064,65 @@ static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = {
|
||||
0, 1, 1),
|
||||
};
|
||||
|
||||
static struct rockchip_clk_branch rk3528_vo_clk_branches[] __initdata = {
|
||||
MMC_GRF(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0",
|
||||
RK3528_SDMMC_CON(0), 1, grf_type_vo),
|
||||
MMC_GRF(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0",
|
||||
RK3528_SDMMC_CON(1), 1, grf_type_vo),
|
||||
};
|
||||
|
||||
static struct rockchip_clk_branch rk3528_vpu_clk_branches[] __initdata = {
|
||||
MMC_GRF(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0",
|
||||
RK3528_SDIO0_CON(0), 1, grf_type_vpu),
|
||||
MMC_GRF(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0",
|
||||
RK3528_SDIO0_CON(1), 1, grf_type_vpu),
|
||||
MMC_GRF(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1",
|
||||
RK3528_SDIO1_CON(0), 1, grf_type_vpu),
|
||||
MMC_GRF(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1",
|
||||
RK3528_SDIO1_CON(1), 1, grf_type_vpu),
|
||||
};
|
||||
|
||||
static int __init clk_rk3528_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rockchip_clk_provider *ctx;
|
||||
unsigned long nr_vpu_branches = ARRAY_SIZE(rk3528_vpu_clk_branches);
|
||||
unsigned long nr_vo_branches = ARRAY_SIZE(rk3528_vo_clk_branches);
|
||||
unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
|
||||
unsigned long nr_clks, nr_vo_clks, nr_vpu_clks;
|
||||
struct rockchip_aux_grf *vo_grf_e, *vpu_grf_e;
|
||||
struct regmap *vo_grf, *vpu_grf;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
|
||||
unsigned long nr_clks;
|
||||
struct rockchip_clk_provider *ctx;
|
||||
void __iomem *reg_base;
|
||||
|
||||
nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
|
||||
nr_branches) + 1;
|
||||
|
||||
reg_base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg_base))
|
||||
return dev_err_probe(dev, PTR_ERR(reg_base),
|
||||
"could not map cru region");
|
||||
|
||||
nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
|
||||
nr_branches) + 1;
|
||||
|
||||
vo_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vo-grf");
|
||||
if (!IS_ERR(vo_grf)) {
|
||||
nr_vo_clks = rockchip_clk_find_max_clk_id(rk3528_vo_clk_branches,
|
||||
nr_vo_branches) + 1;
|
||||
nr_clks = max(nr_clks, nr_vo_clks);
|
||||
} else if (PTR_ERR(vo_grf) != -ENODEV) {
|
||||
return dev_err_probe(dev, PTR_ERR(vo_grf),
|
||||
"failed to look up VO GRF\n");
|
||||
}
|
||||
|
||||
vpu_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vpu-grf");
|
||||
if (!IS_ERR(vpu_grf)) {
|
||||
nr_vpu_clks = rockchip_clk_find_max_clk_id(rk3528_vpu_clk_branches,
|
||||
nr_vpu_branches) + 1;
|
||||
nr_clks = max(nr_clks, nr_vpu_clks);
|
||||
} else if (PTR_ERR(vpu_grf) != -ENODEV) {
|
||||
return dev_err_probe(dev, PTR_ERR(vpu_grf),
|
||||
"failed to look up VPU GRF\n");
|
||||
}
|
||||
|
||||
ctx = rockchip_clk_init(np, reg_base, nr_clks);
|
||||
if (IS_ERR(ctx))
|
||||
return dev_err_probe(dev, PTR_ERR(ctx),
|
||||
@@ -1092,6 +1137,32 @@ static int __init clk_rk3528_probe(struct platform_device *pdev)
|
||||
ARRAY_SIZE(rk3528_cpuclk_rates));
|
||||
rockchip_clk_register_branches(ctx, rk3528_clk_branches, nr_branches);
|
||||
|
||||
if (!IS_ERR(vo_grf)) {
|
||||
vo_grf_e = devm_kzalloc(dev, sizeof(*vo_grf_e), GFP_KERNEL);
|
||||
if (!vo_grf_e)
|
||||
return -ENOMEM;
|
||||
|
||||
vo_grf_e->grf = vo_grf;
|
||||
vo_grf_e->type = grf_type_vo;
|
||||
hash_add(ctx->aux_grf_table, &vo_grf_e->node, grf_type_vo);
|
||||
|
||||
rockchip_clk_register_branches(ctx, rk3528_vo_clk_branches,
|
||||
nr_vo_branches);
|
||||
}
|
||||
|
||||
if (!IS_ERR(vpu_grf)) {
|
||||
vpu_grf_e = devm_kzalloc(dev, sizeof(*vpu_grf_e), GFP_KERNEL);
|
||||
if (!vpu_grf_e)
|
||||
return -ENOMEM;
|
||||
|
||||
vpu_grf_e->grf = vpu_grf;
|
||||
vpu_grf_e->type = grf_type_vpu;
|
||||
hash_add(ctx->aux_grf_table, &vpu_grf_e->node, grf_type_vpu);
|
||||
|
||||
rockchip_clk_register_branches(ctx, rk3528_vpu_clk_branches,
|
||||
nr_vpu_branches);
|
||||
}
|
||||
|
||||
rk3528_rst_init(np, reg_base);
|
||||
|
||||
rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
|
||||
|
||||
@@ -89,6 +89,7 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = {
|
||||
RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0),
|
||||
RK3036_PLL_RATE(78750000, 4, 315, 6, 4, 1, 0),
|
||||
RK3036_PLL_RATE(74250000, 2, 99, 4, 4, 1, 0),
|
||||
RK3036_PLL_RATE(33300000, 4, 111, 5, 4, 1, 0),
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
@@ -590,7 +591,7 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
|
||||
RK3568_CLKSEL_CON(9), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3568_CLKGATE_CON(4), 0, GFLAGS),
|
||||
MUXGRF(CLK_DDR1X, "clk_ddr1x", clk_ddr1x_p, CLK_SET_RATE_PARENT,
|
||||
RK3568_CLKSEL_CON(9), 15, 1, MFLAGS),
|
||||
RK3568_CLKSEL_CON(9), 15, 1, MFLAGS, grf_type_sys),
|
||||
|
||||
COMPOSITE_NOMUX(CLK_MSCH, "clk_msch", "clk_ddr1x", CLK_IGNORE_UNUSED,
|
||||
RK3568_CLKSEL_CON(10), 0, 2, DFLAGS,
|
||||
|
||||
@@ -10,11 +10,13 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/slab.h>
|
||||
#include <dt-bindings/clock/rockchip,rk3576-cru.h>
|
||||
#include "clk.h"
|
||||
|
||||
#define RK3576_GRF_SOC_STATUS0 0x600
|
||||
#define RK3576_PMU0_GRF_OSC_CON6 0x18
|
||||
#define RK3576_VCCIO_IOC_MISC_CON0 0x6400
|
||||
|
||||
enum rk3576_plls {
|
||||
bpll, lpll, vpll, aupll, cpll, gpll, ppll,
|
||||
@@ -1479,6 +1481,14 @@ static struct rockchip_clk_branch rk3576_clk_branches[] __initdata = {
|
||||
RK3576_CLKGATE_CON(10), 0, GFLAGS),
|
||||
GATE(CLK_SAI0_MCLKOUT, "clk_sai0_mclkout", "mclk_sai0_8ch", 0,
|
||||
RK3576_CLKGATE_CON(10), 1, GFLAGS),
|
||||
GATE_GRF(CLK_SAI0_MCLKOUT_TO_IO, "mclk_sai0_to_io", "clk_sai0_mclkout",
|
||||
0, RK3576_VCCIO_IOC_MISC_CON0, 0, GFLAGS, grf_type_ioc),
|
||||
GATE_GRF(CLK_SAI1_MCLKOUT_TO_IO, "mclk_sai1_to_io", "clk_sai1_mclkout",
|
||||
0, RK3576_VCCIO_IOC_MISC_CON0, 1, GFLAGS, grf_type_ioc),
|
||||
GATE_GRF(CLK_SAI2_MCLKOUT_TO_IO, "mclk_sai2_to_io", "clk_sai2_mclkout",
|
||||
0, RK3576_VCCIO_IOC_MISC_CON0, 2, GFLAGS, grf_type_ioc),
|
||||
GATE_GRF(CLK_SAI3_MCLKOUT_TO_IO, "mclk_sai3_to_io", "clk_sai3_mclkout",
|
||||
0, RK3576_VCCIO_IOC_MISC_CON0, 3, GFLAGS, grf_type_ioc),
|
||||
|
||||
/* sdgmac */
|
||||
COMPOSITE_NODIV(HCLK_SDGMAC_ROOT, "hclk_sdgmac_root", mux_200m_100m_50m_24m_p, 0,
|
||||
@@ -1676,13 +1686,13 @@ static struct rockchip_clk_branch rk3576_clk_branches[] __initdata = {
|
||||
|
||||
/* phy ref */
|
||||
MUXGRF(CLK_PHY_REF_SRC, "clk_phy_ref_src", clk_phy_ref_src_p, 0,
|
||||
RK3576_PMU0_GRF_OSC_CON6, 4, 1, MFLAGS),
|
||||
RK3576_PMU0_GRF_OSC_CON6, 4, 1, MFLAGS, grf_type_pmu0),
|
||||
MUXGRF(CLK_USBPHY_REF_SRC, "clk_usbphy_ref_src", clk_usbphy_ref_src_p, 0,
|
||||
RK3576_PMU0_GRF_OSC_CON6, 2, 1, MFLAGS),
|
||||
RK3576_PMU0_GRF_OSC_CON6, 2, 1, MFLAGS, grf_type_pmu0),
|
||||
MUXGRF(CLK_CPLL_REF_SRC, "clk_cpll_ref_src", clk_cpll_ref_src_p, 0,
|
||||
RK3576_PMU0_GRF_OSC_CON6, 1, 1, MFLAGS),
|
||||
RK3576_PMU0_GRF_OSC_CON6, 1, 1, MFLAGS, grf_type_pmu0),
|
||||
MUXGRF(CLK_AUPLL_REF_SRC, "clk_aupll_ref_src", clk_aupll_ref_src_p, 0,
|
||||
RK3576_PMU0_GRF_OSC_CON6, 0, 1, MFLAGS),
|
||||
RK3576_PMU0_GRF_OSC_CON6, 0, 1, MFLAGS, grf_type_pmu0),
|
||||
|
||||
/* secure ns */
|
||||
COMPOSITE_NODIV(ACLK_SECURE_NS, "aclk_secure_ns", mux_350m_175m_116m_24m_p, CLK_IS_CRITICAL,
|
||||
@@ -1725,17 +1735,26 @@ static void __init rk3576_clk_init(struct device_node *np)
|
||||
struct rockchip_clk_provider *ctx;
|
||||
unsigned long clk_nr_clks;
|
||||
void __iomem *reg_base;
|
||||
struct regmap *grf;
|
||||
struct rockchip_aux_grf *ioc_grf_e;
|
||||
struct rockchip_aux_grf *pmu0_grf_e;
|
||||
struct regmap *ioc_grf;
|
||||
struct regmap *pmu0_grf;
|
||||
|
||||
clk_nr_clks = rockchip_clk_find_max_clk_id(rk3576_clk_branches,
|
||||
ARRAY_SIZE(rk3576_clk_branches)) + 1;
|
||||
|
||||
grf = syscon_regmap_lookup_by_compatible("rockchip,rk3576-pmu0-grf");
|
||||
if (IS_ERR(grf)) {
|
||||
pmu0_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3576-pmu0-grf");
|
||||
if (IS_ERR(pmu0_grf)) {
|
||||
pr_err("%s: could not get PMU0 GRF syscon\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ioc_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3576-ioc-grf");
|
||||
if (IS_ERR(ioc_grf)) {
|
||||
pr_err("%s: could not get IOC GRF syscon\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base) {
|
||||
pr_err("%s: could not map cru region\n", __func__);
|
||||
@@ -1745,11 +1764,24 @@ static void __init rk3576_clk_init(struct device_node *np)
|
||||
ctx = rockchip_clk_init(np, reg_base, clk_nr_clks);
|
||||
if (IS_ERR(ctx)) {
|
||||
pr_err("%s: rockchip clk init failed\n", __func__);
|
||||
iounmap(reg_base);
|
||||
return;
|
||||
goto err_unmap;
|
||||
}
|
||||
|
||||
ctx->grf = grf;
|
||||
pmu0_grf_e = kzalloc(sizeof(*pmu0_grf_e), GFP_KERNEL);
|
||||
if (!pmu0_grf_e)
|
||||
goto err_unmap;
|
||||
|
||||
pmu0_grf_e->grf = pmu0_grf;
|
||||
pmu0_grf_e->type = grf_type_pmu0;
|
||||
hash_add(ctx->aux_grf_table, &pmu0_grf_e->node, grf_type_pmu0);
|
||||
|
||||
ioc_grf_e = kzalloc(sizeof(*ioc_grf_e), GFP_KERNEL);
|
||||
if (!ioc_grf_e)
|
||||
goto err_free_pmu0;
|
||||
|
||||
ioc_grf_e->grf = ioc_grf;
|
||||
ioc_grf_e->type = grf_type_ioc;
|
||||
hash_add(ctx->aux_grf_table, &ioc_grf_e->node, grf_type_ioc);
|
||||
|
||||
rockchip_clk_register_plls(ctx, rk3576_pll_clks,
|
||||
ARRAY_SIZE(rk3576_pll_clks),
|
||||
@@ -1772,6 +1804,14 @@ static void __init rk3576_clk_init(struct device_node *np)
|
||||
rockchip_register_restart_notifier(ctx, RK3576_GLB_SRST_FST, NULL);
|
||||
|
||||
rockchip_clk_of_add_provider(np, ctx);
|
||||
|
||||
return;
|
||||
|
||||
err_free_pmu0:
|
||||
kfree(pmu0_grf_e);
|
||||
err_unmap:
|
||||
iounmap(reg_base);
|
||||
return;
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(rk3576_cru, "rockchip,rk3576-cru", rk3576_clk_init);
|
||||
|
||||
@@ -64,6 +64,7 @@ static struct rockchip_pll_rate_table rk3588_pll_rates[] = {
|
||||
RK3588_PLL_RATE(1560000000, 2, 260, 1, 0),
|
||||
RK3588_PLL_RATE(1536000000, 2, 256, 1, 0),
|
||||
RK3588_PLL_RATE(1512000000, 2, 252, 1, 0),
|
||||
RK3588_PLL_RATE(1500000000, 2, 250, 1, 0),
|
||||
RK3588_PLL_RATE(1488000000, 2, 248, 1, 0),
|
||||
RK3588_PLL_RATE(1464000000, 2, 244, 1, 0),
|
||||
RK3588_PLL_RATE(1440000000, 2, 240, 1, 0),
|
||||
|
||||
@@ -857,7 +857,7 @@ static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
|
||||
RV1126_GMAC_CON, 5, 1, MFLAGS),
|
||||
MUXGRF(CLK_GMAC_SRC, "clk_gmac_src", mux_clk_gmac_src_p, CLK_SET_RATE_PARENT |
|
||||
CLK_SET_RATE_NO_REPARENT,
|
||||
RV1126_GRF_IOFUNC_CON1, 12, 1, MFLAGS),
|
||||
RV1126_GRF_IOFUNC_CON1, 12, 1, MFLAGS, grf_type_sys),
|
||||
|
||||
GATE(CLK_GMAC_REF, "clk_gmac_ref", "clk_gmac_src", 0,
|
||||
RV1126_CLKGATE_CON(20), 7, GFLAGS),
|
||||
|
||||
@@ -382,6 +382,8 @@ static struct rockchip_clk_provider *rockchip_clk_init_base(
|
||||
ctx->cru_node = np;
|
||||
spin_lock_init(&ctx->lock);
|
||||
|
||||
hash_init(ctx->aux_grf_table);
|
||||
|
||||
ctx->grf = syscon_regmap_lookup_by_phandle(ctx->cru_node,
|
||||
"rockchip,grf");
|
||||
|
||||
@@ -496,6 +498,8 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
struct rockchip_clk_branch *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct regmap *grf = ctx->grf;
|
||||
struct rockchip_aux_grf *agrf;
|
||||
struct clk *clk;
|
||||
unsigned int idx;
|
||||
unsigned long flags;
|
||||
@@ -504,6 +508,19 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
flags = list->flags;
|
||||
clk = NULL;
|
||||
|
||||
/* for GRF-dependent branches, choose the right grf first */
|
||||
if ((list->branch_type == branch_grf_mux ||
|
||||
list->branch_type == branch_grf_gate ||
|
||||
list->branch_type == branch_grf_mmc) &&
|
||||
list->grf_type != grf_type_sys) {
|
||||
hash_for_each_possible(ctx->aux_grf_table, agrf, node, list->grf_type) {
|
||||
if (agrf->type == list->grf_type) {
|
||||
grf = agrf->grf;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* catch simple muxes */
|
||||
switch (list->branch_type) {
|
||||
case branch_mux:
|
||||
@@ -523,10 +540,10 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
list->mux_shift, list->mux_width,
|
||||
list->mux_flags, &ctx->lock);
|
||||
break;
|
||||
case branch_muxgrf:
|
||||
case branch_grf_mux:
|
||||
clk = rockchip_clk_register_muxgrf(list->name,
|
||||
list->parent_names, list->num_parents,
|
||||
flags, ctx->grf, list->muxdiv_offset,
|
||||
flags, grf, list->muxdiv_offset,
|
||||
list->mux_shift, list->mux_width,
|
||||
list->mux_flags);
|
||||
break;
|
||||
@@ -573,6 +590,13 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
ctx->reg_base + list->gate_offset,
|
||||
list->gate_shift, list->gate_flags, &ctx->lock);
|
||||
break;
|
||||
case branch_grf_gate:
|
||||
flags |= CLK_SET_RATE_PARENT;
|
||||
clk = rockchip_clk_register_gate_grf(list->name,
|
||||
list->parent_names[0], flags, grf,
|
||||
list->gate_offset, list->gate_shift,
|
||||
list->gate_flags);
|
||||
break;
|
||||
case branch_composite:
|
||||
clk = rockchip_clk_register_branch(list->name,
|
||||
list->parent_names, list->num_parents,
|
||||
@@ -590,6 +614,16 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
list->name,
|
||||
list->parent_names, list->num_parents,
|
||||
ctx->reg_base + list->muxdiv_offset,
|
||||
NULL, 0,
|
||||
list->div_shift
|
||||
);
|
||||
break;
|
||||
case branch_grf_mmc:
|
||||
clk = rockchip_clk_register_mmc(
|
||||
list->name,
|
||||
list->parent_names, list->num_parents,
|
||||
NULL,
|
||||
grf, list->muxdiv_offset,
|
||||
list->div_shift
|
||||
);
|
||||
break;
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/hashtable.h>
|
||||
|
||||
struct clk;
|
||||
|
||||
@@ -217,6 +218,9 @@ struct clk;
|
||||
#define RK3528_CLKSEL_CON(x) ((x) * 0x4 + 0x300)
|
||||
#define RK3528_CLKGATE_CON(x) ((x) * 0x4 + 0x800)
|
||||
#define RK3528_SOFTRST_CON(x) ((x) * 0x4 + 0xa00)
|
||||
#define RK3528_SDMMC_CON(x) ((x) * 0x4 + 0x24)
|
||||
#define RK3528_SDIO0_CON(x) ((x) * 0x4 + 0x4)
|
||||
#define RK3528_SDIO1_CON(x) ((x) * 0x4 + 0xc)
|
||||
#define RK3528_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
|
||||
#define RK3528_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE)
|
||||
#define RK3528_PCIE_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
|
||||
@@ -440,12 +444,37 @@ enum rockchip_pll_type {
|
||||
.k = _k, \
|
||||
}
|
||||
|
||||
enum rockchip_grf_type {
|
||||
grf_type_sys = 0,
|
||||
grf_type_pmu0,
|
||||
grf_type_pmu1,
|
||||
grf_type_ioc,
|
||||
grf_type_vo,
|
||||
grf_type_vpu,
|
||||
};
|
||||
|
||||
/* ceil(sqrt(enums in rockchip_grf_type - 1)) */
|
||||
#define GRF_HASH_ORDER 2
|
||||
|
||||
/**
|
||||
* struct rockchip_aux_grf - entry for the aux_grf_table hashtable
|
||||
* @grf: pointer to the grf this entry references
|
||||
* @type: what type of GRF this is
|
||||
* @node: hlist node
|
||||
*/
|
||||
struct rockchip_aux_grf {
|
||||
struct regmap *grf;
|
||||
enum rockchip_grf_type type;
|
||||
struct hlist_node node;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rockchip_clk_provider - information about clock provider
|
||||
* @reg_base: virtual address for the register base.
|
||||
* @clk_data: holds clock related data like clk* and number of clocks.
|
||||
* @cru_node: device-node of the clock-provider
|
||||
* @grf: regmap of the general-register-files syscon
|
||||
* @aux_grf_table: hashtable of auxiliary GRF regmaps, indexed by grf_type
|
||||
* @lock: maintains exclusion between callbacks for a given clock-provider.
|
||||
*/
|
||||
struct rockchip_clk_provider {
|
||||
@@ -453,6 +482,7 @@ struct rockchip_clk_provider {
|
||||
struct clk_onecell_data clk_data;
|
||||
struct device_node *cru_node;
|
||||
struct regmap *grf;
|
||||
DECLARE_HASHTABLE(aux_grf_table, GRF_HASH_ORDER);
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
@@ -594,7 +624,9 @@ struct clk *rockchip_clk_register_cpuclk(const char *name,
|
||||
|
||||
struct clk *rockchip_clk_register_mmc(const char *name,
|
||||
const char *const *parent_names, u8 num_parents,
|
||||
void __iomem *reg, int shift);
|
||||
void __iomem *reg,
|
||||
struct regmap *grf, int grf_reg,
|
||||
int shift);
|
||||
|
||||
/*
|
||||
* DDRCLK flags, including method of setting the rate
|
||||
@@ -622,17 +654,24 @@ struct clk *rockchip_clk_register_muxgrf(const char *name,
|
||||
int flags, struct regmap *grf, int reg,
|
||||
int shift, int width, int mux_flags);
|
||||
|
||||
struct clk *rockchip_clk_register_gate_grf(const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
struct regmap *regmap, unsigned int reg,
|
||||
unsigned int shift, u8 gate_flags);
|
||||
|
||||
#define PNAME(x) static const char *const x[] __initconst
|
||||
|
||||
enum rockchip_clk_branch_type {
|
||||
branch_composite,
|
||||
branch_mux,
|
||||
branch_muxgrf,
|
||||
branch_grf_mux,
|
||||
branch_divider,
|
||||
branch_fraction_divider,
|
||||
branch_gate,
|
||||
branch_grf_gate,
|
||||
branch_linked_gate,
|
||||
branch_mmc,
|
||||
branch_grf_mmc,
|
||||
branch_inverter,
|
||||
branch_factor,
|
||||
branch_ddrclk,
|
||||
@@ -660,6 +699,7 @@ struct rockchip_clk_branch {
|
||||
u8 gate_shift;
|
||||
u8 gate_flags;
|
||||
unsigned int linked_clk_id;
|
||||
enum rockchip_grf_type grf_type;
|
||||
struct rockchip_clk_branch *child;
|
||||
};
|
||||
|
||||
@@ -900,10 +940,10 @@ struct rockchip_clk_branch {
|
||||
.mux_table = mt, \
|
||||
}
|
||||
|
||||
#define MUXGRF(_id, cname, pnames, f, o, s, w, mf) \
|
||||
#define MUXGRF(_id, cname, pnames, f, o, s, w, mf, gt) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.branch_type = branch_muxgrf, \
|
||||
.branch_type = branch_grf_mux, \
|
||||
.name = cname, \
|
||||
.parent_names = pnames, \
|
||||
.num_parents = ARRAY_SIZE(pnames), \
|
||||
@@ -913,6 +953,7 @@ struct rockchip_clk_branch {
|
||||
.mux_width = w, \
|
||||
.mux_flags = mf, \
|
||||
.gate_offset = -1, \
|
||||
.grf_type = gt, \
|
||||
}
|
||||
|
||||
#define DIV(_id, cname, pname, f, o, s, w, df) \
|
||||
@@ -958,6 +999,20 @@ struct rockchip_clk_branch {
|
||||
.gate_flags = gf, \
|
||||
}
|
||||
|
||||
#define GATE_GRF(_id, cname, pname, f, o, b, gf, gt) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.branch_type = branch_grf_gate, \
|
||||
.name = cname, \
|
||||
.parent_names = (const char *[]){ pname }, \
|
||||
.num_parents = 1, \
|
||||
.flags = f, \
|
||||
.gate_offset = o, \
|
||||
.gate_shift = b, \
|
||||
.gate_flags = gf, \
|
||||
.grf_type = gt, \
|
||||
}
|
||||
|
||||
#define GATE_LINK(_id, cname, pname, linkedclk, f, o, b, gf) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
@@ -983,6 +1038,18 @@ struct rockchip_clk_branch {
|
||||
.div_shift = shift, \
|
||||
}
|
||||
|
||||
#define MMC_GRF(_id, cname, pname, offset, shift, grftype) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.branch_type = branch_grf_mmc, \
|
||||
.name = cname, \
|
||||
.parent_names = (const char *[]){ pname }, \
|
||||
.num_parents = 1, \
|
||||
.muxdiv_offset = offset, \
|
||||
.div_shift = shift, \
|
||||
.grf_type = grftype, \
|
||||
}
|
||||
|
||||
#define INVERTER(_id, cname, pname, io, is, if) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#define SCLK_MACREF 152
|
||||
#define SCLK_MACPLL 153
|
||||
#define SCLK_SFC 160
|
||||
#define SCLK_USB480M 161
|
||||
|
||||
/* aclk gates */
|
||||
#define ACLK_DMAC2 194
|
||||
|
||||
@@ -414,6 +414,12 @@
|
||||
#define MCLK_I2S2_2CH_SAI_SRC_PRE 402
|
||||
#define MCLK_I2S3_8CH_SAI_SRC_PRE 403
|
||||
#define MCLK_SDPDIF_SRC_PRE 404
|
||||
#define SCLK_SDMMC_DRV 405
|
||||
#define SCLK_SDMMC_SAMPLE 406
|
||||
#define SCLK_SDIO0_DRV 407
|
||||
#define SCLK_SDIO0_SAMPLE 408
|
||||
#define SCLK_SDIO1_DRV 409
|
||||
#define SCLK_SDIO1_SAMPLE 410
|
||||
|
||||
/* scmi-clocks indices */
|
||||
#define SCMI_PCLK_KEYREADER 0
|
||||
|
||||
@@ -594,4 +594,14 @@
|
||||
#define SCMI_ARMCLK_B 11
|
||||
#define SCMI_CLK_GPU 456
|
||||
|
||||
/* IOC-controlled output clocks */
|
||||
#define CLK_SAI0_MCLKOUT_TO_IO 571
|
||||
#define CLK_SAI1_MCLKOUT_TO_IO 572
|
||||
#define CLK_SAI2_MCLKOUT_TO_IO 573
|
||||
#define CLK_SAI3_MCLKOUT_TO_IO 574
|
||||
#define CLK_SAI4_MCLKOUT_TO_IO 575
|
||||
#define CLK_SAI4_MCLKOUT_TO_IO 575
|
||||
#define CLK_FSPI0_TO_IO 576
|
||||
#define CLK_FSPI1_TO_IO 577
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user