19
19
#include <linux/acpi.h>
20
20
#include <linux/property.h>
21
21
#include <linux/regmap.h>
22
+ #include <linux/reset.h>
22
23
23
24
#include "spi-dw.h"
24
25
@@ -29,6 +30,7 @@ struct dw_spi_mmio {
29
30
struct clk * clk ;
30
31
struct clk * pclk ;
31
32
void * priv ;
33
+ struct reset_control * rstc ;
32
34
};
33
35
34
36
#define MSCC_CPU_SYSTEM_CTRL_GENERAL_CTRL 0x24
@@ -224,6 +226,14 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
224
226
if (ret )
225
227
goto out_clk ;
226
228
229
+ /* find an optional reset controller */
230
+ dwsmmio -> rstc = devm_reset_control_get_optional_exclusive (& pdev -> dev , "spi" );
231
+ if (IS_ERR (dwsmmio -> rstc )) {
232
+ ret = PTR_ERR (dwsmmio -> rstc );
233
+ goto out_clk ;
234
+ }
235
+ reset_control_deassert (dwsmmio -> rstc );
236
+
227
237
dws -> bus_num = pdev -> id ;
228
238
229
239
dws -> max_freq = clk_get_rate (dwsmmio -> clk );
@@ -257,6 +267,8 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
257
267
clk_disable_unprepare (dwsmmio -> pclk );
258
268
out_clk :
259
269
clk_disable_unprepare (dwsmmio -> clk );
270
+ reset_control_assert (dwsmmio -> rstc );
271
+
260
272
return ret ;
261
273
}
262
274
@@ -268,6 +280,7 @@ static int dw_spi_mmio_remove(struct platform_device *pdev)
268
280
pm_runtime_disable (& pdev -> dev );
269
281
clk_disable_unprepare (dwsmmio -> pclk );
270
282
clk_disable_unprepare (dwsmmio -> clk );
283
+ reset_control_assert (dwsmmio -> rstc );
271
284
272
285
return 0 ;
273
286
}
0 commit comments