mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-01-26 03:45:12 +00:00
- stm32mp: fix command stboard
- stm32mp: update kernel device tree according the part number - stm32mp: add 800 MHz profile support = stm32mp15xd and stm32mp15xf - stm32mp: set cp15 frequency in psci cpu on - stm32mp: DT alignment with Linux 5.6-rc1 - stm32mp: clk: add SPI5 support and correct CKSELR masks - stm32mp: ram: fixes on LPDDR2/LPDDR3 support and on tuning - stm32: i2c: allows for any bus frequency - sti: timer: livetree and clk API conversion -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE56Yx6b9SnloYCWtD4rK92eCqk3UFAl56C0cACgkQ4rK92eCq k3VlEwgAgOnfIG1WLj+WSUUHmPrglfw0WfoP2Uh7ReZEzaUfuyRfw4/65rtKJri+ 4WhT+Az+GO8oblL7557U0QCFYHCw97WpTHu/uQ0CZzr72JWRnArlWwwgQq2vFok5 CBfJ/BDCK72RYUcvNHPOh1wRpS+JIRO8d6HdwbiahBHfxP4J+yWII63VpE4K1Zd7 IDXK3H20jVCTG7jdrHNCaScHWme1qsh8HH132oGRlnf6sxtApxJO7dbV0etY15XF U1mipAxMoJMIF7utc9GoNia2Tvyi+ZYDjiKCljKwdMW+ebvTulUcikOcXO/aufGo 3nsyv7W6iMfxcK/4aFkQUOCLADY96Q== =OXic -----END PGP SIGNATURE----- Merge tag 'u-boot-stm32-20200324' of https://gitlab.denx.de/u-boot/custodians/u-boot-stm into next - stm32mp: fix command stboard - stm32mp: update kernel device tree according the part number - stm32mp: add 800 MHz profile support = stm32mp15xd and stm32mp15xf - stm32mp: set cp15 frequency in psci cpu on - stm32mp: DT alignment with Linux 5.6-rc1 - stm32mp: clk: add SPI5 support and correct CKSELR masks - stm32mp: ram: fixes on LPDDR2/LPDDR3 support and on tuning - stm32: i2c: allows for any bus frequency - sti: timer: livetree and clk API conversion
This commit is contained in:
commit
779e6dc6a4
51 changed files with 3143 additions and 2205 deletions
|
@ -133,6 +133,7 @@
|
||||||
DDR_MR3
|
DDR_MR3
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
#ifdef DDR_PHY_CAL_SKIP
|
||||||
st,phy-cal = <
|
st,phy-cal = <
|
||||||
DDR_DX0DLLCR
|
DDR_DX0DLLCR
|
||||||
DDR_DX0DQTR
|
DDR_DX0DQTR
|
||||||
|
@ -148,6 +149,8 @@
|
||||||
DDR_DX3DQSTR
|
DDR_DX3DQSTR
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
1114
arch/arm/dts/stm32mp15-pinctrl.dtsi
Normal file
1114
arch/arm/dts/stm32mp15-pinctrl.dtsi
Normal file
File diff suppressed because it is too large
Load diff
|
@ -20,12 +20,6 @@
|
||||||
device_type = "cpu";
|
device_type = "cpu";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu1: cpu@1 {
|
|
||||||
compatible = "arm,cortex-a7";
|
|
||||||
device_type = "cpu";
|
|
||||||
reg = <1>;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
psci {
|
psci {
|
||||||
|
@ -155,6 +149,11 @@
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
timers3: timer@40001000 {
|
timers3: timer@40001000 {
|
||||||
|
@ -184,6 +183,11 @@
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
timers4: timer@40002000 {
|
timers4: timer@40002000 {
|
||||||
|
@ -211,6 +215,11 @@
|
||||||
reg = <3>;
|
reg = <3>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
timers5: timer@40003000 {
|
timers5: timer@40003000 {
|
||||||
|
@ -240,6 +249,11 @@
|
||||||
reg = <4>;
|
reg = <4>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
timers6: timer@40004000 {
|
timers6: timer@40004000 {
|
||||||
|
@ -596,6 +610,11 @@
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
timers8: timer@44001000 {
|
timers8: timer@44001000 {
|
||||||
|
@ -627,6 +646,11 @@
|
||||||
reg = <7>;
|
reg = <7>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
counter {
|
||||||
|
compatible = "st,stm32-timer-counter";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
usart6: serial@44003000 {
|
usart6: serial@44003000 {
|
||||||
|
@ -930,33 +954,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
m_can1: can@4400e000 {
|
dma1: dma-controller@48000000 {
|
||||||
compatible = "bosch,m_can";
|
|
||||||
reg = <0x4400e000 0x400>, <0x44011000 0x1400>;
|
|
||||||
reg-names = "m_can", "message_ram";
|
|
||||||
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
|
||||||
<GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
interrupt-names = "int0", "int1";
|
|
||||||
clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
|
|
||||||
clock-names = "hclk", "cclk";
|
|
||||||
bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
m_can2: can@4400f000 {
|
|
||||||
compatible = "bosch,m_can";
|
|
||||||
reg = <0x4400f000 0x400>, <0x44011000 0x2800>;
|
|
||||||
reg-names = "m_can", "message_ram";
|
|
||||||
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
|
||||||
<GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
interrupt-names = "int0", "int1";
|
|
||||||
clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
|
|
||||||
clock-names = "hclk", "cclk";
|
|
||||||
bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
dma1: dma@48000000 {
|
|
||||||
compatible = "st,stm32-dma";
|
compatible = "st,stm32-dma";
|
||||||
reg = <0x48000000 0x400>;
|
reg = <0x48000000 0x400>;
|
||||||
interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
@ -973,7 +971,7 @@
|
||||||
dma-requests = <8>;
|
dma-requests = <8>;
|
||||||
};
|
};
|
||||||
|
|
||||||
dma2: dma@48001000 {
|
dma2: dma-controller@48001000 {
|
||||||
compatible = "st,stm32-dma";
|
compatible = "st,stm32-dma";
|
||||||
reg = <0x48001000 0x400>;
|
reg = <0x48001000 0x400>;
|
||||||
interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
@ -1041,8 +1039,8 @@
|
||||||
compatible = "arm,pl18x", "arm,primecell";
|
compatible = "arm,pl18x", "arm,primecell";
|
||||||
arm,primecell-periphid = <0x10153180>;
|
arm,primecell-periphid = <0x10153180>;
|
||||||
reg = <0x48004000 0x400>;
|
reg = <0x48004000 0x400>;
|
||||||
reg-names = "sdmmc";
|
interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
interrupts = <GIC_SPI 137 IRQ_TYPE_NONE>;
|
interrupt-names = "cmd_irq";
|
||||||
clocks = <&rcc SDMMC3_K>;
|
clocks = <&rcc SDMMC3_K>;
|
||||||
clock-names = "apb_pclk";
|
clock-names = "apb_pclk";
|
||||||
resets = <&rcc SDMMC3_R>;
|
resets = <&rcc SDMMC3_R>;
|
||||||
|
@ -1273,15 +1271,6 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
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 {
|
hash1: hash@54002000 {
|
||||||
compatible = "st,stm32f756-hash";
|
compatible = "st,stm32f756-hash";
|
||||||
reg = <0x54002000 0x400>;
|
reg = <0x54002000 0x400>;
|
||||||
|
@ -1302,7 +1291,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
mdma1: dma@58000000 {
|
mdma1: dma-controller@58000000 {
|
||||||
compatible = "st,stm32h7-mdma";
|
compatible = "st,stm32h7-mdma";
|
||||||
reg = <0x58000000 0x1000>;
|
reg = <0x58000000 0x1000>;
|
||||||
interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
@ -1349,20 +1338,22 @@
|
||||||
arm,primecell-periphid = <0x10153180>;
|
arm,primecell-periphid = <0x10153180>;
|
||||||
reg = <0x58005000 0x1000>;
|
reg = <0x58005000 0x1000>;
|
||||||
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
interrupt-names = "cmd_irq";
|
interrupt-names = "cmd_irq";
|
||||||
clocks = <&rcc SDMMC1_K>;
|
clocks = <&rcc SDMMC1_K>;
|
||||||
clock-names = "apb_pclk";
|
clock-names = "apb_pclk";
|
||||||
resets = <&rcc SDMMC1_R>;
|
resets = <&rcc SDMMC1_R>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <120000000>;
|
max-frequency = <120000000>;
|
||||||
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
sdmmc2: sdmmc@58007000 {
|
sdmmc2: sdmmc@58007000 {
|
||||||
compatible = "arm,pl18x", "arm,primecell";
|
compatible = "arm,pl18x", "arm,primecell";
|
||||||
arm,primecell-periphid = <0x10153180>;
|
arm,primecell-periphid = <0x10153180>;
|
||||||
reg = <0x58007000 0x1000>;
|
reg = <0x58007000 0x1000>;
|
||||||
interrupts = <GIC_SPI 124 IRQ_TYPE_NONE>;
|
interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "cmd_irq";
|
||||||
clocks = <&rcc SDMMC2_K>;
|
clocks = <&rcc SDMMC2_K>;
|
||||||
clock-names = "apb_pclk";
|
clock-names = "apb_pclk";
|
||||||
resets = <&rcc SDMMC2_R>;
|
resets = <&rcc SDMMC2_R>;
|
||||||
|
@ -1406,6 +1397,7 @@
|
||||||
st,syscon = <&syscfg 0x4>;
|
st,syscon = <&syscfg 0x4>;
|
||||||
snps,mixed-burst;
|
snps,mixed-burst;
|
||||||
snps,pbl = <2>;
|
snps,pbl = <2>;
|
||||||
|
snps,en-tx-lpi-clockgating;
|
||||||
snps,axi-config = <&stmmac_axi_config_0>;
|
snps,axi-config = <&stmmac_axi_config_0>;
|
||||||
snps,tso;
|
snps,tso;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -1430,26 +1422,6 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpu: gpu@59000000 {
|
|
||||||
compatible = "vivante,gc";
|
|
||||||
reg = <0x59000000 0x800>;
|
|
||||||
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
clocks = <&rcc GPU>, <&rcc GPU_K>;
|
|
||||||
clock-names = "bus" ,"core";
|
|
||||||
resets = <&rcc GPU_R>;
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
dsi: dsi@5a000000 {
|
|
||||||
compatible = "st,stm32-dsi";
|
|
||||||
reg = <0x5a000000 0x800>;
|
|
||||||
clocks = <&rcc DSI_K>, <&clk_hse>, <&rcc DSI_PX>;
|
|
||||||
clock-names = "pclk", "ref", "px_clk";
|
|
||||||
resets = <&rcc DSI_R>;
|
|
||||||
reset-names = "apb";
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
ltdc: display-controller@5a001000 {
|
ltdc: display-controller@5a001000 {
|
||||||
compatible = "st,stm32-ltdc";
|
compatible = "st,stm32-ltdc";
|
||||||
reg = <0x5a001000 0x400>;
|
reg = <0x5a001000 0x400>;
|
||||||
|
@ -1535,7 +1507,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
bsec: nvmem@5c005000 {
|
bsec: efuse@5c005000 {
|
||||||
compatible = "st,stm32mp15-bsec";
|
compatible = "st,stm32mp15-bsec";
|
||||||
reg = <0x5c005000 0x400>;
|
reg = <0x5c005000 0x400>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -1560,12 +1532,172 @@
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Break node order to solve dependency probe issue between
|
||||||
|
* pinctrl and exti.
|
||||||
|
*/
|
||||||
|
pinctrl: pin-controller@50002000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "st,stm32mp157-pinctrl";
|
||||||
|
ranges = <0 0x50002000 0xa400>;
|
||||||
|
interrupt-parent = <&exti>;
|
||||||
|
st,syscfg = <&exti 0x60 0xff>;
|
||||||
|
hwlocks = <&hwspinlock 0>;
|
||||||
|
pins-are-numbered;
|
||||||
|
|
||||||
|
gpioa: gpio@50002000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x0 0x400>;
|
||||||
|
clocks = <&rcc GPIOA>;
|
||||||
|
st,bank-name = "GPIOA";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@50003000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x1000 0x400>;
|
||||||
|
clocks = <&rcc GPIOB>;
|
||||||
|
st,bank-name = "GPIOB";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@50004000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x2000 0x400>;
|
||||||
|
clocks = <&rcc GPIOC>;
|
||||||
|
st,bank-name = "GPIOC";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@50005000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x3000 0x400>;
|
||||||
|
clocks = <&rcc GPIOD>;
|
||||||
|
st,bank-name = "GPIOD";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@50006000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x4000 0x400>;
|
||||||
|
clocks = <&rcc GPIOE>;
|
||||||
|
st,bank-name = "GPIOE";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@50007000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x5000 0x400>;
|
||||||
|
clocks = <&rcc GPIOF>;
|
||||||
|
st,bank-name = "GPIOF";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@50008000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x6000 0x400>;
|
||||||
|
clocks = <&rcc GPIOG>;
|
||||||
|
st,bank-name = "GPIOG";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@50009000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x7000 0x400>;
|
||||||
|
clocks = <&rcc GPIOH>;
|
||||||
|
st,bank-name = "GPIOH";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@5000a000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x8000 0x400>;
|
||||||
|
clocks = <&rcc GPIOI>;
|
||||||
|
st,bank-name = "GPIOI";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioj: gpio@5000b000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x9000 0x400>;
|
||||||
|
clocks = <&rcc GPIOJ>;
|
||||||
|
st,bank-name = "GPIOJ";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiok: gpio@5000c000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0xa000 0x400>;
|
||||||
|
clocks = <&rcc GPIOK>;
|
||||||
|
st,bank-name = "GPIOK";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pinctrl_z: pin-controller-z@54004000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "st,stm32mp157-z-pinctrl";
|
||||||
|
ranges = <0 0x54004000 0x400>;
|
||||||
|
pins-are-numbered;
|
||||||
|
interrupt-parent = <&exti>;
|
||||||
|
st,syscfg = <&exti 0x60 0xff>;
|
||||||
|
hwlocks = <&hwspinlock 0>;
|
||||||
|
|
||||||
|
gpioz: gpio@54004000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0 0x400>;
|
||||||
|
clocks = <&rcc GPIOZ>;
|
||||||
|
st,bank-name = "GPIOZ";
|
||||||
|
st,bank-ioport = <11>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
mlahb {
|
mlahb: ahb {
|
||||||
compatible = "simple-bus";
|
compatible = "st,mlahb", "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
ranges;
|
||||||
dma-ranges = <0x00000000 0x38000000 0x10000>,
|
dma-ranges = <0x00000000 0x38000000 0x10000>,
|
||||||
<0x10000000 0x10000000 0x60000>,
|
<0x10000000 0x10000000 0x60000>,
|
||||||
<0x30000000 0x30000000 0x60000>;
|
<0x30000000 0x30000000 0x60000>;
|
45
arch/arm/dts/stm32mp153.dtsi
Normal file
45
arch/arm/dts/stm32mp153.dtsi
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stm32mp151.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
cpus {
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
m_can1: can@4400e000 {
|
||||||
|
compatible = "bosch,m_can";
|
||||||
|
reg = <0x4400e000 0x400>, <0x44011000 0x1400>;
|
||||||
|
reg-names = "m_can", "message_ram";
|
||||||
|
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "int0", "int1";
|
||||||
|
clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
|
||||||
|
clock-names = "hclk", "cclk";
|
||||||
|
bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
m_can2: can@4400f000 {
|
||||||
|
compatible = "bosch,m_can";
|
||||||
|
reg = <0x4400f000 0x400>, <0x44011000 0x2800>;
|
||||||
|
reg-names = "m_can", "message_ram";
|
||||||
|
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "int0", "int1";
|
||||||
|
clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
|
||||||
|
clock-names = "hclk", "cclk";
|
||||||
|
bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
File diff suppressed because it is too large
Load diff
31
arch/arm/dts/stm32mp157.dtsi
Normal file
31
arch/arm/dts/stm32mp157.dtsi
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stm32mp153.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
soc {
|
||||||
|
gpu: gpu@59000000 {
|
||||||
|
compatible = "vivante,gc";
|
||||||
|
reg = <0x59000000 0x800>;
|
||||||
|
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&rcc GPU>, <&rcc GPU_K>;
|
||||||
|
clock-names = "bus" ,"core";
|
||||||
|
resets = <&rcc GPU_R>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
dsi: dsi@5a000000 {
|
||||||
|
compatible = "st,stm32-dsi";
|
||||||
|
reg = <0x5a000000 0x800>;
|
||||||
|
clocks = <&rcc DSI_K>, <&clk_hse>, <&rcc DSI_PX>;
|
||||||
|
clock-names = "pclk", "ref", "px_clk";
|
||||||
|
resets = <&rcc DSI_R>;
|
||||||
|
reset-names = "apb";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
||||||
#include "stm32mp157-u-boot.dtsi"
|
#include "stm32mp15-u-boot.dtsi"
|
||||||
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
@ -145,7 +145,10 @@
|
||||||
|
|
||||||
&sdmmc1_b4_pins_a {
|
&sdmmc1_b4_pins_a {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
pins {
|
pins1 {
|
||||||
|
u-boot,dm-spl;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -196,7 +199,3 @@
|
||||||
u-boot,force-b-session-valid;
|
u-boot,force-b-session-valid;
|
||||||
hnp-srp-disable;
|
hnp-srp-disable;
|
||||||
};
|
};
|
||||||
|
|
||||||
&v3v3 {
|
|
||||||
regulator-always-on;
|
|
||||||
};
|
|
||||||
|
|
|
@ -6,8 +6,9 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c.dtsi"
|
#include "stm32mp157.dtsi"
|
||||||
#include "stm32mp157xac-pinctrl.dtsi"
|
#include "stm32mp15-pinctrl.dtsi"
|
||||||
|
#include "stm32mp15xxac-pinctrl.dtsi"
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
#include <dt-bindings/mfd/st,stpmic1.h>
|
#include <dt-bindings/mfd/st,stpmic1.h>
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
||||||
#include "stm32mp157-u-boot.dtsi"
|
#include "stm32mp15-u-boot.dtsi"
|
||||||
#include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
|
#include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
@ -164,7 +164,10 @@
|
||||||
|
|
||||||
&sdmmc1_b4_pins_a {
|
&sdmmc1_b4_pins_a {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
pins {
|
pins1 {
|
||||||
|
u-boot,dm-spl;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c.dtsi"
|
#include "stm32mp157.dtsi"
|
||||||
#include "stm32mp157xac-pinctrl.dtsi"
|
#include "stm32mp15-pinctrl.dtsi"
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include "stm32mp15xxac-pinctrl.dtsi"
|
||||||
#include <dt-bindings/mfd/st,stpmic1.h>
|
#include "stm32mp15xx-dkx.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
|
model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
|
||||||
|
@ -23,537 +23,4 @@
|
||||||
chosen {
|
chosen {
|
||||||
stdout-path = "serial0:115200n8";
|
stdout-path = "serial0:115200n8";
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@c0000000 {
|
|
||||||
device_type = "memory";
|
|
||||||
reg = <0xc0000000 0x20000000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
reserved-memory {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
ranges;
|
|
||||||
|
|
||||||
mcuram2: mcuram2@10000000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x10000000 0x40000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdev0vring0: vdev0vring0@10040000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x10040000 0x1000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdev0vring1: vdev0vring1@10041000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x10041000 0x1000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdev0buffer: vdev0buffer@10042000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x10042000 0x4000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
mcuram: mcuram@30000000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x30000000 0x40000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
retram: retram@38000000 {
|
|
||||||
compatible = "shared-dma-pool";
|
|
||||||
reg = <0x38000000 0x10000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpu_reserved: gpu@d4000000 {
|
|
||||||
reg = <0xd4000000 0x4000000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
led {
|
|
||||||
compatible = "gpio-leds";
|
|
||||||
blue {
|
|
||||||
label = "heartbeat";
|
|
||||||
gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
|
|
||||||
linux,default-trigger = "heartbeat";
|
|
||||||
default-state = "off";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sound {
|
|
||||||
compatible = "audio-graph-card";
|
|
||||||
label = "STM32MP1-DK";
|
|
||||||
routing =
|
|
||||||
"Playback" , "MCLK",
|
|
||||||
"Capture" , "MCLK",
|
|
||||||
"MICL" , "Mic Bias";
|
|
||||||
dais = <&sai2a_port &sai2b_port &i2s2_port>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&adc {
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&adc12_ain_pins_a>, <&adc12_usb_cc_pins_a>;
|
|
||||||
vdd-supply = <&vdd>;
|
|
||||||
vdda-supply = <&vdd>;
|
|
||||||
vref-supply = <&vrefbuf>;
|
|
||||||
status = "disabled";
|
|
||||||
adc1: adc@0 {
|
|
||||||
/*
|
|
||||||
* Type-C USB_PWR_CC1 & USB_PWR_CC2 on in18 & in19.
|
|
||||||
* Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
|
|
||||||
* 5 * (56 + 47kOhms) * 5pF => 2.5us.
|
|
||||||
* Use arbitrary margin here (e.g. 5us).
|
|
||||||
*/
|
|
||||||
st,min-sample-time-nsecs = <5000>;
|
|
||||||
/* AIN connector, USB Type-C CC1 & CC2 */
|
|
||||||
st,adc-channels = <0 1 6 13 18 19>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
adc2: adc@100 {
|
|
||||||
/* AIN connector, USB Type-C CC1 & CC2 */
|
|
||||||
st,adc-channels = <0 1 2 6 18 19>;
|
|
||||||
st,min-sample-time-nsecs = <5000>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&cec {
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
pinctrl-0 = <&cec_pins_b>;
|
|
||||||
pinctrl-1 = <&cec_pins_sleep_b>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
ðernet0 {
|
|
||||||
status = "okay";
|
|
||||||
pinctrl-0 = <ðernet0_rgmii_pins_a>;
|
|
||||||
pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
phy-mode = "rgmii-id";
|
|
||||||
max-speed = <1000>;
|
|
||||||
phy-handle = <&phy0>;
|
|
||||||
|
|
||||||
mdio0 {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
compatible = "snps,dwmac-mdio";
|
|
||||||
phy0: ethernet-phy@0 {
|
|
||||||
reg = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&gpu {
|
|
||||||
contiguous-area = <&gpu_reserved>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&i2c1 {
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
pinctrl-0 = <&i2c1_pins_a>;
|
|
||||||
pinctrl-1 = <&i2c1_pins_sleep_a>;
|
|
||||||
i2c-scl-rising-time-ns = <100>;
|
|
||||||
i2c-scl-falling-time-ns = <7>;
|
|
||||||
status = "okay";
|
|
||||||
/delete-property/dmas;
|
|
||||||
/delete-property/dma-names;
|
|
||||||
|
|
||||||
hdmi-transmitter@39 {
|
|
||||||
compatible = "sil,sii9022";
|
|
||||||
reg = <0x39>;
|
|
||||||
iovcc-supply = <&v3v3_hdmi>;
|
|
||||||
cvcc12-supply = <&v1v2_hdmi>;
|
|
||||||
reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
|
|
||||||
interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
|
|
||||||
interrupt-parent = <&gpiog>;
|
|
||||||
#sound-dai-cells = <0>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
ports {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
port@0 {
|
|
||||||
reg = <0>;
|
|
||||||
sii9022_in: endpoint {
|
|
||||||
remote-endpoint = <<dc_ep0_out>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
port@3 {
|
|
||||||
reg = <3>;
|
|
||||||
sii9022_tx_endpoint: endpoint {
|
|
||||||
remote-endpoint = <&i2s2_endpoint>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
cs42l51: cs42l51@4a {
|
|
||||||
compatible = "cirrus,cs42l51";
|
|
||||||
reg = <0x4a>;
|
|
||||||
#sound-dai-cells = <0>;
|
|
||||||
VL-supply = <&v3v3>;
|
|
||||||
VD-supply = <&v1v8_audio>;
|
|
||||||
VA-supply = <&v1v8_audio>;
|
|
||||||
VAHP-supply = <&v1v8_audio>;
|
|
||||||
reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
|
|
||||||
clocks = <&sai2a>;
|
|
||||||
clock-names = "MCLK";
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
cs42l51_port: port {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
cs42l51_tx_endpoint: endpoint@0 {
|
|
||||||
reg = <0>;
|
|
||||||
remote-endpoint = <&sai2a_endpoint>;
|
|
||||||
frame-master;
|
|
||||||
bitclock-master;
|
|
||||||
};
|
|
||||||
|
|
||||||
cs42l51_rx_endpoint: endpoint@1 {
|
|
||||||
reg = <1>;
|
|
||||||
remote-endpoint = <&sai2b_endpoint>;
|
|
||||||
frame-master;
|
|
||||||
bitclock-master;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&i2c4 {
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&i2c4_pins_a>;
|
|
||||||
i2c-scl-rising-time-ns = <185>;
|
|
||||||
i2c-scl-falling-time-ns = <20>;
|
|
||||||
status = "okay";
|
|
||||||
/* spare dmas for other usage */
|
|
||||||
/delete-property/dmas;
|
|
||||||
/delete-property/dma-names;
|
|
||||||
|
|
||||||
typec: stusb1600@28 {
|
|
||||||
compatible = "st,stusb1600";
|
|
||||||
reg = <0x28>;
|
|
||||||
interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
|
|
||||||
interrupt-parent = <&gpioi>;
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&stusb1600_pins_a>;
|
|
||||||
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
typec_con: connector {
|
|
||||||
compatible = "usb-c-connector";
|
|
||||||
label = "USB-C";
|
|
||||||
power-role = "sink";
|
|
||||||
power-opmode = "default";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pmic: stpmic@33 {
|
|
||||||
compatible = "st,stpmic1";
|
|
||||||
reg = <0x33>;
|
|
||||||
interrupts-extended = <&gpioa 0 IRQ_TYPE_EDGE_FALLING>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
regulators {
|
|
||||||
compatible = "st,stpmic1-regulators";
|
|
||||||
ldo1-supply = <&v3v3>;
|
|
||||||
ldo3-supply = <&vdd_ddr>;
|
|
||||||
ldo6-supply = <&v3v3>;
|
|
||||||
pwr_sw1-supply = <&bst_out>;
|
|
||||||
pwr_sw2-supply = <&bst_out>;
|
|
||||||
|
|
||||||
vddcore: buck1 {
|
|
||||||
regulator-name = "vddcore";
|
|
||||||
regulator-min-microvolt = <1200000>;
|
|
||||||
regulator-max-microvolt = <1350000>;
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-initial-mode = <0>;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdd_ddr: buck2 {
|
|
||||||
regulator-name = "vdd_ddr";
|
|
||||||
regulator-min-microvolt = <1350000>;
|
|
||||||
regulator-max-microvolt = <1350000>;
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-initial-mode = <0>;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdd: buck3 {
|
|
||||||
regulator-name = "vdd";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
regulator-always-on;
|
|
||||||
st,mask-reset;
|
|
||||||
regulator-initial-mode = <0>;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
};
|
|
||||||
|
|
||||||
v3v3: buck4 {
|
|
||||||
regulator-name = "v3v3";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
regulator-initial-mode = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
v1v8_audio: ldo1 {
|
|
||||||
regulator-name = "v1v8_audio";
|
|
||||||
regulator-min-microvolt = <1800000>;
|
|
||||||
regulator-max-microvolt = <1800000>;
|
|
||||||
regulator-always-on;
|
|
||||||
interrupts = <IT_CURLIM_LDO1 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
v3v3_hdmi: ldo2 {
|
|
||||||
regulator-name = "v3v3_hdmi";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
regulator-always-on;
|
|
||||||
interrupts = <IT_CURLIM_LDO2 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vtt_ddr: ldo3 {
|
|
||||||
regulator-name = "vtt_ddr";
|
|
||||||
regulator-min-microvolt = <500000>;
|
|
||||||
regulator-max-microvolt = <750000>;
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdd_usb: ldo4 {
|
|
||||||
regulator-name = "vdd_usb";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
interrupts = <IT_CURLIM_LDO4 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vdda: ldo5 {
|
|
||||||
regulator-name = "vdda";
|
|
||||||
regulator-min-microvolt = <2900000>;
|
|
||||||
regulator-max-microvolt = <2900000>;
|
|
||||||
interrupts = <IT_CURLIM_LDO5 0>;
|
|
||||||
regulator-boot-on;
|
|
||||||
};
|
|
||||||
|
|
||||||
v1v2_hdmi: ldo6 {
|
|
||||||
regulator-name = "v1v2_hdmi";
|
|
||||||
regulator-min-microvolt = <1200000>;
|
|
||||||
regulator-max-microvolt = <1200000>;
|
|
||||||
regulator-always-on;
|
|
||||||
interrupts = <IT_CURLIM_LDO6 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vref_ddr: vref_ddr {
|
|
||||||
regulator-name = "vref_ddr";
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-over-current-protection;
|
|
||||||
};
|
|
||||||
|
|
||||||
bst_out: boost {
|
|
||||||
regulator-name = "bst_out";
|
|
||||||
interrupts = <IT_OCP_BOOST 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vbus_otg: pwr_sw1 {
|
|
||||||
regulator-name = "vbus_otg";
|
|
||||||
interrupts = <IT_OCP_OTG 0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
vbus_sw: pwr_sw2 {
|
|
||||||
regulator-name = "vbus_sw";
|
|
||||||
interrupts = <IT_OCP_SWOUT 0>;
|
|
||||||
regulator-active-discharge = <1>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
onkey {
|
|
||||||
compatible = "st,stpmic1-onkey";
|
|
||||||
interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 0>;
|
|
||||||
interrupt-names = "onkey-falling", "onkey-rising";
|
|
||||||
power-off-time-sec = <10>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
watchdog {
|
|
||||||
compatible = "st,stpmic1-wdt";
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&i2s2 {
|
|
||||||
clocks = <&rcc SPI2>, <&rcc SPI2_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
|
|
||||||
clock-names = "pclk", "i2sclk", "x8k", "x11k";
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
pinctrl-0 = <&i2s2_pins_a>;
|
|
||||||
pinctrl-1 = <&i2s2_pins_sleep_a>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
i2s2_port: port {
|
|
||||||
i2s2_endpoint: endpoint {
|
|
||||||
remote-endpoint = <&sii9022_tx_endpoint>;
|
|
||||||
format = "i2s";
|
|
||||||
mclk-fs = <256>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&ipcc {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&iwdg2 {
|
|
||||||
timeout-sec = <32>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
<dc {
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
pinctrl-0 = <<dc_pins_a>;
|
|
||||||
pinctrl-1 = <<dc_pins_sleep_a>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
port {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
ltdc_ep0_out: endpoint@0 {
|
|
||||||
reg = <0>;
|
|
||||||
remote-endpoint = <&sii9022_in>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&m4_rproc {
|
|
||||||
memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>,
|
|
||||||
<&vdev0vring1>, <&vdev0buffer>;
|
|
||||||
mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
|
|
||||||
mbox-names = "vq0", "vq1", "shutdown";
|
|
||||||
interrupt-parent = <&exti>;
|
|
||||||
interrupts = <68 1>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&pwr_regulators {
|
|
||||||
vdd-supply = <&vdd>;
|
|
||||||
vdd_3v3_usbfs-supply = <&vdd_usb>;
|
|
||||||
};
|
|
||||||
|
|
||||||
&rng1 {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&rtc {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&sai2 {
|
|
||||||
clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
|
|
||||||
clock-names = "pclk", "x8k", "x11k";
|
|
||||||
pinctrl-names = "default", "sleep";
|
|
||||||
pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
|
|
||||||
pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
sai2a: audio-controller@4400b004 {
|
|
||||||
#clock-cells = <0>;
|
|
||||||
dma-names = "tx";
|
|
||||||
clocks = <&rcc SAI2_K>;
|
|
||||||
clock-names = "sai_ck";
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
sai2a_port: port {
|
|
||||||
sai2a_endpoint: endpoint {
|
|
||||||
remote-endpoint = <&cs42l51_tx_endpoint>;
|
|
||||||
format = "i2s";
|
|
||||||
mclk-fs = <256>;
|
|
||||||
dai-tdm-slot-num = <2>;
|
|
||||||
dai-tdm-slot-width = <32>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sai2b: audio-controller@4400b024 {
|
|
||||||
dma-names = "rx";
|
|
||||||
st,sync = <&sai2a 2>;
|
|
||||||
clocks = <&rcc SAI2_K>, <&sai2a>;
|
|
||||||
clock-names = "sai_ck", "MCLK";
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
sai2b_port: port {
|
|
||||||
sai2b_endpoint: endpoint {
|
|
||||||
remote-endpoint = <&cs42l51_rx_endpoint>;
|
|
||||||
format = "i2s";
|
|
||||||
mclk-fs = <256>;
|
|
||||||
dai-tdm-slot-num = <2>;
|
|
||||||
dai-tdm-slot-width = <32>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&sdmmc1 {
|
|
||||||
pinctrl-names = "default", "opendrain", "sleep";
|
|
||||||
pinctrl-0 = <&sdmmc1_b4_pins_a>;
|
|
||||||
pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
|
|
||||||
pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
|
|
||||||
broken-cd;
|
|
||||||
st,neg-edge;
|
|
||||||
bus-width = <4>;
|
|
||||||
vmmc-supply = <&v3v3>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&uart4 {
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&uart4_pins_a>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&usbh_ehci {
|
|
||||||
phys = <&usbphyc_port0>;
|
|
||||||
phy-names = "usb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&usbotg_hs {
|
|
||||||
dr_mode = "peripheral";
|
|
||||||
phys = <&usbphyc_port1 0>;
|
|
||||||
phy-names = "usb2-phy";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&usbphyc {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&usbphyc_port0 {
|
|
||||||
phy-supply = <&vdd_usb>;
|
|
||||||
};
|
|
||||||
|
|
||||||
&usbphyc_port1 {
|
|
||||||
phy-supply = <&vdd_usb>;
|
|
||||||
};
|
|
||||||
|
|
||||||
&vrefbuf {
|
|
||||||
regulator-min-microvolt = <2500000>;
|
|
||||||
regulator-max-microvolt = <2500000>;
|
|
||||||
vdda-supply = <&vdd>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,9 +4,3 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "stm32mp157a-dk1-u-boot.dtsi"
|
#include "stm32mp157a-dk1-u-boot.dtsi"
|
||||||
|
|
||||||
&i2c1 {
|
|
||||||
hdmi-transmitter@39 {
|
|
||||||
reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
|
@ -6,11 +6,24 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157a-dk1.dts"
|
#include "stm32mp157.dtsi"
|
||||||
|
#include "stm32mp15xc.dtsi"
|
||||||
|
#include "stm32mp15-pinctrl.dtsi"
|
||||||
|
#include "stm32mp15xxac-pinctrl.dtsi"
|
||||||
|
#include "stm32mp15xx-dkx.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157C-DK2 Discovery Board";
|
model = "STMicroelectronics STM32MP157C-DK2 Discovery Board";
|
||||||
compatible = "st,stm32mp157c-dk2", "st,stm32mp157";
|
compatible = "st,stm32mp157c-dk2", "st,stm32mp157";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
ethernet0 = ðernet0;
|
||||||
|
serial0 = &uart4;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&dsi {
|
&dsi {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
||||||
#include "stm32mp157-u-boot.dtsi"
|
#include "stm32mp15-u-boot.dtsi"
|
||||||
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
@ -161,7 +161,10 @@
|
||||||
|
|
||||||
&sdmmc1_b4_pins_a {
|
&sdmmc1_b4_pins_a {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
pins {
|
pins1 {
|
||||||
|
u-boot,dm-spl;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,8 +5,10 @@
|
||||||
*/
|
*/
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c.dtsi"
|
#include "stm32mp157.dtsi"
|
||||||
#include "stm32mp157xaa-pinctrl.dtsi"
|
#include "stm32mp15xc.dtsi"
|
||||||
|
#include "stm32mp15-pinctrl.dtsi"
|
||||||
|
#include "stm32mp15xxaa-pinctrl.dtsi"
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
#include <dt-bindings/mfd/st,stpmic1.h>
|
#include <dt-bindings/mfd/st,stpmic1.h>
|
||||||
|
|
||||||
|
@ -89,6 +91,22 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&adc {
|
||||||
|
/* ANA0, ANA1 are dedicated pins and don't need pinctrl: only in6. */
|
||||||
|
pinctrl-0 = <&adc1_in6_pins_a>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
vdd-supply = <&vdd>;
|
||||||
|
vdda-supply = <&vdda>;
|
||||||
|
vref-supply = <&vdda>;
|
||||||
|
status = "disabled";
|
||||||
|
adc1: adc@0 {
|
||||||
|
st,adc-channels = <0 1 6>;
|
||||||
|
/* 16.5 ck_cycles sampling time */
|
||||||
|
st,min-sample-time-nsecs = <400>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
&dac {
|
&dac {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&dac_ch1_pins_a &dac_ch2_pins_a>;
|
pinctrl-0 = <&dac_ch1_pins_a &dac_ch2_pins_a>;
|
||||||
|
|
|
@ -182,8 +182,6 @@
|
||||||
|
|
||||||
ov5640: camera@3c {
|
ov5640: camera@3c {
|
||||||
compatible = "ovti,ov5640";
|
compatible = "ovti,ov5640";
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&ov5640_pins>;
|
|
||||||
reg = <0x3c>;
|
reg = <0x3c>;
|
||||||
clocks = <&clk_ext_camera>;
|
clocks = <&clk_ext_camera>;
|
||||||
clock-names = "xclk";
|
clock-names = "xclk";
|
||||||
|
@ -224,12 +222,6 @@
|
||||||
pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
|
pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
|
||||||
bias-pull-down;
|
bias-pull-down;
|
||||||
};
|
};
|
||||||
|
|
||||||
ov5640_pins: camera {
|
|
||||||
pins = "agpio2", "agpio3"; /* stmfx pins 18 & 19 */
|
|
||||||
drive-push-pull;
|
|
||||||
output-low;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -291,6 +283,18 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&sdmmc3 {
|
||||||
|
pinctrl-names = "default", "opendrain", "sleep";
|
||||||
|
pinctrl-0 = <&sdmmc3_b4_pins_a>;
|
||||||
|
pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
|
||||||
|
pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
|
||||||
|
broken-cd;
|
||||||
|
st,neg-edge;
|
||||||
|
bus-width = <4>;
|
||||||
|
vmmc-supply = <&v3v3>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
&spi1 {
|
&spi1 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&spi1_pins_a>;
|
pinctrl-0 = <&spi1_pins_a>;
|
||||||
|
@ -304,7 +308,8 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
pwm {
|
pwm {
|
||||||
pinctrl-0 = <&pwm2_pins_a>;
|
pinctrl-0 = <&pwm2_pins_a>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&pwm2_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
timer@1 {
|
timer@1 {
|
||||||
|
@ -318,7 +323,8 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
pwm {
|
pwm {
|
||||||
pinctrl-0 = <&pwm8_pins_a>;
|
pinctrl-0 = <&pwm8_pins_a>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&pwm8_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
timer@7 {
|
timer@7 {
|
||||||
|
@ -332,7 +338,8 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
pwm {
|
pwm {
|
||||||
pinctrl-0 = <&pwm12_pins_a>;
|
pinctrl-0 = <&pwm12_pins_a>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&pwm12_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
timer@11 {
|
timer@11 {
|
||||||
|
@ -348,6 +355,7 @@
|
||||||
&usbotg_hs {
|
&usbotg_hs {
|
||||||
dr_mode = "peripheral";
|
dr_mode = "peripheral";
|
||||||
phys = <&usbphyc_port1 0>;
|
phys = <&usbphyc_port1 0>;
|
||||||
|
phy-names = "usb2-phy";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
|
||||||
/*
|
|
||||||
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
|
||||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "stm32mp157-pinctrl.dtsi"
|
|
||||||
/ {
|
|
||||||
soc {
|
|
||||||
pinctrl: pin-controller@50002000 {
|
|
||||||
st,package = <STM32MP_PKG_AA>;
|
|
||||||
|
|
||||||
gpioa: gpio@50002000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 0 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiob: gpio@50003000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 16 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioc: gpio@50004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 32 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiod: gpio@50005000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 48 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioe: gpio@50006000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 64 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiof: gpio@50007000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 80 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiog: gpio@50008000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 96 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioh: gpio@50009000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 112 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioi: gpio@5000a000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 128 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioj: gpio@5000b000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 144 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiok: gpio@5000c000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <8>;
|
|
||||||
gpio-ranges = <&pinctrl 0 160 8>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pinctrl_z: pin-controller-z@54004000 {
|
|
||||||
st,package = <STM32MP_PKG_AA>;
|
|
||||||
|
|
||||||
gpioz: gpio@54004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <8>;
|
|
||||||
gpio-ranges = <&pinctrl_z 0 400 8>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -1,62 +0,0 @@
|
||||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
|
||||||
/*
|
|
||||||
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
|
||||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "stm32mp157-pinctrl.dtsi"
|
|
||||||
/ {
|
|
||||||
soc {
|
|
||||||
pinctrl: pin-controller@50002000 {
|
|
||||||
st,package = <STM32MP_PKG_AB>;
|
|
||||||
|
|
||||||
gpioa: gpio@50002000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 0 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiob: gpio@50003000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 16 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioc: gpio@50004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 32 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiod: gpio@50005000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 48 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioe: gpio@50006000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 64 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiof: gpio@50007000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <6>;
|
|
||||||
gpio-ranges = <&pinctrl 6 86 6>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiog: gpio@50008000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <10>;
|
|
||||||
gpio-ranges = <&pinctrl 6 102 10>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioh: gpio@50009000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <2>;
|
|
||||||
gpio-ranges = <&pinctrl 0 112 2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -1,78 +0,0 @@
|
||||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
|
||||||
/*
|
|
||||||
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
|
||||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "stm32mp157-pinctrl.dtsi"
|
|
||||||
/ {
|
|
||||||
soc {
|
|
||||||
pinctrl: pin-controller@50002000 {
|
|
||||||
st,package = <STM32MP_PKG_AC>;
|
|
||||||
|
|
||||||
gpioa: gpio@50002000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 0 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiob: gpio@50003000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 16 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioc: gpio@50004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 32 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiod: gpio@50005000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 48 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioe: gpio@50006000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 64 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiof: gpio@50007000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 80 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiog: gpio@50008000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 96 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioh: gpio@50009000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 112 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioi: gpio@5000a000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <12>;
|
|
||||||
gpio-ranges = <&pinctrl 0 128 12>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pinctrl_z: pin-controller-z@54004000 {
|
|
||||||
st,package = <STM32MP_PKG_AC>;
|
|
||||||
|
|
||||||
gpioz: gpio@54004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <8>;
|
|
||||||
gpio-ranges = <&pinctrl_z 0 400 8>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -1,62 +0,0 @@
|
||||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
|
||||||
/*
|
|
||||||
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
|
||||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "stm32mp157-pinctrl.dtsi"
|
|
||||||
/ {
|
|
||||||
soc {
|
|
||||||
pinctrl: pin-controller@50002000 {
|
|
||||||
st,package = <STM32MP_PKG_AD>;
|
|
||||||
|
|
||||||
gpioa: gpio@50002000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 0 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiob: gpio@50003000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 16 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioc: gpio@50004000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 32 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiod: gpio@50005000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 48 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioe: gpio@50006000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <16>;
|
|
||||||
gpio-ranges = <&pinctrl 0 64 16>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiof: gpio@50007000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <6>;
|
|
||||||
gpio-ranges = <&pinctrl 6 86 6>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiog: gpio@50008000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <10>;
|
|
||||||
gpio-ranges = <&pinctrl 6 102 10>;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioh: gpio@50009000 {
|
|
||||||
status = "okay";
|
|
||||||
ngpios = <2>;
|
|
||||||
gpio-ranges = <&pinctrl 0 112 2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
18
arch/arm/dts/stm32mp15xc.dtsi
Normal file
18
arch/arm/dts/stm32mp15xc.dtsi
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/ {
|
||||||
|
soc {
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
#include <dt-bindings/clock/stm32mp1-clksrc.h>
|
||||||
#include "stm32mp157-u-boot.dtsi"
|
#include "stm32mp15-u-boot.dtsi"
|
||||||
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
@ -196,7 +196,10 @@
|
||||||
|
|
||||||
&sdmmc1_b4_pins_a {
|
&sdmmc1_b4_pins_a {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
pins {
|
pins1 {
|
||||||
|
u-boot,dm-spl;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
u-boot,dm-spl;
|
u-boot,dm-spl;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
*/
|
*/
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c.dtsi"
|
#include "stm32mp157.dtsi"
|
||||||
#include "stm32mp157xaa-pinctrl.dtsi"
|
#include "stm32mp15xc.dtsi"
|
||||||
|
#include "stm32mp15-pinctrl.dtsi"
|
||||||
|
#include "stm32mp15xxaa-pinctrl.dtsi"
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
#include <dt-bindings/mfd/st,stpmic1.h>
|
#include <dt-bindings/mfd/st,stpmic1.h>
|
||||||
|
|
||||||
|
|
639
arch/arm/dts/stm32mp15xx-dkx.dtsi
Normal file
639
arch/arm/dts/stm32mp15xx-dkx.dtsi
Normal file
|
@ -0,0 +1,639 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/mfd/st,stpmic1.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
memory@c0000000 {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0xc0000000 0x20000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reserved-memory {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
mcuram2: mcuram2@10000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x10000000 0x40000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdev0vring0: vdev0vring0@10040000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x10040000 0x1000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdev0vring1: vdev0vring1@10041000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x10041000 0x1000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdev0buffer: vdev0buffer@10042000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x10042000 0x4000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
mcuram: mcuram@30000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x30000000 0x40000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
retram: retram@38000000 {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reg = <0x38000000 0x10000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpu_reserved: gpu@d4000000 {
|
||||||
|
reg = <0xd4000000 0x4000000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
led {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
blue {
|
||||||
|
label = "heartbeat";
|
||||||
|
gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
|
||||||
|
linux,default-trigger = "heartbeat";
|
||||||
|
default-state = "off";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sound {
|
||||||
|
compatible = "audio-graph-card";
|
||||||
|
label = "STM32MP1-DK";
|
||||||
|
routing =
|
||||||
|
"Playback" , "MCLK",
|
||||||
|
"Capture" , "MCLK",
|
||||||
|
"MICL" , "Mic Bias";
|
||||||
|
dais = <&sai2a_port &sai2b_port &i2s2_port>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&adc {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&adc12_ain_pins_a>, <&adc12_usb_cc_pins_a>;
|
||||||
|
vdd-supply = <&vdd>;
|
||||||
|
vdda-supply = <&vdd>;
|
||||||
|
vref-supply = <&vrefbuf>;
|
||||||
|
status = "disabled";
|
||||||
|
adc1: adc@0 {
|
||||||
|
/*
|
||||||
|
* Type-C USB_PWR_CC1 & USB_PWR_CC2 on in18 & in19.
|
||||||
|
* Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
|
||||||
|
* 5 * (56 + 47kOhms) * 5pF => 2.5us.
|
||||||
|
* Use arbitrary margin here (e.g. 5us).
|
||||||
|
*/
|
||||||
|
st,min-sample-time-nsecs = <5000>;
|
||||||
|
/* AIN connector, USB Type-C CC1 & CC2 */
|
||||||
|
st,adc-channels = <0 1 6 13 18 19>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
adc2: adc@100 {
|
||||||
|
/* AIN connector, USB Type-C CC1 & CC2 */
|
||||||
|
st,adc-channels = <0 1 2 6 18 19>;
|
||||||
|
st,min-sample-time-nsecs = <5000>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&cec {
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <&cec_pins_b>;
|
||||||
|
pinctrl-1 = <&cec_pins_sleep_b>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
ðernet0 {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-0 = <ðernet0_rgmii_pins_a>;
|
||||||
|
pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
phy-mode = "rgmii-id";
|
||||||
|
max-speed = <1000>;
|
||||||
|
phy-handle = <&phy0>;
|
||||||
|
|
||||||
|
mdio0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "snps,dwmac-mdio";
|
||||||
|
phy0: ethernet-phy@0 {
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&gpu {
|
||||||
|
contiguous-area = <&gpu_reserved>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c1 {
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <&i2c1_pins_a>;
|
||||||
|
pinctrl-1 = <&i2c1_pins_sleep_a>;
|
||||||
|
i2c-scl-rising-time-ns = <100>;
|
||||||
|
i2c-scl-falling-time-ns = <7>;
|
||||||
|
status = "okay";
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
|
||||||
|
hdmi-transmitter@39 {
|
||||||
|
compatible = "sil,sii9022";
|
||||||
|
reg = <0x39>;
|
||||||
|
iovcc-supply = <&v3v3_hdmi>;
|
||||||
|
cvcc12-supply = <&v1v2_hdmi>;
|
||||||
|
reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
|
||||||
|
interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
interrupt-parent = <&gpiog>;
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
sii9022_in: endpoint {
|
||||||
|
remote-endpoint = <<dc_ep0_out>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
sii9022_tx_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&i2s2_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
cs42l51: cs42l51@4a {
|
||||||
|
compatible = "cirrus,cs42l51";
|
||||||
|
reg = <0x4a>;
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
VL-supply = <&v3v3>;
|
||||||
|
VD-supply = <&v1v8_audio>;
|
||||||
|
VA-supply = <&v1v8_audio>;
|
||||||
|
VAHP-supply = <&v1v8_audio>;
|
||||||
|
reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
|
||||||
|
clocks = <&sai2a>;
|
||||||
|
clock-names = "MCLK";
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
cs42l51_port: port {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
cs42l51_tx_endpoint: endpoint@0 {
|
||||||
|
reg = <0>;
|
||||||
|
remote-endpoint = <&sai2a_endpoint>;
|
||||||
|
frame-master;
|
||||||
|
bitclock-master;
|
||||||
|
};
|
||||||
|
|
||||||
|
cs42l51_rx_endpoint: endpoint@1 {
|
||||||
|
reg = <1>;
|
||||||
|
remote-endpoint = <&sai2b_endpoint>;
|
||||||
|
frame-master;
|
||||||
|
bitclock-master;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c4 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&i2c4_pins_a>;
|
||||||
|
i2c-scl-rising-time-ns = <185>;
|
||||||
|
i2c-scl-falling-time-ns = <20>;
|
||||||
|
status = "okay";
|
||||||
|
/* spare dmas for other usage */
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
|
||||||
|
typec: stusb1600@28 {
|
||||||
|
compatible = "st,stusb1600";
|
||||||
|
reg = <0x28>;
|
||||||
|
interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
interrupt-parent = <&gpioi>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&stusb1600_pins_a>;
|
||||||
|
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
typec_con: connector {
|
||||||
|
compatible = "usb-c-connector";
|
||||||
|
label = "USB-C";
|
||||||
|
power-role = "sink";
|
||||||
|
power-opmode = "default";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pmic: stpmic@33 {
|
||||||
|
compatible = "st,stpmic1";
|
||||||
|
reg = <0x33>;
|
||||||
|
interrupts-extended = <&gpioa 0 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
compatible = "st,stpmic1-regulators";
|
||||||
|
ldo1-supply = <&v3v3>;
|
||||||
|
ldo3-supply = <&vdd_ddr>;
|
||||||
|
ldo6-supply = <&v3v3>;
|
||||||
|
pwr_sw1-supply = <&bst_out>;
|
||||||
|
pwr_sw2-supply = <&bst_out>;
|
||||||
|
|
||||||
|
vddcore: buck1 {
|
||||||
|
regulator-name = "vddcore";
|
||||||
|
regulator-min-microvolt = <1200000>;
|
||||||
|
regulator-max-microvolt = <1350000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-initial-mode = <0>;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdd_ddr: buck2 {
|
||||||
|
regulator-name = "vdd_ddr";
|
||||||
|
regulator-min-microvolt = <1350000>;
|
||||||
|
regulator-max-microvolt = <1350000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-initial-mode = <0>;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdd: buck3 {
|
||||||
|
regulator-name = "vdd";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-always-on;
|
||||||
|
st,mask-reset;
|
||||||
|
regulator-initial-mode = <0>;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
v3v3: buck4 {
|
||||||
|
regulator-name = "v3v3";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
regulator-initial-mode = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
v1v8_audio: ldo1 {
|
||||||
|
regulator-name = "v1v8_audio";
|
||||||
|
regulator-min-microvolt = <1800000>;
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-always-on;
|
||||||
|
interrupts = <IT_CURLIM_LDO1 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
v3v3_hdmi: ldo2 {
|
||||||
|
regulator-name = "v3v3_hdmi";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-always-on;
|
||||||
|
interrupts = <IT_CURLIM_LDO2 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vtt_ddr: ldo3 {
|
||||||
|
regulator-name = "vtt_ddr";
|
||||||
|
regulator-min-microvolt = <500000>;
|
||||||
|
regulator-max-microvolt = <750000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdd_usb: ldo4 {
|
||||||
|
regulator-name = "vdd_usb";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
interrupts = <IT_CURLIM_LDO4 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdda: ldo5 {
|
||||||
|
regulator-name = "vdda";
|
||||||
|
regulator-min-microvolt = <2900000>;
|
||||||
|
regulator-max-microvolt = <2900000>;
|
||||||
|
interrupts = <IT_CURLIM_LDO5 0>;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
v1v2_hdmi: ldo6 {
|
||||||
|
regulator-name = "v1v2_hdmi";
|
||||||
|
regulator-min-microvolt = <1200000>;
|
||||||
|
regulator-max-microvolt = <1200000>;
|
||||||
|
regulator-always-on;
|
||||||
|
interrupts = <IT_CURLIM_LDO6 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vref_ddr: vref_ddr {
|
||||||
|
regulator-name = "vref_ddr";
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-over-current-protection;
|
||||||
|
};
|
||||||
|
|
||||||
|
bst_out: boost {
|
||||||
|
regulator-name = "bst_out";
|
||||||
|
interrupts = <IT_OCP_BOOST 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vbus_otg: pwr_sw1 {
|
||||||
|
regulator-name = "vbus_otg";
|
||||||
|
interrupts = <IT_OCP_OTG 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vbus_sw: pwr_sw2 {
|
||||||
|
regulator-name = "vbus_sw";
|
||||||
|
interrupts = <IT_OCP_SWOUT 0>;
|
||||||
|
regulator-active-discharge = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
onkey {
|
||||||
|
compatible = "st,stpmic1-onkey";
|
||||||
|
interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 0>;
|
||||||
|
interrupt-names = "onkey-falling", "onkey-rising";
|
||||||
|
power-off-time-sec = <10>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
watchdog {
|
||||||
|
compatible = "st,stpmic1-wdt";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2s2 {
|
||||||
|
clocks = <&rcc SPI2>, <&rcc SPI2_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
|
||||||
|
clock-names = "pclk", "i2sclk", "x8k", "x11k";
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <&i2s2_pins_a>;
|
||||||
|
pinctrl-1 = <&i2s2_pins_sleep_a>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
i2s2_port: port {
|
||||||
|
i2s2_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&sii9022_tx_endpoint>;
|
||||||
|
format = "i2s";
|
||||||
|
mclk-fs = <256>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ipcc {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&iwdg2 {
|
||||||
|
timeout-sec = <32>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
<dc {
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <<dc_pins_a>;
|
||||||
|
pinctrl-1 = <<dc_pins_sleep_a>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
port {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
ltdc_ep0_out: endpoint@0 {
|
||||||
|
reg = <0>;
|
||||||
|
remote-endpoint = <&sii9022_in>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&m4_rproc {
|
||||||
|
memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>,
|
||||||
|
<&vdev0vring1>, <&vdev0buffer>;
|
||||||
|
mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
|
||||||
|
mbox-names = "vq0", "vq1", "shutdown";
|
||||||
|
interrupt-parent = <&exti>;
|
||||||
|
interrupts = <68 1>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwr_regulators {
|
||||||
|
vdd-supply = <&vdd>;
|
||||||
|
vdd_3v3_usbfs-supply = <&vdd_usb>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&rng1 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&rtc {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&sai2 {
|
||||||
|
clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
|
||||||
|
clock-names = "pclk", "x8k", "x11k";
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
|
||||||
|
pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
sai2a: audio-controller@4400b004 {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
dma-names = "tx";
|
||||||
|
clocks = <&rcc SAI2_K>;
|
||||||
|
clock-names = "sai_ck";
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
sai2a_port: port {
|
||||||
|
sai2a_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cs42l51_tx_endpoint>;
|
||||||
|
format = "i2s";
|
||||||
|
mclk-fs = <256>;
|
||||||
|
dai-tdm-slot-num = <2>;
|
||||||
|
dai-tdm-slot-width = <32>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sai2b: audio-controller@4400b024 {
|
||||||
|
dma-names = "rx";
|
||||||
|
st,sync = <&sai2a 2>;
|
||||||
|
clocks = <&rcc SAI2_K>, <&sai2a>;
|
||||||
|
clock-names = "sai_ck", "MCLK";
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
sai2b_port: port {
|
||||||
|
sai2b_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cs42l51_rx_endpoint>;
|
||||||
|
format = "i2s";
|
||||||
|
mclk-fs = <256>;
|
||||||
|
dai-tdm-slot-num = <2>;
|
||||||
|
dai-tdm-slot-width = <32>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&sdmmc1 {
|
||||||
|
pinctrl-names = "default", "opendrain", "sleep";
|
||||||
|
pinctrl-0 = <&sdmmc1_b4_pins_a>;
|
||||||
|
pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
|
||||||
|
pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
|
||||||
|
broken-cd;
|
||||||
|
st,neg-edge;
|
||||||
|
bus-width = <4>;
|
||||||
|
vmmc-supply = <&v3v3>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&sdmmc3 {
|
||||||
|
pinctrl-names = "default", "opendrain", "sleep";
|
||||||
|
pinctrl-0 = <&sdmmc3_b4_pins_a>;
|
||||||
|
pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
|
||||||
|
pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
|
||||||
|
broken-cd;
|
||||||
|
st,neg-edge;
|
||||||
|
bus-width = <4>;
|
||||||
|
vmmc-supply = <&v3v3>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers1 {
|
||||||
|
/* spare dmas for other usage */
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
pwm {
|
||||||
|
pinctrl-0 = <&pwm1_pins_a>;
|
||||||
|
pinctrl-1 = <&pwm1_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
timer@0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers3 {
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
pwm {
|
||||||
|
pinctrl-0 = <&pwm3_pins_a>;
|
||||||
|
pinctrl-1 = <&pwm3_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
timer@2 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers4 {
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
pwm {
|
||||||
|
pinctrl-0 = <&pwm4_pins_a &pwm4_pins_b>;
|
||||||
|
pinctrl-1 = <&pwm4_sleep_pins_a &pwm4_sleep_pins_b>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
timer@3 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers5 {
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
pwm {
|
||||||
|
pinctrl-0 = <&pwm5_pins_a>;
|
||||||
|
pinctrl-1 = <&pwm5_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
timer@4 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers6 {
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
timer@5 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&timers12 {
|
||||||
|
/delete-property/dmas;
|
||||||
|
/delete-property/dma-names;
|
||||||
|
status = "disabled";
|
||||||
|
pwm {
|
||||||
|
pinctrl-0 = <&pwm12_pins_a>;
|
||||||
|
pinctrl-1 = <&pwm12_sleep_pins_a>;
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
timer@11 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart4 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart4_pins_a>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbh_ehci {
|
||||||
|
phys = <&usbphyc_port0>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbotg_hs {
|
||||||
|
dr_mode = "peripheral";
|
||||||
|
phys = <&usbphyc_port1 0>;
|
||||||
|
phy-names = "usb2-phy";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbphyc {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbphyc_port0 {
|
||||||
|
phy-supply = <&vdd_usb>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbphyc_port1 {
|
||||||
|
phy-supply = <&vdd_usb>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&vrefbuf {
|
||||||
|
regulator-min-microvolt = <2500000>;
|
||||||
|
regulator-max-microvolt = <2500000>;
|
||||||
|
vdda-supply = <&vdd>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
85
arch/arm/dts/stm32mp15xxaa-pinctrl.dtsi
Normal file
85
arch/arm/dts/stm32mp15xxaa-pinctrl.dtsi
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
st,package = <STM32MP_PKG_AA>;
|
||||||
|
|
||||||
|
gpioa: gpio@50002000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@50003000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@50004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@50005000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@50006000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@50007000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 80 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@50008000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 96 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@50009000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 112 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@5000a000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 128 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioj: gpio@5000b000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 144 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiok: gpio@5000c000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <8>;
|
||||||
|
gpio-ranges = <&pinctrl 0 160 8>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&pinctrl_z {
|
||||||
|
st,package = <STM32MP_PKG_AA>;
|
||||||
|
|
||||||
|
gpioz: gpio@54004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <8>;
|
||||||
|
gpio-ranges = <&pinctrl_z 0 400 8>;
|
||||||
|
};
|
||||||
|
};
|
57
arch/arm/dts/stm32mp15xxab-pinctrl.dtsi
Normal file
57
arch/arm/dts/stm32mp15xxab-pinctrl.dtsi
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
st,package = <STM32MP_PKG_AB>;
|
||||||
|
|
||||||
|
gpioa: gpio@50002000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@50003000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@50004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@50005000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@50006000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@50007000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <6>;
|
||||||
|
gpio-ranges = <&pinctrl 6 86 6>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@50008000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <10>;
|
||||||
|
gpio-ranges = <&pinctrl 6 102 10>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@50009000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <2>;
|
||||||
|
gpio-ranges = <&pinctrl 0 112 2>;
|
||||||
|
};
|
||||||
|
};
|
73
arch/arm/dts/stm32mp15xxac-pinctrl.dtsi
Normal file
73
arch/arm/dts/stm32mp15xxac-pinctrl.dtsi
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
st,package = <STM32MP_PKG_AC>;
|
||||||
|
|
||||||
|
gpioa: gpio@50002000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@50003000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@50004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@50005000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@50006000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@50007000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 80 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@50008000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 96 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@50009000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 112 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@5000a000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <12>;
|
||||||
|
gpio-ranges = <&pinctrl 0 128 12>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&pinctrl_z {
|
||||||
|
st,package = <STM32MP_PKG_AC>;
|
||||||
|
|
||||||
|
gpioz: gpio@54004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <8>;
|
||||||
|
gpio-ranges = <&pinctrl_z 0 400 8>;
|
||||||
|
};
|
||||||
|
};
|
57
arch/arm/dts/stm32mp15xxad-pinctrl.dtsi
Normal file
57
arch/arm/dts/stm32mp15xxad-pinctrl.dtsi
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
st,package = <STM32MP_PKG_AD>;
|
||||||
|
|
||||||
|
gpioa: gpio@50002000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@50003000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@50004000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@50005000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@50006000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <16>;
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@50007000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <6>;
|
||||||
|
gpio-ranges = <&pinctrl 6 86 6>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@50008000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <10>;
|
||||||
|
gpio-ranges = <&pinctrl 6 102 10>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@50009000 {
|
||||||
|
status = "okay";
|
||||||
|
ngpios = <2>;
|
||||||
|
gpio-ranges = <&pinctrl 0 112 2>;
|
||||||
|
};
|
||||||
|
};
|
|
@ -12,8 +12,6 @@
|
||||||
#include <linux/iopoll.h>
|
#include <linux/iopoll.h>
|
||||||
|
|
||||||
#define BSEC_OTP_MAX_VALUE 95
|
#define BSEC_OTP_MAX_VALUE 95
|
||||||
|
|
||||||
#ifndef CONFIG_STM32MP1_TRUSTED
|
|
||||||
#define BSEC_TIMEOUT_US 10000
|
#define BSEC_TIMEOUT_US 10000
|
||||||
|
|
||||||
/* BSEC REGISTER OFFSET (base relative) */
|
/* BSEC REGISTER OFFSET (base relative) */
|
||||||
|
@ -24,9 +22,10 @@
|
||||||
#define BSEC_OTP_LOCK_OFF 0x010
|
#define BSEC_OTP_LOCK_OFF 0x010
|
||||||
#define BSEC_DISTURBED_OFF 0x01C
|
#define BSEC_DISTURBED_OFF 0x01C
|
||||||
#define BSEC_ERROR_OFF 0x034
|
#define BSEC_ERROR_OFF 0x034
|
||||||
#define BSEC_SPLOCK_OFF 0x064 /* Program safmem sticky lock */
|
#define BSEC_WRLOCK_OFF 0x04C /* OTP write permananet lock */
|
||||||
#define BSEC_SWLOCK_OFF 0x07C /* write in OTP sticky lock */
|
#define BSEC_SPLOCK_OFF 0x064 /* OTP write sticky lock */
|
||||||
#define BSEC_SRLOCK_OFF 0x094 /* shadowing sticky lock */
|
#define BSEC_SWLOCK_OFF 0x07C /* shadow write sticky lock */
|
||||||
|
#define BSEC_SRLOCK_OFF 0x094 /* shadow read sticky lock */
|
||||||
#define BSEC_OTP_DATA_OFF 0x200
|
#define BSEC_OTP_DATA_OFF 0x200
|
||||||
|
|
||||||
/* BSEC_CONFIGURATION Register MASK */
|
/* BSEC_CONFIGURATION Register MASK */
|
||||||
|
@ -52,6 +51,24 @@
|
||||||
*/
|
*/
|
||||||
#define BSEC_LOCK_PROGRAM 0x04
|
#define BSEC_LOCK_PROGRAM 0x04
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bsec_lock() - manage lock for each type SR/SP/SW
|
||||||
|
* @address: address of bsec IP register
|
||||||
|
* @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
|
||||||
|
* Return: true if locked else false
|
||||||
|
*/
|
||||||
|
static bool bsec_read_lock(u32 address, u32 otp)
|
||||||
|
{
|
||||||
|
u32 bit;
|
||||||
|
u32 bank;
|
||||||
|
|
||||||
|
bit = 1 << (otp & OTP_LOCK_MASK);
|
||||||
|
bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
|
||||||
|
|
||||||
|
return !!(readl(address + bank) & bit);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_STM32MP1_TRUSTED
|
||||||
/**
|
/**
|
||||||
* bsec_check_error() - Check status of one otp
|
* bsec_check_error() - Check status of one otp
|
||||||
* @base: base address of bsec IP
|
* @base: base address of bsec IP
|
||||||
|
@ -74,23 +91,6 @@ static u32 bsec_check_error(u32 base, u32 otp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* bsec_lock() - manage lock for each type SR/SP/SW
|
|
||||||
* @address: address of bsec IP register
|
|
||||||
* @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
|
|
||||||
* Return: true if locked else false
|
|
||||||
*/
|
|
||||||
static bool bsec_read_lock(u32 address, u32 otp)
|
|
||||||
{
|
|
||||||
u32 bit;
|
|
||||||
u32 bank;
|
|
||||||
|
|
||||||
bit = 1 << (otp & OTP_LOCK_MASK);
|
|
||||||
bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
|
|
||||||
|
|
||||||
return !!(readl(address + bank) & bit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bsec_read_SR_lock() - read SR lock (Shadowing)
|
* bsec_read_SR_lock() - read SR lock (Shadowing)
|
||||||
* @base: base address of bsec IP
|
* @base: base address of bsec IP
|
||||||
|
@ -324,6 +324,16 @@ static int stm32mp_bsec_read_shadow(struct udevice *dev, u32 *val, u32 otp)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int stm32mp_bsec_read_lock(struct udevice *dev, u32 *val, u32 otp)
|
||||||
|
{
|
||||||
|
struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
|
/* return OTP permanent write lock status */
|
||||||
|
*val = bsec_read_lock(plat->base + BSEC_WRLOCK_OFF, otp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
|
static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_STM32MP1_TRUSTED
|
#ifdef CONFIG_STM32MP1_TRUSTED
|
||||||
|
@ -350,22 +360,41 @@ static int stm32mp_bsec_write_shadow(struct udevice *dev, u32 val, u32 otp)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int stm32mp_bsec_write_lock(struct udevice *dev, u32 val, u32 otp)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_STM32MP1_TRUSTED
|
||||||
|
if (val == 1)
|
||||||
|
return stm32_smc_exec(STM32_SMC_BSEC,
|
||||||
|
STM32_SMC_WRLOCK_OTP,
|
||||||
|
otp, 0);
|
||||||
|
if (val == 0)
|
||||||
|
return 0; /* nothing to do */
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
#else
|
||||||
|
return -ENOTSUPP;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int stm32mp_bsec_read(struct udevice *dev, int offset,
|
static int stm32mp_bsec_read(struct udevice *dev, int offset,
|
||||||
void *buf, int size)
|
void *buf, int size)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
bool shadow = true;
|
bool shadow = true, lock = false;
|
||||||
int nb_otp = size / sizeof(u32);
|
int nb_otp = size / sizeof(u32);
|
||||||
int otp;
|
int otp;
|
||||||
unsigned int offs = offset;
|
unsigned int offs = offset;
|
||||||
|
|
||||||
if (offs >= STM32_BSEC_OTP_OFFSET) {
|
if (offs >= STM32_BSEC_LOCK_OFFSET) {
|
||||||
|
offs -= STM32_BSEC_LOCK_OFFSET;
|
||||||
|
lock = true;
|
||||||
|
} else if (offs >= STM32_BSEC_OTP_OFFSET) {
|
||||||
offs -= STM32_BSEC_OTP_OFFSET;
|
offs -= STM32_BSEC_OTP_OFFSET;
|
||||||
shadow = false;
|
shadow = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offs < 0 || (offs % 4) || (size % 4))
|
if ((offs % 4) || (size % 4))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
otp = offs / sizeof(u32);
|
otp = offs / sizeof(u32);
|
||||||
|
@ -373,7 +402,9 @@ static int stm32mp_bsec_read(struct udevice *dev, int offset,
|
||||||
for (i = otp; i < (otp + nb_otp) && i <= BSEC_OTP_MAX_VALUE; i++) {
|
for (i = otp; i < (otp + nb_otp) && i <= BSEC_OTP_MAX_VALUE; i++) {
|
||||||
u32 *addr = &((u32 *)buf)[i - otp];
|
u32 *addr = &((u32 *)buf)[i - otp];
|
||||||
|
|
||||||
if (shadow)
|
if (lock)
|
||||||
|
ret = stm32mp_bsec_read_lock(dev, addr, i);
|
||||||
|
else if (shadow)
|
||||||
ret = stm32mp_bsec_read_shadow(dev, addr, i);
|
ret = stm32mp_bsec_read_shadow(dev, addr, i);
|
||||||
else
|
else
|
||||||
ret = stm32mp_bsec_read_otp(dev, addr, i);
|
ret = stm32mp_bsec_read_otp(dev, addr, i);
|
||||||
|
@ -392,17 +423,20 @@ static int stm32mp_bsec_write(struct udevice *dev, int offset,
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int i;
|
int i;
|
||||||
bool shadow = true;
|
bool shadow = true, lock = false;
|
||||||
int nb_otp = size / sizeof(u32);
|
int nb_otp = size / sizeof(u32);
|
||||||
int otp;
|
int otp;
|
||||||
unsigned int offs = offset;
|
unsigned int offs = offset;
|
||||||
|
|
||||||
if (offs >= STM32_BSEC_OTP_OFFSET) {
|
if (offs >= STM32_BSEC_LOCK_OFFSET) {
|
||||||
|
offs -= STM32_BSEC_LOCK_OFFSET;
|
||||||
|
lock = true;
|
||||||
|
} else if (offs >= STM32_BSEC_OTP_OFFSET) {
|
||||||
offs -= STM32_BSEC_OTP_OFFSET;
|
offs -= STM32_BSEC_OTP_OFFSET;
|
||||||
shadow = false;
|
shadow = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offs < 0 || (offs % 4) || (size % 4))
|
if ((offs % 4) || (size % 4))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
otp = offs / sizeof(u32);
|
otp = offs / sizeof(u32);
|
||||||
|
@ -410,7 +444,9 @@ static int stm32mp_bsec_write(struct udevice *dev, int offset,
|
||||||
for (i = otp; i < otp + nb_otp && i <= BSEC_OTP_MAX_VALUE; i++) {
|
for (i = otp; i < otp + nb_otp && i <= BSEC_OTP_MAX_VALUE; i++) {
|
||||||
u32 *val = &((u32 *)buf)[i - otp];
|
u32 *val = &((u32 *)buf)[i - otp];
|
||||||
|
|
||||||
if (shadow)
|
if (lock)
|
||||||
|
ret = stm32mp_bsec_write_lock(dev, *val, i);
|
||||||
|
else if (shadow)
|
||||||
ret = stm32mp_bsec_write_shadow(dev, *val, i);
|
ret = stm32mp_bsec_write_shadow(dev, *val, i);
|
||||||
else
|
else
|
||||||
ret = stm32mp_bsec_write_otp(dev, *val, i);
|
ret = stm32mp_bsec_write_otp(dev, *val, i);
|
||||||
|
|
|
@ -61,12 +61,6 @@
|
||||||
#define BOOTROM_INSTANCE_MASK GENMASK(31, 16)
|
#define BOOTROM_INSTANCE_MASK GENMASK(31, 16)
|
||||||
#define BOOTROM_INSTANCE_SHIFT 16
|
#define BOOTROM_INSTANCE_SHIFT 16
|
||||||
|
|
||||||
/* BSEC OTP index */
|
|
||||||
#define BSEC_OTP_RPN 1
|
|
||||||
#define BSEC_OTP_SERIAL 13
|
|
||||||
#define BSEC_OTP_PKG 16
|
|
||||||
#define BSEC_OTP_MAC 57
|
|
||||||
|
|
||||||
/* Device Part Number (RPN) = OTP_DATA1 lower 8 bits */
|
/* Device Part Number (RPN) = OTP_DATA1 lower 8 bits */
|
||||||
#define RPN_SHIFT 0
|
#define RPN_SHIFT 0
|
||||||
#define RPN_MASK GENMASK(7, 0)
|
#define RPN_MASK GENMASK(7, 0)
|
||||||
|
@ -285,25 +279,42 @@ u32 get_cpu_package(void)
|
||||||
return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
|
return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_DISPLAY_CPUINFO)
|
void get_soc_name(char name[SOC_NAME_SIZE])
|
||||||
int print_cpuinfo(void)
|
|
||||||
{
|
{
|
||||||
char *cpu_s, *cpu_r, *pkg;
|
char *cpu_s, *cpu_r, *pkg;
|
||||||
|
|
||||||
/* MPUs Part Numbers */
|
/* MPUs Part Numbers */
|
||||||
switch (get_cpu_type()) {
|
switch (get_cpu_type()) {
|
||||||
|
case CPU_STM32MP157Fxx:
|
||||||
|
cpu_s = "157F";
|
||||||
|
break;
|
||||||
|
case CPU_STM32MP157Dxx:
|
||||||
|
cpu_s = "157D";
|
||||||
|
break;
|
||||||
case CPU_STM32MP157Cxx:
|
case CPU_STM32MP157Cxx:
|
||||||
cpu_s = "157C";
|
cpu_s = "157C";
|
||||||
break;
|
break;
|
||||||
case CPU_STM32MP157Axx:
|
case CPU_STM32MP157Axx:
|
||||||
cpu_s = "157A";
|
cpu_s = "157A";
|
||||||
break;
|
break;
|
||||||
|
case CPU_STM32MP153Fxx:
|
||||||
|
cpu_s = "153F";
|
||||||
|
break;
|
||||||
|
case CPU_STM32MP153Dxx:
|
||||||
|
cpu_s = "153D";
|
||||||
|
break;
|
||||||
case CPU_STM32MP153Cxx:
|
case CPU_STM32MP153Cxx:
|
||||||
cpu_s = "153C";
|
cpu_s = "153C";
|
||||||
break;
|
break;
|
||||||
case CPU_STM32MP153Axx:
|
case CPU_STM32MP153Axx:
|
||||||
cpu_s = "153A";
|
cpu_s = "153A";
|
||||||
break;
|
break;
|
||||||
|
case CPU_STM32MP151Fxx:
|
||||||
|
cpu_s = "151F";
|
||||||
|
break;
|
||||||
|
case CPU_STM32MP151Dxx:
|
||||||
|
cpu_s = "151D";
|
||||||
|
break;
|
||||||
case CPU_STM32MP151Cxx:
|
case CPU_STM32MP151Cxx:
|
||||||
cpu_s = "151C";
|
cpu_s = "151C";
|
||||||
break;
|
break;
|
||||||
|
@ -350,7 +361,16 @@ int print_cpuinfo(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("CPU: STM32MP%s%s Rev.%s\n", cpu_s, pkg, cpu_r);
|
snprintf(name, SOC_NAME_SIZE, "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_DISPLAY_CPUINFO)
|
||||||
|
int print_cpuinfo(void)
|
||||||
|
{
|
||||||
|
char name[SOC_NAME_SIZE];
|
||||||
|
|
||||||
|
get_soc_name(name);
|
||||||
|
printf("CPU: %s\n", name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,12 @@
|
||||||
|
|
||||||
#define ETZPC_RESERVED 0xffffffff
|
#define ETZPC_RESERVED 0xffffffff
|
||||||
|
|
||||||
|
#define STM32_FDCAN_BASE 0x4400e000
|
||||||
|
#define STM32_CRYP2_BASE 0x4c005000
|
||||||
|
#define STM32_CRYP1_BASE 0x54001000
|
||||||
|
#define STM32_GPU_BASE 0x59000000
|
||||||
|
#define STM32_DSI_BASE 0x5a000000
|
||||||
|
|
||||||
static const u32 stm32mp1_ip_addr[] = {
|
static const u32 stm32mp1_ip_addr[] = {
|
||||||
0x5c008000, /* 00 stgenc */
|
0x5c008000, /* 00 stgenc */
|
||||||
0x54000000, /* 01 bkpsram */
|
0x54000000, /* 01 bkpsram */
|
||||||
|
@ -33,7 +39,7 @@ static const u32 stm32mp1_ip_addr[] = {
|
||||||
ETZPC_RESERVED, /* 06 reserved */
|
ETZPC_RESERVED, /* 06 reserved */
|
||||||
0x54003000, /* 07 rng1 */
|
0x54003000, /* 07 rng1 */
|
||||||
0x54002000, /* 08 hash1 */
|
0x54002000, /* 08 hash1 */
|
||||||
0x54001000, /* 09 cryp1 */
|
STM32_CRYP1_BASE, /* 09 cryp1 */
|
||||||
0x5a003000, /* 0A ddrctrl */
|
0x5a003000, /* 0A ddrctrl */
|
||||||
0x5a004000, /* 0B ddrphyc */
|
0x5a004000, /* 0B ddrphyc */
|
||||||
0x5c009000, /* 0C i2c6 */
|
0x5c009000, /* 0C i2c6 */
|
||||||
|
@ -86,7 +92,7 @@ static const u32 stm32mp1_ip_addr[] = {
|
||||||
0x4400b000, /* 3B sai2 */
|
0x4400b000, /* 3B sai2 */
|
||||||
0x4400c000, /* 3C sai3 */
|
0x4400c000, /* 3C sai3 */
|
||||||
0x4400d000, /* 3D dfsdm */
|
0x4400d000, /* 3D dfsdm */
|
||||||
0x4400e000, /* 3E tt_fdcan */
|
STM32_FDCAN_BASE, /* 3E tt_fdcan */
|
||||||
ETZPC_RESERVED, /* 3F reserved */
|
ETZPC_RESERVED, /* 3F reserved */
|
||||||
0x50021000, /* 40 lptim2 */
|
0x50021000, /* 40 lptim2 */
|
||||||
0x50022000, /* 41 lptim3 */
|
0x50022000, /* 41 lptim3 */
|
||||||
|
@ -99,7 +105,7 @@ static const u32 stm32mp1_ip_addr[] = {
|
||||||
0x48003000, /* 48 adc */
|
0x48003000, /* 48 adc */
|
||||||
0x4c002000, /* 49 hash2 */
|
0x4c002000, /* 49 hash2 */
|
||||||
0x4c003000, /* 4A rng2 */
|
0x4c003000, /* 4A rng2 */
|
||||||
0x4c005000, /* 4B cryp2 */
|
STM32_CRYP2_BASE, /* 4B cryp2 */
|
||||||
ETZPC_RESERVED, /* 4C reserved */
|
ETZPC_RESERVED, /* 4C reserved */
|
||||||
ETZPC_RESERVED, /* 4D reserved */
|
ETZPC_RESERVED, /* 4D reserved */
|
||||||
ETZPC_RESERVED, /* 4E reserved */
|
ETZPC_RESERVED, /* 4E reserved */
|
||||||
|
@ -126,11 +132,13 @@ static const u32 stm32mp1_ip_addr[] = {
|
||||||
static bool fdt_disable_subnode_by_address(void *fdt, int offset, u32 addr)
|
static bool fdt_disable_subnode_by_address(void *fdt, int offset, u32 addr)
|
||||||
{
|
{
|
||||||
int node;
|
int node;
|
||||||
|
fdt_addr_t regs;
|
||||||
|
|
||||||
for (node = fdt_first_subnode(fdt, offset);
|
for (node = fdt_first_subnode(fdt, offset);
|
||||||
node >= 0;
|
node >= 0;
|
||||||
node = fdt_next_subnode(fdt, node)) {
|
node = fdt_next_subnode(fdt, node)) {
|
||||||
if (addr == (u32)fdt_getprop(fdt, node, "reg", 0)) {
|
regs = fdtdec_get_addr(fdt, node, "reg");
|
||||||
|
if (addr == regs) {
|
||||||
if (fdtdec_get_is_enabled(fdt, node)) {
|
if (fdtdec_get_is_enabled(fdt, node)) {
|
||||||
fdt_status_disabled(fdt, node);
|
fdt_status_disabled(fdt, node);
|
||||||
|
|
||||||
|
@ -143,11 +151,11 @@ static bool fdt_disable_subnode_by_address(void *fdt, int offset, u32 addr)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stm32_fdt_fixup_etzpc(void *fdt)
|
static int stm32_fdt_fixup_etzpc(void *fdt, int soc_node)
|
||||||
{
|
{
|
||||||
const u32 *array;
|
const u32 *array;
|
||||||
int array_size, i;
|
int array_size, i;
|
||||||
int soc_node, offset, shift;
|
int offset, shift;
|
||||||
u32 addr, status, decprot[ETZPC_DECPROT_NB];
|
u32 addr, status, decprot[ETZPC_DECPROT_NB];
|
||||||
|
|
||||||
array = stm32mp1_ip_addr;
|
array = stm32mp1_ip_addr;
|
||||||
|
@ -156,10 +164,6 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
|
||||||
for (i = 0; i < ETZPC_DECPROT_NB; i++)
|
for (i = 0; i < ETZPC_DECPROT_NB; i++)
|
||||||
decprot[i] = readl(ETZPC_DECPROT(i));
|
decprot[i] = readl(ETZPC_DECPROT(i));
|
||||||
|
|
||||||
soc_node = fdt_path_offset(fdt, "/soc");
|
|
||||||
if (soc_node < 0)
|
|
||||||
return soc_node;
|
|
||||||
|
|
||||||
for (i = 0; i < array_size; i++) {
|
for (i = 0; i < array_size; i++) {
|
||||||
offset = i / NB_PROT_PER_REG;
|
offset = i / NB_PROT_PER_REG;
|
||||||
shift = (i % NB_PROT_PER_REG) * DECPROT_NB_BITS;
|
shift = (i % NB_PROT_PER_REG) * DECPROT_NB_BITS;
|
||||||
|
@ -180,6 +184,40 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* deactivate all the cpu except core 0 */
|
||||||
|
static void stm32_fdt_fixup_cpu(void *blob, char *name)
|
||||||
|
{
|
||||||
|
int off;
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
off = fdt_path_offset(blob, "/cpus");
|
||||||
|
if (off < 0) {
|
||||||
|
printf("%s: couldn't find /cpus node\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
off = fdt_node_offset_by_prop_value(blob, -1, "device_type", "cpu", 4);
|
||||||
|
while (off != -FDT_ERR_NOTFOUND) {
|
||||||
|
reg = fdtdec_get_addr(blob, off, "reg");
|
||||||
|
if (reg != 0) {
|
||||||
|
fdt_del_node(blob, off);
|
||||||
|
printf("FDT: cpu %d node remove for %s\n", reg, name);
|
||||||
|
/* after delete we can't trust the offsets anymore */
|
||||||
|
off = -1;
|
||||||
|
}
|
||||||
|
off = fdt_node_offset_by_prop_value(blob, off,
|
||||||
|
"device_type", "cpu", 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stm32_fdt_disable(void *fdt, int offset, u32 addr,
|
||||||
|
const char *string, const char *name)
|
||||||
|
{
|
||||||
|
if (fdt_disable_subnode_by_address(fdt, offset, addr))
|
||||||
|
printf("FDT: %s@%08x node disabled for %s\n",
|
||||||
|
string, addr, name);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is called right before the kernel is booted. "blob" is the
|
* This function is called right before the kernel is booted. "blob" is the
|
||||||
* device tree that will be passed to the kernel.
|
* device tree that will be passed to the kernel.
|
||||||
|
@ -187,14 +225,59 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
|
||||||
int ft_system_setup(void *blob, bd_t *bd)
|
int ft_system_setup(void *blob, bd_t *bd)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
u32 pkg;
|
int soc;
|
||||||
|
u32 pkg, cpu;
|
||||||
|
char name[SOC_NAME_SIZE];
|
||||||
|
|
||||||
|
soc = fdt_path_offset(blob, "/soc");
|
||||||
|
if (soc < 0)
|
||||||
|
return soc;
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(STM32_ETZPC)) {
|
if (CONFIG_IS_ENABLED(STM32_ETZPC)) {
|
||||||
ret = stm32_fdt_fixup_etzpc(blob);
|
ret = stm32_fdt_fixup_etzpc(blob, soc);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* MPUs Part Numbers and name*/
|
||||||
|
cpu = get_cpu_type();
|
||||||
|
get_soc_name(name);
|
||||||
|
|
||||||
|
switch (cpu) {
|
||||||
|
case CPU_STM32MP151Fxx:
|
||||||
|
case CPU_STM32MP151Dxx:
|
||||||
|
case CPU_STM32MP151Cxx:
|
||||||
|
case CPU_STM32MP151Axx:
|
||||||
|
stm32_fdt_fixup_cpu(blob, name);
|
||||||
|
/* after cpu delete we can't trust the soc offsets anymore */
|
||||||
|
soc = fdt_path_offset(blob, "/soc");
|
||||||
|
stm32_fdt_disable(blob, soc, STM32_FDCAN_BASE, "can", name);
|
||||||
|
/* fall through */
|
||||||
|
case CPU_STM32MP153Fxx:
|
||||||
|
case CPU_STM32MP153Dxx:
|
||||||
|
case CPU_STM32MP153Cxx:
|
||||||
|
case CPU_STM32MP153Axx:
|
||||||
|
stm32_fdt_disable(blob, soc, STM32_GPU_BASE, "gpu", name);
|
||||||
|
stm32_fdt_disable(blob, soc, STM32_DSI_BASE, "dsi", name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cpu) {
|
||||||
|
case CPU_STM32MP157Dxx:
|
||||||
|
case CPU_STM32MP157Axx:
|
||||||
|
case CPU_STM32MP153Dxx:
|
||||||
|
case CPU_STM32MP153Axx:
|
||||||
|
case CPU_STM32MP151Dxx:
|
||||||
|
case CPU_STM32MP151Axx:
|
||||||
|
stm32_fdt_disable(blob, soc, STM32_CRYP1_BASE, "cryp", name);
|
||||||
|
stm32_fdt_disable(blob, soc, STM32_CRYP2_BASE, "cryp", name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (get_cpu_package()) {
|
switch (get_cpu_package()) {
|
||||||
case PKG_AA_LBGA448:
|
case PKG_AA_LBGA448:
|
||||||
pkg = STM32MP_PKG_AA;
|
pkg = STM32MP_PKG_AA;
|
||||||
|
|
|
@ -9,8 +9,10 @@
|
||||||
/* DDR power initializations */
|
/* DDR power initializations */
|
||||||
enum ddr_type {
|
enum ddr_type {
|
||||||
STM32MP_DDR3,
|
STM32MP_DDR3,
|
||||||
STM32MP_LPDDR2,
|
STM32MP_LPDDR2_16,
|
||||||
STM32MP_LPDDR3,
|
STM32MP_LPDDR2_32,
|
||||||
|
STM32MP_LPDDR3_16,
|
||||||
|
STM32MP_LPDDR3_32,
|
||||||
};
|
};
|
||||||
|
|
||||||
int board_ddr_power_init(enum ddr_type ddr_type);
|
int board_ddr_power_init(enum ddr_type ddr_type);
|
||||||
|
|
|
@ -119,7 +119,14 @@ enum forced_boot_mode {
|
||||||
#define STM32_BSEC_SHADOW(id) (STM32_BSEC_SHADOW_OFFSET + (id) * 4)
|
#define STM32_BSEC_SHADOW(id) (STM32_BSEC_SHADOW_OFFSET + (id) * 4)
|
||||||
#define STM32_BSEC_OTP_OFFSET 0x80000000
|
#define STM32_BSEC_OTP_OFFSET 0x80000000
|
||||||
#define STM32_BSEC_OTP(id) (STM32_BSEC_OTP_OFFSET + (id) * 4)
|
#define STM32_BSEC_OTP(id) (STM32_BSEC_OTP_OFFSET + (id) * 4)
|
||||||
|
#define STM32_BSEC_LOCK_OFFSET 0xC0000000
|
||||||
|
#define STM32_BSEC_LOCK(id) (STM32_BSEC_LOCK_OFFSET + (id) * 4)
|
||||||
|
|
||||||
|
/* BSEC OTP index */
|
||||||
|
#define BSEC_OTP_RPN 1
|
||||||
|
#define BSEC_OTP_SERIAL 13
|
||||||
|
#define BSEC_OTP_PKG 16
|
||||||
|
#define BSEC_OTP_MAC 57
|
||||||
#define BSEC_OTP_BOARD 59
|
#define BSEC_OTP_BOARD 59
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__*/
|
#endif /* __ASSEMBLY__*/
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#define STM32_SMC_READ_OTP 0x04
|
#define STM32_SMC_READ_OTP 0x04
|
||||||
#define STM32_SMC_READ_ALL 0x05
|
#define STM32_SMC_READ_ALL 0x05
|
||||||
#define STM32_SMC_WRITE_ALL 0x06
|
#define STM32_SMC_WRITE_ALL 0x06
|
||||||
|
#define STM32_SMC_WRLOCK_OTP 0x07
|
||||||
|
|
||||||
/* SMC error codes */
|
/* SMC error codes */
|
||||||
#define STM32_SMC_OK 0x0
|
#define STM32_SMC_OK 0x0
|
||||||
|
@ -45,8 +46,8 @@ static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
|
||||||
arm_smccc_smc(svc, op, data1, data2, 0, 0, 0, 0, &res);
|
arm_smccc_smc(svc, op, data1, data2, 0, 0, 0, 0, &res);
|
||||||
|
|
||||||
if (res.a0) {
|
if (res.a0) {
|
||||||
pr_err("%s: Failed to exec in secure mode (err = %ld)\n",
|
pr_err("%s: Failed to exec svc=%x op=%x in secure mode (err = %ld)\n",
|
||||||
__func__, res.a0);
|
__func__, svc, op, res.a0);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (result)
|
if (result)
|
||||||
|
|
|
@ -3,13 +3,19 @@
|
||||||
* Copyright (C) 2015-2017, STMicroelectronics - All Rights Reserved
|
* Copyright (C) 2015-2017, STMicroelectronics - All Rights Reserved
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ID = Device Version (bit31:16) + Device Part Number (RPN) (bit15:0)*/
|
/* ID = Device Version (bit31:16) + Device Part Number (RPN) (bit7:0) */
|
||||||
#define CPU_STM32MP157Cxx 0x05000000
|
#define CPU_STM32MP157Cxx 0x05000000
|
||||||
#define CPU_STM32MP157Axx 0x05000001
|
#define CPU_STM32MP157Axx 0x05000001
|
||||||
#define CPU_STM32MP153Cxx 0x05000024
|
#define CPU_STM32MP153Cxx 0x05000024
|
||||||
#define CPU_STM32MP153Axx 0x05000025
|
#define CPU_STM32MP153Axx 0x05000025
|
||||||
#define CPU_STM32MP151Cxx 0x0500002E
|
#define CPU_STM32MP151Cxx 0x0500002E
|
||||||
#define CPU_STM32MP151Axx 0x0500002F
|
#define CPU_STM32MP151Axx 0x0500002F
|
||||||
|
#define CPU_STM32MP157Fxx 0x05000080
|
||||||
|
#define CPU_STM32MP157Dxx 0x05000081
|
||||||
|
#define CPU_STM32MP153Fxx 0x050000A4
|
||||||
|
#define CPU_STM32MP153Dxx 0x050000A5
|
||||||
|
#define CPU_STM32MP151Fxx 0x050000AE
|
||||||
|
#define CPU_STM32MP151Dxx 0x050000AF
|
||||||
|
|
||||||
/* return CPU_STMP32MP...Xxx constants */
|
/* return CPU_STMP32MP...Xxx constants */
|
||||||
u32 get_cpu_type(void);
|
u32 get_cpu_type(void);
|
||||||
|
@ -29,6 +35,10 @@ u32 get_cpu_package(void);
|
||||||
#define PKG_AC_TFBGA361 2
|
#define PKG_AC_TFBGA361 2
|
||||||
#define PKG_AD_TFBGA257 1
|
#define PKG_AD_TFBGA257 1
|
||||||
|
|
||||||
|
/* Get SOC name */
|
||||||
|
#define SOC_NAME_SIZE 20
|
||||||
|
void get_soc_name(char name[SOC_NAME_SIZE]);
|
||||||
|
|
||||||
/* return boot mode */
|
/* return boot mode */
|
||||||
u32 get_bootmode(void);
|
u32 get_bootmode(void);
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,22 @@ u8 psci_state[STM32MP1_PSCI_NR_CPUS] __secure_data = {
|
||||||
PSCI_AFFINITY_LEVEL_ON,
|
PSCI_AFFINITY_LEVEL_ON,
|
||||||
PSCI_AFFINITY_LEVEL_OFF};
|
PSCI_AFFINITY_LEVEL_OFF};
|
||||||
|
|
||||||
|
static u32 __secure_data cntfrq;
|
||||||
|
|
||||||
|
static u32 __secure cp15_read_cntfrq(void)
|
||||||
|
{
|
||||||
|
u32 frq;
|
||||||
|
|
||||||
|
asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (frq));
|
||||||
|
|
||||||
|
return frq;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __secure cp15_write_cntfrq(u32 frq)
|
||||||
|
{
|
||||||
|
asm volatile ("mcr p15, 0, %0, c14, c0, 0" : : "r" (frq));
|
||||||
|
}
|
||||||
|
|
||||||
static inline void psci_set_state(int cpu, u8 state)
|
static inline void psci_set_state(int cpu, u8 state)
|
||||||
{
|
{
|
||||||
psci_state[cpu] = state;
|
psci_state[cpu] = state;
|
||||||
|
@ -63,6 +79,9 @@ void __secure psci_arch_cpu_entry(void)
|
||||||
|
|
||||||
psci_set_state(cpu, PSCI_AFFINITY_LEVEL_ON);
|
psci_set_state(cpu, PSCI_AFFINITY_LEVEL_ON);
|
||||||
|
|
||||||
|
/* write the saved cntfrq */
|
||||||
|
cp15_write_cntfrq(cntfrq);
|
||||||
|
|
||||||
/* reset magic in TAMP register */
|
/* reset magic in TAMP register */
|
||||||
writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
|
writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
|
||||||
}
|
}
|
||||||
|
@ -130,6 +149,9 @@ s32 __secure psci_cpu_on(u32 function_id, u32 target_cpu, u32 pc,
|
||||||
if (psci_state[cpu] == PSCI_AFFINITY_LEVEL_ON)
|
if (psci_state[cpu] == PSCI_AFFINITY_LEVEL_ON)
|
||||||
return ARM_PSCI_RET_ALREADY_ON;
|
return ARM_PSCI_RET_ALREADY_ON;
|
||||||
|
|
||||||
|
/* read and save cntfrq of current cpu to write on target cpu */
|
||||||
|
cntfrq = cp15_read_cntfrq();
|
||||||
|
|
||||||
/* reset magic in TAMP register */
|
/* reset magic in TAMP register */
|
||||||
if (readl(TAMP_BACKUP_MAGIC_NUMBER))
|
if (readl(TAMP_BACKUP_MAGIC_NUMBER))
|
||||||
writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
|
writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
|
||||||
|
|
|
@ -1,6 +1,32 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2019, STMicroelectronics - All Rights Reserved
|
* Copyright (C) 2019, STMicroelectronics - All Rights Reserved
|
||||||
|
*
|
||||||
|
* the st command stboard supports the STMicroelectronics board identification
|
||||||
|
* saved in OTP 59.
|
||||||
|
*
|
||||||
|
* The ST product codification have several element
|
||||||
|
* - "Commercial Product Name" (CPN): type of product board (DKX, EVX)
|
||||||
|
* associated to the board ID "MBxxxx"
|
||||||
|
* - "Finished Good" or "Finish Good" (FG):
|
||||||
|
* effective content of the product without chip STM32MP1xx (LCD, Wifi,…)
|
||||||
|
* - BOM: cost variant for same FG (for example, several provider of the same
|
||||||
|
* component)
|
||||||
|
*
|
||||||
|
* For example
|
||||||
|
* - commercial product = STM32MP157C-EV1 for board MB1263
|
||||||
|
* - Finished Good = EVA32MP157A1$AU1
|
||||||
|
*
|
||||||
|
* Both information are written on board and these information are also saved
|
||||||
|
* in OTP59, with:
|
||||||
|
* bit [31:16] (hex) => Board id, MBxxxx
|
||||||
|
* bit [15:12] (dec) => Variant CPN (1....15)
|
||||||
|
* bit [11:8] (dec) => Revision board (index with A = 1, Z = 26)
|
||||||
|
* bit [7:4] (dec) => Variant FG : finished good index
|
||||||
|
* bit [3:0] (dec) => BOM (01, .... 255)
|
||||||
|
*
|
||||||
|
* and displayed with the format:
|
||||||
|
* Board: MB<Board> Var<VarCPN>.<VarFG> Rev.<Revision>-<BOM>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_SPL_BUILD
|
#ifndef CONFIG_SPL_BUILD
|
||||||
|
@ -13,6 +39,7 @@
|
||||||
static bool check_stboard(u16 board)
|
static bool check_stboard(u16 board)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
/* list of supported ST boards */
|
||||||
const u16 st_board_id[] = {
|
const u16 st_board_id[] = {
|
||||||
0x1272,
|
0x1272,
|
||||||
0x1263,
|
0x1263,
|
||||||
|
@ -31,9 +58,11 @@ static bool check_stboard(u16 board)
|
||||||
|
|
||||||
static void display_stboard(u32 otp)
|
static void display_stboard(u32 otp)
|
||||||
{
|
{
|
||||||
printf("Board: MB%04x Var%d Rev.%c-%02d\n",
|
/* display board indentification with OPT coding */
|
||||||
|
printf("Board: MB%04x Var%d.%d Rev.%c-%02d\n",
|
||||||
otp >> 16,
|
otp >> 16,
|
||||||
(otp >> 12) & 0xF,
|
(otp >> 12) & 0xF,
|
||||||
|
(otp >> 4) & 0xF,
|
||||||
((otp >> 8) & 0xF) - 1 + 'A',
|
((otp >> 8) & 0xF) - 1 + 'A',
|
||||||
otp & 0xF);
|
otp & 0xF);
|
||||||
}
|
}
|
||||||
|
@ -42,23 +71,23 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
char * const argv[])
|
char * const argv[])
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
u32 otp;
|
u32 otp, lock;
|
||||||
u8 revision;
|
u8 revision;
|
||||||
unsigned long board, variant, bom;
|
unsigned long board, var_cpn, var_fg, bom;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int confirmed = argc == 6 && !strcmp(argv[1], "-y");
|
int confirmed = argc == 7 && !strcmp(argv[1], "-y");
|
||||||
|
|
||||||
argc -= 1 + confirmed;
|
argc -= 1 + confirmed;
|
||||||
argv += 1 + confirmed;
|
argv += 1 + confirmed;
|
||||||
|
|
||||||
if (argc != 0 && argc != 4)
|
if (argc != 0 && argc != 5)
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
DM_GET_DRIVER(stm32mp_bsec),
|
DM_GET_DRIVER(stm32mp_bsec),
|
||||||
&dev);
|
&dev);
|
||||||
|
|
||||||
ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
|
ret = misc_read(dev, STM32_BSEC_OTP(BSEC_OTP_BOARD),
|
||||||
&otp, sizeof(otp));
|
&otp, sizeof(otp));
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -66,11 +95,20 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = misc_read(dev, STM32_BSEC_LOCK(BSEC_OTP_BOARD),
|
||||||
|
&lock, sizeof(lock));
|
||||||
|
if (ret < 0) {
|
||||||
|
puts("LOCK read error");
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
if (!otp)
|
if (!otp)
|
||||||
puts("Board : OTP board FREE\n");
|
puts("Board : OTP board FREE\n");
|
||||||
else
|
else
|
||||||
display_stboard(otp);
|
display_stboard(otp);
|
||||||
|
printf(" OTP %d %s locked !\n", BSEC_OTP_BOARD,
|
||||||
|
lock == 1 ? "" : "NOT");
|
||||||
return CMD_RET_SUCCESS;
|
return CMD_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,8 +124,8 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strict_strtoul(argv[1], 10, &variant) < 0 ||
|
if (strict_strtoul(argv[1], 10, &var_cpn) < 0 ||
|
||||||
variant == 0 || variant > 15) {
|
var_cpn == 0 || var_cpn > 15) {
|
||||||
printf("argument %d invalid: %s\n", 2, argv[1]);
|
printf("argument %d invalid: %s\n", 2, argv[1]);
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
}
|
}
|
||||||
|
@ -98,13 +136,21 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strict_strtoul(argv[3], 10, &bom) < 0 ||
|
if (strict_strtoul(argv[3], 10, &var_fg) < 0 ||
|
||||||
|
var_fg > 15) {
|
||||||
|
printf("argument %d invalid: %s\n", 4, argv[3]);
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict_strtoul(argv[4], 10, &bom) < 0 ||
|
||||||
bom == 0 || bom > 15) {
|
bom == 0 || bom > 15) {
|
||||||
printf("argument %d invalid: %s\n", 4, argv[3]);
|
printf("argument %d invalid: %s\n", 4, argv[3]);
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
otp = (board << 16) | (variant << 12) | (revision << 8) | bom;
|
/* st board indentification value */
|
||||||
|
otp = (board << 16) | (var_cpn << 12) | (revision << 8) |
|
||||||
|
(var_fg << 4) | bom;
|
||||||
display_stboard(otp);
|
display_stboard(otp);
|
||||||
printf("=> OTP[%d] = %08X\n", BSEC_OTP_BOARD, otp);
|
printf("=> OTP[%d] = %08X\n", BSEC_OTP_BOARD, otp);
|
||||||
|
|
||||||
|
@ -125,24 +171,35 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
ret = misc_write(dev, STM32_BSEC_OTP(BSEC_OTP_BOARD),
|
ret = misc_write(dev, STM32_BSEC_OTP(BSEC_OTP_BOARD),
|
||||||
&otp, sizeof(otp));
|
&otp, sizeof(otp));
|
||||||
|
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
puts("BOARD programming error\n");
|
puts("BOARD programming error\n");
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* write persistent lock */
|
||||||
|
otp = 1;
|
||||||
|
ret = misc_write(dev, STM32_BSEC_LOCK(BSEC_OTP_BOARD),
|
||||||
|
&otp, sizeof(otp));
|
||||||
|
if (ret < 0) {
|
||||||
|
puts("BOARD lock error\n");
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
puts("BOARD programming done\n");
|
puts("BOARD programming done\n");
|
||||||
|
|
||||||
return CMD_RET_SUCCESS;
|
return CMD_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(stboard, 6, 0, do_stboard,
|
U_BOOT_CMD(stboard, 7, 0, do_stboard,
|
||||||
"read/write board reference in OTP",
|
"read/write board reference in OTP",
|
||||||
"\n"
|
"\n"
|
||||||
" Print current board information\n"
|
" Print current board information\n"
|
||||||
"stboard [-y] <Board> <Variant> <Revision> <BOM>\n"
|
"stboard [-y] <Board> <VarCPN> <Revision> <VarFG> <BOM>\n"
|
||||||
" Write board information\n"
|
" Write board information\n"
|
||||||
" - Board: xxxx, example 1264 for MB1264\n"
|
" - Board: xxxx, example 1264 for MB1264\n"
|
||||||
" - Variant: 1 ... 15\n"
|
" - VarCPN: 1...15\n"
|
||||||
" - Revision: A...O\n"
|
" - Revision: A...O\n"
|
||||||
|
" - VarFG: 0...15\n"
|
||||||
" - BOM: 1...15\n");
|
" - BOM: 1...15\n");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -43,6 +43,7 @@ int board_ddr_power_init(enum ddr_type ddr_type)
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
bool buck3_at_1800000v = false;
|
bool buck3_at_1800000v = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
u32 buck2;
|
||||||
|
|
||||||
ret = uclass_get_device_by_driver(UCLASS_PMIC,
|
ret = uclass_get_device_by_driver(UCLASS_PMIC,
|
||||||
DM_GET_DRIVER(pmic_stpmic1), &dev);
|
DM_GET_DRIVER(pmic_stpmic1), &dev);
|
||||||
|
@ -102,8 +103,10 @@ int board_ddr_power_init(enum ddr_type ddr_type)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STM32MP_LPDDR2:
|
case STM32MP_LPDDR2_16:
|
||||||
case STM32MP_LPDDR3:
|
case STM32MP_LPDDR2_32:
|
||||||
|
case STM32MP_LPDDR3_16:
|
||||||
|
case STM32MP_LPDDR3_32:
|
||||||
/*
|
/*
|
||||||
* configure VDD_DDR1 = LDO3
|
* configure VDD_DDR1 = LDO3
|
||||||
* Set LDO3 to 1.8V
|
* Set LDO3 to 1.8V
|
||||||
|
@ -133,11 +136,23 @@ int board_ddr_power_init(enum ddr_type ddr_type)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* VDD_DDR2 : Set BUCK2 to 1.2V */
|
/* VDD_DDR2 : Set BUCK2 to 1.2V (16bits) or 1.25V (32 bits)*/
|
||||||
|
switch (ddr_type) {
|
||||||
|
case STM32MP_LPDDR2_32:
|
||||||
|
case STM32MP_LPDDR3_32:
|
||||||
|
buck2 = STPMIC1_BUCK2_1250000V;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case STM32MP_LPDDR2_16:
|
||||||
|
case STM32MP_LPDDR3_16:
|
||||||
|
buck2 = STPMIC1_BUCK2_1200000V;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pmic_clrsetbits(dev,
|
ret = pmic_clrsetbits(dev,
|
||||||
STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
|
STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
|
||||||
STPMIC1_BUCK_VOUT_MASK,
|
STPMIC1_BUCK_VOUT_MASK,
|
||||||
STPMIC1_BUCK2_1200000V);
|
buck2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -104,19 +104,21 @@ int checkboard(void)
|
||||||
printf(" (%s)", fdt_compat);
|
printf(" (%s)", fdt_compat);
|
||||||
puts("\n");
|
puts("\n");
|
||||||
|
|
||||||
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
/* display the STMicroelectronics board identification */
|
||||||
DM_GET_DRIVER(stm32mp_bsec),
|
if (CONFIG_IS_ENABLED(CMD_STBOARD)) {
|
||||||
&dev);
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
|
DM_GET_DRIVER(stm32mp_bsec),
|
||||||
if (!ret)
|
&dev);
|
||||||
ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
|
if (!ret)
|
||||||
&otp, sizeof(otp));
|
ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
|
||||||
if (ret > 0 && otp) {
|
&otp, sizeof(otp));
|
||||||
printf("Board: MB%04x Var%d Rev.%c-%02d\n",
|
if (ret > 0 && otp)
|
||||||
otp >> 16,
|
printf("Board: MB%04x Var%d.%d Rev.%c-%02d\n",
|
||||||
(otp >> 12) & 0xF,
|
otp >> 16,
|
||||||
((otp >> 8) & 0xF) - 1 + 'A',
|
(otp >> 12) & 0xF,
|
||||||
otp & 0xF);
|
(otp >> 4) & 0xF,
|
||||||
|
((otp >> 8) & 0xF) - 1 + 'A',
|
||||||
|
otp & 0xF);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -25,6 +25,14 @@ It features:
|
||||||
- Standard connectivity, widely inherited from the STM32 MCU family
|
- Standard connectivity, widely inherited from the STM32 MCU family
|
||||||
- Comprehensive security support
|
- Comprehensive security support
|
||||||
|
|
||||||
|
Each line comes with a security option (cryptography & secure boot) and
|
||||||
|
a Cortex-A frequency option:
|
||||||
|
|
||||||
|
- A : Cortex-A7 @ 650 MHz
|
||||||
|
- C : Secure Boot + HW Crypto + Cortex-A7 @ 650 MHz
|
||||||
|
- D : Cortex-A7 @ 800 MHz
|
||||||
|
- F : Secure Boot + HW Crypto + Cortex-A7 @ 800 MHz
|
||||||
|
|
||||||
Everything is supported in Linux but U-Boot is limited to:
|
Everything is supported in Linux but U-Boot is limited to:
|
||||||
|
|
||||||
1. UART
|
1. UART
|
||||||
|
@ -416,20 +424,26 @@ For STMicroelectonics board, it is retrieved in STM32MP15x OTP :
|
||||||
- OTP_58[15:0] = MAC_ADDR[47:32]
|
- OTP_58[15:0] = MAC_ADDR[47:32]
|
||||||
|
|
||||||
To program a MAC address on virgin OTP words above, you can use the fuse command
|
To program a MAC address on virgin OTP words above, you can use the fuse command
|
||||||
on bank 0 to access to internal OTP:
|
on bank 0 to access to internal OTP and lock them:
|
||||||
|
|
||||||
Prerequisite: check if a MAC address isn't yet programmed in OTP
|
Prerequisite: check if a MAC address isn't yet programmed in OTP
|
||||||
|
|
||||||
1) check OTP: their value must be equal to 0
|
1) check OTP: their value must be equal to 0::
|
||||||
|
|
||||||
STM32MP> fuse sense 0 57 2
|
STM32MP> fuse sense 0 57 2
|
||||||
Sensing bank 0:
|
Sensing bank 0:
|
||||||
Word 0x00000039: 00000000 00000000
|
Word 0x00000039: 00000000 00000000
|
||||||
|
|
||||||
2) check environment variable
|
2) check environment variable::
|
||||||
|
|
||||||
STM32MP> env print ethaddr
|
STM32MP> env print ethaddr
|
||||||
## Error: "ethaddr" not defined
|
## Error: "ethaddr" not defined
|
||||||
|
|
||||||
|
3) check lock status of fuse 57 & 58 (at 0x39, 0=unlocked, 1=locked)::
|
||||||
|
|
||||||
|
STM32MP> fuse sense 0 0x10000039 2
|
||||||
|
Sensing bank 0:
|
||||||
|
Word 0x10000039: 00000000 00000000
|
||||||
|
|
||||||
Example to set mac address "12:34:56:78:9a:bc"
|
Example to set mac address "12:34:56:78:9a:bc"
|
||||||
|
|
||||||
|
@ -443,11 +457,19 @@ Example to set mac address "12:34:56:78:9a:bc"
|
||||||
Sensing bank 0:
|
Sensing bank 0:
|
||||||
Word 0x00000039: 78563412 0000bc9a
|
Word 0x00000039: 78563412 0000bc9a
|
||||||
|
|
||||||
3) next REBOOT, in the trace::
|
3) Lock OTP::
|
||||||
|
|
||||||
|
STM32MP> fuse prog 0 0x10000039 1 1
|
||||||
|
|
||||||
|
STM32MP> fuse sense 0 0x10000039 2
|
||||||
|
Sensing bank 0:
|
||||||
|
Word 0x10000039: 00000001 00000001
|
||||||
|
|
||||||
|
4) next REBOOT, in the trace::
|
||||||
|
|
||||||
### Setting environment from OTP MAC address = "12:34:56:78:9a:bc"
|
### Setting environment from OTP MAC address = "12:34:56:78:9a:bc"
|
||||||
|
|
||||||
4) check env update::
|
5) check env update::
|
||||||
|
|
||||||
STM32MP> env print ethaddr
|
STM32MP> env print ethaddr
|
||||||
ethaddr=12:34:56:78:9a:bc
|
ethaddr=12:34:56:78:9a:bc
|
||||||
|
|
|
@ -129,6 +129,8 @@ phyc attributes:
|
||||||
MR3
|
MR3
|
||||||
|
|
||||||
- st,phy-cal : phy cal depending of calibration or tuning of DDR
|
- st,phy-cal : phy cal depending of calibration or tuning of DDR
|
||||||
|
This parameter is optional; when it is absent the built-in PHY
|
||||||
|
calibration is done.
|
||||||
for STM32MP15x: 12 values are requested in this order
|
for STM32MP15x: 12 values are requested in this order
|
||||||
DX0DLLCR
|
DX0DLLCR
|
||||||
DX0DQTR
|
DX0DQTR
|
||||||
|
|
|
@ -95,6 +95,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
#define RCC_I2C12CKSELR 0x8C0
|
#define RCC_I2C12CKSELR 0x8C0
|
||||||
#define RCC_I2C35CKSELR 0x8C4
|
#define RCC_I2C35CKSELR 0x8C4
|
||||||
#define RCC_SPI2S1CKSELR 0x8D8
|
#define RCC_SPI2S1CKSELR 0x8D8
|
||||||
|
#define RCC_SPI45CKSELR 0x8E0
|
||||||
#define RCC_UART6CKSELR 0x8E4
|
#define RCC_UART6CKSELR 0x8E4
|
||||||
#define RCC_UART24CKSELR 0x8E8
|
#define RCC_UART24CKSELR 0x8E8
|
||||||
#define RCC_UART35CKSELR 0x8EC
|
#define RCC_UART35CKSELR 0x8EC
|
||||||
|
@ -304,6 +305,7 @@ enum stm32mp1_parent_sel {
|
||||||
_DSI_SEL,
|
_DSI_SEL,
|
||||||
_ADC12_SEL,
|
_ADC12_SEL,
|
||||||
_SPI1_SEL,
|
_SPI1_SEL,
|
||||||
|
_SPI45_SEL,
|
||||||
_RTC_SEL,
|
_RTC_SEL,
|
||||||
_PARENT_SEL_NB,
|
_PARENT_SEL_NB,
|
||||||
_UNKNOWN_SEL = 0xff,
|
_UNKNOWN_SEL = 0xff,
|
||||||
|
@ -527,6 +529,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
|
||||||
STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 24, I2C5_K, _I2C35_SEL),
|
STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 24, I2C5_K, _I2C35_SEL),
|
||||||
|
|
||||||
STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 8, SPI1_K, _SPI1_SEL),
|
STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 8, SPI1_K, _SPI1_SEL),
|
||||||
|
STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 10, SPI5_K, _SPI45_SEL),
|
||||||
STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL),
|
STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL),
|
||||||
|
|
||||||
STM32MP1_CLK_SET_CLR_F(RCC_MP_APB3ENSETR, 13, VREF, _PCLK3),
|
STM32MP1_CLK_SET_CLR_F(RCC_MP_APB3ENSETR, 13, VREF, _PCLK3),
|
||||||
|
@ -603,6 +606,8 @@ static const u8 dsi_parents[] = {_DSI_PHY, _PLL4_P};
|
||||||
static const u8 adc_parents[] = {_PLL4_R, _CK_PER, _PLL3_Q};
|
static const u8 adc_parents[] = {_PLL4_R, _CK_PER, _PLL3_Q};
|
||||||
static const u8 spi_parents[] = {_PLL4_P, _PLL3_Q, _I2S_CKIN, _CK_PER,
|
static const u8 spi_parents[] = {_PLL4_P, _PLL3_Q, _I2S_CKIN, _CK_PER,
|
||||||
_PLL3_R};
|
_PLL3_R};
|
||||||
|
static const u8 spi45_parents[] = {_PCLK2, _PLL4_Q, _HSI_KER, _CSI_KER,
|
||||||
|
_HSE_KER};
|
||||||
static const u8 rtc_parents[] = {_UNKNOWN_ID, _LSE, _LSI, _HSE};
|
static const u8 rtc_parents[] = {_UNKNOWN_ID, _LSE, _LSI, _HSE};
|
||||||
|
|
||||||
static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
|
static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
|
||||||
|
@ -621,14 +626,15 @@ static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
|
||||||
STM32MP1_CLK_PARENT(_SDMMC3_SEL, RCC_SDMMC3CKSELR, 0, 0x7,
|
STM32MP1_CLK_PARENT(_SDMMC3_SEL, RCC_SDMMC3CKSELR, 0, 0x7,
|
||||||
sdmmc3_parents),
|
sdmmc3_parents),
|
||||||
STM32MP1_CLK_PARENT(_ETH_SEL, RCC_ETHCKSELR, 0, 0x3, eth_parents),
|
STM32MP1_CLK_PARENT(_ETH_SEL, RCC_ETHCKSELR, 0, 0x3, eth_parents),
|
||||||
STM32MP1_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0xf, qspi_parents),
|
STM32MP1_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0x3, qspi_parents),
|
||||||
STM32MP1_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0xf, fmc_parents),
|
STM32MP1_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0x3, fmc_parents),
|
||||||
STM32MP1_CLK_PARENT(_USBPHY_SEL, RCC_USBCKSELR, 0, 0x3, usbphy_parents),
|
STM32MP1_CLK_PARENT(_USBPHY_SEL, RCC_USBCKSELR, 0, 0x3, usbphy_parents),
|
||||||
STM32MP1_CLK_PARENT(_USBO_SEL, RCC_USBCKSELR, 4, 0x1, usbo_parents),
|
STM32MP1_CLK_PARENT(_USBO_SEL, RCC_USBCKSELR, 4, 0x1, usbo_parents),
|
||||||
STM32MP1_CLK_PARENT(_STGEN_SEL, RCC_STGENCKSELR, 0, 0x3, stgen_parents),
|
STM32MP1_CLK_PARENT(_STGEN_SEL, RCC_STGENCKSELR, 0, 0x3, stgen_parents),
|
||||||
STM32MP1_CLK_PARENT(_DSI_SEL, RCC_DSICKSELR, 0, 0x1, dsi_parents),
|
STM32MP1_CLK_PARENT(_DSI_SEL, RCC_DSICKSELR, 0, 0x1, dsi_parents),
|
||||||
STM32MP1_CLK_PARENT(_ADC12_SEL, RCC_ADCCKSELR, 0, 0x1, adc_parents),
|
STM32MP1_CLK_PARENT(_ADC12_SEL, RCC_ADCCKSELR, 0, 0x3, adc_parents),
|
||||||
STM32MP1_CLK_PARENT(_SPI1_SEL, RCC_SPI2S1CKSELR, 0, 0x7, spi_parents),
|
STM32MP1_CLK_PARENT(_SPI1_SEL, RCC_SPI2S1CKSELR, 0, 0x7, spi_parents),
|
||||||
|
STM32MP1_CLK_PARENT(_SPI45_SEL, RCC_SPI45CKSELR, 0, 0x7, spi45_parents),
|
||||||
STM32MP1_CLK_PARENT(_RTC_SEL, RCC_BDCR, RCC_BDCR_RTCSRC_SHIFT,
|
STM32MP1_CLK_PARENT(_RTC_SEL, RCC_BDCR, RCC_BDCR_RTCSRC_SHIFT,
|
||||||
(RCC_BDCR_RTCSRC_MASK >> RCC_BDCR_RTCSRC_SHIFT),
|
(RCC_BDCR_RTCSRC_MASK >> RCC_BDCR_RTCSRC_SHIFT),
|
||||||
rtc_parents),
|
rtc_parents),
|
||||||
|
@ -747,6 +753,7 @@ char * const stm32mp1_clk_parent_sel_name[_PARENT_SEL_NB] = {
|
||||||
[_DSI_SEL] = "DSI",
|
[_DSI_SEL] = "DSI",
|
||||||
[_ADC12_SEL] = "ADC12",
|
[_ADC12_SEL] = "ADC12",
|
||||||
[_SPI1_SEL] = "SPI1",
|
[_SPI1_SEL] = "SPI1",
|
||||||
|
[_SPI45_SEL] = "SPI45",
|
||||||
[_RTC_SEL] = "RTC",
|
[_RTC_SEL] = "RTC",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
#include <clk.h>
|
#include <clk.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#include <malloc.h>
|
|
||||||
#include <reset.h>
|
#include <reset.h>
|
||||||
|
|
||||||
#include <dm/device.h>
|
#include <dm/device.h>
|
||||||
|
#include <linux/err.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
/* STM32 I2C registers */
|
/* STM32 I2C registers */
|
||||||
|
@ -145,7 +145,6 @@ struct stm32_i2c_spec {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct stm32_i2c_setup - private I2C timing setup parameters
|
* struct stm32_i2c_setup - private I2C timing setup parameters
|
||||||
* @speed: I2C speed mode (standard, Fast Plus)
|
|
||||||
* @speed_freq: I2C speed frequency (Hz)
|
* @speed_freq: I2C speed frequency (Hz)
|
||||||
* @clock_src: I2C clock source frequency (Hz)
|
* @clock_src: I2C clock source frequency (Hz)
|
||||||
* @rise_time: Rise time (ns)
|
* @rise_time: Rise time (ns)
|
||||||
|
@ -154,7 +153,6 @@ struct stm32_i2c_spec {
|
||||||
* @analog_filter: Analog filter delay (On/Off)
|
* @analog_filter: Analog filter delay (On/Off)
|
||||||
*/
|
*/
|
||||||
struct stm32_i2c_setup {
|
struct stm32_i2c_setup {
|
||||||
enum i2c_speed_mode speed;
|
|
||||||
u32 speed_freq;
|
u32 speed_freq;
|
||||||
u32 clock_src;
|
u32 clock_src;
|
||||||
u32 rise_time;
|
u32 rise_time;
|
||||||
|
@ -184,10 +182,11 @@ struct stm32_i2c_priv {
|
||||||
struct stm32_i2c_regs *regs;
|
struct stm32_i2c_regs *regs;
|
||||||
struct clk clk;
|
struct clk clk;
|
||||||
struct stm32_i2c_setup *setup;
|
struct stm32_i2c_setup *setup;
|
||||||
int speed;
|
u32 speed;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct stm32_i2c_spec i2c_specs[] = {
|
static const struct stm32_i2c_spec i2c_specs[] = {
|
||||||
|
/* Standard speed - 100 KHz */
|
||||||
[IC_SPEED_MODE_STANDARD] = {
|
[IC_SPEED_MODE_STANDARD] = {
|
||||||
.rate = I2C_SPEED_STANDARD_RATE,
|
.rate = I2C_SPEED_STANDARD_RATE,
|
||||||
.rate_min = 8000,
|
.rate_min = 8000,
|
||||||
|
@ -200,6 +199,7 @@ static const struct stm32_i2c_spec i2c_specs[] = {
|
||||||
.l_min = 4700,
|
.l_min = 4700,
|
||||||
.h_min = 4000,
|
.h_min = 4000,
|
||||||
},
|
},
|
||||||
|
/* Fast speed - 400 KHz */
|
||||||
[IC_SPEED_MODE_FAST] = {
|
[IC_SPEED_MODE_FAST] = {
|
||||||
.rate = I2C_SPEED_FAST_RATE,
|
.rate = I2C_SPEED_FAST_RATE,
|
||||||
.rate_min = 320000,
|
.rate_min = 320000,
|
||||||
|
@ -212,6 +212,7 @@ static const struct stm32_i2c_spec i2c_specs[] = {
|
||||||
.l_min = 1300,
|
.l_min = 1300,
|
||||||
.h_min = 600,
|
.h_min = 600,
|
||||||
},
|
},
|
||||||
|
/* Fast Plus Speed - 1 MHz */
|
||||||
[IC_SPEED_MODE_FAST_PLUS] = {
|
[IC_SPEED_MODE_FAST_PLUS] = {
|
||||||
.rate = I2C_SPEED_FAST_PLUS_RATE,
|
.rate = I2C_SPEED_FAST_PLUS_RATE,
|
||||||
.rate_min = 800000,
|
.rate_min = 800000,
|
||||||
|
@ -474,6 +475,7 @@ static int stm32_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
|
static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
|
||||||
|
const struct stm32_i2c_spec *specs,
|
||||||
struct list_head *solutions)
|
struct list_head *solutions)
|
||||||
{
|
{
|
||||||
struct stm32_i2c_timings *v;
|
struct stm32_i2c_timings *v;
|
||||||
|
@ -490,13 +492,13 @@ static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
|
||||||
af_delay_max = setup->analog_filter ?
|
af_delay_max = setup->analog_filter ?
|
||||||
STM32_I2C_ANALOG_FILTER_DELAY_MAX : 0;
|
STM32_I2C_ANALOG_FILTER_DELAY_MAX : 0;
|
||||||
|
|
||||||
sdadel_min = i2c_specs[setup->speed].hddat_min + setup->fall_time -
|
sdadel_min = specs->hddat_min + setup->fall_time -
|
||||||
af_delay_min - (setup->dnf + 3) * i2cclk;
|
af_delay_min - (setup->dnf + 3) * i2cclk;
|
||||||
|
|
||||||
sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -
|
sdadel_max = specs->vddat_max - setup->rise_time -
|
||||||
af_delay_max - (setup->dnf + 4) * i2cclk;
|
af_delay_max - (setup->dnf + 4) * i2cclk;
|
||||||
|
|
||||||
scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min;
|
scldel_min = setup->rise_time + specs->sudat_min;
|
||||||
|
|
||||||
if (sdadel_min < 0)
|
if (sdadel_min < 0)
|
||||||
sdadel_min = 0;
|
sdadel_min = 0;
|
||||||
|
@ -548,6 +550,7 @@ static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
||||||
|
const struct stm32_i2c_spec *specs,
|
||||||
struct list_head *solutions,
|
struct list_head *solutions,
|
||||||
struct stm32_i2c_timings *s)
|
struct stm32_i2c_timings *s)
|
||||||
{
|
{
|
||||||
|
@ -570,8 +573,8 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
||||||
dnf_delay = setup->dnf * i2cclk;
|
dnf_delay = setup->dnf * i2cclk;
|
||||||
|
|
||||||
tsync = af_delay_min + dnf_delay + (2 * i2cclk);
|
tsync = af_delay_min + dnf_delay + (2 * i2cclk);
|
||||||
clk_max = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_min;
|
clk_max = STM32_NSEC_PER_SEC / specs->rate_min;
|
||||||
clk_min = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_max;
|
clk_min = STM32_NSEC_PER_SEC / specs->rate_max;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Among Prescaler possibilities discovered above figures out SCL Low
|
* Among Prescaler possibilities discovered above figures out SCL Low
|
||||||
|
@ -589,7 +592,7 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
||||||
for (l = 0; l < STM32_SCLL_MAX; l++) {
|
for (l = 0; l < STM32_SCLL_MAX; l++) {
|
||||||
u32 tscl_l = (l + 1) * prescaler + tsync;
|
u32 tscl_l = (l + 1) * prescaler + tsync;
|
||||||
|
|
||||||
if ((tscl_l < i2c_specs[setup->speed].l_min) ||
|
if (tscl_l < specs->l_min ||
|
||||||
(i2cclk >=
|
(i2cclk >=
|
||||||
((tscl_l - af_delay_min - dnf_delay) / 4))) {
|
((tscl_l - af_delay_min - dnf_delay) / 4))) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -601,7 +604,7 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
||||||
setup->rise_time + setup->fall_time;
|
setup->rise_time + setup->fall_time;
|
||||||
|
|
||||||
if ((tscl >= clk_min) && (tscl <= clk_max) &&
|
if ((tscl >= clk_min) && (tscl <= clk_max) &&
|
||||||
(tscl_h >= i2c_specs[setup->speed].h_min) &&
|
(tscl_h >= specs->h_min) &&
|
||||||
(i2cclk < tscl_h)) {
|
(i2cclk < tscl_h)) {
|
||||||
u32 clk_error;
|
u32 clk_error;
|
||||||
|
|
||||||
|
@ -630,26 +633,40 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct stm32_i2c_spec *get_specs(u32 rate)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(i2c_specs); i++)
|
||||||
|
if (rate <= i2c_specs[i].rate)
|
||||||
|
return &i2c_specs[i];
|
||||||
|
|
||||||
|
/* NOT REACHED */
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv,
|
static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv,
|
||||||
struct stm32_i2c_setup *setup,
|
struct stm32_i2c_setup *setup,
|
||||||
struct stm32_i2c_timings *output)
|
struct stm32_i2c_timings *output)
|
||||||
{
|
{
|
||||||
|
const struct stm32_i2c_spec *specs;
|
||||||
struct stm32_i2c_timings *v, *_v;
|
struct stm32_i2c_timings *v, *_v;
|
||||||
struct list_head solutions;
|
struct list_head solutions;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (setup->speed >= ARRAY_SIZE(i2c_specs)) {
|
specs = get_specs(setup->speed_freq);
|
||||||
pr_err("%s: speed out of bound {%d/%d}\n", __func__,
|
if (specs == ERR_PTR(-EINVAL)) {
|
||||||
setup->speed, ARRAY_SIZE(i2c_specs) - 1);
|
pr_err("%s: speed out of bound {%d}\n", __func__,
|
||||||
|
setup->speed_freq);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((setup->rise_time > i2c_specs[setup->speed].rise_max) ||
|
if (setup->rise_time > specs->rise_max ||
|
||||||
(setup->fall_time > i2c_specs[setup->speed].fall_max)) {
|
setup->fall_time > specs->fall_max) {
|
||||||
pr_err("%s :timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
|
pr_err("%s :timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
|
||||||
__func__,
|
__func__,
|
||||||
setup->rise_time, i2c_specs[setup->speed].rise_max,
|
setup->rise_time, specs->rise_max,
|
||||||
setup->fall_time, i2c_specs[setup->speed].fall_max);
|
setup->fall_time, specs->fall_max);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -659,18 +676,12 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setup->speed_freq > i2c_specs[setup->speed].rate) {
|
|
||||||
pr_err("%s: Freq {%d/%d}\n", __func__,
|
|
||||||
setup->speed_freq, i2c_specs[setup->speed].rate);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&solutions);
|
INIT_LIST_HEAD(&solutions);
|
||||||
ret = stm32_i2c_compute_solutions(setup, &solutions);
|
ret = stm32_i2c_compute_solutions(setup, specs, &solutions);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
ret = stm32_i2c_choose_solution(setup, &solutions, output);
|
ret = stm32_i2c_choose_solution(setup, specs, &solutions, output);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
@ -689,14 +700,24 @@ exit:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 get_lower_rate(u32 rate)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = ARRAY_SIZE(i2c_specs) - 1; i >= 0; i--)
|
||||||
|
if (rate > i2c_specs[i].rate)
|
||||||
|
return i2c_specs[i].rate;
|
||||||
|
|
||||||
|
return i2c_specs[0].rate;
|
||||||
|
}
|
||||||
|
|
||||||
static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
|
static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
|
||||||
struct stm32_i2c_timings *timing)
|
struct stm32_i2c_timings *timing)
|
||||||
{
|
{
|
||||||
struct stm32_i2c_setup *setup = i2c_priv->setup;
|
struct stm32_i2c_setup *setup = i2c_priv->setup;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
setup->speed = i2c_priv->speed;
|
setup->speed_freq = i2c_priv->speed;
|
||||||
setup->speed_freq = i2c_specs[setup->speed].rate;
|
|
||||||
setup->clock_src = clk_get_rate(&i2c_priv->clk);
|
setup->clock_src = clk_get_rate(&i2c_priv->clk);
|
||||||
|
|
||||||
if (!setup->clock_src) {
|
if (!setup->clock_src) {
|
||||||
|
@ -709,13 +730,11 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
debug("%s: failed to compute I2C timings.\n",
|
debug("%s: failed to compute I2C timings.\n",
|
||||||
__func__);
|
__func__);
|
||||||
if (i2c_priv->speed > IC_SPEED_MODE_STANDARD) {
|
if (setup->speed_freq > I2C_SPEED_STANDARD_RATE) {
|
||||||
i2c_priv->speed--;
|
|
||||||
setup->speed = i2c_priv->speed;
|
|
||||||
setup->speed_freq =
|
setup->speed_freq =
|
||||||
i2c_specs[setup->speed].rate;
|
get_lower_rate(setup->speed_freq);
|
||||||
debug("%s: downgrade I2C Speed Freq to (%i)\n",
|
debug("%s: downgrade I2C Speed Freq to (%i)\n",
|
||||||
__func__, i2c_specs[setup->speed].rate);
|
__func__, setup->speed_freq);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -727,13 +746,15 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("%s: I2C Speed(%i), Freq(%i), Clk Source(%i)\n", __func__,
|
debug("%s: I2C Freq(%i), Clk Source(%i)\n", __func__,
|
||||||
setup->speed, setup->speed_freq, setup->clock_src);
|
setup->speed_freq, setup->clock_src);
|
||||||
debug("%s: I2C Rise(%i) and Fall(%i) Time\n", __func__,
|
debug("%s: I2C Rise(%i) and Fall(%i) Time\n", __func__,
|
||||||
setup->rise_time, setup->fall_time);
|
setup->rise_time, setup->fall_time);
|
||||||
debug("%s: I2C Analog Filter(%s), DNF(%i)\n", __func__,
|
debug("%s: I2C Analog Filter(%s), DNF(%i)\n", __func__,
|
||||||
setup->analog_filter ? "On" : "Off", setup->dnf);
|
setup->analog_filter ? "On" : "Off", setup->dnf);
|
||||||
|
|
||||||
|
i2c_priv->speed = setup->speed_freq;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -773,21 +794,13 @@ static int stm32_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
|
||||||
{
|
{
|
||||||
struct stm32_i2c_priv *i2c_priv = dev_get_priv(bus);
|
struct stm32_i2c_priv *i2c_priv = dev_get_priv(bus);
|
||||||
|
|
||||||
switch (speed) {
|
if (speed > I2C_SPEED_FAST_PLUS_RATE) {
|
||||||
case I2C_SPEED_STANDARD_RATE:
|
|
||||||
i2c_priv->speed = IC_SPEED_MODE_STANDARD;
|
|
||||||
break;
|
|
||||||
case I2C_SPEED_FAST_RATE:
|
|
||||||
i2c_priv->speed = IC_SPEED_MODE_FAST;
|
|
||||||
break;
|
|
||||||
case I2C_SPEED_FAST_PLUS_RATE:
|
|
||||||
i2c_priv->speed = IC_SPEED_MODE_FAST_PLUS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
debug("%s: Speed %d not supported\n", __func__, speed);
|
debug("%s: Speed %d not supported\n", __func__, speed);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i2c_priv->speed = speed;
|
||||||
|
|
||||||
return stm32_i2c_hw_config(i2c_priv);
|
return stm32_i2c_hw_config(i2c_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -639,7 +639,8 @@ void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl)
|
||||||
start_sw_done(ctl);
|
start_sw_done(ctl);
|
||||||
/* quasi-dynamic register update*/
|
/* quasi-dynamic register update*/
|
||||||
setbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
|
setbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
|
||||||
clrbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN);
|
clrbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN |
|
||||||
|
DDRCTRL_PWRCTL_SELFREF_EN);
|
||||||
clrbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
|
clrbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
|
||||||
wait_sw_done_ack(ctl);
|
wait_sw_done_ack(ctl);
|
||||||
}
|
}
|
||||||
|
@ -652,6 +653,8 @@ void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
|
||||||
clrbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
|
clrbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
|
||||||
if (pwrctl & DDRCTRL_PWRCTL_POWERDOWN_EN)
|
if (pwrctl & DDRCTRL_PWRCTL_POWERDOWN_EN)
|
||||||
setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN);
|
setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN);
|
||||||
|
if ((pwrctl & DDRCTRL_PWRCTL_SELFREF_EN))
|
||||||
|
setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
|
||||||
setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
|
setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
|
||||||
wait_sw_done_ack(ctl);
|
wait_sw_done_ack(ctl);
|
||||||
}
|
}
|
||||||
|
@ -668,14 +671,34 @@ void stm32mp1_ddr_init(struct ddr_info *priv,
|
||||||
{
|
{
|
||||||
u32 pir;
|
u32 pir;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
char bus_width;
|
||||||
|
|
||||||
|
switch (config->c_reg.mstr & DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK) {
|
||||||
|
case DDRCTRL_MSTR_DATA_BUS_WIDTH_QUARTER:
|
||||||
|
bus_width = 8;
|
||||||
|
break;
|
||||||
|
case DDRCTRL_MSTR_DATA_BUS_WIDTH_HALF:
|
||||||
|
bus_width = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bus_width = 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (config->c_reg.mstr & DDRCTRL_MSTR_DDR3)
|
if (config->c_reg.mstr & DDRCTRL_MSTR_DDR3)
|
||||||
ret = board_ddr_power_init(STM32MP_DDR3);
|
ret = board_ddr_power_init(STM32MP_DDR3);
|
||||||
else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR2)
|
else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR2) {
|
||||||
ret = board_ddr_power_init(STM32MP_LPDDR2);
|
if (bus_width == 32)
|
||||||
else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR3)
|
ret = board_ddr_power_init(STM32MP_LPDDR2_32);
|
||||||
ret = board_ddr_power_init(STM32MP_LPDDR3);
|
else
|
||||||
|
ret = board_ddr_power_init(STM32MP_LPDDR2_16);
|
||||||
|
} else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR3) {
|
||||||
|
if (bus_width == 32)
|
||||||
|
ret = board_ddr_power_init(STM32MP_LPDDR3_32);
|
||||||
|
else
|
||||||
|
ret = board_ddr_power_init(STM32MP_LPDDR3_16);
|
||||||
|
}
|
||||||
if (ret)
|
if (ret)
|
||||||
panic("ddr power init failed\n");
|
panic("ddr power init failed\n");
|
||||||
|
|
||||||
|
@ -746,7 +769,8 @@ start:
|
||||||
*/
|
*/
|
||||||
set_reg(priv, REGPHY_REG, &config->p_reg);
|
set_reg(priv, REGPHY_REG, &config->p_reg);
|
||||||
set_reg(priv, REGPHY_TIMING, &config->p_timing);
|
set_reg(priv, REGPHY_TIMING, &config->p_timing);
|
||||||
set_reg(priv, REGPHY_CAL, &config->p_cal);
|
if (config->p_cal_present)
|
||||||
|
set_reg(priv, REGPHY_CAL, &config->p_cal);
|
||||||
|
|
||||||
if (INTERACTIVE(STEP_PHY_INIT))
|
if (INTERACTIVE(STEP_PHY_INIT))
|
||||||
goto start;
|
goto start;
|
||||||
|
@ -781,13 +805,16 @@ start:
|
||||||
|
|
||||||
wait_operating_mode(priv, DDRCTRL_STAT_OPERATING_MODE_NORMAL);
|
wait_operating_mode(priv, DDRCTRL_STAT_OPERATING_MODE_NORMAL);
|
||||||
|
|
||||||
debug("DDR DQS training : ");
|
if (config->p_cal_present) {
|
||||||
|
debug("DDR DQS training skipped.\n");
|
||||||
|
} else {
|
||||||
|
debug("DDR DQS training : ");
|
||||||
/* 8. Disable Auto refresh and power down by setting
|
/* 8. Disable Auto refresh and power down by setting
|
||||||
* - RFSHCTL3.dis_au_refresh = 1
|
* - RFSHCTL3.dis_au_refresh = 1
|
||||||
* - PWRCTL.powerdown_en = 0
|
* - PWRCTL.powerdown_en = 0
|
||||||
* - DFIMISC.dfiinit_complete_en = 0
|
* - DFIMISC.dfiinit_complete_en = 0
|
||||||
*/
|
*/
|
||||||
stm32mp1_refresh_disable(priv->ctl);
|
stm32mp1_refresh_disable(priv->ctl);
|
||||||
|
|
||||||
/* 9. Program PUBL PGCR to enable refresh during training and rank to train
|
/* 9. Program PUBL PGCR to enable refresh during training and rank to train
|
||||||
* not done => keep the programed value in PGCR
|
* not done => keep the programed value in PGCR
|
||||||
|
@ -795,14 +822,15 @@ start:
|
||||||
|
|
||||||
/* 10. configure PUBL PIR register to specify which training step to run */
|
/* 10. configure PUBL PIR register to specify which training step to run */
|
||||||
/* warning : RVTRN is not supported by this PUBL */
|
/* warning : RVTRN is not supported by this PUBL */
|
||||||
stm32mp1_ddrphy_init(priv->phy, DDRPHYC_PIR_QSTRN);
|
stm32mp1_ddrphy_init(priv->phy, DDRPHYC_PIR_QSTRN);
|
||||||
|
|
||||||
/* 11. monitor PUB PGSR.IDONE to poll cpmpletion of training sequence */
|
/* 11. monitor PUB PGSR.IDONE to poll cpmpletion of training sequence */
|
||||||
ddrphy_idone_wait(priv->phy);
|
ddrphy_idone_wait(priv->phy);
|
||||||
|
|
||||||
/* 12. set back registers in step 8 to the orginal values if desidered */
|
/* 12. set back registers in step 8 to the orginal values if desidered */
|
||||||
stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
|
stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
|
||||||
config->c_reg.pwrctl);
|
config->c_reg.pwrctl);
|
||||||
|
} /* if (config->p_cal_present) */
|
||||||
|
|
||||||
/* enable uMCTL2 AXI port 0 and 1 */
|
/* enable uMCTL2 AXI port 0 and 1 */
|
||||||
setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
|
setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
|
||||||
|
|
|
@ -170,6 +170,7 @@ struct stm32mp1_ddr_config {
|
||||||
struct stm32mp1_ddrphy_reg p_reg;
|
struct stm32mp1_ddrphy_reg p_reg;
|
||||||
struct stm32mp1_ddrphy_timing p_timing;
|
struct stm32mp1_ddrphy_timing p_timing;
|
||||||
struct stm32mp1_ddrphy_cal p_cal;
|
struct stm32mp1_ddrphy_cal p_cal;
|
||||||
|
bool p_cal_present;
|
||||||
};
|
};
|
||||||
|
|
||||||
int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u32 mem_speed);
|
int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u32 mem_speed);
|
||||||
|
|
|
@ -260,6 +260,7 @@ struct stm32mp1_ddrphy {
|
||||||
|
|
||||||
#define DDRCTRL_MRSTAT_MR_WR_BUSY BIT(0)
|
#define DDRCTRL_MRSTAT_MR_WR_BUSY BIT(0)
|
||||||
|
|
||||||
|
#define DDRCTRL_PWRCTL_SELFREF_EN BIT(0)
|
||||||
#define DDRCTRL_PWRCTL_POWERDOWN_EN BIT(1)
|
#define DDRCTRL_PWRCTL_POWERDOWN_EN BIT(1)
|
||||||
#define DDRCTRL_PWRCTL_SELFREF_SW BIT(5)
|
#define DDRCTRL_PWRCTL_SELFREF_SW BIT(5)
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ static void stm32mp1_do_usage(void)
|
||||||
"help displays help\n"
|
"help displays help\n"
|
||||||
"info displays DDR information\n"
|
"info displays DDR information\n"
|
||||||
"info <param> <val> changes DDR information\n"
|
"info <param> <val> changes DDR information\n"
|
||||||
" with <param> = step, name, size or speed\n"
|
" with <param> = step, name, size, speed or cal\n"
|
||||||
"freq displays the DDR PHY frequency in kHz\n"
|
"freq displays the DDR PHY frequency in kHz\n"
|
||||||
"freq <freq> changes the DDR PHY frequency\n"
|
"freq <freq> changes the DDR PHY frequency\n"
|
||||||
"param [type|reg] prints input parameters\n"
|
"param [type|reg] prints input parameters\n"
|
||||||
|
@ -160,6 +160,7 @@ static void stm32mp1_do_info(struct ddr_info *priv,
|
||||||
printf("name = %s\n", config->info.name);
|
printf("name = %s\n", config->info.name);
|
||||||
printf("size = 0x%x\n", config->info.size);
|
printf("size = 0x%x\n", config->info.size);
|
||||||
printf("speed = %d kHz\n", config->info.speed);
|
printf("speed = %d kHz\n", config->info.speed);
|
||||||
|
printf("cal = %d\n", config->p_cal_present);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,6 +209,16 @@ static void stm32mp1_do_info(struct ddr_info *priv,
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(argv[1], "cal")) {
|
||||||
|
if (strict_strtoul(argv[2], 10, &value) < 0 ||
|
||||||
|
(value != 0 && value != 1)) {
|
||||||
|
printf("invalid value %s\n", argv[2]);
|
||||||
|
} else {
|
||||||
|
config->p_cal_present = value;
|
||||||
|
printf("cal = %d\n", config->p_cal_present);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
printf("argument %s invalid\n", argv[1]);
|
printf("argument %s invalid\n", argv[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +378,6 @@ bool stm32mp1_ddr_interactive(void *priv,
|
||||||
enum stm32mp1_ddr_interact_step step,
|
enum stm32mp1_ddr_interact_step step,
|
||||||
const struct stm32mp1_ddr_config *config)
|
const struct stm32mp1_ddr_config *config)
|
||||||
{
|
{
|
||||||
const char *prompt = "DDR>";
|
|
||||||
char buffer[CONFIG_SYS_CBSIZE];
|
char buffer[CONFIG_SYS_CBSIZE];
|
||||||
char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */
|
char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */
|
||||||
int argc;
|
int argc;
|
||||||
|
@ -403,13 +413,12 @@ bool stm32mp1_ddr_interactive(void *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%d:%s\n", step, step_str[step]);
|
printf("%d:%s\n", step, step_str[step]);
|
||||||
printf("%s\n", prompt);
|
|
||||||
|
|
||||||
if (next_step > step)
|
if (next_step > step)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
while (next_step == step) {
|
while (next_step == step) {
|
||||||
cli_readline_into_buffer(prompt, buffer, 0);
|
cli_readline_into_buffer("DDR>", buffer, 0);
|
||||||
argc = cli_simple_parse_line(buffer, argv);
|
argc = cli_simple_parse_line(buffer, argv);
|
||||||
if (!argc)
|
if (!argc)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -65,18 +65,22 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||||
struct clk axidcg;
|
struct clk axidcg;
|
||||||
struct stm32mp1_ddr_config config;
|
struct stm32mp1_ddr_config config;
|
||||||
|
|
||||||
#define PARAM(x, y) \
|
#define PARAM(x, y, z) \
|
||||||
{ x,\
|
{ .name = x, \
|
||||||
offsetof(struct stm32mp1_ddr_config, y),\
|
.offset = offsetof(struct stm32mp1_ddr_config, y), \
|
||||||
sizeof(config.y) / sizeof(u32)}
|
.size = sizeof(config.y) / sizeof(u32), \
|
||||||
|
.present = z, \
|
||||||
|
}
|
||||||
|
|
||||||
#define CTL_PARAM(x) PARAM("st,ctl-"#x, c_##x)
|
#define CTL_PARAM(x) PARAM("st,ctl-"#x, c_##x, NULL)
|
||||||
#define PHY_PARAM(x) PARAM("st,phy-"#x, p_##x)
|
#define PHY_PARAM(x) PARAM("st,phy-"#x, p_##x, NULL)
|
||||||
|
#define PHY_PARAM_OPT(x) PARAM("st,phy-"#x, p_##x, &config.p_##x##_present)
|
||||||
|
|
||||||
const struct {
|
const struct {
|
||||||
const char *name; /* name in DT */
|
const char *name; /* name in DT */
|
||||||
const u32 offset; /* offset in config struct */
|
const u32 offset; /* offset in config struct */
|
||||||
const u32 size; /* size of parameters */
|
const u32 size; /* size of parameters */
|
||||||
|
bool * const present; /* presence indication for opt */
|
||||||
} param[] = {
|
} param[] = {
|
||||||
CTL_PARAM(reg),
|
CTL_PARAM(reg),
|
||||||
CTL_PARAM(timing),
|
CTL_PARAM(timing),
|
||||||
|
@ -84,7 +88,7 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||||
CTL_PARAM(perf),
|
CTL_PARAM(perf),
|
||||||
PHY_PARAM(reg),
|
PHY_PARAM(reg),
|
||||||
PHY_PARAM(timing),
|
PHY_PARAM(timing),
|
||||||
PHY_PARAM(cal)
|
PHY_PARAM_OPT(cal)
|
||||||
};
|
};
|
||||||
|
|
||||||
config.info.speed = dev_read_u32_default(dev, "st,mem-speed", 0);
|
config.info.speed = dev_read_u32_default(dev, "st,mem-speed", 0);
|
||||||
|
@ -103,11 +107,25 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||||
param[idx].size);
|
param[idx].size);
|
||||||
debug("%s: %s[0x%x] = %d\n", __func__,
|
debug("%s: %s[0x%x] = %d\n", __func__,
|
||||||
param[idx].name, param[idx].size, ret);
|
param[idx].name, param[idx].size, ret);
|
||||||
if (ret) {
|
if (ret &&
|
||||||
|
(ret != -FDT_ERR_NOTFOUND || !param[idx].present)) {
|
||||||
pr_err("%s: Cannot read %s, error=%d\n",
|
pr_err("%s: Cannot read %s, error=%d\n",
|
||||||
__func__, param[idx].name, ret);
|
__func__, param[idx].name, ret);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (param[idx].present) {
|
||||||
|
/* save presence of optional parameters */
|
||||||
|
*param[idx].present = true;
|
||||||
|
if (ret == -FDT_ERR_NOTFOUND) {
|
||||||
|
*param[idx].present = false;
|
||||||
|
#ifdef CONFIG_STM32MP1_DDR_INTERACTIVE
|
||||||
|
/* reset values if used later */
|
||||||
|
memset((void *)((u32)&config +
|
||||||
|
param[idx].offset),
|
||||||
|
0, param[idx].size * sizeof(u32));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = clk_get_by_name(dev, "axidcg", &axidcg);
|
ret = clk_get_by_name(dev, "axidcg", &axidcg);
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <ram.h>
|
#include <ram.h>
|
||||||
#include <reset.h>
|
#include <reset.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/iopoll.h>
|
||||||
|
|
||||||
#include "stm32mp1_ddr_regs.h"
|
#include "stm32mp1_ddr_regs.h"
|
||||||
#include "stm32mp1_ddr.h"
|
#include "stm32mp1_ddr.h"
|
||||||
|
@ -75,6 +77,133 @@ static u8 get_nb_bytes(struct stm32mp1_ddrctl *ctl)
|
||||||
return nb_bytes;
|
return nb_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u8 get_nb_bank(struct stm32mp1_ddrctl *ctl)
|
||||||
|
{
|
||||||
|
/* Count bank address bits */
|
||||||
|
u8 bits = 0;
|
||||||
|
u32 reg, val;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap1);
|
||||||
|
/* addrmap1.addrmap_bank_b1 */
|
||||||
|
val = (reg & GENMASK(5, 0)) >> 0;
|
||||||
|
if (val <= 31)
|
||||||
|
bits++;
|
||||||
|
/* addrmap1.addrmap_bank_b2 */
|
||||||
|
val = (reg & GENMASK(13, 8)) >> 8;
|
||||||
|
if (val <= 31)
|
||||||
|
bits++;
|
||||||
|
/* addrmap1.addrmap_bank_b3 */
|
||||||
|
val = (reg & GENMASK(21, 16)) >> 16;
|
||||||
|
if (val <= 31)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 get_nb_col(struct stm32mp1_ddrctl *ctl)
|
||||||
|
{
|
||||||
|
u8 bits;
|
||||||
|
u32 reg, val;
|
||||||
|
|
||||||
|
/* Count column address bits, start at 2 for b0 and b1 (fixed) */
|
||||||
|
bits = 2;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap2);
|
||||||
|
/* addrmap2.addrmap_col_b2 */
|
||||||
|
val = (reg & GENMASK(3, 0)) >> 0;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap2.addrmap_col_b3 */
|
||||||
|
val = (reg & GENMASK(11, 8)) >> 8;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap2.addrmap_col_b4 */
|
||||||
|
val = (reg & GENMASK(19, 16)) >> 16;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap2.addrmap_col_b5 */
|
||||||
|
val = (reg & GENMASK(27, 24)) >> 24;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap3);
|
||||||
|
/* addrmap3.addrmap_col_b6 */
|
||||||
|
val = (reg & GENMASK(3, 0)) >> 0;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap3.addrmap_col_b7 */
|
||||||
|
val = (reg & GENMASK(11, 8)) >> 8;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap3.addrmap_col_b8 */
|
||||||
|
val = (reg & GENMASK(19, 16)) >> 16;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap3.addrmap_col_b9 */
|
||||||
|
val = (reg & GENMASK(27, 24)) >> 24;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap4);
|
||||||
|
/* addrmap4.addrmap_col_b10 */
|
||||||
|
val = (reg & GENMASK(3, 0)) >> 0;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap4.addrmap_col_b11 */
|
||||||
|
val = (reg & GENMASK(11, 8)) >> 8;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 get_nb_row(struct stm32mp1_ddrctl *ctl)
|
||||||
|
{
|
||||||
|
/* Count row address bits */
|
||||||
|
u8 bits = 0;
|
||||||
|
u32 reg, val;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap5);
|
||||||
|
/* addrmap5.addrmap_row_b0 */
|
||||||
|
val = (reg & GENMASK(3, 0)) >> 0;
|
||||||
|
if (val <= 11)
|
||||||
|
bits++;
|
||||||
|
/* addrmap5.addrmap_row_b1 */
|
||||||
|
val = (reg & GENMASK(11, 8)) >> 8;
|
||||||
|
if (val <= 11)
|
||||||
|
bits++;
|
||||||
|
/* addrmap5.addrmap_row_b2_10 */
|
||||||
|
val = (reg & GENMASK(19, 16)) >> 16;
|
||||||
|
if (val <= 11)
|
||||||
|
bits += 9;
|
||||||
|
else
|
||||||
|
printf("warning: addrmap5.addrmap_row_b2_10 not supported\n");
|
||||||
|
/* addrmap5.addrmap_row_b11 */
|
||||||
|
val = (reg & GENMASK(27, 24)) >> 24;
|
||||||
|
if (val <= 11)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
reg = readl(&ctl->addrmap6);
|
||||||
|
/* addrmap6.addrmap_row_b12 */
|
||||||
|
val = (reg & GENMASK(3, 0)) >> 0;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap6.addrmap_row_b13 */
|
||||||
|
val = (reg & GENMASK(11, 8)) >> 8;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap6.addrmap_row_b14 */
|
||||||
|
val = (reg & GENMASK(19, 16)) >> 16;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
/* addrmap6.addrmap_row_b15 */
|
||||||
|
val = (reg & GENMASK(27, 24)) >> 24;
|
||||||
|
if (val <= 7)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
static void itm_soft_reset(struct stm32mp1_ddrphy *phy)
|
static void itm_soft_reset(struct stm32mp1_ddrphy *phy)
|
||||||
{
|
{
|
||||||
stm32mp1_ddrphy_init(phy, DDRPHYC_PIR_ITMSRST);
|
stm32mp1_ddrphy_init(phy, DDRPHYC_PIR_ITMSRST);
|
||||||
|
@ -169,8 +298,13 @@ static void set_r0dgps_delay(struct stm32mp1_ddrphy *phy,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Basic BIST configuration for data lane tests. */
|
/* Basic BIST configuration for data lane tests. */
|
||||||
static void config_BIST(struct stm32mp1_ddrphy *phy)
|
static void config_BIST(struct stm32mp1_ddrctl *ctl,
|
||||||
|
struct stm32mp1_ddrphy *phy)
|
||||||
{
|
{
|
||||||
|
u8 nb_bank = get_nb_bank(ctl);
|
||||||
|
u8 nb_row = get_nb_row(ctl);
|
||||||
|
u8 nb_col = get_nb_col(ctl);
|
||||||
|
|
||||||
/* Selects the SDRAM bank address to be used during BIST. */
|
/* Selects the SDRAM bank address to be used during BIST. */
|
||||||
u32 bbank = 0;
|
u32 bbank = 0;
|
||||||
/* Selects the SDRAM row address to be used during BIST. */
|
/* Selects the SDRAM row address to be used during BIST. */
|
||||||
|
@ -190,18 +324,20 @@ static void config_BIST(struct stm32mp1_ddrphy *phy)
|
||||||
* must be 0 with single rank
|
* must be 0 with single rank
|
||||||
*/
|
*/
|
||||||
u32 brank = 0;
|
u32 brank = 0;
|
||||||
|
|
||||||
/* Specifies the maximum SDRAM bank address to be used during
|
/* Specifies the maximum SDRAM bank address to be used during
|
||||||
* BIST before the address & increments to the next rank.
|
* BIST before the address & increments to the next rank.
|
||||||
*/
|
*/
|
||||||
u32 bmbank = 1;
|
u32 bmbank = (1 << nb_bank) - 1;
|
||||||
/* Specifies the maximum SDRAM row address to be used during
|
/* Specifies the maximum SDRAM row address to be used during
|
||||||
* BIST before the address & increments to the next bank.
|
* BIST before the address & increments to the next bank.
|
||||||
*/
|
*/
|
||||||
u32 bmrow = 0x7FFF; /* To check */
|
u32 bmrow = (1 << nb_row) - 1;
|
||||||
/* Specifies the maximum SDRAM column address to be used during
|
/* Specifies the maximum SDRAM column address to be used during
|
||||||
* BIST before the address & increments to the next row.
|
* BIST before the address & increments to the next row.
|
||||||
*/
|
*/
|
||||||
u32 bmcol = 0x3FF; /* To check */
|
u32 bmcol = (1 << nb_col) - 1;
|
||||||
|
|
||||||
u32 bmode_conf = 0x00000001; /* DRam mode */
|
u32 bmode_conf = 0x00000001; /* DRam mode */
|
||||||
u32 bdxen_conf = 0x00000001; /* BIST on Data byte */
|
u32 bdxen_conf = 0x00000001; /* BIST on Data byte */
|
||||||
u32 bdpat_conf = 0x00000002; /* Select LFSR pattern */
|
u32 bdpat_conf = 0x00000002; /* Select LFSR pattern */
|
||||||
|
@ -223,8 +359,6 @@ static void config_BIST(struct stm32mp1_ddrphy *phy)
|
||||||
|
|
||||||
writel(bcol | (brow << 12) | (bbank << 28), &phy->bistar0);
|
writel(bcol | (brow << 12) | (bbank << 28), &phy->bistar0);
|
||||||
writel(brank | (bmrank << 2) | (bainc << 4), &phy->bistar1);
|
writel(brank | (bmrank << 2) | (bainc << 4), &phy->bistar1);
|
||||||
|
|
||||||
/* To check this line : */
|
|
||||||
writel(bmcol | (bmrow << 12) | (bmbank << 28), &phy->bistar2);
|
writel(bmcol | (bmrow << 12) | (bmbank << 28), &phy->bistar2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,6 +380,8 @@ static void BIST_test(struct stm32mp1_ddrphy *phy, u8 byte,
|
||||||
bool result = true; /* BIST_SUCCESS */
|
bool result = true; /* BIST_SUCCESS */
|
||||||
u32 cnt = 0;
|
u32 cnt = 0;
|
||||||
u32 error = 0;
|
u32 error = 0;
|
||||||
|
u32 val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
bist->test_result = true;
|
bist->test_result = true;
|
||||||
|
|
||||||
|
@ -266,7 +402,7 @@ run:
|
||||||
writel(rand(), &phy->bistlsr);
|
writel(rand(), &phy->bistlsr);
|
||||||
|
|
||||||
/* some delay to reset BIST */
|
/* some delay to reset BIST */
|
||||||
mdelay(1);
|
udelay(10);
|
||||||
|
|
||||||
/*Perform BIST Run*/
|
/*Perform BIST Run*/
|
||||||
clrsetbits_le32(&phy->bistrr,
|
clrsetbits_le32(&phy->bistrr,
|
||||||
|
@ -274,27 +410,29 @@ run:
|
||||||
0x00000001);
|
0x00000001);
|
||||||
/* Write BISTRR.BINST = 3?b001; */
|
/* Write BISTRR.BINST = 3?b001; */
|
||||||
|
|
||||||
/* Wait for a number of CTL clocks before reading BIST register*/
|
/* poll on BISTGSR.BDONE and wait max 1000 us */
|
||||||
/* Wait 300 ctl_clk cycles; ... IS it really needed?? */
|
ret = readl_poll_timeout(&phy->bistgsr, val,
|
||||||
/* Perform BIST Instruction Stop*/
|
val & DDRPHYC_BISTGSR_BDDONE, 1000);
|
||||||
/* Write BISTRR.BINST = 3?b010;*/
|
|
||||||
|
|
||||||
/* poll on BISTGSR.BDONE. If 0, wait. ++TODO Add timeout */
|
if (ret < 0) {
|
||||||
while (!(readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDDONE))
|
printf("warning: BIST timeout\n");
|
||||||
;
|
|
||||||
|
|
||||||
/*Check if received correct number of words*/
|
|
||||||
/* if (Read BISTWCSR.DXWCNT = Read BISTWCR.BWCNT) */
|
|
||||||
if (((readl(&phy->bistwcsr)) >> DDRPHYC_BISTWCSR_DXWCNT_SHIFT) ==
|
|
||||||
readl(&phy->bistwcr)) {
|
|
||||||
/*Determine if there is a data comparison error*/
|
|
||||||
/* if (Read BISTGSR.BDXERR = 1?b0) */
|
|
||||||
if (readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDXERR)
|
|
||||||
result = false; /* BIST_FAIL; */
|
|
||||||
else
|
|
||||||
result = true; /* BIST_SUCCESS; */
|
|
||||||
} else {
|
|
||||||
result = false; /* BIST_FAIL; */
|
result = false; /* BIST_FAIL; */
|
||||||
|
/*Perform BIST Stop */
|
||||||
|
clrsetbits_le32(&phy->bistrr, 0x00000007, 0x00000002);
|
||||||
|
} else {
|
||||||
|
/*Check if received correct number of words*/
|
||||||
|
/* if (Read BISTWCSR.DXWCNT = Read BISTWCR.BWCNT) */
|
||||||
|
if (((readl(&phy->bistwcsr)) >> DDRPHYC_BISTWCSR_DXWCNT_SHIFT)
|
||||||
|
== readl(&phy->bistwcr)) {
|
||||||
|
/*Determine if there is a data comparison error*/
|
||||||
|
/* if (Read BISTGSR.BDXERR = 1?b0) */
|
||||||
|
if (readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDXERR)
|
||||||
|
result = false; /* BIST_FAIL; */
|
||||||
|
else
|
||||||
|
result = true; /* BIST_SUCCESS; */
|
||||||
|
} else {
|
||||||
|
result = false; /* BIST_FAIL; */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* loop while success */
|
/* loop while success */
|
||||||
|
@ -394,7 +532,7 @@ static enum test_result bit_deskew(struct stm32mp1_ddrctl *ctl,
|
||||||
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
||||||
|
|
||||||
/* Config the BIST block */
|
/* Config the BIST block */
|
||||||
config_BIST(phy);
|
config_BIST(ctl, phy);
|
||||||
pr_debug("BIST Config done.\n");
|
pr_debug("BIST Config done.\n");
|
||||||
|
|
||||||
/* Train each byte */
|
/* Train each byte */
|
||||||
|
@ -807,7 +945,7 @@ static enum test_result eye_training(struct stm32mp1_ddrctl *ctl,
|
||||||
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
||||||
|
|
||||||
/* Config the BIST block */
|
/* Config the BIST block */
|
||||||
config_BIST(phy);
|
config_BIST(ctl, phy);
|
||||||
|
|
||||||
for (byte = 0; byte < nb_bytes; byte++) {
|
for (byte = 0; byte < nb_bytes; byte++) {
|
||||||
if (ctrlc()) {
|
if (ctrlc()) {
|
||||||
|
@ -1182,15 +1320,17 @@ static u8 set_midpoint_read_dqs_gating(struct stm32mp1_ddrphy *phy, u8 byte,
|
||||||
dqs_gate_values[byte][0],
|
dqs_gate_values[byte][0],
|
||||||
dqs_gate_values[byte][1]);
|
dqs_gate_values[byte][1]);
|
||||||
pr_debug("*******the nominal values were system latency: 0 phase: 2*******\n");
|
pr_debug("*******the nominal values were system latency: 0 phase: 2*******\n");
|
||||||
set_r0dgsl_delay(phy, byte, dqs_gate_values[byte][0]);
|
|
||||||
set_r0dgps_delay(phy, byte, dqs_gate_values[byte][1]);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* if intermitant, restore defaut values */
|
/* if intermitant, restore defaut values */
|
||||||
pr_debug("dqs gating:no regular fail/pass/fail found. defaults values restored.\n");
|
pr_debug("dqs gating:no regular fail/pass/fail found. defaults values restored.\n");
|
||||||
set_r0dgsl_delay(phy, byte, 0);
|
dqs_gate_values[byte][0] = 0;
|
||||||
set_r0dgps_delay(phy, byte, 2);
|
dqs_gate_values[byte][1] = 2;
|
||||||
}
|
}
|
||||||
|
set_r0dgsl_delay(phy, byte, dqs_gate_values[byte][0]);
|
||||||
|
set_r0dgps_delay(phy, byte, dqs_gate_values[byte][1]);
|
||||||
|
printf("Byte %d, R0DGSL = %d, R0DGPS = %d\n",
|
||||||
|
byte, dqs_gate_values[byte][0], dqs_gate_values[byte][1]);
|
||||||
|
|
||||||
/* return 0 if intermittent or if both left_bound
|
/* return 0 if intermittent or if both left_bound
|
||||||
* and right_bound are not found
|
* and right_bound are not found
|
||||||
|
@ -1227,7 +1367,7 @@ static enum test_result read_dqs_gating(struct stm32mp1_ddrctl *ctl,
|
||||||
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
|
||||||
|
|
||||||
/* config the bist block */
|
/* config the bist block */
|
||||||
config_BIST(phy);
|
config_BIST(ctl, phy);
|
||||||
|
|
||||||
for (byte = 0; byte < nb_bytes; byte++) {
|
for (byte = 0; byte < nb_bytes; byte++) {
|
||||||
if (ctrlc()) {
|
if (ctrlc()) {
|
||||||
|
@ -1281,11 +1421,16 @@ static enum test_result do_read_dqs_gating(struct stm32mp1_ddrctl *ctl,
|
||||||
{
|
{
|
||||||
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
||||||
u32 pwrctl = readl(&ctl->pwrctl);
|
u32 pwrctl = readl(&ctl->pwrctl);
|
||||||
|
u32 derateen = readl(&ctl->derateen);
|
||||||
enum test_result res;
|
enum test_result res;
|
||||||
|
|
||||||
|
writel(0x0, &ctl->derateen);
|
||||||
stm32mp1_refresh_disable(ctl);
|
stm32mp1_refresh_disable(ctl);
|
||||||
|
|
||||||
res = read_dqs_gating(ctl, phy, string);
|
res = read_dqs_gating(ctl, phy, string);
|
||||||
|
|
||||||
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
||||||
|
writel(derateen, &ctl->derateen);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1296,11 +1441,16 @@ static enum test_result do_bit_deskew(struct stm32mp1_ddrctl *ctl,
|
||||||
{
|
{
|
||||||
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
||||||
u32 pwrctl = readl(&ctl->pwrctl);
|
u32 pwrctl = readl(&ctl->pwrctl);
|
||||||
|
u32 derateen = readl(&ctl->derateen);
|
||||||
enum test_result res;
|
enum test_result res;
|
||||||
|
|
||||||
|
writel(0x0, &ctl->derateen);
|
||||||
stm32mp1_refresh_disable(ctl);
|
stm32mp1_refresh_disable(ctl);
|
||||||
|
|
||||||
res = bit_deskew(ctl, phy, string);
|
res = bit_deskew(ctl, phy, string);
|
||||||
|
|
||||||
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
||||||
|
writel(derateen, &ctl->derateen);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1311,11 +1461,16 @@ static enum test_result do_eye_training(struct stm32mp1_ddrctl *ctl,
|
||||||
{
|
{
|
||||||
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
u32 rfshctl3 = readl(&ctl->rfshctl3);
|
||||||
u32 pwrctl = readl(&ctl->pwrctl);
|
u32 pwrctl = readl(&ctl->pwrctl);
|
||||||
|
u32 derateen = readl(&ctl->derateen);
|
||||||
enum test_result res;
|
enum test_result res;
|
||||||
|
|
||||||
|
writel(0x0, &ctl->derateen);
|
||||||
stm32mp1_refresh_disable(ctl);
|
stm32mp1_refresh_disable(ctl);
|
||||||
|
|
||||||
res = eye_training(ctl, phy, string);
|
res = eye_training(ctl, phy, string);
|
||||||
|
|
||||||
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
|
||||||
|
writel(derateen, &ctl->derateen);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,13 @@
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <fdtdec.h>
|
#include <clk.h>
|
||||||
#include <timer.h>
|
#include <timer.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/arch-armv7/globaltimer.h>
|
#include <asm/arch-armv7/globaltimer.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
struct sti_timer_priv {
|
struct sti_timer_priv {
|
||||||
struct globaltimer *global_timer;
|
struct globaltimer *global_timer;
|
||||||
};
|
};
|
||||||
|
@ -44,13 +43,24 @@ static int sti_timer_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||||
struct sti_timer_priv *priv = dev_get_priv(dev);
|
struct sti_timer_priv *priv = dev_get_priv(dev);
|
||||||
fdt_addr_t addr;
|
struct clk clk;
|
||||||
|
int err;
|
||||||
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
|
ulong ret;
|
||||||
|
|
||||||
/* get arm global timer base address */
|
/* get arm global timer base address */
|
||||||
addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg");
|
priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev);
|
||||||
priv->global_timer = (struct globaltimer *)addr;
|
if (!priv->global_timer)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
err = clk_get_by_index(dev, 0, &clk);
|
||||||
|
if (!err) {
|
||||||
|
ret = clk_get_rate(&clk);
|
||||||
|
if (IS_ERR_VALUE(ret))
|
||||||
|
return ret;
|
||||||
|
uc_priv->clock_rate = ret;
|
||||||
|
} else {
|
||||||
|
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
|
||||||
|
}
|
||||||
|
|
||||||
/* init timer */
|
/* init timer */
|
||||||
writel(0x01, &priv->global_timer->ctl);
|
writel(0x01, &priv->global_timer->ctl);
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#define STPMIC1_BUCK_VOUT(sel) (sel << STPMIC1_BUCK_VOUT_SHIFT)
|
#define STPMIC1_BUCK_VOUT(sel) (sel << STPMIC1_BUCK_VOUT_SHIFT)
|
||||||
|
|
||||||
#define STPMIC1_BUCK2_1200000V STPMIC1_BUCK_VOUT(24)
|
#define STPMIC1_BUCK2_1200000V STPMIC1_BUCK_VOUT(24)
|
||||||
|
#define STPMIC1_BUCK2_1250000V STPMIC1_BUCK_VOUT(26)
|
||||||
#define STPMIC1_BUCK2_1350000V STPMIC1_BUCK_VOUT(30)
|
#define STPMIC1_BUCK2_1350000V STPMIC1_BUCK_VOUT(30)
|
||||||
|
|
||||||
#define STPMIC1_BUCK3_1800000V STPMIC1_BUCK_VOUT(39)
|
#define STPMIC1_BUCK3_1800000V STPMIC1_BUCK_VOUT(39)
|
||||||
|
|
Loading…
Reference in a new issue