blob: 6863f6e64b725b4179defa147b9209ffdf5ee9d3 [file] [log] [blame]
Gabriel Fernandezafdc1ae2025-05-27 15:27:53 +02001// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
2/*
3 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
4 * Author(s): Patrice Chotard, <patrice.chotard@foss.st.com> for STMicroelectronics.
5 */
6
7#include <dm.h>
8#include <stm32-reset-core.h>
9
10/* Reset clear offset for STM32MP RCC */
11#define RCC_CLR_OFFSET 0x4
12
13/* Offset of register without set/clear management */
14#define RCC_MP_GCR_OFFSET 0x10C
15
16/* Timeout for deassert */
17#define STM32_DEASSERT_TIMEOUT_US 10000
18
19static const struct stm32_reset_cfg *stm32_get_reset_line(struct reset_ctl *reset_ctl)
20{
21 struct stm32_reset_priv *priv = dev_get_priv(reset_ctl->dev);
22 struct stm32_reset_cfg *ptr_line = &priv->reset_line;
23 int bank = (reset_ctl->id / (sizeof(u32) * BITS_PER_BYTE)) * 4;
24 int offset = reset_ctl->id % (sizeof(u32) * BITS_PER_BYTE);
25
26 ptr_line->offset = bank;
27 ptr_line->bit_idx = offset;
28 ptr_line->set_clr = true;
29
30 if (ptr_line->offset == RCC_MP_GCR_OFFSET) {
31 ptr_line->set_clr = false;
32 ptr_line->inverted = true;
33 }
34
35 return ptr_line;
36}
37
38static const struct stm32_reset_data stm32mp1_reset_data = {
39 .get_reset_line = stm32_get_reset_line,
40 .clear_offset = RCC_CLR_OFFSET,
41 .reset_us = STM32_DEASSERT_TIMEOUT_US,
42};
43
44static int stm32_reset_probe(struct udevice *dev)
45{
46 return stm32_reset_core_probe(dev, &stm32mp1_reset_data);
47}
48
49U_BOOT_DRIVER(stm32mp25_rcc_reset) = {
50 .name = "stm32mp1_reset",
51 .id = UCLASS_RESET,
52 .probe = stm32_reset_probe,
53 .priv_auto = sizeof(struct stm32_reset_priv),
54 .ops = &stm32_reset_ops,
55};