clk: mxl: Switch from direct readl/writel based IO to regmap based IO
authorRahul Tanwar <rtanwar@maxlinear.com>
Thu, 13 Oct 2022 06:48:30 +0000 (14:48 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 25 Feb 2023 10:25:38 +0000 (11:25 +0100)
[ Upstream commit 036177310bac5534de44ff6a7b60a4d2c0b6567c ]

Earlier version of driver used direct io remapped register read
writes using readl/writel. But we need secure boot access which
is only possible when registers are read & written using regmap.
This is because the security bus/hook is written & coupled only
with regmap layer.

Switch the driver from direct readl/writel based register accesses
to regmap based register accesses.

Additionally, update the license headers to latest status.

Reviewed-by: Yi xin Zhu <yzhu@maxlinear.com>
Signed-off-by: Rahul Tanwar <rtanwar@maxlinear.com>
Link: https://lore.kernel.org/r/2610331918206e0e3bd18babb39393a558fb34f9.1665642720.git.rtanwar@maxlinear.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Stable-dep-of: 106ef3bda210 ("clk: mxl: Fix a clk entry by adding relevant flags")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clk/x86/Kconfig
drivers/clk/x86/clk-cgu-pll.c
drivers/clk/x86/clk-cgu.c
drivers/clk/x86/clk-cgu.h
drivers/clk/x86/clk-lgm.c

index 69642e1..ced99e0 100644 (file)
@@ -1,8 +1,9 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config CLK_LGM_CGU
        depends on OF && HAS_IOMEM && (X86 || COMPILE_TEST)
+       select MFD_SYSCON
        select OF_EARLY_FLATTREE
        bool "Clock driver for Lightning Mountain(LGM) platform"
        help
-         Clock Generation Unit(CGU) driver for Intel Lightning Mountain(LGM)
-         network processor SoC.
+         Clock Generation Unit(CGU) driver for MaxLinear's x86 based
+         Lightning Mountain(LGM) network processor SoC.
index 3179557..c83083a 100644 (file)
@@ -1,8 +1,9 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
+ * Copyright (C) 2020-2022 MaxLinear, Inc.
  * Copyright (C) 2020 Intel Corporation.
- * Zhu YiXin <yixin.zhu@intel.com>
- * Rahul Tanwar <rahul.tanwar@intel.com>
+ * Zhu Yixin <yzhu@maxlinear.com>
+ * Rahul Tanwar <rtanwar@maxlinear.com>
  */
 
 #include <linux/clk-provider.h>
@@ -76,8 +77,9 @@ static int lgm_pll_enable(struct clk_hw *hw)
 
        spin_lock_irqsave(&pll->lock, flags);
        lgm_set_clk_val(pll->membase, pll->reg, 0, 1, 1);
-       ret = readl_poll_timeout_atomic(pll->membase + pll->reg,
-                                       val, (val & 0x1), 1, 100);
+       ret = regmap_read_poll_timeout_atomic(pll->membase, pll->reg,
+                                             val, (val & 0x1), 1, 100);
+
        spin_unlock_irqrestore(&pll->lock, flags);
 
        return ret;
index 33de600..f5f30a1 100644 (file)
@@ -1,8 +1,9 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
+ * Copyright (C) 2020-2022 MaxLinear, Inc.
  * Copyright (C) 2020 Intel Corporation.
- * Zhu YiXin <yixin.zhu@intel.com>
- * Rahul Tanwar <rahul.tanwar@intel.com>
+ * Zhu Yixin <yzhu@maxlinear.com>
+ * Rahul Tanwar <rtanwar@maxlinear.com>
  */
 #include <linux/clk-provider.h>
 #include <linux/device.h>
index 4e22bfb..dbcb664 100644 (file)
@@ -1,18 +1,19 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
- * Copyright(c) 2020 Intel Corporation.
- * Zhu YiXin <yixin.zhu@intel.com>
- * Rahul Tanwar <rahul.tanwar@intel.com>
+ * Copyright (C) 2020-2022 MaxLinear, Inc.
+ * Copyright (C) 2020 Intel Corporation.
+ * Zhu Yixin <yzhu@maxlinear.com>
+ * Rahul Tanwar <rtanwar@maxlinear.com>
  */
 
 #ifndef __CLK_CGU_H
 #define __CLK_CGU_H
 
-#include <linux/io.h>
+#include <linux/regmap.h>
 
 struct lgm_clk_mux {
        struct clk_hw hw;
-       void __iomem *membase;
+       struct regmap *membase;
        unsigned int reg;
        u8 shift;
        u8 width;
@@ -22,7 +23,7 @@ struct lgm_clk_mux {
 
 struct lgm_clk_divider {
        struct clk_hw hw;
-       void __iomem *membase;
+       struct regmap *membase;
        unsigned int reg;
        u8 shift;
        u8 width;
@@ -35,7 +36,7 @@ struct lgm_clk_divider {
 
 struct lgm_clk_ddiv {
        struct clk_hw hw;
-       void __iomem *membase;
+       struct regmap *membase;
        unsigned int reg;
        u8 shift0;
        u8 width0;
@@ -53,7 +54,7 @@ struct lgm_clk_ddiv {
 
 struct lgm_clk_gate {
        struct clk_hw hw;
-       void __iomem *membase;
+       struct regmap *membase;
        unsigned int reg;
        u8 shift;
        unsigned long flags;
@@ -77,7 +78,7 @@ enum lgm_clk_type {
  * @clk_data: array of hw clocks and clk number.
  */
 struct lgm_clk_provider {
-       void __iomem *membase;
+       struct regmap *membase;
        struct device_node *np;
        struct device *dev;
        struct clk_hw_onecell_data clk_data;
@@ -92,7 +93,7 @@ enum pll_type {
 
 struct lgm_clk_pll {
        struct clk_hw hw;
-       void __iomem *membase;
+       struct regmap *membase;
        unsigned int reg;
        unsigned long flags;
        enum pll_type type;
@@ -300,29 +301,32 @@ struct lgm_clk_branch {
                .div = _d,                                      \
        }
 
-static inline void lgm_set_clk_val(void __iomem *membase, u32 reg,
+static inline void lgm_set_clk_val(struct regmap *membase, u32 reg,
                                   u8 shift, u8 width, u32 set_val)
 {
        u32 mask = (GENMASK(width - 1, 0) << shift);
-       u32 regval;
 
-       regval = readl(membase + reg);
-       regval = (regval & ~mask) | ((set_val << shift) & mask);
-       writel(regval, membase + reg);
+       regmap_update_bits(membase, reg, mask, set_val << shift);
 }
 
-static inline u32 lgm_get_clk_val(void __iomem *membase, u32 reg,
+static inline u32 lgm_get_clk_val(struct regmap *membase, u32 reg,
                                  u8 shift, u8 width)
 {
        u32 mask = (GENMASK(width - 1, 0) << shift);
        u32 val;
 
-       val = readl(membase + reg);
+       if (regmap_read(membase, reg, &val)) {
+               WARN_ONCE(1, "Failed to read clk reg: 0x%x\n", reg);
+               return 0;
+       }
+
        val = (val & mask) >> shift;
 
        return val;
 }
 
+
+
 int lgm_clk_register_branches(struct lgm_clk_provider *ctx,
                              const struct lgm_clk_branch *list,
                              unsigned int nr_clk);
index 020f4e8..4fa2bca 100644 (file)
@@ -1,10 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
+ * Copyright (C) 2020-2022 MaxLinear, Inc.
  * Copyright (C) 2020 Intel Corporation.
- * Zhu YiXin <yixin.zhu@intel.com>
- * Rahul Tanwar <rahul.tanwar@intel.com>
+ * Zhu Yixin <yzhu@maxlinear.com>
+ * Rahul Tanwar <rtanwar@maxlinear.com>
  */
 #include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <dt-bindings/clock/intel,lgm-clk.h>
@@ -433,9 +435,12 @@ static int lgm_cgu_probe(struct platform_device *pdev)
 
        ctx->clk_data.num = CLK_NR_CLKS;
 
-       ctx->membase = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(ctx->membase))
+       ctx->membase = syscon_node_to_regmap(np);
+       if (IS_ERR_OR_NULL(ctx->membase)) {
+               dev_err(dev, "Failed to get clk CGU iomem\n");
                return PTR_ERR(ctx->membase);
+       }
+
 
        ctx->np = np;
        ctx->dev = dev;