mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
clk: meson: migrate meson-eeclk out of hw_onecell_data to drop NR_CLKS
The way hw_onecell_data is declared: struct clk_hw_onecell_data { unsigned int num; struct clk_hw *hws[]; }; makes it impossible to have the clk_hw table declared outside while using ARRAY_SIZE() to determine ".num" due to ".hws" being a flexible array member. Completely move out of hw_onecell_data and add a custom devm_of_clk_add_hw_provider() "get" callback to retrieve the clk_hw from the meson_eeclkc_data struct to finally get rid on the NR_CLKS define. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Link: https://lore.kernel.org/r/20230607-topic-amlogic-upstream-clkid-public-migration-v2-2-38172d17c27a@linaro.org Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
This commit is contained in:
parent
230b6f3a76
commit
141fbc272b
|
@ -41,6 +41,7 @@ config COMMON_CLK_MESON_AO_CLKC
|
|||
config COMMON_CLK_MESON_EE_CLKC
|
||||
tristate
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
select COMMON_CLK_MESON_CLKC_UTILS
|
||||
|
||||
config COMMON_CLK_MESON_CPU_DYNDIV
|
||||
tristate
|
||||
|
|
|
@ -1890,8 +1890,7 @@ static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4);
|
|||
|
||||
/* Array of all clocks provided by this provider */
|
||||
|
||||
static struct clk_hw_onecell_data axg_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *axg_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &axg_sys_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &axg_fixed_pll.hw,
|
||||
[CLKID_FCLK_DIV2] = &axg_fclk_div2.hw,
|
||||
|
@ -2028,9 +2027,6 @@ static struct clk_hw_onecell_data axg_hw_onecell_data = {
|
|||
[CLKID_VDIN_MEAS_SEL] = &axg_vdin_meas_sel.hw,
|
||||
[CLKID_VDIN_MEAS_DIV] = &axg_vdin_meas_div.hw,
|
||||
[CLKID_VDIN_MEAS] = &axg_vdin_meas.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
/* Convenience table to populate regmap in .probe */
|
||||
|
@ -2163,7 +2159,10 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
|
|||
static const struct meson_eeclkc_data axg_clkc_data = {
|
||||
.regmap_clks = axg_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
|
||||
.hw_onecell_data = &axg_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = axg_hw_clks,
|
||||
.num = ARRAY_SIZE(axg_hw_clks),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -160,8 +160,6 @@
|
|||
#define CLKID_VDIN_MEAS_SEL 134
|
||||
#define CLKID_VDIN_MEAS_DIV 135
|
||||
|
||||
#define NR_CLKS 137
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/axg-clkc.h>
|
||||
|
||||
|
|
|
@ -4244,8 +4244,7 @@ static MESON_GATE_RO(g12a_reset_sec, HHI_GCLK_OTHER2, 3);
|
|||
static MESON_GATE_RO(g12a_sec_ahb_apb3, HHI_GCLK_OTHER2, 4);
|
||||
|
||||
/* Array of all clocks provided by this provider */
|
||||
static struct clk_hw_onecell_data g12a_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *g12a_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
||||
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
||||
|
@ -4468,13 +4467,9 @@ static struct clk_hw_onecell_data g12a_hw_onecell_data = {
|
|||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
static struct clk_hw_onecell_data g12b_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *g12b_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
||||
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
||||
|
@ -4732,13 +4727,9 @@ static struct clk_hw_onecell_data g12b_hw_onecell_data = {
|
|||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
static struct clk_hw_onecell_data sm1_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *sm1_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
||||
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
||||
|
@ -4981,9 +4972,6 @@ static struct clk_hw_onecell_data sm1_hw_onecell_data = {
|
|||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
/* Convenience table to populate regmap in .probe */
|
||||
|
@ -5274,7 +5262,7 @@ static int meson_g12a_dvfs_setup_common(struct device *dev,
|
|||
|
||||
static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw **hws = g12b_hw_onecell_data.hws;
|
||||
struct clk_hw **hws = g12b_hw_clks;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *notifier_clk;
|
||||
struct clk_hw *xtal;
|
||||
|
@ -5351,7 +5339,7 @@ static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
|||
|
||||
static int meson_g12a_dvfs_setup(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw **hws = g12a_hw_onecell_data.hws;
|
||||
struct clk_hw **hws = g12a_hw_clks;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *notifier_clk;
|
||||
int ret;
|
||||
|
@ -5413,7 +5401,10 @@ static const struct meson_g12a_data g12a_clkc_data = {
|
|||
.eeclkc_data = {
|
||||
.regmap_clks = g12a_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
.hw_onecell_data = &g12a_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = g12a_hw_clks,
|
||||
.num = ARRAY_SIZE(g12a_hw_clks),
|
||||
},
|
||||
.init_regs = g12a_init_regs,
|
||||
.init_count = ARRAY_SIZE(g12a_init_regs),
|
||||
},
|
||||
|
@ -5424,7 +5415,10 @@ static const struct meson_g12a_data g12b_clkc_data = {
|
|||
.eeclkc_data = {
|
||||
.regmap_clks = g12a_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
.hw_onecell_data = &g12b_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = g12b_hw_clks,
|
||||
.num = ARRAY_SIZE(g12b_hw_clks),
|
||||
},
|
||||
},
|
||||
.dvfs_setup = meson_g12b_dvfs_setup,
|
||||
};
|
||||
|
@ -5433,7 +5427,10 @@ static const struct meson_g12a_data sm1_clkc_data = {
|
|||
.eeclkc_data = {
|
||||
.regmap_clks = g12a_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
.hw_onecell_data = &sm1_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = sm1_hw_clks,
|
||||
.num = ARRAY_SIZE(sm1_hw_clks),
|
||||
},
|
||||
},
|
||||
.dvfs_setup = meson_g12a_dvfs_setup,
|
||||
};
|
||||
|
|
|
@ -266,8 +266,6 @@
|
|||
#define CLKID_NNA_CORE_CLK_DIV 266
|
||||
#define CLKID_MIPI_DSI_PXCLK_DIV 268
|
||||
|
||||
#define NR_CLKS 271
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/g12a-clkc.h>
|
||||
|
||||
|
|
|
@ -2728,8 +2728,7 @@ static MESON_PCLK(gxbb_adc, HHI_GCLK_MPEG1, 13, &gxbb_aiu_glue.hw);
|
|||
|
||||
/* Array of all clocks provided by this provider */
|
||||
|
||||
static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *gxbb_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
|
||||
[CLKID_HDMI_PLL] = &gxbb_hdmi_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
|
||||
|
@ -2935,13 +2934,9 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
|
|||
[CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw,
|
||||
[CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
|
||||
[CLKID_HDMI] = &gxbb_hdmi.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
||||
.hws = {
|
||||
static struct clk_hw *gxl_hw_clks[] = {
|
||||
[CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
|
||||
[CLKID_HDMI_PLL] = &gxl_hdmi_pll.hw,
|
||||
[CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
|
||||
|
@ -3147,9 +3142,6 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
|||
[CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
|
||||
[CLKID_HDMI] = &gxbb_hdmi.hw,
|
||||
[CLKID_ACODEC] = &gxl_acodec.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
static struct clk_regmap *const gxbb_clk_regmaps[] = {
|
||||
|
@ -3544,13 +3536,19 @@ static struct clk_regmap *const gxl_clk_regmaps[] = {
|
|||
static const struct meson_eeclkc_data gxbb_clkc_data = {
|
||||
.regmap_clks = gxbb_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(gxbb_clk_regmaps),
|
||||
.hw_onecell_data = &gxbb_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = gxbb_hw_clks,
|
||||
.num = ARRAY_SIZE(gxbb_hw_clks),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct meson_eeclkc_data gxl_clkc_data = {
|
||||
.regmap_clks = gxl_clk_regmaps,
|
||||
.regmap_clk_num = ARRAY_SIZE(gxl_clk_regmaps),
|
||||
.hw_onecell_data = &gxl_hw_onecell_data,
|
||||
.hw_clks = {
|
||||
.hws = gxl_hw_clks,
|
||||
.num = ARRAY_SIZE(gxl_hw_clks),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct of_device_id clkc_match_table[] = {
|
||||
|
|
|
@ -188,8 +188,6 @@
|
|||
#define CLKID_HDMI_SEL 203
|
||||
#define CLKID_HDMI_DIV 204
|
||||
|
||||
#define NR_CLKS 207
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/gxbb-clkc.h>
|
||||
|
||||
|
|
|
@ -43,20 +43,19 @@ int meson_eeclkc_probe(struct platform_device *pdev)
|
|||
for (i = 0; i < data->regmap_clk_num; i++)
|
||||
data->regmap_clks[i]->map = map;
|
||||
|
||||
for (i = 0; i < data->hw_onecell_data->num; i++) {
|
||||
for (i = 0; i < data->hw_clks.num; i++) {
|
||||
/* array might be sparse */
|
||||
if (!data->hw_onecell_data->hws[i])
|
||||
if (!data->hw_clks.hws[i])
|
||||
continue;
|
||||
|
||||
ret = devm_clk_hw_register(dev, data->hw_onecell_data->hws[i]);
|
||||
ret = devm_clk_hw_register(dev, data->hw_clks.hws[i]);
|
||||
if (ret) {
|
||||
dev_err(dev, "Clock registration failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
||||
data->hw_onecell_data);
|
||||
return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, (void *)&data->hw_clks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(meson_eeclkc_probe);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <linux/clk-provider.h>
|
||||
#include "clk-regmap.h"
|
||||
#include "meson-clkc-utils.h"
|
||||
|
||||
struct platform_device;
|
||||
|
||||
|
@ -17,7 +18,7 @@ struct meson_eeclkc_data {
|
|||
unsigned int regmap_clk_num;
|
||||
const struct reg_sequence *init_regs;
|
||||
unsigned int init_count;
|
||||
struct clk_hw_onecell_data *hw_onecell_data;
|
||||
struct meson_clk_hw_data hw_clks;
|
||||
};
|
||||
|
||||
int meson_eeclkc_probe(struct platform_device *pdev);
|
||||
|
|
Loading…
Reference in New Issue
Block a user