]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
clk: en7523: move clock_register in hw_init callback
authorLorenzo Bianconi <lorenzo@kernel.org>
Tue, 12 Nov 2024 00:08:50 +0000 (01:08 +0100)
committerStephen Boyd <sboyd@kernel.org>
Thu, 14 Nov 2024 20:58:56 +0000 (12:58 -0800)
Move en7523_register_clocks routine in hw_init callback.
Introduce en7523_clk_hw_init callback for EN7523 SoC.
This is a preliminary patch to differentiate IO mapped region between
EN7523 and EN7581 SoCs in order to access chip-scu IO region
<0x1fa20000 0x384> on EN7581 SoC as syscon device since it contains
miscellaneous registers needed by multiple devices (clock, pinctrl ..).

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://lore.kernel.org/r/20241112-clk-en7581-syscon-v2-3-8ada5e394ae4@kernel.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/clk-en7523.c

index ec6716844fdcf7fc25482c6e587d062279360675..da112c9fe8ef94e830449a64f54e77885b7dda83 100644 (file)
@@ -78,7 +78,8 @@ struct en_clk_soc_data {
                const u16 *idx_map;
                u16 idx_map_nr;
        } reset;
-       int (*hw_init)(struct platform_device *pdev, void __iomem *np_base);
+       int (*hw_init)(struct platform_device *pdev,
+                      struct clk_hw_onecell_data *clk_data);
 };
 
 static const u32 gsw_base[] = { 400000000, 500000000 };
@@ -406,20 +407,6 @@ static void en7581_pci_disable(struct clk_hw *hw)
        usleep_range(1000, 2000);
 }
 
-static int en7581_clk_hw_init(struct platform_device *pdev,
-                             void __iomem *np_base)
-{
-       u32 val;
-
-       val = readl(np_base + REG_NP_SCU_SSTR);
-       val &= ~(REG_PCIE_XSI0_SEL_MASK | REG_PCIE_XSI1_SEL_MASK);
-       writel(val, np_base + REG_NP_SCU_SSTR);
-       val = readl(np_base + REG_NP_SCU_PCIC);
-       writel(val | 3, np_base + REG_NP_SCU_PCIC);
-
-       return 0;
-}
-
 static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_data *clk_data,
                                   void __iomem *base, void __iomem *np_base)
 {
@@ -449,6 +436,49 @@ static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_dat
        clk_data->num = EN7523_NUM_CLOCKS;
 }
 
+static int en7523_clk_hw_init(struct platform_device *pdev,
+                             struct clk_hw_onecell_data *clk_data)
+{
+       void __iomem *base, *np_base;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       np_base = devm_platform_ioremap_resource(pdev, 1);
+       if (IS_ERR(np_base))
+               return PTR_ERR(np_base);
+
+       en7523_register_clocks(&pdev->dev, clk_data, base, np_base);
+
+       return 0;
+}
+
+static int en7581_clk_hw_init(struct platform_device *pdev,
+                             struct clk_hw_onecell_data *clk_data)
+{
+       void __iomem *base, *np_base;
+       u32 val;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       np_base = devm_platform_ioremap_resource(pdev, 1);
+       if (IS_ERR(np_base))
+               return PTR_ERR(np_base);
+
+       en7523_register_clocks(&pdev->dev, clk_data, base, np_base);
+
+       val = readl(np_base + REG_NP_SCU_SSTR);
+       val &= ~(REG_PCIE_XSI0_SEL_MASK | REG_PCIE_XSI1_SEL_MASK);
+       writel(val, np_base + REG_NP_SCU_SSTR);
+       val = readl(np_base + REG_NP_SCU_PCIC);
+       writel(val | 3, np_base + REG_NP_SCU_PCIC);
+
+       return 0;
+}
+
 static int en7523_reset_update(struct reset_controller_dev *rcdev,
                               unsigned long id, bool assert)
 {
@@ -543,31 +573,18 @@ static int en7523_clk_probe(struct platform_device *pdev)
        struct device_node *node = pdev->dev.of_node;
        const struct en_clk_soc_data *soc_data;
        struct clk_hw_onecell_data *clk_data;
-       void __iomem *base, *np_base;
        int r;
 
-       base = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(base))
-               return PTR_ERR(base);
-
-       np_base = devm_platform_ioremap_resource(pdev, 1);
-       if (IS_ERR(np_base))
-               return PTR_ERR(np_base);
-
-       soc_data = device_get_match_data(&pdev->dev);
-       if (soc_data->hw_init) {
-               r = soc_data->hw_init(pdev, np_base);
-               if (r)
-                       return r;
-       }
-
        clk_data = devm_kzalloc(&pdev->dev,
                                struct_size(clk_data, hws, EN7523_NUM_CLOCKS),
                                GFP_KERNEL);
        if (!clk_data)
                return -ENOMEM;
 
-       en7523_register_clocks(&pdev->dev, clk_data, base, np_base);
+       soc_data = device_get_match_data(&pdev->dev);
+       r = soc_data->hw_init(pdev, clk_data);
+       if (r)
+               return r;
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
@@ -590,6 +607,7 @@ static const struct en_clk_soc_data en7523_data = {
                .prepare = en7523_pci_prepare,
                .unprepare = en7523_pci_unprepare,
        },
+       .hw_init = en7523_clk_hw_init,
 };
 
 static const struct en_clk_soc_data en7581_data = {