hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/reset/reset-simple.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Simple Reset Controller Driver
34 *
....@@ -8,13 +9,9 @@
89 * Copyright 2013 Maxime Ripard
910 *
1011 * Maxime Ripard <maxime.ripard@free-electrons.com>
11
- *
12
- * This program is free software; you can redistribute it and/or modify
13
- * it under the terms of the GNU General Public License as published by
14
- * the Free Software Foundation; either version 2 of the License, or
15
- * (at your option) any later version.
1612 */
1713
14
+#include <linux/delay.h>
1815 #include <linux/device.h>
1916 #include <linux/err.h>
2017 #include <linux/io.h>
....@@ -22,9 +19,8 @@
2219 #include <linux/of_device.h>
2320 #include <linux/platform_device.h>
2421 #include <linux/reset-controller.h>
22
+#include <linux/reset/reset-simple.h>
2523 #include <linux/spinlock.h>
26
-
27
-#include "reset-simple.h"
2824
2925 static inline struct reset_simple_data *
3026 to_reset_simple_data(struct reset_controller_dev *rcdev)
....@@ -68,6 +64,24 @@
6864 return reset_simple_update(rcdev, id, false);
6965 }
7066
67
+static int reset_simple_reset(struct reset_controller_dev *rcdev,
68
+ unsigned long id)
69
+{
70
+ struct reset_simple_data *data = to_reset_simple_data(rcdev);
71
+ int ret;
72
+
73
+ if (!data->reset_us)
74
+ return -ENOTSUPP;
75
+
76
+ ret = reset_simple_assert(rcdev, id);
77
+ if (ret)
78
+ return ret;
79
+
80
+ usleep_range(data->reset_us, data->reset_us * 2);
81
+
82
+ return reset_simple_deassert(rcdev, id);
83
+}
84
+
7185 static int reset_simple_status(struct reset_controller_dev *rcdev,
7286 unsigned long id)
7387 {
....@@ -85,6 +99,7 @@
8599 const struct reset_control_ops reset_simple_ops = {
86100 .assert = reset_simple_assert,
87101 .deassert = reset_simple_deassert,
102
+ .reset = reset_simple_reset,
88103 .status = reset_simple_status,
89104 };
90105 EXPORT_SYMBOL_GPL(reset_simple_ops);
....@@ -109,7 +124,7 @@
109124 #define SOCFPGA_NR_BANKS 8
110125
111126 static const struct reset_simple_devdata reset_simple_socfpga = {
112
- .reg_offset = 0x10,
127
+ .reg_offset = 0x20,
113128 .nr_resets = SOCFPGA_NR_BANKS * 32,
114129 .status_active_low = true,
115130 };
....@@ -120,7 +135,8 @@
120135 };
121136
122137 static const struct of_device_id reset_simple_dt_ids[] = {
123
- { .compatible = "altr,rst-mgr", .data = &reset_simple_socfpga },
138
+ { .compatible = "altr,stratix10-rst-mgr",
139
+ .data = &reset_simple_socfpga },
124140 { .compatible = "st,stm32-rcc", },
125141 { .compatible = "allwinner,sun6i-a31-clock-reset",
126142 .data = &reset_simple_active_low },
....@@ -128,6 +144,11 @@
128144 .data = &reset_simple_active_low },
129145 { .compatible = "aspeed,ast2400-lpc-reset" },
130146 { .compatible = "aspeed,ast2500-lpc-reset" },
147
+ { .compatible = "bitmain,bm1880-reset",
148
+ .data = &reset_simple_active_low },
149
+ { .compatible = "snps,dw-high-reset" },
150
+ { .compatible = "snps,dw-low-reset",
151
+ .data = &reset_simple_active_low },
131152 { /* sentinel */ },
132153 };
133154
....@@ -164,14 +185,6 @@
164185 data->rcdev.nr_resets = devdata->nr_resets;
165186 data->active_low = devdata->active_low;
166187 data->status_active_low = devdata->status_active_low;
167
- }
168
-
169
- if (of_device_is_compatible(dev->of_node, "altr,rst-mgr") &&
170
- of_property_read_u32(dev->of_node, "altr,modrst-offset",
171
- &reg_offset)) {
172
- dev_warn(dev,
173
- "missing altr,modrst-offset property, assuming 0x%x!\n",
174
- reg_offset);
175188 }
176189
177190 data->membase += reg_offset;