dm: reset: add stm32 reset driver

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>
This commit is contained in:
Patrice Chotard 2017-09-13 18:00:07 +02:00 committed by Tom Rini
parent 4c3aebd56a
commit 23a0641685
5 changed files with 232 additions and 0 deletions

View file

@ -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

View 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

View 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

View file

@ -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,
};

View file

@ -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 */