Commit fc3c382f authored by John Tsichritzis's avatar John Tsichritzis Committed by TrustedFirmware Code Review
Browse files

Merge changes from topic "yg/clk_syscfg_dt" into integration

* changes:
  fdts: stm32mp1: realign device tree files with internal devs
  stm32mp1: increase device tree size to 20kB
  stm32mp1: make dt_get_stdout_node_offset() static
  stm32mp1: use unsigned values for SDMMC defines
  stm32mp1: remove useless LIBFDT_SRCS from PLAT_BL_COMMON_SOURCES
  stm32mp1: update doc for U-Boot compilation
  stm32mp1: add general SYSCFG management
  stm32mp1: move stm32_get_gpio_bank_clock() to private file
  clk: stm32mp1: correctly handle Clock Spreading Generator
  clk: stm32mp1: use defines for mask values in stm32mp1_clk_sel array
  clk: stm32mp1: move oscillator functions to generic file
  arch: add some defines for generic timer registers
Showing with 555 additions and 332 deletions
+555 -332
...@@ -83,9 +83,8 @@ To build with SP_min: ...@@ -83,9 +83,8 @@ To build with SP_min:
make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157c-ev1.dtb make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157c-ev1.dtb
cd <u-boot_directory> cd <u-boot_directory>
make stm32mp15_basic_defconfig make stm32mp15_trusted_defconfig
make DEVICE_TREE=stm32mp157c-ev1 all make DEVICE_TREE=stm32mp157c-ev1 all
./tools/mkimage -T stm32image -a 0xC0100000 -e 0xC0100000 -d u-boot.bin u-boot.stm32
To build TF-A with with Op-TEE support: To build TF-A with with Op-TEE support:
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <drivers/generic_delay_timer.h> #include <drivers/generic_delay_timer.h>
#include <drivers/st/stm32mp_clkfunc.h> #include <drivers/st/stm32mp_clkfunc.h>
#include <drivers/st/stm32mp1_clk.h> #include <drivers/st/stm32mp1_clk.h>
#include <drivers/st/stm32mp1_clkfunc.h>
#include <drivers/st/stm32mp1_rcc.h> #include <drivers/st/stm32mp1_rcc.h>
#include <dt-bindings/clock/stm32mp1-clksrc.h> #include <dt-bindings/clock/stm32mp1-clksrc.h>
#include <lib/mmio.h> #include <lib/mmio.h>
...@@ -40,6 +39,15 @@ ...@@ -40,6 +39,15 @@
#define HSIDIV_TIMEOUT TIMEOUT_US_200MS #define HSIDIV_TIMEOUT TIMEOUT_US_200MS
#define OSCRDY_TIMEOUT TIMEOUT_US_1S #define OSCRDY_TIMEOUT TIMEOUT_US_1S
const char *stm32mp_osc_node_label[NB_OSC] = {
[_LSI] = "clk-lsi",
[_LSE] = "clk-lse",
[_HSI] = "clk-hsi",
[_HSE] = "clk-hse",
[_CSI] = "clk-csi",
[_I2S_CKIN] = "i2s_ckin",
};
enum stm32mp1_parent_id { enum stm32mp1_parent_id {
/* Oscillators are defined in enum stm32mp_osc_id */ /* Oscillators are defined in enum stm32mp_osc_id */
...@@ -83,7 +91,7 @@ enum stm32mp1_parent_sel { ...@@ -83,7 +91,7 @@ enum stm32mp1_parent_sel {
_STGEN_SEL, _STGEN_SEL,
_I2C46_SEL, _I2C46_SEL,
_SPI6_SEL, _SPI6_SEL,
_USART1_SEL, _UART1_SEL,
_RNG1_SEL, _RNG1_SEL,
_UART6_SEL, _UART6_SEL,
_UART24_SEL, _UART24_SEL,
...@@ -93,8 +101,8 @@ enum stm32mp1_parent_sel { ...@@ -93,8 +101,8 @@ enum stm32mp1_parent_sel {
_SDMMC3_SEL, _SDMMC3_SEL,
_QSPI_SEL, _QSPI_SEL,
_FMC_SEL, _FMC_SEL,
_ASS_SEL, _AXIS_SEL,
_MSS_SEL, _MCUS_SEL,
_USBPHY_SEL, _USBPHY_SEL,
_USBO_SEL, _USBO_SEL,
_PARENT_SEL_NB, _PARENT_SEL_NB,
...@@ -246,13 +254,13 @@ struct stm32mp1_clk_pll { ...@@ -246,13 +254,13 @@ struct stm32mp1_clk_pll {
.fixed = (f), \ .fixed = (f), \
} }
#define _CLK_PARENT(idx, off, s, m, p) \ #define _CLK_PARENT_SEL(_label, _rcc_selr, _parents) \
[(idx)] = { \ [_ ## _label ## _SEL] = { \
.offset = (off), \ .offset = _rcc_selr, \
.src = (s), \ .src = _rcc_selr ## _ ## _label ## SRC_SHIFT, \
.msk = (m), \ .msk = _rcc_selr ## _ ## _label ## SRC_MASK, \
.parent = (p), \ .parent = (_parents), \
.nb_parent = ARRAY_SIZE(p) \ .nb_parent = ARRAY_SIZE(_parents) \
} }
#define _CLK_PLL(idx, type, off1, off2, off3, \ #define _CLK_PLL(idx, type, off1, off2, off3, \
...@@ -315,6 +323,8 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = { ...@@ -315,6 +323,8 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
_CLK_SC_FIXED(RCC_MP_APB2ENSETR, 2, TIM15_K, _PCLK2), _CLK_SC_FIXED(RCC_MP_APB2ENSETR, 2, TIM15_K, _PCLK2),
_CLK_SC_SELEC(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL), _CLK_SC_SELEC(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL),
_CLK_SC_FIXED(RCC_MP_APB3ENSETR, 11, SYSCFG, _UNKNOWN_ID),
_CLK_SC_SELEC(RCC_MP_APB4ENSETR, 8, DDRPERFM, _UNKNOWN_SEL), _CLK_SC_SELEC(RCC_MP_APB4ENSETR, 8, DDRPERFM, _UNKNOWN_SEL),
_CLK_SC_SELEC(RCC_MP_APB4ENSETR, 15, IWDG2, _UNKNOWN_SEL), _CLK_SC_SELEC(RCC_MP_APB4ENSETR, 15, IWDG2, _UNKNOWN_SEL),
_CLK_SC_SELEC(RCC_MP_APB4ENSETR, 16, USBPHY_K, _USBPHY_SEL), _CLK_SC_SELEC(RCC_MP_APB4ENSETR, 16, USBPHY_K, _USBPHY_SEL),
...@@ -322,7 +332,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = { ...@@ -322,7 +332,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
_CLK_SC_SELEC(RCC_MP_APB5ENSETR, 0, SPI6_K, _SPI6_SEL), _CLK_SC_SELEC(RCC_MP_APB5ENSETR, 0, SPI6_K, _SPI6_SEL),
_CLK_SC_SELEC(RCC_MP_APB5ENSETR, 2, I2C4_K, _I2C46_SEL), _CLK_SC_SELEC(RCC_MP_APB5ENSETR, 2, I2C4_K, _I2C46_SEL),
_CLK_SC_SELEC(RCC_MP_APB5ENSETR, 3, I2C6_K, _I2C46_SEL), _CLK_SC_SELEC(RCC_MP_APB5ENSETR, 3, I2C6_K, _I2C46_SEL),
_CLK_SC_SELEC(RCC_MP_APB5ENSETR, 4, USART1_K, _USART1_SEL), _CLK_SC_SELEC(RCC_MP_APB5ENSETR, 4, USART1_K, _UART1_SEL),
_CLK_SC_FIXED(RCC_MP_APB5ENSETR, 8, RTCAPB, _PCLK5), _CLK_SC_FIXED(RCC_MP_APB5ENSETR, 8, RTCAPB, _PCLK5),
_CLK_SC_FIXED(RCC_MP_APB5ENSETR, 11, TZC1, _PCLK5), _CLK_SC_FIXED(RCC_MP_APB5ENSETR, 11, TZC1, _PCLK5),
_CLK_SC_FIXED(RCC_MP_APB5ENSETR, 12, TZC2, _PCLK5), _CLK_SC_FIXED(RCC_MP_APB5ENSETR, 12, TZC2, _PCLK5),
...@@ -430,25 +440,25 @@ static const uint8_t usbo_parents[] = { ...@@ -430,25 +440,25 @@ static const uint8_t usbo_parents[] = {
}; };
static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = { static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
_CLK_PARENT(_I2C12_SEL, RCC_I2C12CKSELR, 0, 0x7, i2c12_parents), _CLK_PARENT_SEL(I2C12, RCC_I2C12CKSELR, i2c12_parents),
_CLK_PARENT(_I2C35_SEL, RCC_I2C35CKSELR, 0, 0x7, i2c35_parents), _CLK_PARENT_SEL(I2C35, RCC_I2C35CKSELR, i2c35_parents),
_CLK_PARENT(_STGEN_SEL, RCC_STGENCKSELR, 0, 0x3, stgen_parents), _CLK_PARENT_SEL(STGEN, RCC_STGENCKSELR, stgen_parents),
_CLK_PARENT(_I2C46_SEL, RCC_I2C46CKSELR, 0, 0x7, i2c46_parents), _CLK_PARENT_SEL(I2C46, RCC_I2C46CKSELR, i2c46_parents),
_CLK_PARENT(_SPI6_SEL, RCC_SPI6CKSELR, 0, 0x7, spi6_parents), _CLK_PARENT_SEL(SPI6, RCC_SPI6CKSELR, spi6_parents),
_CLK_PARENT(_USART1_SEL, RCC_UART1CKSELR, 0, 0x7, usart1_parents), _CLK_PARENT_SEL(UART1, RCC_UART1CKSELR, usart1_parents),
_CLK_PARENT(_RNG1_SEL, RCC_RNG1CKSELR, 0, 0x3, rng1_parents), _CLK_PARENT_SEL(RNG1, RCC_RNG1CKSELR, rng1_parents),
_CLK_PARENT(_UART6_SEL, RCC_UART6CKSELR, 0, 0x7, uart6_parents), _CLK_PARENT_SEL(UART6, RCC_UART6CKSELR, uart6_parents),
_CLK_PARENT(_UART24_SEL, RCC_UART24CKSELR, 0, 0x7, uart234578_parents), _CLK_PARENT_SEL(UART24, RCC_UART24CKSELR, uart234578_parents),
_CLK_PARENT(_UART35_SEL, RCC_UART35CKSELR, 0, 0x7, uart234578_parents), _CLK_PARENT_SEL(UART35, RCC_UART35CKSELR, uart234578_parents),
_CLK_PARENT(_UART78_SEL, RCC_UART78CKSELR, 0, 0x7, uart234578_parents), _CLK_PARENT_SEL(UART78, RCC_UART78CKSELR, uart234578_parents),
_CLK_PARENT(_SDMMC12_SEL, RCC_SDMMC12CKSELR, 0, 0x7, sdmmc12_parents), _CLK_PARENT_SEL(SDMMC12, RCC_SDMMC12CKSELR, sdmmc12_parents),
_CLK_PARENT(_SDMMC3_SEL, RCC_SDMMC3CKSELR, 0, 0x7, sdmmc3_parents), _CLK_PARENT_SEL(SDMMC3, RCC_SDMMC3CKSELR, sdmmc3_parents),
_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0xf, qspi_parents), _CLK_PARENT_SEL(QSPI, RCC_QSPICKSELR, qspi_parents),
_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0xf, fmc_parents), _CLK_PARENT_SEL(FMC, RCC_FMCCKSELR, fmc_parents),
_CLK_PARENT(_ASS_SEL, RCC_ASSCKSELR, 0, 0x3, ass_parents), _CLK_PARENT_SEL(AXIS, RCC_ASSCKSELR, ass_parents),
_CLK_PARENT(_MSS_SEL, RCC_MSSCKSELR, 0, 0x3, mss_parents), _CLK_PARENT_SEL(MCUS, RCC_MSSCKSELR, mss_parents),
_CLK_PARENT(_USBPHY_SEL, RCC_USBCKSELR, 0, 0x3, usbphy_parents), _CLK_PARENT_SEL(USBPHY, RCC_USBCKSELR, usbphy_parents),
_CLK_PARENT(_USBO_SEL, RCC_USBCKSELR, 4, 0x1, usbo_parents), _CLK_PARENT_SEL(USBO, RCC_USBCKSELR, usbo_parents),
}; };
/* Define characteristic of PLL according type */ /* Define characteristic of PLL according type */
...@@ -648,7 +658,7 @@ static int stm32mp1_clk_get_parent(unsigned long id) ...@@ -648,7 +658,7 @@ static int stm32mp1_clk_get_parent(unsigned long id)
} }
sel = clk_sel_ref(s); sel = clk_sel_ref(s);
p_sel = (mmio_read_32(rcc_base + sel->offset) >> sel->src) & sel->msk; p_sel = (mmio_read_32(rcc_base + sel->offset) & sel->msk) >> sel->src;
if (p_sel < sel->nb_parent) { if (p_sel < sel->nb_parent) {
return (int)sel->parent[p_sel]; return (int)sel->parent[p_sel];
} }
...@@ -1305,7 +1315,11 @@ static void stm32mp1_pll_start(enum stm32mp1_pll_id pll_id) ...@@ -1305,7 +1315,11 @@ static void stm32mp1_pll_start(enum stm32mp1_pll_id pll_id)
const struct stm32mp1_clk_pll *pll = pll_ref(pll_id); const struct stm32mp1_clk_pll *pll = pll_ref(pll_id);
uintptr_t pllxcr = stm32mp_rcc_base() + pll->pllxcr; uintptr_t pllxcr = stm32mp_rcc_base() + pll->pllxcr;
mmio_write_32(pllxcr, RCC_PLLNCR_PLLON); /* Preserve RCC_PLLNCR_SSCG_CTRL value */
mmio_clrsetbits_32(pllxcr,
RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN |
RCC_PLLNCR_DIVREN,
RCC_PLLNCR_PLLON);
} }
static int stm32mp1_pll_output(enum stm32mp1_pll_id pll_id, uint32_t output) static int stm32mp1_pll_output(enum stm32mp1_pll_id pll_id, uint32_t output)
...@@ -1434,6 +1448,9 @@ static void stm32mp1_pll_csg(enum stm32mp1_pll_id pll_id, uint32_t *csg) ...@@ -1434,6 +1448,9 @@ static void stm32mp1_pll_csg(enum stm32mp1_pll_id pll_id, uint32_t *csg)
RCC_PLLNCSGR_SSCG_MODE_MASK; RCC_PLLNCSGR_SSCG_MODE_MASK;
mmio_write_32(stm32mp_rcc_base() + pll->pllxcsgr, pllxcsg); mmio_write_32(stm32mp_rcc_base() + pll->pllxcsgr, pllxcsg);
mmio_setbits_32(stm32mp_rcc_base() + pll->pllxcr,
RCC_PLLNCR_SSCG_CTRL);
} }
static int stm32mp1_set_clksrc(unsigned int clksrc) static int stm32mp1_set_clksrc(unsigned int clksrc)
...@@ -1516,9 +1533,6 @@ static void stm32mp1_set_rtcsrc(unsigned int clksrc, bool lse_css) ...@@ -1516,9 +1533,6 @@ static void stm32mp1_set_rtcsrc(unsigned int clksrc, bool lse_css)
} }
} }
#define CNTCVL_OFF 0x008
#define CNTCVU_OFF 0x00C
static void stm32mp1_stgen_config(void) static void stm32mp1_stgen_config(void)
{ {
uintptr_t stgen; uintptr_t stgen;
......
/*
* Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <errno.h>
#include <libfdt.h>
#include <platform_def.h>
#include <drivers/st/stm32_gpio.h>
#include <drivers/st/stm32mp_clkfunc.h>
#include <drivers/st/stm32mp1_clk.h>
#include <drivers/st/stm32mp1_clkfunc.h>
#include <dt-bindings/clock/stm32mp1-clksrc.h>
const char *stm32mp_osc_node_label[NB_OSC] = {
[_LSI] = "clk-lsi",
[_LSE] = "clk-lse",
[_HSI] = "clk-hsi",
[_HSE] = "clk-hse",
[_CSI] = "clk-csi",
[_I2S_CKIN] = "i2s_ckin",
};
/*
* Get the frequency of an oscillator from its name in device tree.
* @param name: oscillator name
* @param freq: stores the frequency of the oscillator
* @return: 0 on success, and a negative FDT/ERRNO error code on failure.
*/
int fdt_osc_read_freq(const char *name, uint32_t *freq)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return -ENOENT;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return -FDT_ERR_NOTFOUND;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return ret;
}
if (strncmp(cchar, name, (size_t)ret) == 0) {
const fdt32_t *cuint;
cuint = fdt_getprop(fdt, subnode, "clock-frequency",
&ret);
if (cuint == NULL) {
return ret;
}
*freq = fdt32_to_cpu(*cuint);
return 0;
}
}
/* Oscillator not found, freq=0 */
*freq = 0;
return 0;
}
/*
* Check the presence of an oscillator property from its id.
* @param osc_id: oscillator ID
* @param prop_name: property name
* @return: true/false regarding search result.
*/
bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return false;
}
if (osc_id >= NB_OSC) {
return false;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return false;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return false;
}
if (strncmp(cchar, stm32mp_osc_node_label[osc_id],
(size_t)ret) != 0) {
continue;
}
if (fdt_getprop(fdt, subnode, prop_name, NULL) != NULL) {
return true;
}
}
return false;
}
/*
* Get the value of a oscillator property from its ID.
* @param osc_id: oscillator ID
* @param prop_name: property name
* @param dflt_value: default value
* @return oscillator value on success, default value if property not found.
*/
uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id,
const char *prop_name, uint32_t dflt_value)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return dflt_value;
}
if (osc_id >= NB_OSC) {
return dflt_value;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return dflt_value;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return dflt_value;
}
if (strncmp(cchar, stm32mp_osc_node_label[osc_id],
(size_t)ret) != 0) {
continue;
}
return fdt_read_uint32_default(subnode, prop_name, dflt_value);
}
return dflt_value;
}
...@@ -15,6 +15,147 @@ ...@@ -15,6 +15,147 @@
#define DT_STGEN_COMPAT "st,stm32-stgen" #define DT_STGEN_COMPAT "st,stm32-stgen"
/*
* Get the frequency of an oscillator from its name in device tree.
* @param name: oscillator name
* @param freq: stores the frequency of the oscillator
* @return: 0 on success, and a negative FDT/ERRNO error code on failure.
*/
int fdt_osc_read_freq(const char *name, uint32_t *freq)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return -ENOENT;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return -FDT_ERR_NOTFOUND;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return ret;
}
if (strncmp(cchar, name, (size_t)ret) == 0) {
const fdt32_t *cuint;
cuint = fdt_getprop(fdt, subnode, "clock-frequency",
&ret);
if (cuint == NULL) {
return ret;
}
*freq = fdt32_to_cpu(*cuint);
return 0;
}
}
/* Oscillator not found, freq=0 */
*freq = 0;
return 0;
}
/*
* Check the presence of an oscillator property from its id.
* @param osc_id: oscillator ID
* @param prop_name: property name
* @return: true/false regarding search result.
*/
bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return false;
}
if (osc_id >= NB_OSC) {
return false;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return false;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return false;
}
if (strncmp(cchar, stm32mp_osc_node_label[osc_id],
(size_t)ret) != 0) {
continue;
}
if (fdt_getprop(fdt, subnode, prop_name, NULL) != NULL) {
return true;
}
}
return false;
}
/*
* Get the value of a oscillator property from its ID.
* @param osc_id: oscillator ID
* @param prop_name: property name
* @param dflt_value: default value
* @return oscillator value on success, default value if property not found.
*/
uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id,
const char *prop_name, uint32_t dflt_value)
{
int node, subnode;
void *fdt;
if (fdt_get_address(&fdt) == 0) {
return dflt_value;
}
if (osc_id >= NB_OSC) {
return dflt_value;
}
node = fdt_path_offset(fdt, "/clocks");
if (node < 0) {
return dflt_value;
}
fdt_for_each_subnode(subnode, fdt, node) {
const char *cchar;
int ret;
cchar = fdt_get_name(fdt, subnode, &ret);
if (cchar == NULL) {
return dflt_value;
}
if (strncmp(cchar, stm32mp_osc_node_label[osc_id],
(size_t)ret) != 0) {
continue;
}
return fdt_read_uint32_default(subnode, prop_name, dflt_value);
}
return dflt_value;
}
/* /*
* Get the RCC node offset from the device tree * Get the RCC node offset from the device tree
* @param fdt: Device tree reference * @param fdt: Device tree reference
......
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
/* /*
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
*/ *
/* STM32MP157C DK1/DK2 BOARD configuration * STM32MP157C DK1/DK2 BOARD configuration
* 1x DDR3L 4Gb, 16-bit, 533MHz. * 1x DDR3L 4Gb, 16-bit, 533MHz.
* Reference used NT5CC256M16DP-DI from NANYA * Reference used NT5CC256M16DP-DI from NANYA
* *
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
* address mapping : RBC * address mapping : RBC
* Tc > + 85C : N * Tc > + 85C : N
*/ */
#define DDR_MEM_NAME "DDR3-1066/888 bin G 1x4Gb 533MHz v1.45"
#define DDR_MEM_NAME "DDR3-1066/888 bin G 1x4Gb 533MHz v1.41"
#define DDR_MEM_SPEED 533000 #define DDR_MEM_SPEED 533000
#define DDR_MEM_SIZE 0x20000000 #define DDR_MEM_SIZE 0x20000000
...@@ -90,7 +89,7 @@ ...@@ -90,7 +89,7 @@
#define DDR_PTR2 0x042DA068 #define DDR_PTR2 0x042DA068
#define DDR_ACIOCR 0x10400812 #define DDR_ACIOCR 0x10400812
#define DDR_DXCCR 0x00000C40 #define DDR_DXCCR 0x00000C40
#define DDR_DSGCR 0xF200001F #define DDR_DSGCR 0xF200011F
#define DDR_DCR 0x0000000B #define DDR_DCR 0x0000000B
#define DDR_DTPR0 0x38D488D0 #define DDR_DTPR0 0x38D488D0
#define DDR_DTPR1 0x098B00D8 #define DDR_DTPR1 0x098B00D8
...@@ -109,11 +108,11 @@ ...@@ -109,11 +108,11 @@
#define DDR_DX1DLLCR 0x40000000 #define DDR_DX1DLLCR 0x40000000
#define DDR_DX1DQTR 0xFFFFFFFF #define DDR_DX1DQTR 0xFFFFFFFF
#define DDR_DX1DQSTR 0x3DB02000 #define DDR_DX1DQSTR 0x3DB02000
#define DDR_DX2GCR 0x0000CE81 #define DDR_DX2GCR 0x0000CE80
#define DDR_DX2DLLCR 0x40000000 #define DDR_DX2DLLCR 0x40000000
#define DDR_DX2DQTR 0xFFFFFFFF #define DDR_DX2DQTR 0xFFFFFFFF
#define DDR_DX2DQSTR 0x3DB02000 #define DDR_DX2DQSTR 0x3DB02000
#define DDR_DX3GCR 0x0000CE81 #define DDR_DX3GCR 0x0000CE80
#define DDR_DX3DLLCR 0x40000000 #define DDR_DX3DLLCR 0x40000000
#define DDR_DX3DQTR 0xFFFFFFFF #define DDR_DX3DQTR 0xFFFFFFFF
#define DDR_DX3DQSTR 0x3DB02000 #define DDR_DX3DQSTR 0x3DB02000
......
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
/* /*
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
*/ *
* STM32MP157C ED1 BOARD configuration
/* STM32MP157C ED1 BOARD configuration
* 2x DDR3L 4Gb each, 16-bit, 533MHz, Single Die Package in flyby topology. * 2x DDR3L 4Gb each, 16-bit, 533MHz, Single Die Package in flyby topology.
* Reference used NT5CC256M16DP-DI from NANYA * Reference used NT5CC256M16DP-DI from NANYA
* *
...@@ -17,8 +16,7 @@ ...@@ -17,8 +16,7 @@
* address mapping : RBC * address mapping : RBC
* Tc > + 85C : N * Tc > + 85C : N
*/ */
#define DDR_MEM_NAME "DDR3-1066/888 bin G 2x4Gb 533MHz v1.45"
#define DDR_MEM_NAME "DDR3-1066/888 bin G 2x4Gb 533MHz v1.41"
#define DDR_MEM_SPEED 533000 #define DDR_MEM_SPEED 533000
#define DDR_MEM_SIZE 0x40000000 #define DDR_MEM_SIZE 0x40000000
...@@ -91,7 +89,7 @@ ...@@ -91,7 +89,7 @@
#define DDR_PTR2 0x042DA068 #define DDR_PTR2 0x042DA068
#define DDR_ACIOCR 0x10400812 #define DDR_ACIOCR 0x10400812
#define DDR_DXCCR 0x00000C40 #define DDR_DXCCR 0x00000C40
#define DDR_DSGCR 0xF200001F #define DDR_DSGCR 0xF200011F
#define DDR_DCR 0x0000000B #define DDR_DCR 0x0000000B
#define DDR_DTPR0 0x38D488D0 #define DDR_DTPR0 0x38D488D0
#define DDR_DTPR1 0x098B00D8 #define DDR_DTPR1 0x098B00D8
......
...@@ -214,21 +214,6 @@ ...@@ -214,21 +214,6 @@
}; };
}; };
sdmmc1_dir_pins_b: sdmmc1-dir-1 {
pins1 {
pinmux = <STM32_PINMUX('E', 12, AF8)>, /* SDMMC1_D0DIR */
<STM32_PINMUX('E', 14, AF11)>, /* SDMMC1_D123DIR */
<STM32_PINMUX('B', 9, AF11)>; /* SDMMC1_CDIR */
slew-rate = <3>;
drive-push-pull;
bias-pull-up;
};
pins2 {
pinmux = <STM32_PINMUX('E', 4, AF8)>; /* SDMMC1_CKIN */
bias-pull-up;
};
};
sdmmc2_b4_pins_a: sdmmc2-b4-0 { sdmmc2_b4_pins_a: sdmmc2-b4-0 {
pins1 { pins1 {
pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */ pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
...@@ -286,6 +271,19 @@ ...@@ -286,6 +271,19 @@
}; };
}; };
uart7_pins_a: uart7-0 {
pins1 {
pinmux = <STM32_PINMUX('E', 8, AF7)>; /* USART7_TX */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('E', 7, AF7)>; /* USART7_RX */
bias-disable;
};
};
usart3_pins_a: usart3-0 { usart3_pins_a: usart3-0 {
pins1 { pins1 {
pinmux = <STM32_PINMUX('B', 10, AF7)>, /* USART3_TX */ pinmux = <STM32_PINMUX('B', 10, AF7)>, /* USART3_TX */
...@@ -300,6 +298,21 @@ ...@@ -300,6 +298,21 @@
bias-disable; bias-disable;
}; };
}; };
usart3_pins_b: usart3-1 {
pins1 {
pinmux = <STM32_PINMUX('B', 10, AF7)>, /* USART3_TX */
<STM32_PINMUX('G', 8, AF8)>; /* USART3_RTS */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('B', 12, AF8)>, /* USART3_RX */
<STM32_PINMUX('B', 13, AF7)>; /* USART3_CTS_NSS */
bias-disable;
};
};
}; };
pinctrl_z: pin-controller-z@54004000 { pinctrl_z: pin-controller-z@54004000 {
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
aliases { aliases {
serial0 = &uart4; serial0 = &uart4;
serial1 = &usart3;
serial2 = &uart7;
}; };
chosen { chosen {
...@@ -146,6 +148,12 @@ ...@@ -146,6 +148,12 @@
status = "okay"; status = "okay";
}; };
&pwr {
pwr-regulators {
vdd-supply = <&vdd>;
};
};
&rng1 { &rng1 {
status = "okay"; status = "okay";
}; };
...@@ -170,6 +178,18 @@ ...@@ -170,6 +178,18 @@
status = "okay"; status = "okay";
}; };
&uart7 {
pinctrl-names = "default";
pinctrl-0 = <&uart7_pins_a>;
status = "disabled";
};
&usart3 {
pinctrl-names = "default";
pinctrl-0 = <&usart3_pins_b>;
status = "disabled";
};
/* ATF Specific */ /* ATF Specific */
#include <dt-bindings/clock/stm32mp1-clksrc.h> #include <dt-bindings/clock/stm32mp1-clksrc.h>
#include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi" #include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
...@@ -281,3 +301,11 @@ ...@@ -281,3 +301,11 @@
cfg = < 3 98 5 7 7 PQR(1,1,1) >; cfg = < 3 98 5 7 7 PQR(1,1,1) >;
}; };
}; };
&bsec {
board_id: board_id@ec {
reg = <0xec 0x4>;
status = "okay";
secure-status = "okay";
};
};
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
st,main-control-register = <0x04>; st,main-control-register = <0x04>;
st,vin-control-register = <0xc0>; st,vin-control-register = <0xc0>;
st,usb-control-register = <0x30>; st,usb-control-register = <0x20>;
regulators { regulators {
compatible = "st,stpmic1-regulators"; compatible = "st,stpmic1-regulators";
...@@ -143,6 +143,12 @@ ...@@ -143,6 +143,12 @@
status = "okay"; status = "okay";
}; };
&pwr {
pwr-regulators {
vdd-supply = <&vdd>;
};
};
&rng1 { &rng1 {
status = "okay"; status = "okay";
}; };
...@@ -302,4 +308,10 @@ ...@@ -302,4 +308,10 @@
}; };
}; };
/delete-node/ &clk_csi; &bsec {
board_id: board_id@ec {
reg = <0xec 0x4>;
status = "okay";
secure-status = "okay";
};
};
...@@ -26,9 +26,12 @@ ...@@ -26,9 +26,12 @@
status = "okay"; status = "okay";
secure-status = "okay"; secure-status = "okay";
}; };
board_id: board_id@ec { };
reg = <0xec 0x4>;
status = "okay"; &sdmmc1 {
secure-status = "okay"; compatible = "st,stm32-sdmmc2";
}; };
&sdmmc2 {
compatible = "st,stm32-sdmmc2";
}; };
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/* /*
* Copyright (C) STMicroelectronics 2017 - All Rights Reserved * Copyright (C) STMicroelectronics 2017-2019 - All Rights Reserved
* Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics. * Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics.
*/ */
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
...@@ -70,6 +70,16 @@ ...@@ -70,6 +70,16 @@
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
ranges; ranges;
timers12: timer@40006000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "st,stm32-timers";
reg = <0x40006000 0x400>;
clocks = <&rcc TIM12_K>;
clock-names = "int";
status = "disabled";
};
usart2: serial@4000e000 { usart2: serial@4000e000 {
compatible = "st,stm32h7-uart"; compatible = "st,stm32h7-uart";
reg = <0x4000e000 0x400>; reg = <0x4000e000 0x400>;
...@@ -127,8 +137,19 @@ ...@@ -127,8 +137,19 @@
status = "disabled"; status = "disabled";
}; };
timers15: timer@44006000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "st,stm32-timers";
reg = <0x44006000 0x400>;
clocks = <&rcc TIM15_K>;
clock-names = "int";
status = "disabled";
};
sdmmc3: sdmmc@48004000 { sdmmc3: sdmmc@48004000 {
compatible = "st,stm32-sdmmc2"; compatible = "arm,pl18x", "arm,primecell";
arm,primecell-periphid = <0x00253180>;
reg = <0x48004000 0x400>, <0x48005000 0x400>; reg = <0x48004000 0x400>, <0x48005000 0x400>;
clocks = <&rcc SDMMC3_K>; clocks = <&rcc SDMMC3_K>;
clock-names = "apb_pclk"; clock-names = "apb_pclk";
...@@ -139,6 +160,16 @@ ...@@ -139,6 +160,16 @@
status = "disabled"; status = "disabled";
}; };
usbotg_hs: usb-otg@49000000 {
compatible = "st,stm32mp1-hsotg", "snps,dwc2";
reg = <0x49000000 0x10000>;
clocks = <&rcc USBO_K>;
clock-names = "otg";
resets = <&rcc USBO_R>;
reset-names = "dwc2";
status = "disabled";
};
rcc: rcc@50000000 { rcc: rcc@50000000 {
compatible = "st,stm32mp1-rcc", "syscon"; compatible = "st,stm32mp1-rcc", "syscon";
reg = <0x50000000 0x1000>; reg = <0x50000000 0x1000>;
...@@ -170,6 +201,30 @@ ...@@ -170,6 +201,30 @@
}; };
}; };
syscfg: syscon@50020000 {
compatible = "st,stm32mp157-syscfg", "syscon";
reg = <0x50020000 0x400>;
clocks = <&rcc SYSCFG>;
};
cryp1: cryp@54001000 {
compatible = "st,stm32mp1-cryp";
reg = <0x54001000 0x400>;
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc CRYP1>;
resets = <&rcc CRYP1_R>;
status = "disabled";
};
hash1: hash@54002000 {
compatible = "st,stm32f756-hash";
reg = <0x54002000 0x400>;
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc HASH1>;
resets = <&rcc HASH1_R>;
status = "disabled";
};
rng1: rng@54003000 { rng1: rng@54003000 {
compatible = "st,stm32-rng"; compatible = "st,stm32-rng";
reg = <0x54003000 0x400>; reg = <0x54003000 0x400>;
...@@ -202,7 +257,8 @@ ...@@ -202,7 +257,8 @@
}; };
sdmmc1: sdmmc@58005000 { sdmmc1: sdmmc@58005000 {
compatible = "st,stm32-sdmmc2"; compatible = "arm,pl18x", "arm,primecell";
arm,primecell-periphid = <0x00253180>;
reg = <0x58005000 0x1000>, <0x58006000 0x1000>; reg = <0x58005000 0x1000>, <0x58006000 0x1000>;
clocks = <&rcc SDMMC1_K>; clocks = <&rcc SDMMC1_K>;
clock-names = "apb_pclk"; clock-names = "apb_pclk";
...@@ -214,7 +270,8 @@ ...@@ -214,7 +270,8 @@
}; };
sdmmc2: sdmmc@58007000 { sdmmc2: sdmmc@58007000 {
compatible = "st,stm32-sdmmc2"; compatible = "arm,pl18x", "arm,primecell";
arm,primecell-periphid = <0x00253180>;
reg = <0x58007000 0x1000>, <0x58008000 0x1000>; reg = <0x58007000 0x1000>, <0x58008000 0x1000>;
clocks = <&rcc SDMMC2_K>; clocks = <&rcc SDMMC2_K>;
clock-names = "apb_pclk"; clock-names = "apb_pclk";
......
...@@ -81,6 +81,10 @@ ...@@ -81,6 +81,10 @@
* Generic timer memory mapped registers & offsets * Generic timer memory mapped registers & offsets
******************************************************************************/ ******************************************************************************/
#define CNTCR_OFF U(0x000) #define CNTCR_OFF U(0x000)
/* Counter Count Value Lower register */
#define CNTCVL_OFF U(0x008)
/* Counter Count Value Upper register */
#define CNTCVU_OFF U(0x00C)
#define CNTFID_OFF U(0x020) #define CNTFID_OFF U(0x020)
#define CNTCR_EN (U(1) << 0) #define CNTCR_EN (U(1) << 0)
......
...@@ -99,6 +99,7 @@ ...@@ -99,6 +99,7 @@
* Generic timer memory mapped registers & offsets * Generic timer memory mapped registers & offsets
******************************************************************************/ ******************************************************************************/
#define CNTCR_OFF U(0x000) #define CNTCR_OFF U(0x000)
#define CNTCV_OFF U(0x008)
#define CNTFID_OFF U(0x020) #define CNTFID_OFF U(0x020)
#define CNTCR_EN (U(1) << 0) #define CNTCR_EN (U(1) << 0)
......
...@@ -9,6 +9,19 @@ ...@@ -9,6 +9,19 @@
#include <arch_helpers.h> #include <arch_helpers.h>
enum stm32mp_osc_id {
_HSI,
_HSE,
_CSI,
_LSI,
_LSE,
_I2S_CKIN,
NB_OSC,
_UNKNOWN_OSC_ID = 0xFF
};
extern const char *stm32mp_osc_node_label[NB_OSC];
int stm32mp1_clk_probe(void); int stm32mp1_clk_probe(void);
int stm32mp1_clk_init(void); int stm32mp1_clk_init(void);
......
/*
* Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef STM32MP1_CLKFUNC_H
#define STM32MP1_CLKFUNC_H
#include <stdbool.h>
#include <libfdt.h>
enum stm32mp_osc_id {
_HSI,
_HSE,
_CSI,
_LSI,
_LSE,
_I2S_CKIN,
NB_OSC,
_UNKNOWN_OSC_ID = 0xFF
};
extern const char *stm32mp_osc_node_label[NB_OSC];
int fdt_osc_read_freq(const char *name, uint32_t *freq);
bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name);
uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id,
const char *prop_name,
uint32_t dflt_value);
#endif /* STM32MP1_CLKFUNC_H */
...@@ -480,4 +480,82 @@ ...@@ -480,4 +480,82 @@
/* Values of RCC_PWRLPDLYCR register */ /* Values of RCC_PWRLPDLYCR register */
#define RCC_PWRLPDLYCR_PWRLP_DLY_MASK GENMASK(21, 0) #define RCC_PWRLPDLYCR_PWRLP_DLY_MASK GENMASK(21, 0)
/* RCC_ASSCKSELR register fields */
#define RCC_ASSCKSELR_AXISSRC_MASK GENMASK(2, 0)
#define RCC_ASSCKSELR_AXISSRC_SHIFT 0
/* RCC_MSSCKSELR register fields */
#define RCC_MSSCKSELR_MCUSSRC_MASK GENMASK(1, 0)
#define RCC_MSSCKSELR_MCUSSRC_SHIFT 0
/* RCC_I2C46CKSELR register fields */
#define RCC_I2C46CKSELR_I2C46SRC_MASK GENMASK(2, 0)
#define RCC_I2C46CKSELR_I2C46SRC_SHIFT 0
/* RCC_SPI6CKSELR register fields */
#define RCC_SPI6CKSELR_SPI6SRC_MASK GENMASK(2, 0)
#define RCC_SPI6CKSELR_SPI6SRC_SHIFT 0
/* RCC_UART1CKSELR register fields */
#define RCC_UART1CKSELR_UART1SRC_MASK GENMASK(2, 0)
#define RCC_UART1CKSELR_UART1SRC_SHIFT 0
/* RCC_RNG1CKSELR register fields */
#define RCC_RNG1CKSELR_RNG1SRC_MASK GENMASK(1, 0)
#define RCC_RNG1CKSELR_RNG1SRC_SHIFT 0
/* RCC_STGENCKSELR register fields */
#define RCC_STGENCKSELR_STGENSRC_MASK GENMASK(1, 0)
#define RCC_STGENCKSELR_STGENSRC_SHIFT 0
/* RCC_I2C12CKSELR register fields */
#define RCC_I2C12CKSELR_I2C12SRC_MASK GENMASK(2, 0)
#define RCC_I2C12CKSELR_I2C12SRC_SHIFT 0
/* RCC_I2C35CKSELR register fields */
#define RCC_I2C35CKSELR_I2C35SRC_MASK GENMASK(2, 0)
#define RCC_I2C35CKSELR_I2C35SRC_SHIFT 0
/* RCC_UART6CKSELR register fields */
#define RCC_UART6CKSELR_UART6SRC_MASK GENMASK(2, 0)
#define RCC_UART6CKSELR_UART6SRC_SHIFT 0
/* RCC_UART24CKSELR register fields */
#define RCC_UART24CKSELR_UART24SRC_MASK GENMASK(2, 0)
#define RCC_UART24CKSELR_UART24SRC_SHIFT 0
/* RCC_UART35CKSELR register fields */
#define RCC_UART35CKSELR_UART35SRC_MASK GENMASK(2, 0)
#define RCC_UART35CKSELR_UART35SRC_SHIFT 0
/* RCC_UART78CKSELR register fields */
#define RCC_UART78CKSELR_UART78SRC_MASK GENMASK(2, 0)
#define RCC_UART78CKSELR_UART78SRC_SHIFT 0
/* RCC_SDMMC12CKSELR register fields */
#define RCC_SDMMC12CKSELR_SDMMC12SRC_MASK GENMASK(2, 0)
#define RCC_SDMMC12CKSELR_SDMMC12SRC_SHIFT 0
/* RCC_SDMMC3CKSELR register fields */
#define RCC_SDMMC3CKSELR_SDMMC3SRC_MASK GENMASK(2, 0)
#define RCC_SDMMC3CKSELR_SDMMC3SRC_SHIFT 0
/* RCC_ETHCKSELR register fields */
#define RCC_ETHCKSELR_ETHSRC_MASK GENMASK(1, 0)
#define RCC_ETHCKSELR_ETHSRC_SHIFT 0
/* RCC_QSPICKSELR register fields */
#define RCC_QSPICKSELR_QSPISRC_MASK GENMASK(1, 0)
#define RCC_QSPICKSELR_QSPISRC_SHIFT 0
/* RCC_FMCCKSELR register fields */
#define RCC_FMCCKSELR_FMCSRC_MASK GENMASK(1, 0)
#define RCC_FMCCKSELR_FMCSRC_SHIFT 0
/* RCC_USBCKSELR register fields */
#define RCC_USBCKSELR_USBPHYSRC_MASK GENMASK(1, 0)
#define RCC_USBCKSELR_USBPHYSRC_SHIFT 0
#define RCC_USBCKSELR_USBOSRC_MASK BIT(4)
#define RCC_USBCKSELR_USBOSRC_SHIFT 4
#endif /* STM32MP1_RCC_H */ #endif /* STM32MP1_RCC_H */
...@@ -11,6 +11,14 @@ ...@@ -11,6 +11,14 @@
#include <libfdt.h> #include <libfdt.h>
#include <platform_def.h>
int fdt_osc_read_freq(const char *name, uint32_t *freq);
bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name);
uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id,
const char *prop_name,
uint32_t dflt_value);
int fdt_get_rcc_node(void *fdt); int fdt_get_rcc_node(void *fdt);
uint32_t fdt_rcc_read_addr(void); uint32_t fdt_rcc_read_addr(void);
int fdt_rcc_read_uint32_array(const char *prop_name, int fdt_rcc_read_uint32_array(const char *prop_name,
......
...@@ -36,11 +36,12 @@ int dt_set_stdout_pinctrl(void); ...@@ -36,11 +36,12 @@ int dt_set_stdout_pinctrl(void);
void dt_fill_device_info(struct dt_node_info *info, int node); void dt_fill_device_info(struct dt_node_info *info, int node);
int dt_get_node(struct dt_node_info *info, int offset, const char *compat); int dt_get_node(struct dt_node_info *info, int offset, const char *compat);
int dt_get_stdout_uart_info(struct dt_node_info *info); int dt_get_stdout_uart_info(struct dt_node_info *info);
int dt_get_stdout_node_offset(void);
uint32_t dt_get_ddr_size(void); uint32_t dt_get_ddr_size(void);
uintptr_t dt_get_ddrctrl_base(void); uintptr_t dt_get_ddrctrl_base(void);
uintptr_t dt_get_ddrphyc_base(void); uintptr_t dt_get_ddrphyc_base(void);
uintptr_t dt_get_pwr_base(void); uintptr_t dt_get_pwr_base(void);
uint32_t dt_get_pwr_vdd_voltage(void);
uintptr_t dt_get_syscfg_base(void);
const char *dt_get_board_model(void); const char *dt_get_board_model(void);
#endif /* STM32MP_DT_H */ #endif /* STM32MP_DT_H */
...@@ -98,17 +98,6 @@ uintptr_t stm32_get_gpio_bank_base(unsigned int bank) ...@@ -98,17 +98,6 @@ uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
return GPIOA_BASE + (bank * GPIO_BANK_OFFSET); return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
} }
unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
{
if (bank == GPIO_BANK_Z) {
return GPIOZ;
}
assert(GPIO_BANK_A == 0 && bank <= GPIO_BANK_K);
return GPIOA + (bank - GPIO_BANK_A);
}
uint32_t stm32_get_gpio_bank_offset(unsigned int bank) uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
{ {
if (bank == GPIO_BANK_Z) { if (bank == GPIO_BANK_Z) {
......
...@@ -145,6 +145,52 @@ int fdt_read_uint32_array(int node, const char *prop_name, uint32_t *array, ...@@ -145,6 +145,52 @@ int fdt_read_uint32_array(int node, const char *prop_name, uint32_t *array,
return 0; return 0;
} }
/*******************************************************************************
* This function gets the stdout path node.
* It reads the value indicated inside the device tree.
* Returns node offset on success and a negative FDT error code on failure.
******************************************************************************/
static int dt_get_stdout_node_offset(void)
{
int node;
const char *cchar;
node = fdt_path_offset(fdt, "/secure-chosen");
if (node < 0) {
node = fdt_path_offset(fdt, "/chosen");
if (node < 0) {
return -FDT_ERR_NOTFOUND;
}
}
cchar = fdt_getprop(fdt, node, "stdout-path", NULL);
if (cchar == NULL) {
return -FDT_ERR_NOTFOUND;
}
node = -FDT_ERR_NOTFOUND;
if (strchr(cchar, (int)':') != NULL) {
const char *name;
char *str = (char *)cchar;
int len = 0;
while (strncmp(":", str, 1)) {
len++;
str++;
}
name = fdt_get_alias_namelen(fdt, cchar, len);
if (name != NULL) {
node = fdt_path_offset(fdt, name);
}
} else {
node = fdt_path_offset(fdt, cchar);
}
return node;
}
/******************************************************************************* /*******************************************************************************
* This function gets the stdout pin configuration information from the DT. * This function gets the stdout pin configuration information from the DT.
* And then calls the sub-function to treat it and set GPIO registers. * And then calls the sub-function to treat it and set GPIO registers.
...@@ -231,49 +277,6 @@ int dt_get_stdout_uart_info(struct dt_node_info *info) ...@@ -231,49 +277,6 @@ int dt_get_stdout_uart_info(struct dt_node_info *info)
return node; return node;
} }
/*******************************************************************************
* This function gets the stdout path node.
* It reads the value indicated inside the device tree.
* Returns node if success, and a negative value else.
******************************************************************************/
int dt_get_stdout_node_offset(void)
{
int node;
const char *cchar;
node = fdt_path_offset(fdt, "/chosen");
if (node < 0) {
return -FDT_ERR_NOTFOUND;
}
cchar = fdt_getprop(fdt, node, "stdout-path", NULL);
if (cchar == NULL) {
return -FDT_ERR_NOTFOUND;
}
node = -FDT_ERR_NOTFOUND;
if (strchr(cchar, (int)':') != NULL) {
const char *name;
char *str = (char *)cchar;
int len = 0;
while (strncmp(":", str, 1)) {
len++;
str++;
}
name = fdt_get_alias_namelen(fdt, cchar, len);
if (name != NULL) {
node = fdt_path_offset(fdt, name);
}
} else {
node = fdt_path_offset(fdt, cchar);
}
return node;
}
/******************************************************************************* /*******************************************************************************
* This function gets DDR size information from the DT. * This function gets DDR size information from the DT.
* Returns value in bytes on success, and 0 on failure. * Returns value in bytes on success, and 0 on failure.
...@@ -358,6 +361,68 @@ uintptr_t dt_get_pwr_base(void) ...@@ -358,6 +361,68 @@ uintptr_t dt_get_pwr_base(void)
return fdt32_to_cpu(*cuint); return fdt32_to_cpu(*cuint);
} }
/*******************************************************************************
* This function gets PWR VDD regulator voltage information from the DT.
* Returns value in microvolts on success, and 0 on failure.
******************************************************************************/
uint32_t dt_get_pwr_vdd_voltage(void)
{
int node, pwr_regulators_node;
const fdt32_t *cuint;
node = fdt_node_offset_by_compatible(fdt, -1, DT_PWR_COMPAT);
if (node < 0) {
INFO("%s: Cannot read PWR node in DT\n", __func__);
return 0;
}
pwr_regulators_node = fdt_subnode_offset(fdt, node, "pwr-regulators");
if (node < 0) {
INFO("%s: Cannot read pwr-regulators node in DT\n", __func__);
return 0;
}
cuint = fdt_getprop(fdt, pwr_regulators_node, "vdd-supply", NULL);
if (cuint == NULL) {
return 0;
}
node = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
if (node < 0) {
return 0;
}
cuint = fdt_getprop(fdt, node, "regulator-min-microvolt", NULL);
if (cuint == NULL) {
return 0;
}
return fdt32_to_cpu(*cuint);
}
/*******************************************************************************
* This function gets SYSCFG base address information from the DT.
* Returns value on success, and 0 on failure.
******************************************************************************/
uintptr_t dt_get_syscfg_base(void)
{
int node;
const fdt32_t *cuint;
node = fdt_node_offset_by_compatible(fdt, -1, DT_SYSCFG_COMPAT);
if (node < 0) {
INFO("%s: Cannot read SYSCFG node in DT\n", __func__);
return 0;
}
cuint = fdt_getprop(fdt, node, "reg", NULL);
if (cuint == NULL) {
return 0;
}
return fdt32_to_cpu(*cuint);
}
/******************************************************************************* /*******************************************************************************
* This function retrieves board model from DT * This function retrieves board model from DT
* Returns string taken from model node, NULL otherwise * Returns string taken from model node, NULL otherwise
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment