diff options
author | Jerome Brunet <jbrunet@baylibre.com> | 2025-08-25 16:26:27 +0200 |
---|---|---|
committer | Jerome Brunet <jbrunet@baylibre.com> | 2025-09-04 18:27:12 +0200 |
commit | 480197ceece792b887a6f3361080a030eb8e4846 (patch) | |
tree | 07483d7cd418bbc5bf02765d62c391e27b3c551c | |
parent | e256a6602aa0914ff8a40724505ef2a5314a6e8e (diff) |
clk: amlogic: add probe helper for mmio based controllers
Add a 2nd probe function helper for mmio based controllers, which
are getting the memory region from a resource instead of a syscon.
Link: https://lore.kernel.org/r/20250825-meson-clk-cleanup-24-v2-2-0f402f01e117@baylibre.com
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
-rw-r--r-- | drivers/clk/meson/meson-clkc-utils.c | 62 | ||||
-rw-r--r-- | drivers/clk/meson/meson-clkc-utils.h | 1 |
2 files changed, 50 insertions, 13 deletions
diff --git a/drivers/clk/meson/meson-clkc-utils.c b/drivers/clk/meson/meson-clkc-utils.c index 49f562d0f203..870f50548e26 100644 --- a/drivers/clk/meson/meson-clkc-utils.c +++ b/drivers/clk/meson/meson-clkc-utils.c @@ -26,12 +26,9 @@ struct clk_hw *meson_clk_hw_get(struct of_phandle_args *clkspec, void *clk_hw_da } EXPORT_SYMBOL_NS_GPL(meson_clk_hw_get, "CLK_MESON"); -int meson_clkc_syscon_probe(struct platform_device *pdev) +static int meson_clkc_init(struct device *dev, struct regmap *map) { const struct meson_clkc_data *data; - struct device *dev = &pdev->dev; - struct device_node *np; - struct regmap *map; struct clk_hw *hw; int ret, i; @@ -39,15 +36,6 @@ int meson_clkc_syscon_probe(struct platform_device *pdev) if (!data) return -EINVAL; - np = of_get_parent(dev->of_node); - map = syscon_node_to_regmap(np); - of_node_put(np); - if (IS_ERR(map)) { - dev_err(dev, - "failed to get parent syscon regmap\n"); - return PTR_ERR(map); - } - if (data->init_count) regmap_multi_reg_write(map, data->init_regs, data->init_count); @@ -68,8 +56,56 @@ int meson_clkc_syscon_probe(struct platform_device *pdev) return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, (void *)&data->hw_clks); } + +int meson_clkc_syscon_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *np; + struct regmap *map; + + np = of_get_parent(dev->of_node); + map = syscon_node_to_regmap(np); + of_node_put(np); + if (IS_ERR(map)) { + dev_err(dev, "failed to get parent syscon regmap\n"); + return PTR_ERR(map); + } + + return meson_clkc_init(dev, map); +} EXPORT_SYMBOL_NS_GPL(meson_clkc_syscon_probe, "CLK_MESON"); +int meson_clkc_mmio_probe(struct platform_device *pdev) +{ + const struct meson_clkc_data *data; + struct device *dev = &pdev->dev; + struct resource *res; + void __iomem *base; + struct regmap *map; + struct regmap_config regmap_cfg = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + }; + + data = of_device_get_match_data(dev); + if (!data) + return -EINVAL; + + base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(base)) + return PTR_ERR(base); + + regmap_cfg.max_register = resource_size(res) - regmap_cfg.reg_stride; + + map = devm_regmap_init_mmio(dev, base, ®map_cfg); + if (IS_ERR(map)) + return PTR_ERR(map); + + return meson_clkc_init(dev, map); +} +EXPORT_SYMBOL_NS_GPL(meson_clkc_mmio_probe, "CLK_MESON"); + MODULE_DESCRIPTION("Amlogic Clock Controller Utilities"); MODULE_LICENSE("GPL"); MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/meson-clkc-utils.h b/drivers/clk/meson/meson-clkc-utils.h index 26cd47544302..b45f85f630d7 100644 --- a/drivers/clk/meson/meson-clkc-utils.h +++ b/drivers/clk/meson/meson-clkc-utils.h @@ -25,5 +25,6 @@ struct meson_clkc_data { }; int meson_clkc_syscon_probe(struct platform_device *pdev); +int meson_clkc_mmio_probe(struct platform_device *pdev); #endif |