hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/clk/x86/clk-cgu.h
....@@ -1,28 +1,28 @@
11 /* SPDX-License-Identifier: GPL-2.0 */
22 /*
3
- * Copyright(c) 2020 Intel Corporation.
4
- * Zhu YiXin <yixin.zhu@intel.com>
5
- * Rahul Tanwar <rahul.tanwar@intel.com>
3
+ * Copyright (C) 2020-2022 MaxLinear, Inc.
4
+ * Copyright (C) 2020 Intel Corporation.
5
+ * Zhu Yixin <yzhu@maxlinear.com>
6
+ * Rahul Tanwar <rtanwar@maxlinear.com>
67 */
78
89 #ifndef __CLK_CGU_H
910 #define __CLK_CGU_H
1011
11
-#include <linux/io.h>
12
+#include <linux/regmap.h>
1213
1314 struct lgm_clk_mux {
1415 struct clk_hw hw;
15
- void __iomem *membase;
16
+ struct regmap *membase;
1617 unsigned int reg;
1718 u8 shift;
1819 u8 width;
1920 unsigned long flags;
20
- spinlock_t lock;
2121 };
2222
2323 struct lgm_clk_divider {
2424 struct clk_hw hw;
25
- void __iomem *membase;
25
+ struct regmap *membase;
2626 unsigned int reg;
2727 u8 shift;
2828 u8 width;
....@@ -30,12 +30,11 @@
3030 u8 width_gate;
3131 unsigned long flags;
3232 const struct clk_div_table *table;
33
- spinlock_t lock;
3433 };
3534
3635 struct lgm_clk_ddiv {
3736 struct clk_hw hw;
38
- void __iomem *membase;
37
+ struct regmap *membase;
3938 unsigned int reg;
4039 u8 shift0;
4140 u8 width0;
....@@ -48,16 +47,14 @@
4847 unsigned int mult;
4948 unsigned int div;
5049 unsigned long flags;
51
- spinlock_t lock;
5250 };
5351
5452 struct lgm_clk_gate {
5553 struct clk_hw hw;
56
- void __iomem *membase;
54
+ struct regmap *membase;
5755 unsigned int reg;
5856 u8 shift;
5957 unsigned long flags;
60
- spinlock_t lock;
6158 };
6259
6360 enum lgm_clk_type {
....@@ -77,11 +74,10 @@
7774 * @clk_data: array of hw clocks and clk number.
7875 */
7976 struct lgm_clk_provider {
80
- void __iomem *membase;
77
+ struct regmap *membase;
8178 struct device_node *np;
8279 struct device *dev;
8380 struct clk_hw_onecell_data clk_data;
84
- spinlock_t lock;
8581 };
8682
8783 enum pll_type {
....@@ -92,11 +88,10 @@
9288
9389 struct lgm_clk_pll {
9490 struct clk_hw hw;
95
- void __iomem *membase;
91
+ struct regmap *membase;
9692 unsigned int reg;
9793 unsigned long flags;
9894 enum pll_type type;
99
- spinlock_t lock;
10095 };
10196
10297 /**
....@@ -202,6 +197,8 @@
202197 /* clock flags definition */
203198 #define CLOCK_FLAG_VAL_INIT BIT(16)
204199 #define MUX_CLK_SW BIT(17)
200
+#define GATE_CLK_HW BIT(18)
201
+#define DIV_CLK_NO_MASK BIT(19)
205202
206203 #define LGM_MUX(_id, _name, _pdata, _f, _reg, \
207204 _shift, _width, _cf, _v) \
....@@ -300,29 +297,32 @@
300297 .div = _d, \
301298 }
302299
303
-static inline void lgm_set_clk_val(void __iomem *membase, u32 reg,
300
+static inline void lgm_set_clk_val(struct regmap *membase, u32 reg,
304301 u8 shift, u8 width, u32 set_val)
305302 {
306303 u32 mask = (GENMASK(width - 1, 0) << shift);
307
- u32 regval;
308304
309
- regval = readl(membase + reg);
310
- regval = (regval & ~mask) | ((set_val << shift) & mask);
311
- writel(regval, membase + reg);
305
+ regmap_update_bits(membase, reg, mask, set_val << shift);
312306 }
313307
314
-static inline u32 lgm_get_clk_val(void __iomem *membase, u32 reg,
308
+static inline u32 lgm_get_clk_val(struct regmap *membase, u32 reg,
315309 u8 shift, u8 width)
316310 {
317311 u32 mask = (GENMASK(width - 1, 0) << shift);
318312 u32 val;
319313
320
- val = readl(membase + reg);
314
+ if (regmap_read(membase, reg, &val)) {
315
+ WARN_ONCE(1, "Failed to read clk reg: 0x%x\n", reg);
316
+ return 0;
317
+ }
318
+
321319 val = (val & mask) >> shift;
322320
323321 return val;
324322 }
325323
324
+
325
+
326326 int lgm_clk_register_branches(struct lgm_clk_provider *ctx,
327327 const struct lgm_clk_branch *list,
328328 unsigned int nr_clk);