Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+50 -13
+49 -13
drivers/clk/meson/meson-clkc-utils.c
··· 26 26 } 27 27 EXPORT_SYMBOL_NS_GPL(meson_clk_hw_get, "CLK_MESON"); 28 28 29 - int meson_clkc_syscon_probe(struct platform_device *pdev) 29 + static int meson_clkc_init(struct device *dev, struct regmap *map) 30 30 { 31 31 const struct meson_clkc_data *data; 32 - struct device *dev = &pdev->dev; 33 - struct device_node *np; 34 - struct regmap *map; 35 32 struct clk_hw *hw; 36 33 int ret, i; 37 34 38 35 data = of_device_get_match_data(dev); 39 36 if (!data) 40 37 return -EINVAL; 41 - 42 - np = of_get_parent(dev->of_node); 43 - map = syscon_node_to_regmap(np); 44 - of_node_put(np); 45 - if (IS_ERR(map)) { 46 - dev_err(dev, 47 - "failed to get parent syscon regmap\n"); 48 - return PTR_ERR(map); 49 - } 50 38 51 39 if (data->init_count) 52 40 regmap_multi_reg_write(map, data->init_regs, data->init_count); ··· 56 68 57 69 return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, (void *)&data->hw_clks); 58 70 } 71 + 72 + int meson_clkc_syscon_probe(struct platform_device *pdev) 73 + { 74 + struct device *dev = &pdev->dev; 75 + struct device_node *np; 76 + struct regmap *map; 77 + 78 + np = of_get_parent(dev->of_node); 79 + map = syscon_node_to_regmap(np); 80 + of_node_put(np); 81 + if (IS_ERR(map)) { 82 + dev_err(dev, "failed to get parent syscon regmap\n"); 83 + return PTR_ERR(map); 84 + } 85 + 86 + return meson_clkc_init(dev, map); 87 + } 59 88 EXPORT_SYMBOL_NS_GPL(meson_clkc_syscon_probe, "CLK_MESON"); 89 + 90 + int meson_clkc_mmio_probe(struct platform_device *pdev) 91 + { 92 + const struct meson_clkc_data *data; 93 + struct device *dev = &pdev->dev; 94 + struct resource *res; 95 + void __iomem *base; 96 + struct regmap *map; 97 + struct regmap_config regmap_cfg = { 98 + .reg_bits = 32, 99 + .val_bits = 32, 100 + .reg_stride = 4, 101 + }; 102 + 103 + data = of_device_get_match_data(dev); 104 + if (!data) 105 + return -EINVAL; 106 + 107 + base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 108 + if (IS_ERR(base)) 109 + return PTR_ERR(base); 110 + 111 + regmap_cfg.max_register = resource_size(res) - regmap_cfg.reg_stride; 112 + 113 + map = devm_regmap_init_mmio(dev, base, &regmap_cfg); 114 + if (IS_ERR(map)) 115 + return PTR_ERR(map); 116 + 117 + return meson_clkc_init(dev, map); 118 + } 119 + EXPORT_SYMBOL_NS_GPL(meson_clkc_mmio_probe, "CLK_MESON"); 60 120 61 121 MODULE_DESCRIPTION("Amlogic Clock Controller Utilities"); 62 122 MODULE_LICENSE("GPL");
+1
drivers/clk/meson/meson-clkc-utils.h
··· 25 25 }; 26 26 27 27 int meson_clkc_syscon_probe(struct platform_device *pdev); 28 + int meson_clkc_mmio_probe(struct platform_device *pdev); 28 29 29 30 #endif