Merge branches 'clk-debugfs-danger', 'clk-basic-hw', 'clk-renesas', 'clk-amlogic' and 'clk-allwinner' into clk-next
- Support dangerous debugfs actions on clks with dead code - Convert gpio, fixed-factor, mux, gate, divider basic clks to hw based APIs * clk-debugfs-danger: clk: Add support for setting clk_rate via debugfs * clk-basic-hw: clk: divider: Add support for specifying parents via DT/pointers clk: gate: Add support for specifying parents via DT/pointers clk: mux: Add support for specifying parents via DT/pointers clk: asm9260: Use parent accuracy in fixed rate clk clk: fixed-rate: Document that accuracy isn't a rate clk: fixed-rate: Add clk flags for parent accuracy clk: fixed-rate: Add support for specifying parents via DT/pointers clk: fixed-rate: Document accuracy member clk: fixed-rate: Move to_clk_fixed_rate() to C file clk: fixed-rate: Remove clk_register_fixed_rate_with_accuracy() clk: fixed-rate: Convert to clk_hw based APIs clk: gpio: Use DT way of specifying parents * clk-renesas: clk: renesas: Prepare for split of R-Car H3 config symbol dt-bindings: clock: renesas: cpg-mssr: Fix r8a774b1 typo clk: renesas: r7s9210: Add SPIBSC clock clk: renesas: rcar-gen3: Allow changing the RPC[D2] clocks clk: renesas: Remove use of ARCH_R8A7796 clk: renesas: rcar-gen2: Change multipliers and dividers to u8 * clk-amlogic: clk: clarify that clk_set_rate() does updates from top to bottom clk: meson: meson8b: make the CCF use the glitch-free mali mux clk: meson: pll: Fix by 0 division in __pll_params_to_rate() clk: meson: g12a: fix missing uart2 in regmap table clk: meson: meson8b: use of_clk_hw_register to register the clocks clk: meson: meson8b: don't register the XTAL clock when provided via OF clk: meson: meson8b: change references to the XTAL clock to use [fw_]name clk: meson: meson8b: use clk_hw_set_parent in the CPU clock notifier clk: meson: add a driver for the Meson8/8b/8m2 DDR clock controller dt-bindings: clock: meson8b: add the clock inputs dt-bindings: clock: add the Amlogic Meson8 DDR clock controller binding * clk-allwinner: clk: sunxi: a23/a33: Export the MIPI PLL clk: sunxi: a31: Export the MIPI PLL clk: sunxi-ng: a64: export CLK_CPUX clock for DVFS clk: sunxi-ng: add mux and pll notifiers for A64 CPU clock clk: sunxi-ng: r40: Export MBUS clock clk: sunxi: use of_device_get_match_data
This commit is contained in:
@@ -18,4 +18,4 @@ obj-$(CONFIG_COMMON_CLK_AXG) += axg.o axg-aoclk.o
|
||||
obj-$(CONFIG_COMMON_CLK_AXG_AUDIO) += axg-audio.o
|
||||
obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o
|
||||
obj-$(CONFIG_COMMON_CLK_G12A) += g12a.o g12a-aoclk.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o meson8-ddr.o
|
||||
|
@@ -77,6 +77,15 @@ static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
|
||||
unsigned int m, n, frac;
|
||||
|
||||
n = meson_parm_read(clk->map, &pll->n);
|
||||
|
||||
/*
|
||||
* On some HW, N is set to zero on init. This value is invalid as
|
||||
* it would result in a division by zero. The rate can't be
|
||||
* calculated in this case
|
||||
*/
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
m = meson_parm_read(clk->map, &pll->m);
|
||||
|
||||
frac = MESON_PARM_APPLICABLE(&pll->frac) ?
|
||||
|
@@ -4692,6 +4692,7 @@ static struct clk_regmap *const g12a_clk_regmaps[] = {
|
||||
&g12a_bt656,
|
||||
&g12a_usb1_to_ddr,
|
||||
&g12a_mmc_pclk,
|
||||
&g12a_uart2,
|
||||
&g12a_vpu_intr,
|
||||
&g12a_gic,
|
||||
&g12a_sd_emmc_a_clk0,
|
||||
|
149
drivers/clk/meson/meson8-ddr.c
Normal file
149
drivers/clk/meson/meson8-ddr.c
Normal file
@@ -0,0 +1,149 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Amlogic Meson8 DDR clock controller
|
||||
*
|
||||
* Copyright (C) 2019 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/meson8-ddr-clkc.h>
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-pll.h"
|
||||
|
||||
#define AM_DDR_PLL_CNTL 0x00
|
||||
#define AM_DDR_PLL_CNTL1 0x04
|
||||
#define AM_DDR_PLL_CNTL2 0x08
|
||||
#define AM_DDR_PLL_CNTL3 0x0c
|
||||
#define AM_DDR_PLL_CNTL4 0x10
|
||||
#define AM_DDR_PLL_STS 0x14
|
||||
#define DDR_CLK_CNTL 0x18
|
||||
#define DDR_CLK_STS 0x1c
|
||||
|
||||
static struct clk_regmap meson8_ddr_pll_dco = {
|
||||
.data = &(struct meson_clk_pll_data){
|
||||
.en = {
|
||||
.reg_off = AM_DDR_PLL_CNTL,
|
||||
.shift = 30,
|
||||
.width = 1,
|
||||
},
|
||||
.m = {
|
||||
.reg_off = AM_DDR_PLL_CNTL,
|
||||
.shift = 0,
|
||||
.width = 9,
|
||||
},
|
||||
.n = {
|
||||
.reg_off = AM_DDR_PLL_CNTL,
|
||||
.shift = 9,
|
||||
.width = 5,
|
||||
},
|
||||
.l = {
|
||||
.reg_off = AM_DDR_PLL_CNTL,
|
||||
.shift = 31,
|
||||
.width = 1,
|
||||
},
|
||||
.rst = {
|
||||
.reg_off = AM_DDR_PLL_CNTL,
|
||||
.shift = 29,
|
||||
.width = 1,
|
||||
},
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ddr_pll_dco",
|
||||
.ops = &meson_clk_pll_ro_ops,
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap meson8_ddr_pll = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = AM_DDR_PLL_CNTL,
|
||||
.shift = 16,
|
||||
.width = 2,
|
||||
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ddr_pll",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8_ddr_pll_dco.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_hw_onecell_data meson8_ddr_clk_hw_onecell_data = {
|
||||
.hws = {
|
||||
[DDR_CLKID_DDR_PLL_DCO] = &meson8_ddr_pll_dco.hw,
|
||||
[DDR_CLKID_DDR_PLL] = &meson8_ddr_pll.hw,
|
||||
},
|
||||
.num = 2,
|
||||
};
|
||||
|
||||
static struct clk_regmap *const meson8_ddr_clk_regmaps[] = {
|
||||
&meson8_ddr_pll_dco,
|
||||
&meson8_ddr_pll,
|
||||
};
|
||||
|
||||
static const struct regmap_config meson8_ddr_clkc_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = DDR_CLK_STS,
|
||||
};
|
||||
|
||||
static int meson8_ddr_clkc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
void __iomem *base;
|
||||
struct clk_hw *hw;
|
||||
int ret, i;
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
regmap = devm_regmap_init_mmio(&pdev->dev, base,
|
||||
&meson8_ddr_clkc_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
/* Populate regmap */
|
||||
for (i = 0; i < ARRAY_SIZE(meson8_ddr_clk_regmaps); i++)
|
||||
meson8_ddr_clk_regmaps[i]->map = regmap;
|
||||
|
||||
/* Register all clks */
|
||||
for (i = 0; i < meson8_ddr_clk_hw_onecell_data.num; i++) {
|
||||
hw = meson8_ddr_clk_hw_onecell_data.hws[i];
|
||||
|
||||
ret = devm_clk_hw_register(&pdev->dev, hw);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Clock registration failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get,
|
||||
&meson8_ddr_clk_hw_onecell_data);
|
||||
}
|
||||
|
||||
static const struct of_device_id meson8_ddr_clkc_match_table[] = {
|
||||
{ .compatible = "amlogic,meson8-ddr-clkc" },
|
||||
{ .compatible = "amlogic,meson8b-ddr-clkc" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver meson8_ddr_clkc_driver = {
|
||||
.probe = meson8_ddr_clkc_probe,
|
||||
.driver = {
|
||||
.name = "meson8-ddr-clkc",
|
||||
.of_match_table = meson8_ddr_clkc_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(meson8_ddr_clkc_driver);
|
@@ -97,8 +97,10 @@ static struct clk_regmap meson8b_fixed_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fixed_pll_dco",
|
||||
.ops = &meson_clk_pll_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
.name = "xtal",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
@@ -162,8 +164,10 @@ static struct clk_regmap meson8b_hdmi_pll_dco = {
|
||||
/* sometimes also called "HPLL" or "HPLL PLL" */
|
||||
.name = "hdmi_pll_dco",
|
||||
.ops = &meson_clk_pll_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
.name = "xtal",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
@@ -237,8 +241,10 @@ static struct clk_regmap meson8b_sys_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys_pll_dco",
|
||||
.ops = &meson_clk_pll_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
.name = "xtal",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
@@ -631,9 +637,9 @@ static struct clk_regmap meson8b_cpu_in_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_in_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw,
|
||||
&meson8b_sys_pll.hw,
|
||||
.parent_data = (const struct clk_parent_data[]) {
|
||||
{ .fw_name = "xtal", .name = "xtal", .index = -1, },
|
||||
{ .hw = &meson8b_sys_pll.hw, },
|
||||
},
|
||||
.num_parents = 2,
|
||||
.flags = (CLK_SET_RATE_PARENT |
|
||||
@@ -736,9 +742,9 @@ static struct clk_regmap meson8b_cpu_clk = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw,
|
||||
&meson8b_cpu_scale_out_sel.hw,
|
||||
.parent_data = (const struct clk_parent_data[]) {
|
||||
{ .fw_name = "xtal", .name = "xtal", .index = -1, },
|
||||
{ .hw = &meson8b_cpu_scale_out_sel.hw, },
|
||||
},
|
||||
.num_parents = 2,
|
||||
.flags = (CLK_SET_RATE_PARENT |
|
||||
@@ -758,12 +764,12 @@ static struct clk_regmap meson8b_nand_clk_sel = {
|
||||
.name = "nand_clk_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
/* FIXME all other parents are unknown: */
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_fclk_div4.hw,
|
||||
&meson8b_fclk_div3.hw,
|
||||
&meson8b_fclk_div5.hw,
|
||||
&meson8b_fclk_div7.hw,
|
||||
&meson8b_xtal.hw,
|
||||
.parent_data = (const struct clk_parent_data[]) {
|
||||
{ .hw = &meson8b_fclk_div4.hw, },
|
||||
{ .hw = &meson8b_fclk_div3.hw, },
|
||||
{ .hw = &meson8b_fclk_div5.hw, },
|
||||
{ .hw = &meson8b_fclk_div7.hw, },
|
||||
{ .fw_name = "xtal", .name = "xtal", .index = -1, },
|
||||
},
|
||||
.num_parents = 5,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
@@ -1721,8 +1727,10 @@ static struct clk_regmap meson8b_hdmi_sys_sel = {
|
||||
.name = "hdmi_sys_sel",
|
||||
.ops = &clk_regmap_mux_ro_ops,
|
||||
/* FIXME: all other parents are unknown */
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
.name = "xtal",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
@@ -1764,17 +1772,20 @@ static struct clk_regmap meson8b_hdmi_sys = {
|
||||
|
||||
/*
|
||||
* The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
|
||||
* muxed by a glitch-free switch on Meson8b and Meson8m2. Meson8 only
|
||||
* has mali_0 and no glitch-free mux.
|
||||
* muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can
|
||||
* actually manage this glitch-free mux because it does top-to-bottom
|
||||
* updates the each clock tree and switches to the "inactive" one when
|
||||
* CLK_SET_RATE_GATE is set.
|
||||
* Meson8 only has mali_0 and no glitch-free mux.
|
||||
*/
|
||||
static const struct clk_hw *meson8b_mali_0_1_parent_hws[] = {
|
||||
&meson8b_xtal.hw,
|
||||
&meson8b_mpll2.hw,
|
||||
&meson8b_mpll1.hw,
|
||||
&meson8b_fclk_div7.hw,
|
||||
&meson8b_fclk_div4.hw,
|
||||
&meson8b_fclk_div3.hw,
|
||||
&meson8b_fclk_div5.hw,
|
||||
static const struct clk_parent_data meson8b_mali_0_1_parent_data[] = {
|
||||
{ .fw_name = "xtal", .name = "xtal", .index = -1, },
|
||||
{ .hw = &meson8b_mpll2.hw, },
|
||||
{ .hw = &meson8b_mpll1.hw, },
|
||||
{ .hw = &meson8b_fclk_div7.hw, },
|
||||
{ .hw = &meson8b_fclk_div4.hw, },
|
||||
{ .hw = &meson8b_fclk_div3.hw, },
|
||||
{ .hw = &meson8b_fclk_div5.hw, },
|
||||
};
|
||||
|
||||
static u32 meson8b_mali_0_1_mux_table[] = { 0, 2, 3, 4, 5, 6, 7 };
|
||||
@@ -1789,8 +1800,8 @@ static struct clk_regmap meson8b_mali_0_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mali_0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = meson8b_mali_0_1_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_hws),
|
||||
.parent_data = meson8b_mali_0_1_parent_data,
|
||||
.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data),
|
||||
/*
|
||||
* Don't propagate rate changes up because the only changeable
|
||||
* parents are mpll1 and mpll2 but we need those for audio and
|
||||
@@ -1830,7 +1841,7 @@ static struct clk_regmap meson8b_mali_0 = {
|
||||
&meson8b_mali_0_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1844,8 +1855,8 @@ static struct clk_regmap meson8b_mali_1_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mali_1_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = meson8b_mali_0_1_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_hws),
|
||||
.parent_data = meson8b_mali_0_1_parent_data,
|
||||
.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data),
|
||||
/*
|
||||
* Don't propagate rate changes up because the only changeable
|
||||
* parents are mpll1 and mpll2 but we need those for audio and
|
||||
@@ -1885,7 +1896,7 @@ static struct clk_regmap meson8b_mali_1 = {
|
||||
&meson8b_mali_1_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1944,8 +1955,10 @@ static struct clk_regmap meson8m2_gp_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gp_pll_dco",
|
||||
.ops = &meson_clk_pll_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&meson8b_xtal.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
.name = "xtal",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
@@ -3585,7 +3598,7 @@ static const struct reset_control_ops meson8b_clk_reset_ops = {
|
||||
|
||||
struct meson8b_nb_data {
|
||||
struct notifier_block nb;
|
||||
struct clk_hw_onecell_data *onecell_data;
|
||||
struct clk_hw *cpu_clk;
|
||||
};
|
||||
|
||||
static int meson8b_cpu_clk_notifier_cb(struct notifier_block *nb,
|
||||
@@ -3593,30 +3606,25 @@ static int meson8b_cpu_clk_notifier_cb(struct notifier_block *nb,
|
||||
{
|
||||
struct meson8b_nb_data *nb_data =
|
||||
container_of(nb, struct meson8b_nb_data, nb);
|
||||
struct clk_hw **hws = nb_data->onecell_data->hws;
|
||||
struct clk_hw *cpu_clk_hw, *parent_clk_hw;
|
||||
struct clk *cpu_clk, *parent_clk;
|
||||
struct clk_hw *parent_clk;
|
||||
int ret;
|
||||
|
||||
switch (event) {
|
||||
case PRE_RATE_CHANGE:
|
||||
parent_clk_hw = hws[CLKID_XTAL];
|
||||
/* xtal */
|
||||
parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 0);
|
||||
break;
|
||||
|
||||
case POST_RATE_CHANGE:
|
||||
parent_clk_hw = hws[CLKID_CPU_SCALE_OUT_SEL];
|
||||
/* cpu_scale_out_sel */
|
||||
parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
cpu_clk_hw = hws[CLKID_CPUCLK];
|
||||
cpu_clk = __clk_lookup(clk_hw_get_name(cpu_clk_hw));
|
||||
|
||||
parent_clk = __clk_lookup(clk_hw_get_name(parent_clk_hw));
|
||||
|
||||
ret = clk_set_parent(cpu_clk, parent_clk);
|
||||
ret = clk_hw_set_parent(nb_data->cpu_clk, parent_clk);
|
||||
if (ret)
|
||||
return notifier_from_errno(ret);
|
||||
|
||||
@@ -3682,20 +3690,26 @@ static void __init meson8b_clkc_init_common(struct device_node *np,
|
||||
meson8b_clk_regmaps[i]->map = map;
|
||||
|
||||
/*
|
||||
* register all clks
|
||||
* CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
|
||||
* always skip CLKID_UNUSED and also skip XTAL if the .dtb provides the
|
||||
* XTAL clock as input.
|
||||
*/
|
||||
for (i = CLKID_XTAL; i < CLK_NR_CLKS; i++) {
|
||||
if (!IS_ERR(of_clk_get_by_name(np, "xtal")))
|
||||
i = CLKID_PLL_FIXED;
|
||||
else
|
||||
i = CLKID_XTAL;
|
||||
|
||||
/* register all clks */
|
||||
for (; i < CLK_NR_CLKS; i++) {
|
||||
/* array might be sparse */
|
||||
if (!clk_hw_onecell_data->hws[i])
|
||||
continue;
|
||||
|
||||
ret = clk_hw_register(NULL, clk_hw_onecell_data->hws[i]);
|
||||
ret = of_clk_hw_register(np, clk_hw_onecell_data->hws[i]);
|
||||
if (ret)
|
||||
return;
|
||||
}
|
||||
|
||||
meson8b_cpu_nb_data.onecell_data = clk_hw_onecell_data;
|
||||
meson8b_cpu_nb_data.cpu_clk = clk_hw_onecell_data->hws[CLKID_CPUCLK];
|
||||
|
||||
/*
|
||||
* FIXME we shouldn't program the muxes in notifier handlers. The
|
||||
|
Reference in New Issue
Block a user