From: Stephen Boyd <sboyd@kernel.org>
To: Michal Wilczynski <m.wilczynski@samsung.com>,
airlied@gmail.com, aou@eecs.berkeley.edu, conor+dt@kernel.org,
drew@pdp7.com, frank.binns@imgtec.com, guoren@kernel.org,
jassisinghbrar@gmail.com, jszhang@kernel.org, krzk+dt@kernel.org,
m.szyprowski@samsung.com, maarten.lankhorst@linux.intel.com,
matt.coster@imgtec.com, mripard@kernel.org,
mturquette@baylibre.com, palmer@dabbelt.com,
paul.walmsley@sifive.com, robh@kernel.org, simona@ffwll.ch,
tzimmermann@suse.de, ulf.hansson@linaro.org, wefu@redhat.com
Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
dri-devel@lists.freedesktop.org, linux-pm@vger.kernel.org,
Michal Wilczynski <m.wilczynski@samsung.com>
Subject: Re: [RFC PATCH v1 01/14] clk: thead: Refactor TH1520 clock driver to share common code
Date: Tue, 03 Dec 2024 11:56:12 -0800 [thread overview]
Message-ID: <94a57c718a09a20d148101884bf2e5f2.sboyd@kernel.org> (raw)
In-Reply-To: <20241203134137.2114847-2-m.wilczynski@samsung.com>
Quoting Michal Wilczynski (2024-12-03 05:41:24)
> diff --git a/drivers/clk/thead/Makefile b/drivers/clk/thead/Makefile
> index 7ee0bec1f251..d7cf88390b69 100644
> --- a/drivers/clk/thead/Makefile
> +++ b/drivers/clk/thead/Makefile
> @@ -1,2 +1,2 @@
> # SPDX-License-Identifier: GPL-2.0
> -obj-$(CONFIG_CLK_THEAD_TH1520_AP) += clk-th1520-ap.o
> +obj-$(CONFIG_CLK_THEAD_TH1520_AP) += clk-th1520.o clk-th1520-ap.o
Can the -ap driver be extended instead? Or are the clks in a different
IO region?
> diff --git a/drivers/clk/thead/clk-th1520-ap.c b/drivers/clk/thead/clk-th1520-ap.c
> index 17e32ae08720..a6015805b859 100644
> --- a/drivers/clk/thead/clk-th1520-ap.c
> +++ b/drivers/clk/thead/clk-th1520-ap.c
> @@ -5,297 +5,9 @@
> * Authors: Yangtao Li <frank.li@vivo.com>
> */
>
> -#include <dt-bindings/clock/thead,th1520-clk-ap.h>
Presumably this should stay here.
> -#include <linux/bitfield.h>
> -#include <linux/clk-provider.h>
> -#include <linux/device.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -#include <linux/regmap.h>
These should all stay here as well.
> -
> -#define TH1520_PLL_POSTDIV2 GENMASK(26, 24)
> -#define TH1520_PLL_POSTDIV1 GENMASK(22, 20)
> -#define TH1520_PLL_FBDIV GENMASK(19, 8)
> -#define TH1520_PLL_REFDIV GENMASK(5, 0)
> -#define TH1520_PLL_BYPASS BIT(30)
> -#define TH1520_PLL_DSMPD BIT(24)
> -#define TH1520_PLL_FRAC GENMASK(23, 0)
> -#define TH1520_PLL_FRAC_BITS 24
> -
> -struct ccu_internal {
> - u8 shift;
> - u8 width;
> -};
> -
> -struct ccu_div_internal {
> - u8 shift;
> - u8 width;
> - u32 flags;
> -};
> -
> -struct ccu_common {
> - int clkid;
> - struct regmap *map;
> - u16 cfg0;
> - u16 cfg1;
> - struct clk_hw hw;
> -};
> -
> -struct ccu_mux {
> - struct ccu_internal mux;
> - struct ccu_common common;
> -};
> -
> -struct ccu_gate {
> - u32 enable;
> - struct ccu_common common;
> -};
> -
> -struct ccu_div {
> - u32 enable;
> - struct ccu_div_internal div;
> - struct ccu_internal mux;
> - struct ccu_common common;
> -};
> -
> -struct ccu_pll {
> - struct ccu_common common;
> -};
> -
> -#define TH_CCU_ARG(_shift, _width) \
> - { \
> - .shift = _shift, \
> - .width = _width, \
> - }
> -
> -#define TH_CCU_DIV_FLAGS(_shift, _width, _flags) \
> - { \
> - .shift = _shift, \
> - .width = _width, \
> - .flags = _flags, \
> - }
> -
> -#define CCU_GATE(_clkid, _struct, _name, _parent, _reg, _gate, _flags) \
> - struct ccu_gate _struct = { \
> - .enable = _gate, \
> - .common = { \
> - .clkid = _clkid, \
> - .cfg0 = _reg, \
> - .hw.init = CLK_HW_INIT_PARENTS_DATA( \
> - _name, \
> - _parent, \
> - &clk_gate_ops, \
> - _flags), \
> - } \
> - }
> -
> -static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
> -{
> - return container_of(hw, struct ccu_common, hw);
> -}
> -
> -static inline struct ccu_mux *hw_to_ccu_mux(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_mux, common);
> -}
> -
> -static inline struct ccu_pll *hw_to_ccu_pll(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> +#include "clk-th1520.h"
>
> - return container_of(common, struct ccu_pll, common);
> -}
> -
> -static inline struct ccu_div *hw_to_ccu_div(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_div, common);
> -}
> -
> -static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_gate, common);
> -}
> -
> -static u8 ccu_get_parent_helper(struct ccu_common *common,
> - struct ccu_internal *mux)
> -{
> - unsigned int val;
> - u8 parent;
> -
> - regmap_read(common->map, common->cfg0, &val);
> - parent = val >> mux->shift;
> - parent &= GENMASK(mux->width - 1, 0);
> -
> - return parent;
> -}
> -
> -static int ccu_set_parent_helper(struct ccu_common *common,
> - struct ccu_internal *mux,
> - u8 index)
> -{
> - return regmap_update_bits(common->map, common->cfg0,
> - GENMASK(mux->width - 1, 0) << mux->shift,
> - index << mux->shift);
> -}
> -
> -static void ccu_disable_helper(struct ccu_common *common, u32 gate)
> -{
> - if (!gate)
> - return;
> - regmap_update_bits(common->map, common->cfg0,
> - gate, ~gate);
> -}
> -
> -static int ccu_enable_helper(struct ccu_common *common, u32 gate)
> -{
> - unsigned int val;
> - int ret;
> -
> - if (!gate)
> - return 0;
> -
> - ret = regmap_update_bits(common->map, common->cfg0, gate, gate);
> - regmap_read(common->map, common->cfg0, &val);
> - return ret;
> -}
> -
> -static int ccu_is_enabled_helper(struct ccu_common *common, u32 gate)
> -{
> - unsigned int val;
> -
> - if (!gate)
> - return true;
> -
> - regmap_read(common->map, common->cfg0, &val);
> - return val & gate;
> -}
> -
> -static unsigned long ccu_div_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> - unsigned long rate;
> - unsigned int val;
> -
> - regmap_read(cd->common.map, cd->common.cfg0, &val);
> - val = val >> cd->div.shift;
> - val &= GENMASK(cd->div.width - 1, 0);
> - rate = divider_recalc_rate(hw, parent_rate, val, NULL,
> - cd->div.flags, cd->div.width);
> -
> - return rate;
> -}
> -
> -static u8 ccu_div_get_parent(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_get_parent_helper(&cd->common, &cd->mux);
> -}
> -
> -static int ccu_div_set_parent(struct clk_hw *hw, u8 index)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_set_parent_helper(&cd->common, &cd->mux, index);
> -}
> -
> -static void ccu_div_disable(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - ccu_disable_helper(&cd->common, cd->enable);
> -}
> -
> -static int ccu_div_enable(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_enable_helper(&cd->common, cd->enable);
> -}
> -
> -static int ccu_div_is_enabled(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_is_enabled_helper(&cd->common, cd->enable);
> -}
> -
> -static const struct clk_ops ccu_div_ops = {
> - .disable = ccu_div_disable,
> - .enable = ccu_div_enable,
> - .is_enabled = ccu_div_is_enabled,
> - .get_parent = ccu_div_get_parent,
> - .set_parent = ccu_div_set_parent,
> - .recalc_rate = ccu_div_recalc_rate,
> - .determine_rate = clk_hw_determine_rate_no_reparent,
> -};
> -
> -static unsigned long th1520_pll_vco_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_pll *pll = hw_to_ccu_pll(hw);
> - unsigned long div, mul, frac;
> - unsigned int cfg0, cfg1;
> - u64 rate = parent_rate;
> -
> - regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> - regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> -
> - mul = FIELD_GET(TH1520_PLL_FBDIV, cfg0);
> - div = FIELD_GET(TH1520_PLL_REFDIV, cfg0);
> - if (!(cfg1 & TH1520_PLL_DSMPD)) {
> - mul <<= TH1520_PLL_FRAC_BITS;
> - frac = FIELD_GET(TH1520_PLL_FRAC, cfg1);
> - mul += frac;
> - div <<= TH1520_PLL_FRAC_BITS;
> - }
> - rate = parent_rate * mul;
> - rate = rate / div;
> - return rate;
> -}
> -
> -static unsigned long th1520_pll_postdiv_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_pll *pll = hw_to_ccu_pll(hw);
> - unsigned long div, rate = parent_rate;
> - unsigned int cfg0, cfg1;
> -
> - regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> - regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> -
> - if (cfg1 & TH1520_PLL_BYPASS)
> - return rate;
> -
> - div = FIELD_GET(TH1520_PLL_POSTDIV1, cfg0) *
> - FIELD_GET(TH1520_PLL_POSTDIV2, cfg0);
> -
> - rate = rate / div;
> -
> - return rate;
> -}
> -
> -static unsigned long ccu_pll_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - unsigned long rate = parent_rate;
> -
> - rate = th1520_pll_vco_recalc_rate(hw, rate);
> - rate = th1520_pll_postdiv_recalc_rate(hw, rate);
> -
> - return rate;
> -}
> -
> -static const struct clk_ops clk_pll_ops = {
> - .recalc_rate = ccu_pll_recalc_rate,
> -};
> +#define NR_CLKS (CLK_UART_SCLK + 1)
>
> static const struct clk_parent_data osc_24m_clk[] = {
> { .index = 0 }
> @@ -956,15 +668,6 @@ static struct ccu_common *th1520_gate_clks[] = {
> &sram3_clk.common,
> };
>
> -#define NR_CLKS (CLK_UART_SCLK + 1)
Why did this move?
> -
> -static const struct regmap_config th1520_clk_regmap_config = {
> - .reg_bits = 32,
> - .val_bits = 32,
> - .reg_stride = 4,
> - .fast_io = true,
> -};
> -
> static int th1520_clk_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> diff --git a/drivers/clk/thead/clk-th1520.c b/drivers/clk/thead/clk-th1520.c
> new file mode 100644
> index 000000000000..e2bfe56de9af
> --- /dev/null
> +++ b/drivers/clk/thead/clk-th1520.c
> @@ -0,0 +1,188 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2023 Jisheng Zhang <jszhang@kernel.org>
> + * Copyright (C) 2023 Vivo Communication Technology Co. Ltd.
> + * Authors: Yangtao Li <frank.li@vivo.com>
> + */
> +
> +#include "clk-th1520.h"
Explicitly include linux headers here, don't just put them all into a
header file. It helps us easily see what C files are using different
parts of the kernel infrastructure.
> +
> +static u8 ccu_get_parent_helper(struct ccu_common *common,
> + struct ccu_internal *mux)
> +{
> + unsigned int val;
> + u8 parent;
> +
> + regmap_read(common->map, common->cfg0, &val);
> + parent = val >> mux->shift;
> + parent &= GENMASK(mux->width - 1, 0);
> +
> + return parent;
> +}
> +
> +static int ccu_set_parent_helper(struct ccu_common *common,
> + struct ccu_internal *mux, u8 index)
> +{
> + return regmap_update_bits(common->map, common->cfg0,
> + GENMASK(mux->width - 1, 0) << mux->shift,
> + index << mux->shift);
> +}
> +
> +static void ccu_disable_helper(struct ccu_common *common, u32 gate)
> +{
> + if (!gate)
> + return;
> + regmap_update_bits(common->map, common->cfg0, gate, ~gate);
> +}
> +
> +static int ccu_enable_helper(struct ccu_common *common, u32 gate)
> +{
> + unsigned int val;
> + int ret;
> +
> + if (!gate)
> + return 0;
> +
> + ret = regmap_update_bits(common->map, common->cfg0, gate, gate);
> + regmap_read(common->map, common->cfg0, &val);
> + return ret;
> +}
> +
> +static int ccu_is_enabled_helper(struct ccu_common *common, u32 gate)
> +{
> + unsigned int val;
> +
> + if (!gate)
> + return true;
> +
> + regmap_read(common->map, common->cfg0, &val);
> + return val & gate;
> +}
> +
> +static unsigned long ccu_div_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> + unsigned long rate;
> + unsigned int val;
> +
> + regmap_read(cd->common.map, cd->common.cfg0, &val);
> + val = val >> cd->div.shift;
> + val &= GENMASK(cd->div.width - 1, 0);
> + rate = divider_recalc_rate(hw, parent_rate, val, NULL, cd->div.flags,
> + cd->div.width);
> +
> + return rate;
> +}
> +
> +static u8 ccu_div_get_parent(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_get_parent_helper(&cd->common, &cd->mux);
> +}
> +
> +static int ccu_div_set_parent(struct clk_hw *hw, u8 index)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_set_parent_helper(&cd->common, &cd->mux, index);
> +}
> +
> +static void ccu_div_disable(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + ccu_disable_helper(&cd->common, cd->enable);
> +}
> +
> +static int ccu_div_enable(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_enable_helper(&cd->common, cd->enable);
> +}
> +
> +static int ccu_div_is_enabled(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_is_enabled_helper(&cd->common, cd->enable);
> +}
> +
> +const struct clk_ops ccu_div_ops = {
> + .disable = ccu_div_disable,
> + .enable = ccu_div_enable,
> + .is_enabled = ccu_div_is_enabled,
> + .get_parent = ccu_div_get_parent,
> + .set_parent = ccu_div_set_parent,
> + .recalc_rate = ccu_div_recalc_rate,
> + .determine_rate = clk_hw_determine_rate_no_reparent,
> +};
> +
> +static unsigned long th1520_pll_vco_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_pll *pll = hw_to_ccu_pll(hw);
> + unsigned long div, mul, frac;
> + unsigned int cfg0, cfg1;
> + u64 rate = parent_rate;
> +
> + regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> + regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> +
> + mul = FIELD_GET(TH1520_PLL_FBDIV, cfg0);
> + div = FIELD_GET(TH1520_PLL_REFDIV, cfg0);
> + if (!(cfg1 & TH1520_PLL_DSMPD)) {
> + mul <<= TH1520_PLL_FRAC_BITS;
> + frac = FIELD_GET(TH1520_PLL_FRAC, cfg1);
> + mul += frac;
> + div <<= TH1520_PLL_FRAC_BITS;
> + }
> + rate = parent_rate * mul;
> + rate = rate / div;
> + return rate;
> +}
> +
> +static unsigned long th1520_pll_postdiv_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_pll *pll = hw_to_ccu_pll(hw);
> + unsigned long div, rate = parent_rate;
> + unsigned int cfg0, cfg1;
> +
> + regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> + regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> +
> + if (cfg1 & TH1520_PLL_BYPASS)
> + return rate;
> +
> + div = FIELD_GET(TH1520_PLL_POSTDIV1, cfg0) *
> + FIELD_GET(TH1520_PLL_POSTDIV2, cfg0);
> +
> + rate = rate / div;
> +
> + return rate;
> +}
> +
> +static unsigned long ccu_pll_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + unsigned long rate = parent_rate;
> +
> + rate = th1520_pll_vco_recalc_rate(hw, rate);
> + rate = th1520_pll_postdiv_recalc_rate(hw, rate);
> +
> + return rate;
> +}
> +
> +const struct clk_ops clk_pll_ops = {
> + .recalc_rate = ccu_pll_recalc_rate,
> +};
> +
> +const struct regmap_config th1520_clk_regmap_config = {
I don't get why this is moved.
> + .reg_bits = 32,
> + .val_bits = 32,
> + .reg_stride = 4,
> + .fast_io = true,
> +};
> diff --git a/drivers/clk/thead/clk-th1520.h b/drivers/clk/thead/clk-th1520.h
> new file mode 100644
> index 000000000000..285d41e65008
> --- /dev/null
> +++ b/drivers/clk/thead/clk-th1520.h
> @@ -0,0 +1,134 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2023 Jisheng Zhang <jszhang@kernel.org>
> + * Copyright (C) 2023 Vivo Communication Technology Co. Ltd.
> + * Authors: Yangtao Li <frank.li@vivo.com>
> + *
> + * clk-th1520.h - Common definitions for T-HEAD TH1520 Clock Drivers
> + */
> +
> +#ifndef CLK_TH1520_H
> +#define CLK_TH1520_H
> +
> +#include <dt-bindings/clock/thead,th1520-clk-ap.h>
dt-bindings comes after linux includes, but this shouldn't be here
anyway.
> +#include <linux/bitfield.h>
> +#include <linux/clk-provider.h>
Seems we have to have this one for clk_hw.
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
I don't see these includes used here, so remove them.
> +#include <linux/regmap.h>
Forward declare regmap and drop the include
struct regmap;
> +
> +#define TH1520_PLL_POSTDIV2 GENMASK(26, 24)
> +#define TH1520_PLL_POSTDIV1 GENMASK(22, 20)
> +#define TH1520_PLL_FBDIV GENMASK(19, 8)
> +#define TH1520_PLL_REFDIV GENMASK(5, 0)
> +#define TH1520_PLL_BYPASS BIT(30)
> +#define TH1520_PLL_DSMPD BIT(24)
> +#define TH1520_PLL_FRAC GENMASK(23, 0)
> +#define TH1520_PLL_FRAC_BITS 24
Are these going to be used in multiple drivers?
> +
> +struct ccu_internal {
> + u8 shift;
> + u8 width;
> +};
> +
> +struct ccu_div_internal {
> + u8 shift;
> + u8 width;
> + u32 flags;
> +};
> +
> +struct ccu_common {
> + int clkid;
> + struct regmap *map;
> + u16 cfg0;
> + u16 cfg1;
> + struct clk_hw hw;
> +};
> +
> +struct ccu_mux {
> + struct ccu_internal mux;
> + struct ccu_common common;
> +};
> +
> +struct ccu_gate {
> + u32 enable;
> + struct ccu_common common;
> +};
> +
> +struct ccu_div {
> + u32 enable;
> + struct ccu_div_internal div;
> + struct ccu_internal mux;
> + struct ccu_common common;
> +};
> +
> +struct ccu_pll {
> + struct ccu_common common;
> +};
> +
> +#define TH_CCU_ARG(_shift, _width) \
> + { \
> + .shift = _shift, \
> + .width = _width, \
> + }
> +
> +#define TH_CCU_DIV_FLAGS(_shift, _width, _flags) \
> + { \
> + .shift = _shift, \
> + .width = _width, \
> + .flags = _flags, \
> + }
> +
> +#define CCU_GATE(_clkid, _struct, _name, _parent, _reg, _gate, _flags) \
> + struct ccu_gate _struct = { \
> + .enable = _gate, \
> + .common = { \
> + .clkid = _clkid, \
> + .cfg0 = _reg, \
> + .hw.init = CLK_HW_INIT_PARENTS_DATA( \
> + _name, \
> + _parent, \
> + &clk_gate_ops, \
> + _flags), \
> + } \
> + }
> +
> +static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
> +{
> + return container_of(hw, struct ccu_common, hw);
> +}
> +
> +static inline struct ccu_mux *hw_to_ccu_mux(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_mux, common);
> +}
> +
> +static inline struct ccu_pll *hw_to_ccu_pll(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_pll, common);
> +}
> +
> +static inline struct ccu_div *hw_to_ccu_div(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_div, common);
> +}
> +
> +static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_gate, common);
> +}
> +
> +extern const struct clk_ops ccu_div_ops;
> +extern const struct clk_ops clk_pll_ops;
> +extern const struct regmap_config th1520_clk_regmap_config;
Why is the regmap config exported?
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <sboyd@kernel.org>
To: Michal Wilczynski <m.wilczynski@samsung.com>,
airlied@gmail.com, aou@eecs.berkeley.edu, conor+dt@kernel.org,
drew@pdp7.com, frank.binns@imgtec.com, guoren@kernel.org,
jassisinghbrar@gmail.com, jszhang@kernel.org, krzk+dt@kernel.org,
m.szyprowski@samsung.com, maarten.lankhorst@linux.intel.com,
matt.coster@imgtec.com, mripard@kernel.org,
mturquette@baylibre.com, palmer@dabbelt.com,
paul.walmsley@sifive.com, robh@kernel.org, simona@ffwll.ch,
tzimmermann@suse.de, ulf.hansson@linaro.org, wefu@redhat.com
Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
dri-devel@lists.freedesktop.org, linux-pm@vger.kernel.org,
Michal Wilczynski <m.wilczynski@samsung.com>
Subject: Re: [RFC PATCH v1 01/14] clk: thead: Refactor TH1520 clock driver to share common code
Date: Tue, 03 Dec 2024 11:56:12 -0800 [thread overview]
Message-ID: <94a57c718a09a20d148101884bf2e5f2.sboyd@kernel.org> (raw)
In-Reply-To: <20241203134137.2114847-2-m.wilczynski@samsung.com>
Quoting Michal Wilczynski (2024-12-03 05:41:24)
> diff --git a/drivers/clk/thead/Makefile b/drivers/clk/thead/Makefile
> index 7ee0bec1f251..d7cf88390b69 100644
> --- a/drivers/clk/thead/Makefile
> +++ b/drivers/clk/thead/Makefile
> @@ -1,2 +1,2 @@
> # SPDX-License-Identifier: GPL-2.0
> -obj-$(CONFIG_CLK_THEAD_TH1520_AP) += clk-th1520-ap.o
> +obj-$(CONFIG_CLK_THEAD_TH1520_AP) += clk-th1520.o clk-th1520-ap.o
Can the -ap driver be extended instead? Or are the clks in a different
IO region?
> diff --git a/drivers/clk/thead/clk-th1520-ap.c b/drivers/clk/thead/clk-th1520-ap.c
> index 17e32ae08720..a6015805b859 100644
> --- a/drivers/clk/thead/clk-th1520-ap.c
> +++ b/drivers/clk/thead/clk-th1520-ap.c
> @@ -5,297 +5,9 @@
> * Authors: Yangtao Li <frank.li@vivo.com>
> */
>
> -#include <dt-bindings/clock/thead,th1520-clk-ap.h>
Presumably this should stay here.
> -#include <linux/bitfield.h>
> -#include <linux/clk-provider.h>
> -#include <linux/device.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -#include <linux/regmap.h>
These should all stay here as well.
> -
> -#define TH1520_PLL_POSTDIV2 GENMASK(26, 24)
> -#define TH1520_PLL_POSTDIV1 GENMASK(22, 20)
> -#define TH1520_PLL_FBDIV GENMASK(19, 8)
> -#define TH1520_PLL_REFDIV GENMASK(5, 0)
> -#define TH1520_PLL_BYPASS BIT(30)
> -#define TH1520_PLL_DSMPD BIT(24)
> -#define TH1520_PLL_FRAC GENMASK(23, 0)
> -#define TH1520_PLL_FRAC_BITS 24
> -
> -struct ccu_internal {
> - u8 shift;
> - u8 width;
> -};
> -
> -struct ccu_div_internal {
> - u8 shift;
> - u8 width;
> - u32 flags;
> -};
> -
> -struct ccu_common {
> - int clkid;
> - struct regmap *map;
> - u16 cfg0;
> - u16 cfg1;
> - struct clk_hw hw;
> -};
> -
> -struct ccu_mux {
> - struct ccu_internal mux;
> - struct ccu_common common;
> -};
> -
> -struct ccu_gate {
> - u32 enable;
> - struct ccu_common common;
> -};
> -
> -struct ccu_div {
> - u32 enable;
> - struct ccu_div_internal div;
> - struct ccu_internal mux;
> - struct ccu_common common;
> -};
> -
> -struct ccu_pll {
> - struct ccu_common common;
> -};
> -
> -#define TH_CCU_ARG(_shift, _width) \
> - { \
> - .shift = _shift, \
> - .width = _width, \
> - }
> -
> -#define TH_CCU_DIV_FLAGS(_shift, _width, _flags) \
> - { \
> - .shift = _shift, \
> - .width = _width, \
> - .flags = _flags, \
> - }
> -
> -#define CCU_GATE(_clkid, _struct, _name, _parent, _reg, _gate, _flags) \
> - struct ccu_gate _struct = { \
> - .enable = _gate, \
> - .common = { \
> - .clkid = _clkid, \
> - .cfg0 = _reg, \
> - .hw.init = CLK_HW_INIT_PARENTS_DATA( \
> - _name, \
> - _parent, \
> - &clk_gate_ops, \
> - _flags), \
> - } \
> - }
> -
> -static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
> -{
> - return container_of(hw, struct ccu_common, hw);
> -}
> -
> -static inline struct ccu_mux *hw_to_ccu_mux(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_mux, common);
> -}
> -
> -static inline struct ccu_pll *hw_to_ccu_pll(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> +#include "clk-th1520.h"
>
> - return container_of(common, struct ccu_pll, common);
> -}
> -
> -static inline struct ccu_div *hw_to_ccu_div(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_div, common);
> -}
> -
> -static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
> -{
> - struct ccu_common *common = hw_to_ccu_common(hw);
> -
> - return container_of(common, struct ccu_gate, common);
> -}
> -
> -static u8 ccu_get_parent_helper(struct ccu_common *common,
> - struct ccu_internal *mux)
> -{
> - unsigned int val;
> - u8 parent;
> -
> - regmap_read(common->map, common->cfg0, &val);
> - parent = val >> mux->shift;
> - parent &= GENMASK(mux->width - 1, 0);
> -
> - return parent;
> -}
> -
> -static int ccu_set_parent_helper(struct ccu_common *common,
> - struct ccu_internal *mux,
> - u8 index)
> -{
> - return regmap_update_bits(common->map, common->cfg0,
> - GENMASK(mux->width - 1, 0) << mux->shift,
> - index << mux->shift);
> -}
> -
> -static void ccu_disable_helper(struct ccu_common *common, u32 gate)
> -{
> - if (!gate)
> - return;
> - regmap_update_bits(common->map, common->cfg0,
> - gate, ~gate);
> -}
> -
> -static int ccu_enable_helper(struct ccu_common *common, u32 gate)
> -{
> - unsigned int val;
> - int ret;
> -
> - if (!gate)
> - return 0;
> -
> - ret = regmap_update_bits(common->map, common->cfg0, gate, gate);
> - regmap_read(common->map, common->cfg0, &val);
> - return ret;
> -}
> -
> -static int ccu_is_enabled_helper(struct ccu_common *common, u32 gate)
> -{
> - unsigned int val;
> -
> - if (!gate)
> - return true;
> -
> - regmap_read(common->map, common->cfg0, &val);
> - return val & gate;
> -}
> -
> -static unsigned long ccu_div_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> - unsigned long rate;
> - unsigned int val;
> -
> - regmap_read(cd->common.map, cd->common.cfg0, &val);
> - val = val >> cd->div.shift;
> - val &= GENMASK(cd->div.width - 1, 0);
> - rate = divider_recalc_rate(hw, parent_rate, val, NULL,
> - cd->div.flags, cd->div.width);
> -
> - return rate;
> -}
> -
> -static u8 ccu_div_get_parent(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_get_parent_helper(&cd->common, &cd->mux);
> -}
> -
> -static int ccu_div_set_parent(struct clk_hw *hw, u8 index)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_set_parent_helper(&cd->common, &cd->mux, index);
> -}
> -
> -static void ccu_div_disable(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - ccu_disable_helper(&cd->common, cd->enable);
> -}
> -
> -static int ccu_div_enable(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_enable_helper(&cd->common, cd->enable);
> -}
> -
> -static int ccu_div_is_enabled(struct clk_hw *hw)
> -{
> - struct ccu_div *cd = hw_to_ccu_div(hw);
> -
> - return ccu_is_enabled_helper(&cd->common, cd->enable);
> -}
> -
> -static const struct clk_ops ccu_div_ops = {
> - .disable = ccu_div_disable,
> - .enable = ccu_div_enable,
> - .is_enabled = ccu_div_is_enabled,
> - .get_parent = ccu_div_get_parent,
> - .set_parent = ccu_div_set_parent,
> - .recalc_rate = ccu_div_recalc_rate,
> - .determine_rate = clk_hw_determine_rate_no_reparent,
> -};
> -
> -static unsigned long th1520_pll_vco_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_pll *pll = hw_to_ccu_pll(hw);
> - unsigned long div, mul, frac;
> - unsigned int cfg0, cfg1;
> - u64 rate = parent_rate;
> -
> - regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> - regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> -
> - mul = FIELD_GET(TH1520_PLL_FBDIV, cfg0);
> - div = FIELD_GET(TH1520_PLL_REFDIV, cfg0);
> - if (!(cfg1 & TH1520_PLL_DSMPD)) {
> - mul <<= TH1520_PLL_FRAC_BITS;
> - frac = FIELD_GET(TH1520_PLL_FRAC, cfg1);
> - mul += frac;
> - div <<= TH1520_PLL_FRAC_BITS;
> - }
> - rate = parent_rate * mul;
> - rate = rate / div;
> - return rate;
> -}
> -
> -static unsigned long th1520_pll_postdiv_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - struct ccu_pll *pll = hw_to_ccu_pll(hw);
> - unsigned long div, rate = parent_rate;
> - unsigned int cfg0, cfg1;
> -
> - regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> - regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> -
> - if (cfg1 & TH1520_PLL_BYPASS)
> - return rate;
> -
> - div = FIELD_GET(TH1520_PLL_POSTDIV1, cfg0) *
> - FIELD_GET(TH1520_PLL_POSTDIV2, cfg0);
> -
> - rate = rate / div;
> -
> - return rate;
> -}
> -
> -static unsigned long ccu_pll_recalc_rate(struct clk_hw *hw,
> - unsigned long parent_rate)
> -{
> - unsigned long rate = parent_rate;
> -
> - rate = th1520_pll_vco_recalc_rate(hw, rate);
> - rate = th1520_pll_postdiv_recalc_rate(hw, rate);
> -
> - return rate;
> -}
> -
> -static const struct clk_ops clk_pll_ops = {
> - .recalc_rate = ccu_pll_recalc_rate,
> -};
> +#define NR_CLKS (CLK_UART_SCLK + 1)
>
> static const struct clk_parent_data osc_24m_clk[] = {
> { .index = 0 }
> @@ -956,15 +668,6 @@ static struct ccu_common *th1520_gate_clks[] = {
> &sram3_clk.common,
> };
>
> -#define NR_CLKS (CLK_UART_SCLK + 1)
Why did this move?
> -
> -static const struct regmap_config th1520_clk_regmap_config = {
> - .reg_bits = 32,
> - .val_bits = 32,
> - .reg_stride = 4,
> - .fast_io = true,
> -};
> -
> static int th1520_clk_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> diff --git a/drivers/clk/thead/clk-th1520.c b/drivers/clk/thead/clk-th1520.c
> new file mode 100644
> index 000000000000..e2bfe56de9af
> --- /dev/null
> +++ b/drivers/clk/thead/clk-th1520.c
> @@ -0,0 +1,188 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2023 Jisheng Zhang <jszhang@kernel.org>
> + * Copyright (C) 2023 Vivo Communication Technology Co. Ltd.
> + * Authors: Yangtao Li <frank.li@vivo.com>
> + */
> +
> +#include "clk-th1520.h"
Explicitly include linux headers here, don't just put them all into a
header file. It helps us easily see what C files are using different
parts of the kernel infrastructure.
> +
> +static u8 ccu_get_parent_helper(struct ccu_common *common,
> + struct ccu_internal *mux)
> +{
> + unsigned int val;
> + u8 parent;
> +
> + regmap_read(common->map, common->cfg0, &val);
> + parent = val >> mux->shift;
> + parent &= GENMASK(mux->width - 1, 0);
> +
> + return parent;
> +}
> +
> +static int ccu_set_parent_helper(struct ccu_common *common,
> + struct ccu_internal *mux, u8 index)
> +{
> + return regmap_update_bits(common->map, common->cfg0,
> + GENMASK(mux->width - 1, 0) << mux->shift,
> + index << mux->shift);
> +}
> +
> +static void ccu_disable_helper(struct ccu_common *common, u32 gate)
> +{
> + if (!gate)
> + return;
> + regmap_update_bits(common->map, common->cfg0, gate, ~gate);
> +}
> +
> +static int ccu_enable_helper(struct ccu_common *common, u32 gate)
> +{
> + unsigned int val;
> + int ret;
> +
> + if (!gate)
> + return 0;
> +
> + ret = regmap_update_bits(common->map, common->cfg0, gate, gate);
> + regmap_read(common->map, common->cfg0, &val);
> + return ret;
> +}
> +
> +static int ccu_is_enabled_helper(struct ccu_common *common, u32 gate)
> +{
> + unsigned int val;
> +
> + if (!gate)
> + return true;
> +
> + regmap_read(common->map, common->cfg0, &val);
> + return val & gate;
> +}
> +
> +static unsigned long ccu_div_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> + unsigned long rate;
> + unsigned int val;
> +
> + regmap_read(cd->common.map, cd->common.cfg0, &val);
> + val = val >> cd->div.shift;
> + val &= GENMASK(cd->div.width - 1, 0);
> + rate = divider_recalc_rate(hw, parent_rate, val, NULL, cd->div.flags,
> + cd->div.width);
> +
> + return rate;
> +}
> +
> +static u8 ccu_div_get_parent(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_get_parent_helper(&cd->common, &cd->mux);
> +}
> +
> +static int ccu_div_set_parent(struct clk_hw *hw, u8 index)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_set_parent_helper(&cd->common, &cd->mux, index);
> +}
> +
> +static void ccu_div_disable(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + ccu_disable_helper(&cd->common, cd->enable);
> +}
> +
> +static int ccu_div_enable(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_enable_helper(&cd->common, cd->enable);
> +}
> +
> +static int ccu_div_is_enabled(struct clk_hw *hw)
> +{
> + struct ccu_div *cd = hw_to_ccu_div(hw);
> +
> + return ccu_is_enabled_helper(&cd->common, cd->enable);
> +}
> +
> +const struct clk_ops ccu_div_ops = {
> + .disable = ccu_div_disable,
> + .enable = ccu_div_enable,
> + .is_enabled = ccu_div_is_enabled,
> + .get_parent = ccu_div_get_parent,
> + .set_parent = ccu_div_set_parent,
> + .recalc_rate = ccu_div_recalc_rate,
> + .determine_rate = clk_hw_determine_rate_no_reparent,
> +};
> +
> +static unsigned long th1520_pll_vco_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_pll *pll = hw_to_ccu_pll(hw);
> + unsigned long div, mul, frac;
> + unsigned int cfg0, cfg1;
> + u64 rate = parent_rate;
> +
> + regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> + regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> +
> + mul = FIELD_GET(TH1520_PLL_FBDIV, cfg0);
> + div = FIELD_GET(TH1520_PLL_REFDIV, cfg0);
> + if (!(cfg1 & TH1520_PLL_DSMPD)) {
> + mul <<= TH1520_PLL_FRAC_BITS;
> + frac = FIELD_GET(TH1520_PLL_FRAC, cfg1);
> + mul += frac;
> + div <<= TH1520_PLL_FRAC_BITS;
> + }
> + rate = parent_rate * mul;
> + rate = rate / div;
> + return rate;
> +}
> +
> +static unsigned long th1520_pll_postdiv_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct ccu_pll *pll = hw_to_ccu_pll(hw);
> + unsigned long div, rate = parent_rate;
> + unsigned int cfg0, cfg1;
> +
> + regmap_read(pll->common.map, pll->common.cfg0, &cfg0);
> + regmap_read(pll->common.map, pll->common.cfg1, &cfg1);
> +
> + if (cfg1 & TH1520_PLL_BYPASS)
> + return rate;
> +
> + div = FIELD_GET(TH1520_PLL_POSTDIV1, cfg0) *
> + FIELD_GET(TH1520_PLL_POSTDIV2, cfg0);
> +
> + rate = rate / div;
> +
> + return rate;
> +}
> +
> +static unsigned long ccu_pll_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + unsigned long rate = parent_rate;
> +
> + rate = th1520_pll_vco_recalc_rate(hw, rate);
> + rate = th1520_pll_postdiv_recalc_rate(hw, rate);
> +
> + return rate;
> +}
> +
> +const struct clk_ops clk_pll_ops = {
> + .recalc_rate = ccu_pll_recalc_rate,
> +};
> +
> +const struct regmap_config th1520_clk_regmap_config = {
I don't get why this is moved.
> + .reg_bits = 32,
> + .val_bits = 32,
> + .reg_stride = 4,
> + .fast_io = true,
> +};
> diff --git a/drivers/clk/thead/clk-th1520.h b/drivers/clk/thead/clk-th1520.h
> new file mode 100644
> index 000000000000..285d41e65008
> --- /dev/null
> +++ b/drivers/clk/thead/clk-th1520.h
> @@ -0,0 +1,134 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2023 Jisheng Zhang <jszhang@kernel.org>
> + * Copyright (C) 2023 Vivo Communication Technology Co. Ltd.
> + * Authors: Yangtao Li <frank.li@vivo.com>
> + *
> + * clk-th1520.h - Common definitions for T-HEAD TH1520 Clock Drivers
> + */
> +
> +#ifndef CLK_TH1520_H
> +#define CLK_TH1520_H
> +
> +#include <dt-bindings/clock/thead,th1520-clk-ap.h>
dt-bindings comes after linux includes, but this shouldn't be here
anyway.
> +#include <linux/bitfield.h>
> +#include <linux/clk-provider.h>
Seems we have to have this one for clk_hw.
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
I don't see these includes used here, so remove them.
> +#include <linux/regmap.h>
Forward declare regmap and drop the include
struct regmap;
> +
> +#define TH1520_PLL_POSTDIV2 GENMASK(26, 24)
> +#define TH1520_PLL_POSTDIV1 GENMASK(22, 20)
> +#define TH1520_PLL_FBDIV GENMASK(19, 8)
> +#define TH1520_PLL_REFDIV GENMASK(5, 0)
> +#define TH1520_PLL_BYPASS BIT(30)
> +#define TH1520_PLL_DSMPD BIT(24)
> +#define TH1520_PLL_FRAC GENMASK(23, 0)
> +#define TH1520_PLL_FRAC_BITS 24
Are these going to be used in multiple drivers?
> +
> +struct ccu_internal {
> + u8 shift;
> + u8 width;
> +};
> +
> +struct ccu_div_internal {
> + u8 shift;
> + u8 width;
> + u32 flags;
> +};
> +
> +struct ccu_common {
> + int clkid;
> + struct regmap *map;
> + u16 cfg0;
> + u16 cfg1;
> + struct clk_hw hw;
> +};
> +
> +struct ccu_mux {
> + struct ccu_internal mux;
> + struct ccu_common common;
> +};
> +
> +struct ccu_gate {
> + u32 enable;
> + struct ccu_common common;
> +};
> +
> +struct ccu_div {
> + u32 enable;
> + struct ccu_div_internal div;
> + struct ccu_internal mux;
> + struct ccu_common common;
> +};
> +
> +struct ccu_pll {
> + struct ccu_common common;
> +};
> +
> +#define TH_CCU_ARG(_shift, _width) \
> + { \
> + .shift = _shift, \
> + .width = _width, \
> + }
> +
> +#define TH_CCU_DIV_FLAGS(_shift, _width, _flags) \
> + { \
> + .shift = _shift, \
> + .width = _width, \
> + .flags = _flags, \
> + }
> +
> +#define CCU_GATE(_clkid, _struct, _name, _parent, _reg, _gate, _flags) \
> + struct ccu_gate _struct = { \
> + .enable = _gate, \
> + .common = { \
> + .clkid = _clkid, \
> + .cfg0 = _reg, \
> + .hw.init = CLK_HW_INIT_PARENTS_DATA( \
> + _name, \
> + _parent, \
> + &clk_gate_ops, \
> + _flags), \
> + } \
> + }
> +
> +static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
> +{
> + return container_of(hw, struct ccu_common, hw);
> +}
> +
> +static inline struct ccu_mux *hw_to_ccu_mux(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_mux, common);
> +}
> +
> +static inline struct ccu_pll *hw_to_ccu_pll(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_pll, common);
> +}
> +
> +static inline struct ccu_div *hw_to_ccu_div(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_div, common);
> +}
> +
> +static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
> +{
> + struct ccu_common *common = hw_to_ccu_common(hw);
> +
> + return container_of(common, struct ccu_gate, common);
> +}
> +
> +extern const struct clk_ops ccu_div_ops;
> +extern const struct clk_ops clk_pll_ops;
> +extern const struct regmap_config th1520_clk_regmap_config;
Why is the regmap config exported?
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2024-12-03 19:56 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20241203134148eucas1p1dd37e9cac92aada509d87f5178e337e8@eucas1p1.samsung.com>
2024-12-03 13:41 ` [RFC PATCH v1 00/14] Enable drm/imagination BXM-4-64 Support for LicheePi 4A Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 13:41 ` [RFC PATCH v1 01/14] clk: thead: Refactor TH1520 clock driver to share common code Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 19:56 ` Stephen Boyd [this message]
2024-12-03 19:56 ` Stephen Boyd
2024-12-04 13:54 ` Michal Wilczynski
2024-12-04 13:54 ` Michal Wilczynski
2024-12-05 7:31 ` Krzysztof Kozlowski
2024-12-05 7:31 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 02/14] dt-bindings: clock: thead,th1520: Rename header file Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 14:24 ` Rob Herring (Arm)
2024-12-03 14:24 ` Rob Herring (Arm)
2024-12-03 15:41 ` Krzysztof Kozlowski
2024-12-03 15:41 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 03/14] clk: thead: Enable clock gates with regmaps Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 13:41 ` [RFC PATCH v1 04/14] clk: thead: Add clock driver for TH1520 Video Output subsystem Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:54 ` Krzysztof Kozlowski
2024-12-03 15:54 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 05/14] dt-bindings: clock: thead,th1520: Add support for " Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 14:24 ` Rob Herring (Arm)
2024-12-03 14:24 ` Rob Herring (Arm)
2024-12-03 15:45 ` Krzysztof Kozlowski
2024-12-03 15:45 ` Krzysztof Kozlowski
2024-12-04 10:11 ` Michal Wilczynski
2024-12-04 10:11 ` Michal Wilczynski
2024-12-04 20:21 ` Stephen Boyd
2024-12-04 20:21 ` [RFC PATCH v1 05/14] dt-bindings: clock: thead, th1520: " Stephen Boyd
2024-12-04 20:21 ` [RFC PATCH v1 05/14] dt-bindings: clock: thead,th1520: " Stephen Boyd
2024-12-04 20:22 ` Stephen Boyd
2024-12-04 20:22 ` [RFC PATCH v1 05/14] dt-bindings: clock: thead, th1520: " Stephen Boyd
2024-12-04 20:22 ` [RFC PATCH v1 05/14] dt-bindings: clock: thead,th1520: " Stephen Boyd
2024-12-05 7:28 ` Krzysztof Kozlowski
2024-12-05 7:28 ` Krzysztof Kozlowski
2024-12-05 7:27 ` Krzysztof Kozlowski
2024-12-05 7:27 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 06/14] dt-bindings: clock: thead,th1520: Rename YAML schema file Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 14:25 ` Rob Herring (Arm)
2024-12-03 14:25 ` Rob Herring (Arm)
2024-12-03 15:45 ` Krzysztof Kozlowski
2024-12-03 15:45 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 07/14] soc: thead: power-domain: Add skeleton power-domain driver for TH1520 Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:58 ` Krzysztof Kozlowski
2024-12-03 15:58 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 08/14] dt-bindings: power: thead,th1520: Add support for power domains Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:25 ` Rob Herring (Arm)
2024-12-03 15:25 ` Rob Herring (Arm)
2024-12-03 15:48 ` Krzysztof Kozlowski
2024-12-03 15:48 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 09/14] riscv: Enable PM_GENERIC_DOMAINS for T-Head SoCs Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 13:41 ` [RFC PATCH v1 10/14] drm/imagination: Add support for IMG BXM-4-64 GPU Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:49 ` Krzysztof Kozlowski
2024-12-03 15:49 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 11/14] drm/imagination: Enable PowerVR driver for RISC-V Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 13:41 ` [RFC PATCH v1 12/14] riscv: dts: Add Video Output clock and syscon regmap nodes Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:50 ` Krzysztof Kozlowski
2024-12-03 15:50 ` Krzysztof Kozlowski
2024-12-03 13:41 ` [RFC PATCH v1 13/14] riscv: dts: Introduce power domain node with simple-bus compatible Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:52 ` Krzysztof Kozlowski
2024-12-03 15:52 ` Krzysztof Kozlowski
2024-12-04 10:34 ` Michal Wilczynski
2024-12-04 10:34 ` Michal Wilczynski
2024-12-03 13:41 ` [RFC PATCH v1 14/14] riscv: dts: Add GPU node to TH1520 device tree Michal Wilczynski
2024-12-03 13:41 ` Michal Wilczynski
2024-12-03 15:53 ` Krzysztof Kozlowski
2024-12-03 15:53 ` Krzysztof Kozlowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=94a57c718a09a20d148101884bf2e5f2.sboyd@kernel.org \
--to=sboyd@kernel.org \
--cc=airlied@gmail.com \
--cc=aou@eecs.berkeley.edu \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=drew@pdp7.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=frank.binns@imgtec.com \
--cc=guoren@kernel.org \
--cc=jassisinghbrar@gmail.com \
--cc=jszhang@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=m.szyprowski@samsung.com \
--cc=m.wilczynski@samsung.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matt.coster@imgtec.com \
--cc=mripard@kernel.org \
--cc=mturquette@baylibre.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=robh@kernel.org \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=ulf.hansson@linaro.org \
--cc=wefu@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.