]> git.sur5r.net Git - u-boot/commitdiff
dm: reset: add stm32 reset driver
authorPatrice Chotard <patrice.chotard@st.com>
Wed, 13 Sep 2017 16:00:07 +0000 (18:00 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 22 Sep 2017 11:40:01 +0000 (07:40 -0400)
This driver is adapted from linux drivers/reset/reset-stm32.c
It's compatible with STM32 F4/F7/H7 SoCs.

This driver doesn't implement .of_match as it's binded
by MFD RCC driver.

To add support for each SoC family, a SoC's specific
include/dt-binfings/mfd/stm32xx-rcc.h file must be added.

This patch only includes stm32h7-rcc.h dedicated for STM32H7 SoCs.
Other SoCs support will be added in the future.

Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
doc/device-tree-bindings/reset/st,stm32-rcc.txt [new file with mode: 0644]
drivers/reset/Kconfig
drivers/reset/Makefile
drivers/reset/stm32-reset.c [new file with mode: 0644]
include/dt-bindings/mfd/stm32h7-rcc.h [new file with mode: 0644]

diff --git a/doc/device-tree-bindings/reset/st,stm32-rcc.txt b/doc/device-tree-bindings/reset/st,stm32-rcc.txt
new file mode 100644 (file)
index 0000000..01db343
--- /dev/null
@@ -0,0 +1,6 @@
+STMicroelectronics STM32 Peripheral Reset Controller
+====================================================
+
+The RCC IP is both a reset and a clock controller.
+
+Please see Documentation/devicetree/bindings/clock/st,stm32-rcc.txt
index e6af7da8fe59292f4238e23b3ccef29b9c72986c..ce46e2752c256873ddbf29bc0d47ff2605becdd2 100644 (file)
@@ -28,6 +28,13 @@ config STI_RESET
          Say Y if you want to control reset signals provided by system config
          block.
 
+config STM32_RESET
+       bool "Enable the STM32 reset"
+       depends on STM32
+       help
+         Support for reset controllers on STMicroelectronics STM32 family SoCs.
+         This resset driver is compatible with STM32 F4/F7 and H7 SoCs.
+
 config TEGRA_CAR_RESET
        bool "Enable Tegra CAR-based reset driver"
        depends on TEGRA_CAR
index d5e06c2241d7648ac0d812ff5e9719e03f961467..252cefeed5b0cda84f0c5d519d43400ed816d5c3 100644 (file)
@@ -6,6 +6,7 @@ obj-$(CONFIG_DM_RESET) += reset-uclass.o
 obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset.o
 obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset-test.o
 obj-$(CONFIG_STI_RESET) += sti-reset.o
+obj-$(CONFIG_STM32_RESET) += stm32-reset.o
 obj-$(CONFIG_TEGRA_CAR_RESET) += tegra-car-reset.o
 obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
 obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
diff --git a/drivers/reset/stm32-reset.c b/drivers/reset/stm32-reset.c
new file mode 100644 (file)
index 0000000..9c627d8
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2017
+ * Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <reset-uclass.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct stm32_reset_priv {
+       fdt_addr_t base;
+};
+
+static int stm32_reset_request(struct reset_ctl *reset_ctl)
+{
+       return 0;
+}
+
+static int stm32_reset_free(struct reset_ctl *reset_ctl)
+{
+       return 0;
+}
+
+static int stm32_reset_assert(struct reset_ctl *reset_ctl)
+{
+       struct stm32_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+       int bank = (reset_ctl->id / BITS_PER_LONG) * 4;
+       int offset = reset_ctl->id % BITS_PER_LONG;
+       debug("%s: reset id = %ld bank = %d offset = %d)\n", __func__,
+             reset_ctl->id, bank, offset);
+
+       setbits_le32(priv->base + bank, BIT(offset));
+
+       return 0;
+}
+
+static int stm32_reset_deassert(struct reset_ctl *reset_ctl)
+{
+       struct stm32_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+       int bank = (reset_ctl->id / BITS_PER_LONG) * 4;
+       int offset = reset_ctl->id % BITS_PER_LONG;
+       debug("%s: reset id = %ld bank = %d offset = %d)\n", __func__,
+             reset_ctl->id, bank, offset);
+
+       clrbits_le32(priv->base + bank, BIT(offset));
+
+       return 0;
+}
+
+static const struct reset_ops stm32_reset_ops = {
+       .request        = stm32_reset_request,
+       .free           = stm32_reset_free,
+       .rst_assert     = stm32_reset_assert,
+       .rst_deassert   = stm32_reset_deassert,
+};
+
+static int stm32_reset_probe(struct udevice *dev)
+{
+       struct stm32_reset_priv *priv = dev_get_priv(dev);
+
+       priv->base = devfdt_get_addr(dev);
+       if (priv->base == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       return 0;
+}
+
+U_BOOT_DRIVER(stm32_rcc_reset) = {
+       .name                   = "stm32_rcc_reset",
+       .id                     = UCLASS_RESET,
+       .probe                  = stm32_reset_probe,
+       .priv_auto_alloc_size   = sizeof(struct stm32_reset_priv),
+       .ops                    = &stm32_reset_ops,
+};
diff --git a/include/dt-bindings/mfd/stm32h7-rcc.h b/include/dt-bindings/mfd/stm32h7-rcc.h
new file mode 100644 (file)
index 0000000..b96b3c3
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * This header provides constants for the STM32H7 RCC IP
+ */
+
+#ifndef _DT_BINDINGS_MFD_STM32H7_RCC_H
+#define _DT_BINDINGS_MFD_STM32H7_RCC_H
+
+/* AHB3 */
+#define STM32H7_RCC_AHB3_MDMA          0
+#define STM32H7_RCC_AHB3_DMA2D         4
+#define STM32H7_RCC_AHB3_JPGDEC                5
+#define STM32H7_RCC_AHB3_FMC           12
+#define STM32H7_RCC_AHB3_QUADSPI       14
+#define STM32H7_RCC_AHB3_SDMMC1                16
+#define STM32H7_RCC_AHB3_CPU1          31
+
+#define STM32H7_AHB3_RESET(bit) (STM32H7_RCC_AHB3_##bit + (0x7C * 8))
+
+/* AHB1 */
+#define STM32H7_RCC_AHB1_DMA1          0
+#define STM32H7_RCC_AHB1_DMA2          1
+#define STM32H7_RCC_AHB1_ADC12         5
+#define STM32H7_RCC_AHB1_ART           14
+#define STM32H7_RCC_AHB1_ETH1MAC       15
+#define STM32H7_RCC_AHB1_USB1OTG       25
+#define STM32H7_RCC_AHB1_USB2OTG       27
+#define STM32H7_RCC_AHB1_CPU2          31
+
+#define STM32H7_AHB1_RESET(bit) (STM32H7_RCC_AHB1_##bit + (0x80 * 8))
+
+/* AHB2 */
+#define STM32H7_RCC_AHB2_CAMITF                0
+#define STM32H7_RCC_AHB2_CRYPT         4
+#define STM32H7_RCC_AHB2_HASH          5
+#define STM32H7_RCC_AHB2_RNG           6
+#define STM32H7_RCC_AHB2_SDMMC2                9
+
+#define STM32H7_AHB2_RESET(bit) (STM32H7_RCC_AHB2_##bit + (0x84 * 8))
+
+/* AHB4 */
+#define STM32H7_RCC_AHB4_GPIOA         0
+#define STM32H7_RCC_AHB4_GPIOB         1
+#define STM32H7_RCC_AHB4_GPIOC         2
+#define STM32H7_RCC_AHB4_GPIOD         3
+#define STM32H7_RCC_AHB4_GPIOE         4
+#define STM32H7_RCC_AHB4_GPIOF         5
+#define STM32H7_RCC_AHB4_GPIOG         6
+#define STM32H7_RCC_AHB4_GPIOH         7
+#define STM32H7_RCC_AHB4_GPIOI         8
+#define STM32H7_RCC_AHB4_GPIOJ         9
+#define STM32H7_RCC_AHB4_GPIOK         10
+#define STM32H7_RCC_AHB4_CRC           19
+#define STM32H7_RCC_AHB4_BDMA          21
+#define STM32H7_RCC_AHB4_ADC3          24
+#define STM32H7_RCC_AHB4_HSEM          25
+
+#define STM32H7_AHB4_RESET(bit) (STM32H7_RCC_AHB4_##bit + (0x88 * 8))
+
+
+/* APB3 */
+#define STM32H7_RCC_APB3_LTDC          3
+#define STM32H7_RCC_APB3_DSI           4
+
+#define STM32H7_APB3_RESET(bit) (STM32H7_RCC_APB3_##bit + (0x8C * 8))
+
+/* APB1L */
+#define STM32H7_RCC_APB1L_TIM2         0
+#define STM32H7_RCC_APB1L_TIM3         1
+#define STM32H7_RCC_APB1L_TIM4         2
+#define STM32H7_RCC_APB1L_TIM5         3
+#define STM32H7_RCC_APB1L_TIM6         4
+#define STM32H7_RCC_APB1L_TIM7         5
+#define STM32H7_RCC_APB1L_TIM12                6
+#define STM32H7_RCC_APB1L_TIM13                7
+#define STM32H7_RCC_APB1L_TIM14                8
+#define STM32H7_RCC_APB1L_LPTIM1       9
+#define STM32H7_RCC_APB1L_SPI2         14
+#define STM32H7_RCC_APB1L_SPI3         15
+#define STM32H7_RCC_APB1L_SPDIF_RX     16
+#define STM32H7_RCC_APB1L_USART2       17
+#define STM32H7_RCC_APB1L_USART3       18
+#define STM32H7_RCC_APB1L_UART4                19
+#define STM32H7_RCC_APB1L_UART5                20
+#define STM32H7_RCC_APB1L_I2C1         21
+#define STM32H7_RCC_APB1L_I2C2         22
+#define STM32H7_RCC_APB1L_I2C3         23
+#define STM32H7_RCC_APB1L_HDMICEC      27
+#define STM32H7_RCC_APB1L_DAC12                29
+#define STM32H7_RCC_APB1L_USART7       30
+#define STM32H7_RCC_APB1L_USART8       31
+
+#define STM32H7_APB1L_RESET(bit) (STM32H7_RCC_APB1L_##bit + (0x90 * 8))
+
+/* APB1H */
+#define STM32H7_RCC_APB1H_CRS          1
+#define STM32H7_RCC_APB1H_SWP          2
+#define STM32H7_RCC_APB1H_OPAMP                4
+#define STM32H7_RCC_APB1H_MDIOS                5
+#define STM32H7_RCC_APB1H_FDCAN                8
+
+#define STM32H7_APB1H_RESET(bit) (STM32H7_RCC_APB1H_##bit + (0x94 * 8))
+
+/* APB2 */
+#define STM32H7_RCC_APB2_TIM1          0
+#define STM32H7_RCC_APB2_TIM8          1
+#define STM32H7_RCC_APB2_USART1                4
+#define STM32H7_RCC_APB2_USART6                5
+#define STM32H7_RCC_APB2_SPI1          12
+#define STM32H7_RCC_APB2_SPI4          13
+#define STM32H7_RCC_APB2_TIM15         16
+#define STM32H7_RCC_APB2_TIM16         17
+#define STM32H7_RCC_APB2_TIM17         18
+#define STM32H7_RCC_APB2_SPI5          20
+#define STM32H7_RCC_APB2_SAI1          22
+#define STM32H7_RCC_APB2_SAI2          23
+#define STM32H7_RCC_APB2_SAI3          24
+#define STM32H7_RCC_APB2_DFSDM1                28
+#define STM32H7_RCC_APB2_HRTIM         29
+
+#define STM32H7_APB2_RESET(bit) (STM32H7_RCC_APB2_##bit + (0x98 * 8))
+
+/* APB4 */
+#define STM32H7_RCC_APB4_SYSCFG                1
+#define STM32H7_RCC_APB4_LPUART1       3
+#define STM32H7_RCC_APB4_SPI6          5
+#define STM32H7_RCC_APB4_I2C4          7
+#define STM32H7_RCC_APB4_LPTIM2                9
+#define STM32H7_RCC_APB4_LPTIM3                10
+#define STM32H7_RCC_APB4_LPTIM4                11
+#define STM32H7_RCC_APB4_LPTIM5                12
+#define STM32H7_RCC_APB4_COMP12                14
+#define STM32H7_RCC_APB4_VREF          15
+#define STM32H7_RCC_APB4_SAI4          21
+#define STM32H7_RCC_APB4_TMPSENS       26
+
+#define STM32H7_APB4_RESET(bit) (STM32H7_RCC_APB4_##bit + (0x9C * 8))
+
+#endif /* _DT_BINDINGS_MFD_STM32H7_RCC_H */