Lines Matching full:reset

2  * Atmel AT91 SAM9 & SAMA5 SoCs reset code
20 #include <linux/reset-controller.h>
25 #include <dt-bindings/reset/sama7g5-reset.h>
27 #define AT91_RSTC_CR 0x00 /* Reset Controller Control Register */
28 #define AT91_RSTC_PROCRST BIT(0) /* Processor Reset */
29 #define AT91_RSTC_PERRST BIT(2) /* Peripheral Reset */
30 #define AT91_RSTC_EXTRST BIT(3) /* External Reset */
33 #define AT91_RSTC_SR 0x04 /* Reset Controller Status Register */
34 #define AT91_RSTC_URSTS BIT(0) /* User Reset Status */
35 #define AT91_RSTC_RSTTYP GENMASK(10, 8) /* Reset Type */
37 #define AT91_RSTC_SRCMP BIT(17) /* Software Reset Command in Progress */
39 #define AT91_RSTC_MR 0x08 /* Reset Controller Mode Register */
40 #define AT91_RSTC_URSTEN BIT(0) /* User Reset Enable */
41 #define AT91_RSTC_URSTASYNC BIT(2) /* User Reset Asynchronous Control */
42 #define AT91_RSTC_URSTIEN BIT(4) /* User Reset Interrupt Enable */
43 #define AT91_RSTC_ERSTL GENMASK(11, 8) /* External Reset Length */
46 * enum reset_type - reset types
47 * @RESET_TYPE_GENERAL: first power-up reset
50 * @RESET_TYPE_SOFTWARE: processor reset required by software
54 * @RESET_TYPE_ULP2: ULP2 reset
68 * struct at91_reset - AT91 reset specific data structure
69 * @rstc_base: base address for system reset
71 * @dev_base: base address for devices reset
73 * @data: platform specific reset data
74 * @rcdev: reset controller device
75 * @lock: lock for devices reset register access
76 * @nb: reset notifier block
77 * @args: SoC specific system reset arguments
96 * struct at91_reset_data - AT91 reset data
97 * @reset_args: SoC specific system reset arguments
99 * @device_reset_min_id: min id for device reset
100 * @device_reset_max_id: max id for device reset
111 * reset register it can be left driving the data bus and
117 struct at91_reset *reset = container_of(this, struct at91_reset, nb); in at91_reset() local
135 /* Reset CPU */ in at91_reset()
140 : "r" (reset->ramc_base[0]), in at91_reset()
141 "r" (reset->ramc_base[1]), in at91_reset()
142 "r" (reset->rstc_base), in at91_reset()
145 "r" (reset->data->reset_args), in at91_reset()
146 "r" (reset->ramc_lpr) in at91_reset()
160 reason = "general reset"; in at91_reset_status()
166 reason = "watchdog reset"; in at91_reset_status()
169 reason = "software reset"; in at91_reset_status()
172 reason = "user reset"; in at91_reset_status()
181 reason = "ULP2 reset"; in at91_reset_status()
184 reason = "unknown reset"; in at91_reset_status()
250 struct at91_reset *reset = to_at91_reset(rcdev); in at91_reset_update() local
254 spin_lock_irqsave(&reset->lock, flags); in at91_reset_update()
255 val = readl_relaxed(reset->dev_base); in at91_reset_update()
260 writel_relaxed(val, reset->dev_base); in at91_reset_update()
261 spin_unlock_irqrestore(&reset->lock, flags); in at91_reset_update()
281 struct at91_reset *reset = to_at91_reset(rcdev); in at91_reset_dev_status() local
284 val = readl_relaxed(reset->dev_base); in at91_reset_dev_status()
298 struct at91_reset *reset = to_at91_reset(rcdev); in at91_reset_of_xlate() local
300 if (!reset->data->n_device_reset || in at91_reset_of_xlate()
301 (reset_spec->args[0] < reset->data->device_reset_min_id || in at91_reset_of_xlate()
302 reset_spec->args[0] > reset->data->device_reset_max_id)) in at91_reset_of_xlate()
308 static int at91_rcdev_init(struct at91_reset *reset, in at91_rcdev_init() argument
311 if (!reset->data->n_device_reset) in at91_rcdev_init()
314 reset->dev_base = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 1, in at91_rcdev_init()
316 if (IS_ERR(reset->dev_base)) in at91_rcdev_init()
319 spin_lock_init(&reset->lock); in at91_rcdev_init()
320 reset->rcdev.ops = &at91_reset_ops; in at91_rcdev_init()
321 reset->rcdev.owner = THIS_MODULE; in at91_rcdev_init()
322 reset->rcdev.of_node = pdev->dev.of_node; in at91_rcdev_init()
323 reset->rcdev.nr_resets = reset->data->n_device_reset; in at91_rcdev_init()
324 reset->rcdev.of_reset_n_cells = 1; in at91_rcdev_init()
325 reset->rcdev.of_xlate = at91_reset_of_xlate; in at91_rcdev_init()
327 return devm_reset_controller_register(&pdev->dev, &reset->rcdev); in at91_rcdev_init()
333 struct at91_reset *reset; in at91_reset_probe() local
337 reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL); in at91_reset_probe()
338 if (!reset) in at91_reset_probe()
341 reset->rstc_base = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL); in at91_reset_probe()
342 if (IS_ERR(reset->rstc_base)) { in at91_reset_probe()
343 dev_err(&pdev->dev, "Could not map reset controller address\n"); in at91_reset_probe()
350 reset->ramc_lpr = (u32)match->data; in at91_reset_probe()
351 reset->ramc_base[idx] = devm_of_iomap(&pdev->dev, np, 0, NULL); in at91_reset_probe()
352 if (IS_ERR(reset->ramc_base[idx])) { in at91_reset_probe()
361 reset->data = device_get_match_data(&pdev->dev); in at91_reset_probe()
362 if (!reset->data) in at91_reset_probe()
365 reset->nb.notifier_call = at91_reset; in at91_reset_probe()
366 reset->nb.priority = 192; in at91_reset_probe()
368 reset->sclk = devm_clk_get(&pdev->dev, NULL); in at91_reset_probe()
369 if (IS_ERR(reset->sclk)) in at91_reset_probe()
370 return PTR_ERR(reset->sclk); in at91_reset_probe()
372 ret = clk_prepare_enable(reset->sclk); in at91_reset_probe()
378 platform_set_drvdata(pdev, reset); in at91_reset_probe()
380 ret = at91_rcdev_init(reset, pdev); in at91_reset_probe()
385 u32 val = readl(reset->rstc_base + AT91_RSTC_MR); in at91_reset_probe()
388 reset->rstc_base + AT91_RSTC_MR); in at91_reset_probe()
391 ret = register_restart_handler(&reset->nb); in at91_reset_probe()
395 at91_reset_status(pdev, reset->rstc_base); in at91_reset_probe()
400 clk_disable_unprepare(reset->sclk); in at91_reset_probe()
406 struct at91_reset *reset = platform_get_drvdata(pdev); in at91_reset_remove() local
408 unregister_restart_handler(&reset->nb); in at91_reset_remove()
409 clk_disable_unprepare(reset->sclk); in at91_reset_remove()
417 .name = "at91-reset",
424 MODULE_DESCRIPTION("Reset driver for Atmel SoCs");