forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/drivers/clk/mediatek/reset.c
....@@ -1,14 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2014 MediaTek Inc.
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
124 */
135
146 #include <linux/mfd/syscon.h>
....@@ -26,6 +18,24 @@
2618 int regofs;
2719 struct reset_controller_dev rcdev;
2820 };
21
+
22
+static int mtk_reset_assert_set_clr(struct reset_controller_dev *rcdev,
23
+ unsigned long id)
24
+{
25
+ struct mtk_reset *data = container_of(rcdev, struct mtk_reset, rcdev);
26
+ unsigned int reg = data->regofs + ((id / 32) << 4);
27
+
28
+ return regmap_write(data->regmap, reg, BIT(id % 32));
29
+}
30
+
31
+static int mtk_reset_deassert_set_clr(struct reset_controller_dev *rcdev,
32
+ unsigned long id)
33
+{
34
+ struct mtk_reset *data = container_of(rcdev, struct mtk_reset, rcdev);
35
+ unsigned int reg = data->regofs + ((id / 32) << 4) + 0x4;
36
+
37
+ return regmap_write(data->regmap, reg, BIT(id % 32));
38
+}
2939
3040 static int mtk_reset_assert(struct reset_controller_dev *rcdev,
3141 unsigned long id)
....@@ -57,14 +67,32 @@
5767 return mtk_reset_deassert(rcdev, id);
5868 }
5969
70
+static int mtk_reset_set_clr(struct reset_controller_dev *rcdev,
71
+ unsigned long id)
72
+{
73
+ int ret;
74
+
75
+ ret = mtk_reset_assert_set_clr(rcdev, id);
76
+ if (ret)
77
+ return ret;
78
+ return mtk_reset_deassert_set_clr(rcdev, id);
79
+}
80
+
6081 static const struct reset_control_ops mtk_reset_ops = {
6182 .assert = mtk_reset_assert,
6283 .deassert = mtk_reset_deassert,
6384 .reset = mtk_reset,
6485 };
6586
66
-void mtk_register_reset_controller(struct device_node *np,
67
- unsigned int num_regs, int regofs)
87
+static const struct reset_control_ops mtk_reset_ops_set_clr = {
88
+ .assert = mtk_reset_assert_set_clr,
89
+ .deassert = mtk_reset_deassert_set_clr,
90
+ .reset = mtk_reset_set_clr,
91
+};
92
+
93
+static void mtk_register_reset_controller_common(struct device_node *np,
94
+ unsigned int num_regs, int regofs,
95
+ const struct reset_control_ops *reset_ops)
6896 {
6997 struct mtk_reset *data;
7098 int ret;
....@@ -85,7 +113,7 @@
85113 data->regofs = regofs;
86114 data->rcdev.owner = THIS_MODULE;
87115 data->rcdev.nr_resets = num_regs * 32;
88
- data->rcdev.ops = &mtk_reset_ops;
116
+ data->rcdev.ops = reset_ops;
89117 data->rcdev.of_node = np;
90118
91119 ret = reset_controller_register(&data->rcdev);
....@@ -95,3 +123,17 @@
95123 return;
96124 }
97125 }
126
+
127
+void mtk_register_reset_controller(struct device_node *np,
128
+ unsigned int num_regs, int regofs)
129
+{
130
+ mtk_register_reset_controller_common(np, num_regs, regofs,
131
+ &mtk_reset_ops);
132
+}
133
+
134
+void mtk_register_reset_controller_set_clr(struct device_node *np,
135
+ unsigned int num_regs, int regofs)
136
+{
137
+ mtk_register_reset_controller_common(np, num_regs, regofs,
138
+ &mtk_reset_ops_set_clr);
139
+}