Compare commits

...

10 Commits

Author SHA1 Message Date
James Pace e48b3d7d0d Update for gcc 11.4. 2024-01-28 08:45:23 -05:00
Lionel VITTE 311a492c21 CMSIS-SVD: switch to branch main
Change-Id: I8c3e03d35065d2e47fae9e5cd04dcb50b4ac73c1
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-12-12 13:55:40 +05:30
Romuald JEANNE ef4a6a785d LINUX-STM32MP: v5.15-stm32mp-r2.1
Change-Id: Icc53eff4868b9b5819af646224d1620c2dc514fa
Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
2023-08-03 12:11:53 +02:00
Lionel VITTE 91c9734966 OPTEE-OS-STM32MP: 3.16.0-stm32mp-r2.1
Change-Id: Ibb1ea4150d8102d80865f1fef87ecc0309b440d1
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-08-03 12:11:53 +02:00
Lionel VITTE b0bb59f9c2 U-BOOT-STM32MP: v2021.10-stm32mp-r2.1
Change-Id: Id9cf1a6fd54d1ceb8d60eaba50dde5de86a7ba49
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-08-03 12:11:53 +02:00
Christophe Priouzeau 4bea9587c1 TF-A-STM32MP: v2.6-stm32mp-r2.1
Change-Id: If57b0aa3cce4fcf98c98e9e1c5f13bc1ecd3b74b
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-08-03 12:11:53 +02:00
Christophe Priouzeau 8c00c5ebf3 SYSTEMD: watchdog: limit time for shutdown watchdog
Change-Id: Ic855a71f1e96932cfccfe352dab98859d12a1471
Signed-off-by: Christophe Priouzeau <christophe.priouzeau@foss.st.com>
2023-08-03 12:11:53 +02:00
Lionel VITTE 85b8afb05a OPENOCD: allow empty commit
Sometimes the source directory is not cleaned but
everything is already committed. Then, git commit will fail
and so the build. Allow empty commit to bypass that issue.

Change-Id: Ib9b98dfc1b27ae74d32195b0e0e6e5aca7dd1f30
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-08-03 12:11:53 +02:00
Florian LEPELTIER 53b6894975 GCNANO-USERLAND: upgrade to new 6.4.9-20221206
Change-Id: Ie2eb911adf551d8ed7415f0135c6554cf1207527
2023-08-03 12:11:53 +02:00
Lionel VITTE 85ce72412d GCC: make symbols are dynamically available and plugins work
The Canadian build will skip the check for rdynamic. And hence the gcc
symbols are not dynamically available and the gcc plugins won't work. The
opt_pass.*set_pass_param symbols are there but not as exported symbols
so nm -D won't see them e.g..

Based on the patch found here
https://lists.openembedded.org/g/openembedded-core/topic/rfc_build_linux_with_a_oe/90687587

Change-Id: I4860565319a786f5cc511f50cbfcabad9278ed4b
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
2023-08-03 12:10:24 +02:00
41 changed files with 6927 additions and 2842 deletions

View File

@ -42,6 +42,7 @@ GPU_USERLAND_LIBRARIES_INSTALL = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/egl = "${@get_gpu_vivante_handler(d)}" PREFERRED_PROVIDER_virtual/egl = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgles1 = "${@get_gpu_vivante_handler(d)}" PREFERRED_PROVIDER_virtual/libgles1 = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgles2 = "${@get_gpu_vivante_handler(d)}" PREFERRED_PROVIDER_virtual/libgles2 = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgles3 = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgbm = "${@get_gpu_vivante_handler(d)}" PREFERRED_PROVIDER_virtual/libgbm = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/mesa = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}" PREFERRED_PROVIDER_virtual/mesa = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}"
PREFERRED_PROVIDER_virtual/libgl = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}" PREFERRED_PROVIDER_virtual/libgl = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}"

View File

@ -11,11 +11,12 @@ SRCREV = "a1f02f4f3daae7e21ee58b4c93ec3e46b8f28d15"
SRC_URI += " \ SRC_URI += " \
file://0001-v2.6-stm32mp-r1.patch \ file://0001-v2.6-stm32mp-r1.patch \
file://0002-v2.6-stm32mp-r2.patch \ file://0002-v2.6-stm32mp-r2.patch \
file://0003-v2.6-stm32mp-r2.1.patch\
" "
TF_A_VERSION = "v2.6" TF_A_VERSION = "v2.6"
TF_A_SUBVERSION = "stm32mp" TF_A_SUBVERSION = "stm32mp"
TF_A_RELEASE = "r2" TF_A_RELEASE = "r2.1"
PV = "${TF_A_VERSION}-${TF_A_SUBVERSION}-${TF_A_RELEASE}" PV = "${TF_A_VERSION}-${TF_A_SUBVERSION}-${TF_A_RELEASE}"
ARCHIVER_ST_BRANCH = "${TF_A_VERSION}-${TF_A_SUBVERSION}" ARCHIVER_ST_BRANCH = "${TF_A_VERSION}-${TF_A_SUBVERSION}"
@ -31,7 +32,7 @@ S = "${WORKDIR}/git"
BBCLASSEXTEND = "devupstream:target" BBCLASSEXTEND = "devupstream:target"
SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/arm-trusted-firmware.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}" SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/arm-trusted-firmware.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}"
SRCREV:class-devupstream = "4b6e8e9bf8fa676ff8d1358ea2cf2e44904c2473" SRCREV:class-devupstream = "aa1e9e2db80e49ed0259757a0f09ff119725409d"
# --------------------------------- # ---------------------------------
# Configure default preference to manage dynamic selection between tarball and github # Configure default preference to manage dynamic selection between tarball and github

View File

@ -92,7 +92,7 @@ TF_A_SIGN_ENABLE ??= "0"
TF_A_ENCRYPTED_ENABLE ??= "0" TF_A_ENCRYPTED_ENABLE ??= "0"
# Set metadata generation # Set metadata generation
TF_A_ENABLE_METADATA ??= "${@bb.utils.contains('MACHINE_FEATURES', 'fw-update', '1', '0', 'd')}" TF_A_ENABLE_METADATA ??= "${@bb.utils.contains('MACHINE_FEATURES', 'fw-update', '1', '0', d)}"
TF_A_METADATA_NAME ?= "metadata" TF_A_METADATA_NAME ?= "metadata"
TF_A_METADATA_SUFFIX ?= "bin" TF_A_METADATA_SUFFIX ?= "bin"
TF_A_METADATA_BINARY ??= "${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" TF_A_METADATA_BINARY ??= "${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}"

View File

@ -0,0 +1,582 @@
From 26924c80204083a5184a425f534e39fbc5d97484 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Mon, 3 Jul 2023 10:24:57 +0200
Subject: [PATCH] v2.6-stm32mp-r2.1-rc1
---
drivers/mtd/nand/spi_nand.c | 3 +-
drivers/st/bsec/bsec2.c | 17 ----------
drivers/st/uart/aarch32/stm32_console.S | 9 ++++--
fdts/stm32mp15-bl2.dtsi | 1 -
fdts/stm32mp15-bl32.dtsi | 1 -
include/drivers/spi_nand.h | 4 +++
include/drivers/st/bsec.h | 1 -
include/drivers/st/bsec2_reg.h | 1 -
plat/st/common/stm32cubeprogrammer_uart.c | 9 +++++-
plat/st/stm32mp1/include/stm32mp1_private.h | 4 ++-
plat/st/stm32mp1/plat_def_uuid_config.c | 11 +++++--
plat/st/stm32mp1/platform.mk | 2 +-
plat/st/stm32mp1/stm32mp1_context.c | 28 +++++++++++++++-
.../stm32mp1/stm32mp1_critic_power_wrapper.S | 9 +-----
plat/st/stm32mp1/stm32mp1_def.h | 11 +++++--
plat/st/stm32mp1/stm32mp1_low_power.c | 22 ++++++-------
plat/st/stm32mp1/stm32mp1_pm.c | 6 ++--
plat/st/stm32mp1/stm32mp1_private.c | 32 ++++++++++++++++++-
plat/st/stm32mp1/stm32mp1_ssp.c | 5 ++-
19 files changed, 119 insertions(+), 57 deletions(-)
diff --git a/drivers/mtd/nand/spi_nand.c b/drivers/mtd/nand/spi_nand.c
index abb524d7f..a18b06f58 100644
--- a/drivers/mtd/nand/spi_nand.c
+++ b/drivers/mtd/nand/spi_nand.c
@@ -17,7 +17,6 @@
#define SPI_NAND_MAX_ID_LEN 4U
#define DELAY_US_400MS 400000U
-#define MACRONIX_ID 0xC2U
static struct spinand_device spinand_dev;
@@ -91,7 +90,7 @@ static int spi_nand_quad_enable(uint8_t manufacturer_id)
{
bool enable = false;
- if (manufacturer_id != MACRONIX_ID) {
+ if ((spinand_dev.flags & SPI_NAND_HAS_QE_BIT) == 0U) {
return 0;
}
diff --git a/drivers/st/bsec/bsec2.c b/drivers/st/bsec/bsec2.c
index 6a8af5c13..8a07b118e 100644
--- a/drivers/st/bsec/bsec2.c
+++ b/drivers/st/bsec/bsec2.c
@@ -582,23 +582,6 @@ uint32_t bsec_permanent_lock_otp(uint32_t otp)
return result;
}
-/*
- * bsec_write_debug_conf: write value in debug feature.
- * to enable/disable debug service.
- * val: value to write.
- * return value: none.
- */
-void bsec_write_debug_conf(uint32_t val)
-{
- if (is_otp_invalid_mode()) {
- return;
- }
-
- bsec_lock();
- mmio_write_32(bsec_base + BSEC_DEN_OFF, val & BSEC_DEN_ALL_MSK);
- bsec_unlock();
-}
-
/*
* bsec_read_debug_conf: return debug configuration register value.
*/
diff --git a/drivers/st/uart/aarch32/stm32_console.S b/drivers/st/uart/aarch32/stm32_console.S
index abe47b53f..43039fdc7 100644
--- a/drivers/st/uart/aarch32/stm32_console.S
+++ b/drivers/st/uart/aarch32/stm32_console.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -238,14 +238,19 @@ func console_stm32_core_flush
cmp r0, #0
ASM_ASSERT(ne)
#endif /* ENABLE_ASSERTIONS */
+ /* Skip flush if UART is not enabled */
+ ldr r1, [r0, #USART_CR1]
+ tst r1, #USART_CR1_UE
+ beq 1f
/* Check Transmit Data Register Empty */
mov r2, #USART_TIMEOUT
txe_loop_3:
subs r2, r2, #1
- beq plat_panic_handler
+ beq 1f
ldr r1, [r0, #USART_ISR]
tst r1, #USART_ISR_TXE
beq txe_loop_3
+1:
bx lr
endfunc console_stm32_core_flush
diff --git a/fdts/stm32mp15-bl2.dtsi b/fdts/stm32mp15-bl2.dtsi
index 6938d9e3f..52c8e1670 100644
--- a/fdts/stm32mp15-bl2.dtsi
+++ b/fdts/stm32mp15-bl2.dtsi
@@ -42,7 +42,6 @@
/delete-node/ rtc@5c004000;
/delete-node/ etzpc@5c007000;
/delete-node/ stgen@5c008000;
- /delete-node/ i2c@5c009000;
/delete-node/ tamp@5c00a000;
pinctrl@50002000 {
diff --git a/fdts/stm32mp15-bl32.dtsi b/fdts/stm32mp15-bl32.dtsi
index 264aaf098..6de0207dd 100644
--- a/fdts/stm32mp15-bl32.dtsi
+++ b/fdts/stm32mp15-bl32.dtsi
@@ -24,7 +24,6 @@
/delete-node/ mmc@58007000;
/delete-node/ spi@5c001000;
/delete-node/ stgen@5c008000;
- /delete-node/ i2c@5c009000;
pinctrl@50002000 {
/delete-node/ fmc-0;
diff --git a/include/drivers/spi_nand.h b/include/drivers/spi_nand.h
index 40e206375..1eddbb6c0 100644
--- a/include/drivers/spi_nand.h
+++ b/include/drivers/spi_nand.h
@@ -29,9 +29,13 @@
#define SPI_NAND_STATUS_BUSY BIT(0)
#define SPI_NAND_STATUS_ECC_UNCOR BIT(5)
+/* Flags for specific configuration */
+#define SPI_NAND_HAS_QE_BIT BIT(0)
+
struct spinand_device {
struct nand_device *nand_dev;
struct spi_mem_op spi_read_cache_op;
+ uint32_t flags;
uint8_t cfg_cache; /* Cached value of SPI NAND device register CFG */
};
diff --git a/include/drivers/st/bsec.h b/include/drivers/st/bsec.h
index 145f9d783..909884289 100644
--- a/include/drivers/st/bsec.h
+++ b/include/drivers/st/bsec.h
@@ -102,7 +102,6 @@ uint32_t bsec_write_otp(uint32_t val, uint32_t otp);
uint32_t bsec_program_otp(uint32_t val, uint32_t otp);
uint32_t bsec_permanent_lock_otp(uint32_t otp);
-void bsec_write_debug_conf(uint32_t val);
uint32_t bsec_read_debug_conf(void);
void bsec_write_scratch(uint32_t val);
diff --git a/include/drivers/st/bsec2_reg.h b/include/drivers/st/bsec2_reg.h
index 0d8fedc48..fbe2e3767 100644
--- a/include/drivers/st/bsec2_reg.h
+++ b/include/drivers/st/bsec2_reg.h
@@ -94,7 +94,6 @@
#define BSEC_SPIDEN BIT(5)
#define BSEC_SPINDEN BIT(6)
#define BSEC_DBGSWGEN BIT(10)
-#define BSEC_DEN_ALL_MSK GENMASK(10, 0)
/* BSEC_FENABLE Register */
#define BSEC_FEN_ALL_MSK GENMASK(14, 0)
diff --git a/plat/st/common/stm32cubeprogrammer_uart.c b/plat/st/common/stm32cubeprogrammer_uart.c
index a993afdbf..48da167bf 100644
--- a/plat/st/common/stm32cubeprogrammer_uart.c
+++ b/plat/st/common/stm32cubeprogrammer_uart.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021-2022, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2021-2023, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -138,11 +138,13 @@ static int uart_send_result(uint8_t byte)
return uart_write_8(byte);
}
+#if !STM32MP_SSP
static int is_valid_header(fip_toc_header_t *header)
{
return (header->name == TOC_HEADER_NAME) &&
(header->serial_number != 0U);
}
+#endif
static int uart_receive_command(uint8_t *command)
{
@@ -395,12 +397,15 @@ static int uart_start_cmd(uintptr_t buffer)
return 0;
}
+#if !STM32MP_SSP
if (!is_valid_header((fip_toc_header_t *)buffer)) {
STM32PROG_ERROR("FIP Header check failed %lx, for phase %u\n",
buffer, handle.phase);
return -EIO;
}
+
VERBOSE("FIP header looks OK.\n");
+#endif
return 0;
}
@@ -589,6 +594,8 @@ static int uart_read(uint8_t id, uintptr_t buffer, size_t length)
}
}
+ stm32_uart_flush(&handle.uart);
+
return 0;
}
diff --git a/plat/st/stm32mp1/include/stm32mp1_private.h b/plat/st/stm32mp1/include/stm32mp1_private.h
index 73222815c..ccddc5bad 100644
--- a/plat/st/stm32mp1/include/stm32mp1_private.h
+++ b/plat/st/stm32mp1/include/stm32mp1_private.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -47,6 +47,8 @@ void stm32mp1_init_scmi_server(void);
void stm32mp1_pm_save_scmi_state(uint8_t *state, size_t size);
void stm32mp1_pm_restore_scmi_state(uint8_t *state, size_t size);
+bool stm32mp_bkpram_get_access(void);
+
#if defined(IMAGE_BL32) && DEBUG
void stm32mp_dump_core_registers(bool fcore);
#endif
diff --git a/plat/st/stm32mp1/plat_def_uuid_config.c b/plat/st/stm32mp1/plat_def_uuid_config.c
index efaf56701..4df414468 100644
--- a/plat/st/stm32mp1/plat_def_uuid_config.c
+++ b/plat/st/stm32mp1/plat_def_uuid_config.c
@@ -1,9 +1,11 @@
/*
- * Copyright (c) 2022, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2022-2023, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <stddef.h>
+
#include <firmware_image_package.h>
#include "tbbr_config.h"
@@ -13,6 +15,11 @@ toc_entry_t plat_def_toc_entries[] = {
.name = "STM32MP CONFIG CERT",
.uuid = UUID_STM32MP_CONFIG_CERT,
.cmdline_name = "stm32mp-cfg-cert"
+ },
+
+ {
+ .name = NULL,
+ .uuid = { {0} },
+ .cmdline_name = NULL,
}
};
-
diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk
index 9a4122184..97cedb514 100644
--- a/plat/st/stm32mp1/platform.mk
+++ b/plat/st/stm32mp1/platform.mk
@@ -14,7 +14,7 @@ STM32MP_RECONFIGURE_CONSOLE ?= 0
STM32MP_UART_BAUDRATE ?= 115200
# Add specific ST version
-ST_VERSION := r2.0
+ST_VERSION := r2.1
ST_GIT_SHA1 := $(shell git rev-parse --short=8 HEAD 2>/dev/null)
VERSION_STRING := v${VERSION_MAJOR}.${VERSION_MINOR}-${PLAT}-${ST_VERSION}(${BUILD_TYPE}):${BUILD_STRING}(${ST_GIT_SHA1})
diff --git a/plat/st/stm32mp1/stm32mp1_context.c b/plat/st/stm32mp1/stm32mp1_context.c
index 4ed88e6c4..4c881e1cf 100644
--- a/plat/st/stm32mp1/stm32mp1_context.c
+++ b/plat/st/stm32mp1/stm32mp1_context.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -158,6 +158,10 @@ uint32_t stm32_pm_get_optee_ep(void)
void stm32_clean_context(void)
{
+ if (!stm32mp_bkpram_get_access()) {
+ return;
+ }
+
clk_enable(BKPSRAM);
#if defined(IMAGE_BL2)
@@ -410,6 +414,10 @@ void stm32_context_save_bl2_param(void)
{
struct backup_data_s *backup_data;
+ if (!stm32mp_bkpram_get_access()) {
+ return;
+ }
+
clk_enable(BKPSRAM);
backup_data = (struct backup_data_s *)STM32MP_BACKUP_RAM_BASE;
@@ -578,6 +586,10 @@ void stm32mp1_pm_save_mce_mkey_in_context(uint8_t *data)
backup_data = (struct backup_data_s *)STM32MP_BACKUP_RAM_BASE;
+ if (!stm32mp_bkpram_get_access()) {
+ return;
+ }
+
clk_enable(BKPSRAM);
memcpy(backup_data->mce_mkey, data, MCE_KEY_SIZE_IN_BYTES);
@@ -591,6 +603,11 @@ void stm32mp1_pm_get_mce_mkey_from_context(uint8_t *data)
backup_data = (struct backup_data_s *)STM32MP_BACKUP_RAM_BASE;
+ if (!stm32mp_bkpram_get_access()) {
+ ERROR("DDR encryption key not available\n");
+ panic();
+ }
+
clk_enable(BKPSRAM);
memcpy(data, backup_data->mce_mkey, MCE_KEY_SIZE_IN_BYTES);
@@ -606,6 +623,10 @@ void stm32mp1_pm_save_mce_region(uint32_t index, struct stm32_mce_region_s *conf
panic();
}
+ if (!stm32mp_bkpram_get_access()) {
+ return;
+ }
+
backup_data = (struct backup_data_s *)STM32MP_BACKUP_RAM_BASE;
clk_enable(BKPSRAM);
@@ -625,6 +646,11 @@ void stm32mp1_pm_get_mce_region(uint32_t index, struct stm32_mce_region_s *confi
backup_data = (struct backup_data_s *)STM32MP_BACKUP_RAM_BASE;
+ if (!stm32mp_bkpram_get_access()) {
+ ERROR("MCE region not available\n");
+ panic();
+ }
+
clk_enable(BKPSRAM);
memcpy(config, &backup_data->mce_regions[index], sizeof(struct stm32_mce_region_s));
diff --git a/plat/st/stm32mp1/stm32mp1_critic_power_wrapper.S b/plat/st/stm32mp1/stm32mp1_critic_power_wrapper.S
index d7981d61c..c3fb5cdbf 100644
--- a/plat/st/stm32mp1/stm32mp1_critic_power_wrapper.S
+++ b/plat/st/stm32mp1/stm32mp1_critic_power_wrapper.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019-2021, STMicroelectronics - All Rights Reserved
+ * Copyright (C) 2019-2023, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -61,13 +61,6 @@ func stm32_pwr_down_wfi_wrapper
# Set sp to BL2 STACK (as BL2 is not using it anymore)
ldr sp, =__STACKS_END__
- # Disable MMU as TLB are still stored in DDR,
- # and in few instructions DDR won't be readable
- bl disable_mmu_secure
-
- # dsb is done in disable mmu
- # isb is done in disable mmu
-
mov r0, r2
mov r1, r3
diff --git a/plat/st/stm32mp1/stm32mp1_def.h b/plat/st/stm32mp1/stm32mp1_def.h
index ba92bd321..d80d64695 100644
--- a/plat/st/stm32mp1/stm32mp1_def.h
+++ b/plat/st/stm32mp1/stm32mp1_def.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -380,9 +380,11 @@ enum ddr_type {
#if STM32MP13
#define NAND_OTP "cfg9_otp"
#define NAND2_OTP "cfg10_otp"
+#define SSP_OTP "cfg9_otp"
#endif
#if STM32MP15
#define NAND_OTP "nand_otp"
+#define SSP_OTP "ssp_otp"
#endif
#define MONOTONIC_OTP "monotonic_otp"
#define UID_OTP "uid_otp"
@@ -390,7 +392,6 @@ enum ddr_type {
#define ENCKEY_OTP "enckey_otp"
#define BOARD_ID_OTP "board_id"
#define CFG2_OTP "cfg2_otp"
-#define SSP_OTP "ssp_otp"
#define CHIP_CERTIFICATE_OTP "chip_otp"
#define RMA_OTP "rma_otp"
@@ -521,7 +522,13 @@ enum ddr_type {
#define TAMP_BKP_REGISTER_BASE (TAMP_BASE + U(0x100))
#define TAMP_BKP_SEC_NUMBER U(10)
#define TAMP_BKP_S_W_NS_R_NUMBER U(5)
+#define TAMP_CR2 U(0x4)
+#define TAMP_CR2_MASK_NOER GENMASK_32(7, 0)
+#define TAMP_CR3 U(0x8)
+#define TAMP_CR3_MASK_NOER GENMASK_32(12, 0)
+#define TAMP_SR U(0x30)
#define TAMP_COUNTR U(0x40)
+#define TAMP_ERCFGR U(0x54)
#if !(defined(__LINKER__) || defined(__ASSEMBLER__))
static inline uintptr_t tamp_bkpr(uint32_t idx)
diff --git a/plat/st/stm32mp1/stm32mp1_low_power.c b/plat/st/stm32mp1/stm32mp1_low_power.c
index a4b473515..0be84c935 100644
--- a/plat/st/stm32mp1/stm32mp1_low_power.c
+++ b/plat/st/stm32mp1/stm32mp1_low_power.c
@@ -232,13 +232,6 @@ static void enter_cstop(uint32_t mode, uint32_t nsec_addr)
;
}
}
-
- /* Keep backup RAM content in standby */
- mmio_setbits_32(pwr_base + PWR_CR2, PWR_CR2_BREN);
- while ((mmio_read_32(pwr_base + PWR_CR2) &
- PWR_CR2_BRRDY) == 0U) {
- ;
- }
}
clk_disable(RTCAPB);
@@ -281,8 +274,8 @@ void stm32_exit_cstop(void)
dsb();
isb();
- /* Disable retention and backup RAM content after stop */
- mmio_clrbits_32(pwr_base + PWR_CR2, PWR_CR2_BREN | PWR_CR2_RREN);
+ /* Disable retention RAM content after stop */
+ mmio_clrbits_32(pwr_base + PWR_CR2, PWR_CR2_RREN);
/* Update STGEN counter with low power mode duration */
stm32_rtc_get_calendar(&current_calendar);
@@ -431,11 +424,18 @@ void stm32_init_low_power(void)
mmio_setbits_32(rcc_base + RCC_MP_SREQCLRR,
RCC_MP_SREQSETR_STPREQ_P0 | RCC_MP_SREQSETR_STPREQ_P1);
- /* Disable retention and backup RAM content after standby */
- mmio_clrbits_32(pwr_base + PWR_CR2, PWR_CR2_BREN | PWR_CR2_RREN);
+ /* Disable retention RAM content after standby */
+ mmio_clrbits_32(pwr_base + PWR_CR2, PWR_CR2_RREN);
/* Wait 5 HSI periods before re-enabling PLLs after STOP modes */
mmio_clrsetbits_32(rcc_base + RCC_PWRLPDLYCR,
RCC_PWRLPDLYCR_PWRLP_DLY_MASK,
PWRLP_TEMPO_5_HSI);
+
+ /* Keep backup RAM content in standby and VBAT mode */
+ mmio_setbits_32(pwr_base + PWR_CR2, PWR_CR2_BREN);
+ while ((mmio_read_32(pwr_base + PWR_CR2) &
+ PWR_CR2_BRRDY) == 0U) {
+ ;
+ }
}
diff --git a/plat/st/stm32mp1/stm32mp1_pm.c b/plat/st/stm32mp1/stm32mp1_pm.c
index 1346c11b5..c482af502 100644
--- a/plat/st/stm32mp1/stm32mp1_pm.c
+++ b/plat/st/stm32mp1/stm32mp1_pm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -169,13 +169,13 @@ static void __dead2 stm32_pwr_domain_pwr_down_wfi(const psci_power_state_t
void (*warm_entrypoint)(void) =
(void (*)(void))stm32_sec_entrypoint;
+ disable_mmu_icache_secure();
+
stm32_pwr_down_wfi(stm32_is_cstop_done(),
stm32mp1_get_lp_soc_mode(PSCI_MODE_SYSTEM_SUSPEND));
stm32_exit_cstop();
- disable_mmu_icache_secure();
-
warm_entrypoint();
}
diff --git a/plat/st/stm32mp1/stm32mp1_private.c b/plat/st/stm32mp1/stm32mp1_private.c
index 7e2c0ed4e..97f64e772 100644
--- a/plat/st/stm32mp1/stm32mp1_private.c
+++ b/plat/st/stm32mp1/stm32mp1_private.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -988,3 +988,33 @@ void stm32_set_max_fwu_trial_boot_cnt(void)
clk_disable(RTCAPB);
}
#endif /* PSA_FWU_SUPPORT */
+
+#if STM32MP13
+bool stm32mp_bkpram_get_access(void)
+{
+ static bool state = true;
+
+ if (!state) {
+ return state;
+ }
+
+ clk_enable(RTCAPB);
+
+ if ((mmio_read_32(TAMP_BASE + TAMP_ERCFGR) != 0U) &&
+ (mmio_read_32(TAMP_BASE + TAMP_SR) != 0U) &&
+ (((mmio_read_32(TAMP_BASE + TAMP_CR2) & TAMP_CR2_MASK_NOER) == 0U) ||
+ ((mmio_read_32(TAMP_BASE + TAMP_CR3) & TAMP_CR3_MASK_NOER) == 0U))) {
+ NOTICE("TAMPER detected : Degraded mode\n");
+ state = false;
+ }
+
+ clk_disable(RTCAPB);
+
+ return state;
+}
+#else /* STM32MP15 */
+bool stm32mp_bkpram_get_access(void)
+{
+ return true;
+}
+#endif
diff --git a/plat/st/stm32mp1/stm32mp1_ssp.c b/plat/st/stm32mp1/stm32mp1_ssp.c
index ed1fd8ec0..f9ff52f58 100644
--- a/plat/st/stm32mp1/stm32mp1_ssp.c
+++ b/plat/st/stm32mp1/stm32mp1_ssp.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2022, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2017-2023, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -1000,6 +1000,9 @@ void bl2_el3_plat_arch_setup(void)
initialize_pmic();
}
+ stm32_save_boot_interface(boot_context->boot_interface_selected,
+ boot_context->boot_interface_instance);
+
#if DEBUG
if (stm32mp_uart_console_setup() != 0) {
goto skip_console_init;
--
2.25.1

View File

@ -25,6 +25,7 @@ SRC_URI += "\
file://0007-ARM-v2021.10-stm32mp-r2-BOARD.patch \ file://0007-ARM-v2021.10-stm32mp-r2-BOARD.patch \
file://0008-ARM-v2021.10-stm32mp-r2-MISC-DRIVERS.patch \ file://0008-ARM-v2021.10-stm32mp-r2-MISC-DRIVERS.patch \
file://0009-ARM-v2021.10-stm32mp-r2-DEVICETREE.patch \ file://0009-ARM-v2021.10-stm32mp-r2-DEVICETREE.patch \
file://0010-ARM-v2021.10-stm32mp-r2.1.patch \
\ \
file://0099-Add-external-var-to-allow-build-of-new-devicetree-fi.patch \ file://0099-Add-external-var-to-allow-build-of-new-devicetree-fi.patch \
" "
@ -34,7 +35,7 @@ SRC_URI += "${@bb.utils.contains('ST_UBOOT_DEBUG_TRACE', '1', '', 'file://0098-s
U_BOOT_VERSION = "v2021.10" U_BOOT_VERSION = "v2021.10"
U_BOOT_SUBVERSION = "stm32mp" U_BOOT_SUBVERSION = "stm32mp"
U_BOOT_RELEASE = "r2" U_BOOT_RELEASE = "r2.1"
PV = "${U_BOOT_VERSION}-${U_BOOT_SUBVERSION}-${U_BOOT_RELEASE}" PV = "${U_BOOT_VERSION}-${U_BOOT_SUBVERSION}-${U_BOOT_RELEASE}"
@ -51,7 +52,7 @@ S = "${WORKDIR}/git"
BBCLASSEXTEND = "devupstream:target" BBCLASSEXTEND = "devupstream:target"
SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/u-boot.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}" SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/u-boot.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}"
SRCREV:class-devupstream = "3984366f6997c680b8c6ccc82d50e77a6e1cccf2" SRCREV:class-devupstream = "d1bbf3f7edb786fe854034810355e750b08a9851"
# --------------------------------- # ---------------------------------
# Configure default preference to manage dynamic selection between tarball and github # Configure default preference to manage dynamic selection between tarball and github

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,21 @@
From 9538ad0348aef5f00cd0a6858873d5ffac2e287f Mon Sep 17 00:00:00 2001 From 8ba56fabc89de0df9613c30c8e9d72513a09b017 Mon Sep 17 00:00:00 2001
From: Christophe Priouzeau <christophe.priouzeau@foss.st.com> From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 28 Sep 2022 10:52:51 +0200 Date: Thu, 6 Jul 2023 17:38:46 +0200
Subject: [PATCH] silent_mode Subject: [PATCH] silent_mode
Signed-off-by: Christophe Priouzeau <christophe.priouzeau@foss.st.com>
--- ---
include/configs/stm32mp13_st_common.h | 3 ++- include/configs/stm32mp13_st_common.h | 3 ++-
include/configs/stm32mp15_st_common.h | 3 ++- include/configs/stm32mp15_st_common.h | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-) 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/include/configs/stm32mp13_st_common.h b/include/configs/stm32mp13_st_common.h diff --git a/include/configs/stm32mp13_st_common.h b/include/configs/stm32mp13_st_common.h
index 41681537a2..49d3398663 100644 index 82a428fe63..1ee1beaae6 100644
--- a/include/configs/stm32mp13_st_common.h --- a/include/configs/stm32mp13_st_common.h
+++ b/include/configs/stm32mp13_st_common.h +++ b/include/configs/stm32mp13_st_common.h
@@ -10,7 +10,8 @@ @@ -10,7 +10,8 @@
#define STM32MP_BOARD_EXTRA_ENV \ #define STM32MP_BOARD_EXTRA_ENV \
"usb_pgood_delay=1000\0" \ "usb_pgood_delay=2000\0" \
- "console=ttySTM0\0" - "console=ttySTM0\0"
+ "console=ttySTM0\0" \ + "console=ttySTM0\0" \
+ "silent=1\0" + "silent=1\0"
@ -24,13 +23,13 @@ index 41681537a2..49d3398663 100644
#include <configs/stm32mp13_common.h> #include <configs/stm32mp13_common.h>
diff --git a/include/configs/stm32mp15_st_common.h b/include/configs/stm32mp15_st_common.h diff --git a/include/configs/stm32mp15_st_common.h b/include/configs/stm32mp15_st_common.h
index c395f7f986..81865b24ea 100644 index 9865ef5843..2542012148 100644
--- a/include/configs/stm32mp15_st_common.h --- a/include/configs/stm32mp15_st_common.h
+++ b/include/configs/stm32mp15_st_common.h +++ b/include/configs/stm32mp15_st_common.h
@@ -10,7 +10,8 @@ @@ -10,7 +10,8 @@
#define STM32MP_BOARD_EXTRA_ENV \ #define STM32MP_BOARD_EXTRA_ENV \
"usb_pgood_delay=1000\0" \ "usb_pgood_delay=2000\0" \
- "console=ttySTM0\0" - "console=ttySTM0\0"
+ "console=ttySTM0\0" \ + "console=ttySTM0\0" \
+ "silent=1\0" + "silent=1\0"

View File

@ -4,6 +4,8 @@ do_install:append:stm32mpcommon() {
install -d ${D}${systemd_unitdir}/system.conf.d/ install -d ${D}${systemd_unitdir}/system.conf.d/
echo "[Manager]" > ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf echo "[Manager]" > ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf
echo "RuntimeWatchdogSec=32" >> ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf echo "RuntimeWatchdogSec=32" >> ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf
echo "ShutdownWatchdogSec=2min" >> ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf echo "ShutdownWatchdogSec=32" >> ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf
echo "RebootWatchdogSec=32" >> ${D}${systemd_unitdir}/system.conf.d/01-watchdog.conf
fi fi
} }

View File

@ -17,7 +17,7 @@ NO_GENERIC_LICENSE[svd-STMicro] = "data/STMicro/License.html"
inherit pkgconfig autotools-brokensep gettext inherit pkgconfig autotools-brokensep gettext
SRC_URI = "git://github.com/posborne/cmsis-svd.git;protocol=https;branch=master" SRC_URI = "git://github.com/posborne/cmsis-svd.git;protocol=https;branch=main"
SRCREV = "f487b5ca7c132b8f09d11514c509372f83a6cb75" SRCREV = "f487b5ca7c132b8f09d11514c509372f83a6cb75"
PV = "0.4+git${SRCPV}" PV = "0.4+git${SRCPV}"

View File

@ -0,0 +1,4 @@
FILESEXTRAPATHS:prepend:stm32mpcommon := "${THISDIR}/gcc:"
SRC_URI += " \
file://0031-make-gcc-plugins-work-for-the-sdk.patch \
"

View File

@ -0,0 +1,80 @@
From a426b2c12053304035854184976637a665d3396a Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 1 Feb 2023 15:29:23 +0100
Subject: [PATCH] make gcc-plugins work for the sdk
Upstream-Status: Pending
---
config/gcc-plugin.m4 | 11 ++++++++++-
gcc/configure | 12 +++++++++++-
gcc/plugin.c | 5 +++++
3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/config/gcc-plugin.m4 b/config/gcc-plugin.m4
index 8f2787191..966d4c14e 100644
--- a/config/gcc-plugin.m4
+++ b/config/gcc-plugin.m4
@@ -77,7 +77,16 @@ AC_DEFUN([GCC_ENABLE_PLUGINS],
AC_MSG_RESULT([$plugin_rdynamic])
fi
else
- AC_MSG_RESULT([unable to check])
+ case "${host}" in
+ *-*-linux*)
+ AC_MSG_RESULT([unable to check, guessing -rdynamic is needed])
+ plugin_rdynamic=yes
+ pluginlibs="-rdynamic"
+ ;;
+ *)
+ AC_MSG_RESULT([unable to check])
+ ;;
+ esac
fi
# Check -ldl
diff --git a/gcc/configure b/gcc/configure
index 27ca7dfa4..a731fbbdc 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -32137,8 +32137,18 @@ $as_echo_n "checking for -rdynamic... " >&6; }
$as_echo "$plugin_rdynamic" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to check" >&5
+ case "${host}" in
+ *-*-linux*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to check, guessing -rdynamic is needed" >&5
+$as_echo "unable to check, guessing -rdynamic is needed" >&6; }
+ plugin_rdynamic=yes
+ pluginlibs="-rdynamic"
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to check" >&5
$as_echo "unable to check" >&6; }
+ ;;
+ esac
fi
# Check -ldl
diff --git a/gcc/plugin.c b/gcc/plugin.c
index d47fa512a..21a98c223 100644
--- a/gcc/plugin.c
+++ b/gcc/plugin.c
@@ -980,9 +980,14 @@ plugin_default_version_check (struct plugin_gcc_version *gcc_version,
return false;
if (strcmp (gcc_version->revision, plugin_version->revision))
return false;
+#if 0
+ /* In case of a cross compiler, this compares the cross config with the native
+ config, which will always fail, at least for OE. Disable it. */
if (strcmp (gcc_version->configuration_arguments,
plugin_version->configuration_arguments))
return false;
+#endif
+
return true;
}
--
2.17.1

View File

@ -19,5 +19,5 @@ SRC_URI += ""
# To be removed after a new jimtcl release get used by openocd. # To be removed after a new jimtcl release get used by openocd.
do_configure:prepend() { do_configure:prepend() {
git add jimtcl git add jimtcl
git commit -m "Update jimtcl" git commit --allow-empty -m "Update jimtcl"
} }

View File

@ -6,12 +6,12 @@ LIC_FILES_CHKSUM = "file://${GCNANO_TAR_FILENAME}/LICENSE;md5=dd36864f287701862a
DEPENDS += " libdrm wayland " DEPENDS += " libdrm wayland "
SRC_URI = "git://github.com/STMicroelectronics/gcnano-binaries;protocol=https;branch=gcnano-${GCNANO_VERSION}-binaries" SRC_URI = "git://github.com/STMicroelectronics/gcnano-binaries;protocol=https;branch=gcnano-${GCNANO_VERSION}-binaries"
SRCREV = "787d3311e1bae40805fe2091be653eaadf059611" SRCREV = "0ac1a89d7a59d040a69745a85f0da7e98644cc4b"
PV = "${GCNANO_VERSION}+${GCNANO_DATE}" PV = "${GCNANO_VERSION}+${GCNANO_DATE}"
GCNANO_VERSION = "6.4.9" GCNANO_VERSION = "6.4.9"
GCNANO_DATE = "20221020" GCNANO_DATE = "20221206"
S = "${WORKDIR}/git" S = "${WORKDIR}/git"
B = "${S}/${GCNANO_TAR_FILENAME}" B = "${S}/${GCNANO_TAR_FILENAME}"

View File

@ -8,6 +8,7 @@ PROVIDES = "\
${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'gbm', 'virtual/libgbm', '', d)} \ ${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'gbm', 'virtual/libgbm', '', d)} \
${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'glesv1', 'virtual/libgles1', '', d)} \ ${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'glesv1', 'virtual/libgles1', '', d)} \
${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'glesv2', 'virtual/libgles2', '', d)} \ ${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'glesv2', 'virtual/libgles2', '', d)} \
${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'glesv2', 'virtual/libgles3', '', d)} \
${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'vg', 'virtual/libopenvg', '', d)} \ ${@bb.utils.contains('GCNANO_PACKAGECONFIG', 'vg', 'virtual/libopenvg', '', d)} \
" "

View File

@ -1,9 +1,9 @@
From 84827f5873b8cd852cc79177e9a42b12760b3723 Mon Sep 17 00:00:00 2001 From 79ae410c50b3664a3006547c2235128e5f4736d1 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 13 Oct 2022 12:22:34 +0200 Date: Tue, 25 Jul 2023 10:34:11 +0200
Subject: [PATCH 01/22] v5.15-stm32mp-r2 MACHINE Subject: [PATCH 01/22] v5.15-stm32mp-r2.1 MACHINE
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
Documentation/arm/index.rst | 1 + Documentation/arm/index.rst | 1 +
.../arm/stm32/stm32mp13-overview.rst | 37 +++++++++++++++++++ .../arm/stm32/stm32mp13-overview.rst | 37 +++++++++++++++++++

View File

@ -1,9 +1,9 @@
From 7fce50075a5475b4af7b4918076e0577457530c9 Mon Sep 17 00:00:00 2001 From b931df769e83687f9676f7fbe0154b9a88c3812e Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:22:35 +0100 Date: Tue, 25 Jul 2023 10:35:04 +0200
Subject: [PATCH 02/22] v5.15-stm32mp-r2 CLOCK Subject: [PATCH 02/22] v5.15-stm32mp-r2.1 CLOCK
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
drivers/clk/Kconfig | 5 + drivers/clk/Kconfig | 5 +
drivers/clk/Makefile | 1 + drivers/clk/Makefile | 1 +
@ -32,7 +32,7 @@ Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
create mode 100644 include/dt-bindings/clock/stm32mp13-clks.h create mode 100644 include/dt-bindings/clock/stm32mp13-clks.h
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index c5b3dc97396a..c23287f7d108 100644 index 100e474ff3dc..0a93f074cede 100644
--- a/drivers/clk/Kconfig --- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig
@@ -334,6 +334,11 @@ config COMMON_CLK_VC5 @@ -334,6 +334,11 @@ config COMMON_CLK_VC5

View File

@ -1,86 +1,17 @@
From 7b129c9db71e9dcb515a4585861898b6a3644f1b Mon Sep 17 00:00:00 2001 From 3297b2b5cfda8baab37e49aadea8b6fc6a755326 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:23:32 +0100 Date: Tue, 25 Jul 2023 10:35:55 +0200
Subject: [PATCH 03/22] v5.15-stm32mp-r2 CPUFREQ Subject: [PATCH 03/22] v5.15-stm32mp-r2.1 CPUFREQ
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/cpufreq/stm32-cpufreq.txt | 61 +++++++++++
drivers/cpufreq/Kconfig.arm | 7 ++ drivers/cpufreq/Kconfig.arm | 7 ++
drivers/cpufreq/Makefile | 1 + drivers/cpufreq/Makefile | 1 +
drivers/cpufreq/cpufreq-dt-platdev.c | 1 + drivers/cpufreq/cpufreq-dt-platdev.c | 1 +
drivers/cpufreq/stm32-cpufreq.c | 103 ++++++++++++++++++ drivers/cpufreq/stm32-cpufreq.c | 103 +++++++++++++++++++++++++++
5 files changed, 173 insertions(+) 4 files changed, 112 insertions(+)
create mode 100644 Documentation/devicetree/bindings/cpufreq/stm32-cpufreq.txt
create mode 100644 drivers/cpufreq/stm32-cpufreq.c create mode 100644 drivers/cpufreq/stm32-cpufreq.c
diff --git a/Documentation/devicetree/bindings/cpufreq/stm32-cpufreq.txt b/Documentation/devicetree/bindings/cpufreq/stm32-cpufreq.txt
new file mode 100644
index 000000000000..1292eb2612a0
--- /dev/null
+++ b/Documentation/devicetree/bindings/cpufreq/stm32-cpufreq.txt
@@ -0,0 +1,61 @@
+STM32 CPUFreq and OPP bindings
+==============================
+
+STM32 CPUFreq driver needs to read chip information from the SoC to list
+available OPPs. Then it depends on cpufreq-dt bindings.
+
+Required properties:
+--------------------
+- clocks: Phandle to the cpu clock "cpu".
+- clocks-name: Should contain "cpu".
+- nvmem-cells: Phandle to nvmem cell that contains "part_number".
+- nvmem-cell-names: Must be "part_number".
+- operating-points-v2: Phandle to operating points table. See ../power/opp.txt
+ for more details.
+
+Optional properties:
+--------------------
+See cpufreq-dt.txt for optional properties.
+
+Examples:
+---------
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu0: cpu@0 {
+ compatible = "arm,cortex-a7";
+ device_type = "cpu";
+ reg = <0>;
+ clocks = <&rcc CK_MPU>;
+ clock-names = "cpu";
+ operating-points-v2 = <&cpu0_opp_table>;
+ nvmem-cells = <&part_number_otp>;
+ nvmem-cell-names = "part_number";
+ };
+
+ cpu1: cpu@1 {
+ compatible = "arm,cortex-a7";
+ device_type = "cpu";
+ reg = <1>;
+ clocks = <&rcc CK_MPU>;
+ clock-names = "cpu";
+ operating-points-v2 = <&cpu0_opp_table>;
+ };
+ };
+
+ cpu0_opp_table: cpu0-opp-table {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-650000000 {
+ opp-hz = /bits/ 64 <650000000>;
+ opp-microvolt = <1200000>;
+ opp-supported-hw = <0x1>;
+ };
+ opp-800000000 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <1350000>;
+ opp-supported-hw = <0x2>;
+ };
+ };
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 954749afb5fe..eac08e90768c 100644 index 954749afb5fe..eac08e90768c 100644
--- a/drivers/cpufreq/Kconfig.arm --- a/drivers/cpufreq/Kconfig.arm
@ -112,10 +43,10 @@ index 48ee5859030c..d34de1b927bf 100644
obj-$(CONFIG_ARM_TEGRA20_CPUFREQ) += tegra20-cpufreq.o obj-$(CONFIG_ARM_TEGRA20_CPUFREQ) += tegra20-cpufreq.o
obj-$(CONFIG_ARM_TEGRA124_CPUFREQ) += tegra124-cpufreq.o obj-$(CONFIG_ARM_TEGRA124_CPUFREQ) += tegra124-cpufreq.o
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
index ca1d103ec449..f205e6e9703e 100644 index e1b5975c7daa..9e3cd2746eeb 100644
--- a/drivers/cpufreq/cpufreq-dt-platdev.c --- a/drivers/cpufreq/cpufreq-dt-platdev.c
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c
@@ -150,6 +150,7 @@ static const struct of_device_id blocklist[] __initconst = { @@ -152,6 +152,7 @@ static const struct of_device_id blocklist[] __initconst = {
{ .compatible = "st,stih407", }, { .compatible = "st,stih407", },
{ .compatible = "st,stih410", }, { .compatible = "st,stih410", },
{ .compatible = "st,stih418", }, { .compatible = "st,stih418", },

View File

@ -1,9 +1,9 @@
From dc62943bb269dbe5f3294beda26e299bb00f0e97 Mon Sep 17 00:00:00 2001 From 06dab8c8240a3a813f147ce5daa94b64eaf9ff9f Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:49:53 +0100 Date: Tue, 25 Jul 2023 10:37:00 +0200
Subject: [PATCH 04/22] v5.15-stm32mp-r2 CPUIDLE-POWER Subject: [PATCH 04/22] v5.15-stm32mp-r2.1 CPUIDLE-POWER
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
drivers/cpuidle/Kconfig.arm | 8 + drivers/cpuidle/Kconfig.arm | 8 +
drivers/cpuidle/Makefile | 1 + drivers/cpuidle/Makefile | 1 +

View File

@ -1,48 +1,14 @@
From 0d2fcaf7ef322a9caec811097a3877d9a89eaae4 Mon Sep 17 00:00:00 2001 From 313fd2a08ceee58571f3af89fbb740710cb9db42 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:26:07 +0100 Date: Tue, 25 Jul 2023 10:37:32 +0200
Subject: [PATCH 05/22] v5.15-stm32mp-r2 CRYPTO Subject: [PATCH 05/22] v5.15-stm32mp-r2.1 CRYPTO
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/crypto/st,stm32-cryp.yaml | 9 + drivers/crypto/stm32/stm32-cryp.c | 741 ++++++++++++++++++++--
.../bindings/crypto/st,stm32-hash.yaml | 1 + drivers/crypto/stm32/stm32-hash.c | 999 +++++++++++++++++++++---------
drivers/crypto/stm32/stm32-cryp.c | 741 ++++++++++++- 2 files changed, 1399 insertions(+), 341 deletions(-)
drivers/crypto/stm32/stm32-hash.c | 999 ++++++++++++------
4 files changed, 1409 insertions(+), 341 deletions(-)
diff --git a/Documentation/devicetree/bindings/crypto/st,stm32-cryp.yaml b/Documentation/devicetree/bindings/crypto/st,stm32-cryp.yaml
index a4574552502a..6c3f8f7bfd67 100644
--- a/Documentation/devicetree/bindings/crypto/st,stm32-cryp.yaml
+++ b/Documentation/devicetree/bindings/crypto/st,stm32-cryp.yaml
@@ -27,6 +27,15 @@ properties:
resets:
maxItems: 1
+ dmas:
+ maxItems: 2
+ minItems: 2
+
+ dma-names:
+ items:
+ - const: in
+ - const: out
+
required:
- compatible
- reg
diff --git a/Documentation/devicetree/bindings/crypto/st,stm32-hash.yaml b/Documentation/devicetree/bindings/crypto/st,stm32-hash.yaml
index 6dd658f0912c..1a944608d8ff 100644
--- a/Documentation/devicetree/bindings/crypto/st,stm32-hash.yaml
+++ b/Documentation/devicetree/bindings/crypto/st,stm32-hash.yaml
@@ -14,6 +14,7 @@ properties:
enum:
- st,stm32f456-hash
- st,stm32f756-hash
+ - st,stm32mp13-hash
reg:
maxItems: 1
diff --git a/drivers/crypto/stm32/stm32-cryp.c b/drivers/crypto/stm32/stm32-cryp.c diff --git a/drivers/crypto/stm32/stm32-cryp.c b/drivers/crypto/stm32/stm32-cryp.c
index 81eb136b6c11..d76641596db4 100644 index 81eb136b6c11..d76641596db4 100644
--- a/drivers/crypto/stm32/stm32-cryp.c --- a/drivers/crypto/stm32/stm32-cryp.c

View File

@ -1,133 +1,15 @@
From 62911b17f33f57875c1b18ed211d5fa0f731ad42 Mon Sep 17 00:00:00 2001 From a5162908ea9e9ed9fdcb92fc16a979e9ddd6997d Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:26:34 +0100 Date: Tue, 25 Jul 2023 10:39:12 +0200
Subject: [PATCH 06/22] v5.15-stm32mp-r2 DMA Subject: [PATCH 06/22] v5.15-stm32mp-r2.1 DMA
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../devicetree/bindings/dma/st,stm32-dma.yaml | 47 + drivers/dma/stm32-dma.c | 1169 ++++++++++++++++++++++++++++++++----
.../bindings/dma/st,stm32-mdma.yaml | 12 +-
drivers/dma/stm32-dma.c | 1169 +++++++++++++++--
drivers/dma/stm32-dmamux.c | 2 +- drivers/dma/stm32-dmamux.c | 2 +-
drivers/dma/stm32-mdma.c | 147 ++- drivers/dma/stm32-mdma.c | 147 ++++-
5 files changed, 1240 insertions(+), 137 deletions(-) 3 files changed, 1185 insertions(+), 133 deletions(-)
diff --git a/Documentation/devicetree/bindings/dma/st,stm32-dma.yaml b/Documentation/devicetree/bindings/dma/st,stm32-dma.yaml
index 4bf676fd25dc..99351fe0fa17 100644
--- a/Documentation/devicetree/bindings/dma/st,stm32-dma.yaml
+++ b/Documentation/devicetree/bindings/dma/st,stm32-dma.yaml
@@ -47,6 +47,14 @@ description: |
not wait for the de-assertion of the REQuest, ACK is only managed
by transfer completion. This must only be used on channels
managing transfers for STM32 USART/UART.
+ -bit 30-29: indicated SRAM Buffer size in (2^order)*PAGE_SIZE.
+ Order is given by those 2 bits starting at 0.
+ Valid only whether Intermediate M2M transfer is set.
+ For cyclic, whether Intermediate M2M transfer is chosen, any value can be set:
+ SRAM buffer size will rely on period size and not on this DT value.
+ -bit 31: Intermediate M2M transfer from/to DDR to/from SRAM throughout MDMA
+ 0: MDMA not used to generate an intermediate M2M transfer
+ 1: MDMA used to generate an intermediate M2M transfer.
maintainers:
@@ -82,6 +90,35 @@ properties:
description: if defined, it indicates that the controller
supports memory-to-memory transfer
+ dmas:
+ description: A list of eight dma specifiers, one for each entry in dma-names.
+ Refer to stm32-mdma.yaml for more details.
+ items:
+ - description: DMA channel 0 connected to the MDMA channel specified
+ - description: DMA channel 1 connected to the MDMA channel specified
+ - description: DMA channel 2 connected to the MDMA channel specified
+ - description: DMA channel 3 connected to the MDMA channel specified
+ - description: DMA channel 4 connected to the MDMA channel specified
+ - description: DMA channel 5 connected to the MDMA channel specified
+ - description: DMA channel 6 connected to the MDMA channel specified
+ - description: DMA channel 7 connected to the MDMA channel specified
+
+ dma-names:
+ description: Represents each STM32 DMA channel connected to a STM32 MDMA one.
+ items:
+ - const: ch0
+ - const: ch1
+ - const: ch2
+ - const: ch3
+ - const: ch4
+ - const: ch5
+ - const: ch6
+ - const: ch7
+
+ memory-region:
+ description: Phandle to a node describing memory to be used for M2M intermediate transfer
+ between DMA and MDMA.
+
required:
- compatible
- reg
@@ -111,6 +148,16 @@ examples:
st,mem2mem;
resets = <&rcc 150>;
dma-requests = <8>;
+ dmas = <&mdma1 8 0x3 0x1200000a 0x40026408 0x00000020 1>,
+ <&mdma1 9 0x3 0x1200000a 0x40026408 0x00000800 1>,
+ <&mdma1 10 0x3 0x1200000a 0x40026408 0x00200000 1>,
+ <&mdma1 11 0x3 0x1200000a 0x40026408 0x08000000 1>,
+ <&mdma1 12 0x3 0x1200000a 0x4002640C 0x00000020 1>,
+ <&mdma1 13 0x3 0x1200000a 0x4002640C 0x00000800 1>,
+ <&mdma1 14 0x3 0x1200000a 0x4002640C 0x00200000 1>,
+ <&mdma1 15 0x3 0x1200000a 0x4002640C 0x08000000 1>;
+ dma-names = "ch0", "ch1", "ch2", "ch3", "ch4", "ch5", "ch6", "ch7";
+ memory-region = <&sram_dmapool>;
};
...
diff --git a/Documentation/devicetree/bindings/dma/st,stm32-mdma.yaml b/Documentation/devicetree/bindings/dma/st,stm32-mdma.yaml
index c30be840be1c..c4bb58014374 100644
--- a/Documentation/devicetree/bindings/dma/st,stm32-mdma.yaml
+++ b/Documentation/devicetree/bindings/dma/st,stm32-mdma.yaml
@@ -10,8 +10,8 @@ description: |
The STM32 MDMA is a general-purpose direct memory access controller capable of
supporting 64 independent DMA channels with 256 HW requests.
DMA clients connected to the STM32 MDMA controller must use the format
- described in the dma.txt file, using a five-cell specifier for each channel:
- a phandle to the MDMA controller plus the following five integer cells:
+ described in the dma.txt file, using a six-cell specifier for each channel:
+ a phandle to the MDMA controller plus the following six integer cells:
1. The request line number
2. The priority level
0x0: Low
@@ -48,6 +48,10 @@ description: |
if no HW ack signal is used by the MDMA client
5. A 32bit mask specifying the value to be written to acknowledge the request
if no HW ack signal is used by the MDMA client
+ 6. A bitfield value specifying if the MDMA client wants to generate M2M transfer
+ with HW trigger (1) or not (0). This bitfield should be only enabled for
+ M2M transfer triggered by STM32 DMA client. The memory devices involved in this
+ kind of transfer are SRAM and DDR.
maintainers:
- Amelie Delaunay <amelie.delaunay@st.com>
@@ -57,7 +61,7 @@ allOf:
properties:
"#dma-cells":
- const: 5
+ const: 6
compatible:
const: st,stm32h7-mdma
@@ -97,7 +101,7 @@ examples:
interrupts = <122>;
clocks = <&timer_clk>;
resets = <&rcc 992>;
- #dma-cells = <5>;
+ #dma-cells = <6>;
dma-channels = <16>;
dma-requests = <32>;
st,ahb-addr-masks = <0x20000000>, <0x00000000>;
diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c
index 7dfc743ac433..7c6078c6c3bf 100644 index 7dfc743ac433..7c6078c6c3bf 100644
--- a/drivers/dma/stm32-dma.c --- a/drivers/dma/stm32-dma.c

View File

@ -1,9 +1,9 @@
From 1f085af24db6752b0028d1aea4a451f772922b12 Mon Sep 17 00:00:00 2001 From 6c74d8a9e9dd425dc13d45fcd0c95e0b7dda589b Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:27:37 +0100 Date: Tue, 25 Jul 2023 10:40:32 +0200
Subject: [PATCH 07/22] v5.15-stm32mp-r2 DRM Subject: [PATCH 07/22] v5.15-stm32mp-r2.1 DRM
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
drivers/gpu/drm/bridge/sii902x.c | 100 +- drivers/gpu/drm/bridge/sii902x.c | 100 +-
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 5 +- drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 5 +-
@ -12,19 +12,19 @@ Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
drivers/gpu/drm/drm_connector.c | 62 + drivers/gpu/drm/drm_connector.c | 62 +
drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Kconfig | 9 +
drivers/gpu/drm/panel/Makefile | 1 + drivers/gpu/drm/panel/Makefile | 1 +
.../gpu/drm/panel/panel-orisetech-otm8009a.c | 101 +- .../gpu/drm/panel/panel-orisetech-otm8009a.c | 163 ++-
drivers/gpu/drm/panel/panel-raydium-rm68200.c | 7 +- drivers/gpu/drm/panel/panel-raydium-rm68200.c | 76 +-
drivers/gpu/drm/panel/panel-rocktech-hx8394.c | 397 ++++++ drivers/gpu/drm/panel/panel-rocktech-hx8394.c | 432 +++++++
drivers/gpu/drm/panel/panel-simple.c | 16 + drivers/gpu/drm/panel/panel-simple.c | 16 +
drivers/gpu/drm/stm/drv.c | 6 + drivers/gpu/drm/stm/drv.c | 6 +
drivers/gpu/drm/stm/dw_mipi_dsi-stm.c | 118 +- drivers/gpu/drm/stm/dw_mipi_dsi-stm.c | 118 +-
drivers/gpu/drm/stm/ltdc.c | 1118 ++++++++++++++--- drivers/gpu/drm/stm/ltdc.c | 1143 ++++++++++++++---
drivers/gpu/drm/stm/ltdc.h | 25 +- drivers/gpu/drm/stm/ltdc.h | 25 +-
drivers/video/backlight/gpio_backlight.c | 7 +- drivers/video/backlight/gpio_backlight.c | 7 +-
drivers/video/fbdev/simplefb.c | 21 +- drivers/video/fbdev/simplefb.c | 21 +-
include/drm/bridge/dw_mipi_dsi.h | 4 +- include/drm/bridge/dw_mipi_dsi.h | 4 +-
include/drm/drm_connector.h | 14 + include/drm/drm_connector.h | 14 +
19 files changed, 1763 insertions(+), 262 deletions(-) 19 files changed, 1918 insertions(+), 298 deletions(-)
create mode 100644 drivers/gpu/drm/panel/panel-rocktech-hx8394.c create mode 100644 drivers/gpu/drm/panel/panel-rocktech-hx8394.c
diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c
@ -252,7 +252,7 @@ index f195c7013137..9301aa72e6cb 100644
*val = state->hdr_output_metadata ? *val = state->hdr_output_metadata ?
state->hdr_output_metadata->base.id : 0; state->hdr_output_metadata->base.id : 0;
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 7ee29f073857..798d2cff102f 100644 index 78bc315b0b73..f240af91d401 100644
--- a/drivers/gpu/drm/drm_bridge.c --- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c
@@ -227,11 +227,13 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, @@ -227,11 +227,13 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
@ -274,10 +274,10 @@ index 7ee29f073857..798d2cff102f 100644
return ret; return ret;
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index e9b7926d9b66..c035729fa995 100644 index cfe163103cfd..185df70e94b9 100644
--- a/drivers/gpu/drm/drm_connector.c --- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c
@@ -824,6 +824,12 @@ static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = { @@ -827,6 +827,12 @@ static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = {
{ DRM_MODE_SCALE_ASPECT, "Full aspect" }, { DRM_MODE_SCALE_ASPECT, "Full aspect" },
}; };
@ -290,7 +290,7 @@ index e9b7926d9b66..c035729fa995 100644
static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = { static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = {
{ DRM_MODE_PICTURE_ASPECT_NONE, "Automatic" }, { DRM_MODE_PICTURE_ASPECT_NONE, "Automatic" },
{ DRM_MODE_PICTURE_ASPECT_4_3, "4:3" }, { DRM_MODE_PICTURE_ASPECT_4_3, "4:3" },
@@ -1776,6 +1782,62 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, @@ -1779,6 +1785,62 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector,
} }
EXPORT_SYMBOL(drm_connector_attach_scaling_mode_property); EXPORT_SYMBOL(drm_connector_attach_scaling_mode_property);
@ -386,10 +386,18 @@ index c8132050bcec..57d7948975c2 100644
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9341) += panel-ilitek-ili9341.o obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9341) += panel-ilitek-ili9341.o
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o
diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
index f80b44a8a700..70b2bb72dbbc 100644 index f8dbccd55033..e75d2fdc678f 100644
--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
+++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
@@ -60,6 +60,9 @@ @@ -10,6 +10,7 @@
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
+#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>
#include <video/mipi_display.h>
@@ -60,6 +61,9 @@
#define MCS_CMD2_ENA1 0xFF00 /* Enable Access Command2 "CMD2" */ #define MCS_CMD2_ENA1 0xFF00 /* Enable Access Command2 "CMD2" */
#define MCS_CMD2_ENA2 0xFF80 /* Enable Access Orise Command2 */ #define MCS_CMD2_ENA2 0xFF80 /* Enable Access Orise Command2 */
@ -399,7 +407,7 @@ index f80b44a8a700..70b2bb72dbbc 100644
struct otm8009a { struct otm8009a {
struct device *dev; struct device *dev;
struct drm_panel panel; struct drm_panel panel;
@@ -70,19 +73,35 @@ struct otm8009a { @@ -70,19 +74,35 @@ struct otm8009a {
bool enabled; bool enabled;
}; };
@ -448,7 +456,7 @@ index f80b44a8a700..70b2bb72dbbc 100644
}; };
static inline struct otm8009a *panel_to_otm8009a(struct drm_panel *panel) static inline struct otm8009a *panel_to_otm8009a(struct drm_panel *panel)
@@ -208,12 +227,11 @@ static int otm8009a_init_sequence(struct otm8009a *ctx) @@ -208,12 +228,11 @@ static int otm8009a_init_sequence(struct otm8009a *ctx)
/* Default portrait 480x800 rgb24 */ /* Default portrait 480x800 rgb24 */
dcs_write_seq(ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00); dcs_write_seq(ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
@ -463,7 +471,52 @@ index f80b44a8a700..70b2bb72dbbc 100644
if (ret) if (ret)
return ret; return ret;
@@ -337,24 +355,35 @@ static int otm8009a_get_modes(struct drm_panel *panel, @@ -272,16 +291,15 @@ static int otm8009a_disable(struct drm_panel *panel)
static int otm8009a_unprepare(struct drm_panel *panel)
{
struct otm8009a *ctx = panel_to_otm8009a(panel);
+ int ret;
if (!ctx->prepared)
return 0;
- if (ctx->reset_gpio) {
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
- msleep(20);
- }
-
- regulator_disable(ctx->supply);
+ pm_runtime_mark_last_busy(panel->dev);
+ ret = pm_runtime_put_autosuspend(panel->dev);
+ if (ret < 0)
+ return ret;
ctx->prepared = false;
@@ -296,20 +314,12 @@ static int otm8009a_prepare(struct drm_panel *panel)
if (ctx->prepared)
return 0;
- ret = regulator_enable(ctx->supply);
+ ret = pm_runtime_get_sync(panel->dev);
if (ret < 0) {
- dev_err(panel->dev, "failed to enable supply: %d\n", ret);
+ pm_runtime_put_autosuspend(panel->dev);
return ret;
}
- if (ctx->reset_gpio) {
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
- msleep(20);
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
- msleep(100);
- }
-
ret = otm8009a_init_sequence(ctx);
if (ret)
return ret;
@@ -337,24 +347,35 @@ static int otm8009a_get_modes(struct drm_panel *panel,
struct drm_connector *connector) struct drm_connector *connector)
{ {
struct drm_display_mode *mode; struct drm_display_mode *mode;
@ -512,7 +565,7 @@ index f80b44a8a700..70b2bb72dbbc 100644
} }
static const struct drm_panel_funcs otm8009a_drm_funcs = { static const struct drm_panel_funcs otm8009a_drm_funcs = {
@@ -419,8 +448,18 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi) @@ -419,8 +440,10 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(ctx->reset_gpio)) { if (IS_ERR(ctx->reset_gpio)) {
@ -521,23 +574,93 @@ index f80b44a8a700..70b2bb72dbbc 100644
+ ret = PTR_ERR(ctx->reset_gpio); + ret = PTR_ERR(ctx->reset_gpio);
+ if (ret != -EPROBE_DEFER) + if (ret != -EPROBE_DEFER)
+ dev_err(dev, "cannot get reset GPIO: %d\n", ret); + dev_err(dev, "cannot get reset GPIO: %d\n", ret);
+ return ret;
}
ctx->supply = devm_regulator_get(dev, "power");
@@ -467,6 +490,10 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
return ret;
}
+ pm_runtime_enable(ctx->dev);
+ pm_runtime_set_autosuspend_delay(ctx->dev, 1000);
+ pm_runtime_use_autosuspend(ctx->dev);
+
return 0;
}
@@ -477,9 +504,50 @@ static int otm8009a_remove(struct mipi_dsi_device *dsi)
mipi_dsi_detach(dsi);
drm_panel_remove(&ctx->panel);
+ pm_runtime_dont_use_autosuspend(ctx->dev);
+ pm_runtime_disable(ctx->dev);
+
return 0;
}
+static __maybe_unused int orisetech_otm8009a_suspend(struct device *dev)
+{
+ struct otm8009a *ctx = dev_get_drvdata(dev);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(20);
+
+ regulator_disable(ctx->supply);
+
+ return 0;
+}
+
+static __maybe_unused int orisetech_otm8009a_resume(struct device *dev)
+{
+ struct otm8009a *ctx = dev_get_drvdata(dev);
+ int ret;
+
+ ret = regulator_enable(ctx->supply);
+ if (ret < 0) {
+ dev_err(ctx->dev, "failed to enable supply: %d\n", ret);
+ return ret; + return ret;
+ } + }
+ +
+ /* Reset the panel to avoid visual artifacts */
+ if (ctx->reset_gpio) {
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0); + gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1); + gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(20); + msleep(20);
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0); + gpiod_set_value_cansleep(ctx->reset_gpio, 0);
} + msleep(100);
+
ctx->supply = devm_regulator_get(dev, "power"); + return 0;
+}
+
+static const struct dev_pm_ops orisetech_otm8009a_pm_ops = {
+ SET_RUNTIME_PM_OPS(orisetech_otm8009a_suspend, orisetech_otm8009a_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+};
+
static const struct of_device_id orisetech_otm8009a_of_match[] = {
{ .compatible = "orisetech,otm8009a" },
{ }
@@ -492,6 +560,7 @@ static struct mipi_dsi_driver orisetech_otm8009a_driver = {
.driver = {
.name = "panel-orisetech-otm8009a",
.of_match_table = orisetech_otm8009a_of_match,
+ .pm = &orisetech_otm8009a_pm_ops,
},
};
module_mipi_dsi_driver(orisetech_otm8009a_driver);
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
index 412c0dbcb2b6..d5542266e754 100644 index 412c0dbcb2b6..6bd2c6406e4a 100644
--- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
+++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
@@ -91,7 +91,7 @@ static const struct drm_display_mode default_mode = { @@ -10,6 +10,7 @@
#include <linux/gpio/consumer.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
+#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>
#include <video/mipi_display.h>
@@ -91,7 +92,7 @@ static const struct drm_display_mode default_mode = {
.vsync_start = 1280 + 12, .vsync_start = 1280 + 12,
.vsync_end = 1280 + 12 + 5, .vsync_end = 1280 + 12 + 5,
.vtotal = 1280 + 12 + 5 + 12, .vtotal = 1280 + 12 + 5 + 12,
@ -546,7 +669,48 @@ index 412c0dbcb2b6..d5542266e754 100644
.width_mm = 68, .width_mm = 68,
.height_mm = 122, .height_mm = 122,
}; };
@@ -347,6 +347,8 @@ static int rm68200_get_modes(struct drm_panel *panel, @@ -260,14 +261,10 @@ static int rm68200_unprepare(struct drm_panel *panel)
if (ret)
dev_warn(panel->dev, "failed to enter sleep mode: %d\n", ret);
- msleep(120);
-
- if (ctx->reset_gpio) {
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
- msleep(20);
- }
-
- regulator_disable(ctx->supply);
+ pm_runtime_mark_last_busy(panel->dev);
+ ret = pm_runtime_put_autosuspend(panel->dev);
+ if (ret < 0)
+ return ret;
ctx->prepared = false;
@@ -283,19 +280,12 @@ static int rm68200_prepare(struct drm_panel *panel)
if (ctx->prepared)
return 0;
- ret = regulator_enable(ctx->supply);
+ ret = pm_runtime_get_sync(panel->dev);
if (ret < 0) {
- dev_err(ctx->dev, "failed to enable supply: %d\n", ret);
+ pm_runtime_put_autosuspend(panel->dev);
return ret;
}
- if (ctx->reset_gpio) {
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
- msleep(20);
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
- msleep(100);
- }
-
rm68200_init_sequence(ctx);
ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
@@ -347,6 +337,8 @@ static int rm68200_get_modes(struct drm_panel *panel,
connector->display_info.width_mm = mode->width_mm; connector->display_info.width_mm = mode->width_mm;
connector->display_info.height_mm = mode->height_mm; connector->display_info.height_mm = mode->height_mm;
@ -555,7 +719,7 @@ index 412c0dbcb2b6..d5542266e754 100644
return 1; return 1;
} }
@@ -372,7 +374,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi) @@ -372,7 +364,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(ctx->reset_gpio)) { if (IS_ERR(ctx->reset_gpio)) {
ret = PTR_ERR(ctx->reset_gpio); ret = PTR_ERR(ctx->reset_gpio);
@ -565,12 +729,81 @@ index 412c0dbcb2b6..d5542266e754 100644
return ret; return ret;
} }
@@ -409,6 +402,10 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
return ret;
}
+ pm_runtime_enable(ctx->dev);
+ pm_runtime_set_autosuspend_delay(ctx->dev, 1000);
+ pm_runtime_use_autosuspend(ctx->dev);
+
return 0;
}
@@ -419,9 +416,49 @@ static int rm68200_remove(struct mipi_dsi_device *dsi)
mipi_dsi_detach(dsi);
drm_panel_remove(&ctx->panel);
+ pm_runtime_dont_use_autosuspend(ctx->dev);
+ pm_runtime_disable(ctx->dev);
+
return 0;
}
+static __maybe_unused int raydium_rm68200_suspend(struct device *dev)
+{
+ struct rm68200 *ctx = dev_get_drvdata(dev);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(20);
+
+ regulator_disable(ctx->supply);
+
+ return 0;
+}
+
+static __maybe_unused int raydium_rm68200_resume(struct device *dev)
+{
+ struct rm68200 *ctx = dev_get_drvdata(dev);
+ int ret;
+
+ ret = regulator_enable(ctx->supply);
+ if (ret < 0) {
+ dev_err(ctx->dev, "failed to enable supply: %d\n", ret);
+ return ret;
+ }
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(20);
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+ msleep(100);
+
+ return 0;
+}
+
+static const struct dev_pm_ops raydium_rm68200_pm_ops = {
+ SET_RUNTIME_PM_OPS(raydium_rm68200_suspend, raydium_rm68200_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+};
+
static const struct of_device_id raydium_rm68200_of_match[] = {
{ .compatible = "raydium,rm68200" },
{ }
@@ -434,6 +471,7 @@ static struct mipi_dsi_driver raydium_rm68200_driver = {
.driver = {
.name = "panel-raydium-rm68200",
.of_match_table = raydium_rm68200_of_match,
+ .pm = &raydium_rm68200_pm_ops,
},
};
module_mipi_dsi_driver(raydium_rm68200_driver);
diff --git a/drivers/gpu/drm/panel/panel-rocktech-hx8394.c b/drivers/gpu/drm/panel/panel-rocktech-hx8394.c diff --git a/drivers/gpu/drm/panel/panel-rocktech-hx8394.c b/drivers/gpu/drm/panel/panel-rocktech-hx8394.c
new file mode 100644 new file mode 100644
index 000000000000..6a5926cc79ba index 000000000000..29a64a546364
--- /dev/null --- /dev/null
+++ b/drivers/gpu/drm/panel/panel-rocktech-hx8394.c +++ b/drivers/gpu/drm/panel/panel-rocktech-hx8394.c
@@ -0,0 +1,397 @@ @@ -0,0 +1,432 @@
+// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0
+/* +/*
+ * Copyright (C) STMicroelectronics SA 2022 + * Copyright (C) STMicroelectronics SA 2022
@ -582,6 +815,7 @@ index 000000000000..6a5926cc79ba
+#include <linux/gpio/consumer.h> +#include <linux/gpio/consumer.h>
+#include <linux/mod_devicetable.h> +#include <linux/mod_devicetable.h>
+#include <linux/module.h> +#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h> +#include <linux/regulator/consumer.h>
+ +
+#include <video/mipi_display.h> +#include <video/mipi_display.h>
@ -780,19 +1014,12 @@ index 000000000000..6a5926cc79ba
+ if (ctx->prepared) + if (ctx->prepared)
+ return 0; + return 0;
+ +
+ ret = regulator_enable(ctx->supply); + ret = pm_runtime_get_sync(panel->dev);
+ if (ret < 0) { + if (ret < 0) {
+ dev_err(ctx->dev, "failed to enable supply: %d\n", ret); + pm_runtime_put_autosuspend(panel->dev);
+ return ret; + return ret;
+ } + }
+ +
+ if (ctx->reset_gpio) {
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(1);
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+ msleep(50);
+ }
+
+ ret = hx8394_read_id(ctx); + ret = hx8394_read_id(ctx);
+ if (ret < 0) + if (ret < 0)
+ return ret; + return ret;
@ -837,14 +1064,10 @@ index 000000000000..6a5926cc79ba
+ if (ret) + if (ret)
+ dev_warn(panel->dev, "failed to enter sleep mode: %d\n", ret); + dev_warn(panel->dev, "failed to enter sleep mode: %d\n", ret);
+ +
+ msleep(120); + pm_runtime_mark_last_busy(panel->dev);
+ + ret = pm_runtime_put_autosuspend(panel->dev);
+ if (ctx->reset_gpio) { + if (ret < 0)
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1); + return ret;
+ msleep(20);
+ }
+
+ regulator_disable(ctx->supply);
+ +
+ ctx->prepared = false; + ctx->prepared = false;
+ +
@ -936,6 +1159,10 @@ index 000000000000..6a5926cc79ba
+ return ret; + return ret;
+ } + }
+ +
+ pm_runtime_enable(ctx->dev);
+ pm_runtime_set_autosuspend_delay(ctx->dev, 1000);
+ pm_runtime_use_autosuspend(ctx->dev);
+
+ return 0; + return 0;
+} +}
+ +
@ -946,9 +1173,49 @@ index 000000000000..6a5926cc79ba
+ mipi_dsi_detach(dsi); + mipi_dsi_detach(dsi);
+ drm_panel_remove(&ctx->panel); + drm_panel_remove(&ctx->panel);
+ +
+ pm_runtime_dont_use_autosuspend(ctx->dev);
+ pm_runtime_disable(ctx->dev);
+
+ return 0; + return 0;
+} +}
+ +
+static __maybe_unused int rocktech_hx8394_suspend(struct device *dev)
+{
+ struct hx8394 *ctx = dev_get_drvdata(dev);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ msleep(20);
+
+ regulator_disable(ctx->supply);
+
+ return 0;
+}
+
+static __maybe_unused int rocktech_hx8394_resume(struct device *dev)
+{
+ struct hx8394 *ctx = dev_get_drvdata(dev);
+ int ret;
+
+ ret = regulator_enable(ctx->supply);
+ if (ret < 0) {
+ dev_err(ctx->dev, "failed to enable supply: %d\n", ret);
+ return ret;
+ }
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ mdelay(1);
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+ msleep(50);
+
+ return 0;
+}
+
+static const struct dev_pm_ops rocktech_hx8394_pm_ops = {
+ SET_RUNTIME_PM_OPS(rocktech_hx8394_suspend, rocktech_hx8394_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+};
+
+static const struct of_device_id rocktech_hx8394_of_match[] = { +static const struct of_device_id rocktech_hx8394_of_match[] = {
+ { .compatible = "rocktech,hx8394" }, + { .compatible = "rocktech,hx8394" },
+ { } + { }
@ -961,6 +1228,7 @@ index 000000000000..6a5926cc79ba
+ .driver = { + .driver = {
+ .name = "panel-rocktech-hx8394", + .name = "panel-rocktech-hx8394",
+ .of_match_table = rocktech_hx8394_of_match, + .of_match_table = rocktech_hx8394_of_match,
+ .pm = &rocktech_hx8394_pm_ops,
+ }, + },
+}; +};
+module_mipi_dsi_driver(rocktech_hx8394_driver); +module_mipi_dsi_driver(rocktech_hx8394_driver);
@ -969,7 +1237,7 @@ index 000000000000..6a5926cc79ba
+MODULE_DESCRIPTION("DRM Driver for rocktech HX8394 MIPI DSI panel"); +MODULE_DESCRIPTION("DRM Driver for rocktech HX8394 MIPI DSI panel");
+MODULE_LICENSE("GPL v2"); +MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 8dd7013c75f2..6934f3680a14 100644 index fb785f5a106a..3af0982bed64 100644
--- a/drivers/gpu/drm/panel/panel-simple.c --- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -575,6 +575,7 @@ static int panel_dpi_probe(struct device *dev, @@ -575,6 +575,7 @@ static int panel_dpi_probe(struct device *dev,
@ -1197,7 +1465,7 @@ index 32cb41b2202f..1750b6a25e87 100644
dw_mipi_dsi_stm_plat_data.priv_data = dsi; dw_mipi_dsi_stm_plat_data.priv_data = dsi;
diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
index 9d235b60b428..3dcd63f20ee0 100644 index 9d235b60b428..30f4995f8836 100644
--- a/drivers/gpu/drm/stm/ltdc.c --- a/drivers/gpu/drm/stm/ltdc.c
+++ b/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c
@@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
@ -1710,7 +1978,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
- return 0; - return 0;
+ ret = NB_PF; /* error case, trace msg is handled by the caller */ + ret = NB_PF; /* error case, trace msg is handled by the caller */
+ break; + break;
+ } }
+ +
+ if (ret == PF_FLEXIBLE) { + if (ret == PF_FLEXIBLE) {
+ regmap_write(ldev->regmap, LTDC_L1FPF0R + lofs, + regmap_write(ldev->regmap, LTDC_L1FPF0R + lofs,
@ -1718,22 +1986,17 @@ index 9d235b60b428..3dcd63f20ee0 100644
+ +
+ regmap_write(ldev->regmap, LTDC_L1FPF1R + lofs, + regmap_write(ldev->regmap, LTDC_L1FPF1R + lofs,
+ (psize << 18) + (blen << 14) + (bpos << 9) + (glen << 5) + gpos); + (psize << 18) + (blen << 14) + (bpos << 9) + (glen << 5) + gpos);
}
+
+ return ret;
+ } + }
+ +
+ return ret;
}
-static inline u32 get_pixelformat_without_alpha(u32 drm)
+/* +/*
+ * All non-alpha color formats derived from native alpha color formats are + * All non-alpha color formats derived from native alpha color formats are
+ * either characterized by a FourCC format code + * either characterized by a FourCC format code
+ */ + */
+static inline u32 is_xrgb(u32 drm) +static inline u32 is_xrgb(u32 drm)
+{
+ return ((drm & 0xFF) == 'X' || ((drm >> 8) & 0xFF) == 'X');
}
-static inline u32 get_pixelformat_without_alpha(u32 drm)
+static inline void ltdc_set_ycbcr_config(struct drm_plane *plane, u32 drm_pix_fmt)
{ {
- switch (drm) { - switch (drm) {
- case DRM_FORMAT_ARGB4444: - case DRM_FORMAT_ARGB4444:
@ -1748,6 +2011,11 @@ index 9d235b60b428..3dcd63f20ee0 100644
- return DRM_FORMAT_XRGB8888; - return DRM_FORMAT_XRGB8888;
- case DRM_FORMAT_RGBA8888: - case DRM_FORMAT_RGBA8888:
- return DRM_FORMAT_RGBX8888; - return DRM_FORMAT_RGBX8888;
+ return ((drm & 0xFF) == 'X' || ((drm >> 8) & 0xFF) == 'X');
+}
+
+static inline void ltdc_set_ycbcr_config(struct drm_plane *plane, u32 drm_pix_fmt)
+{
+ struct ltdc_device *ldev = plane_to_ltdc(plane); + struct ltdc_device *ldev = plane_to_ltdc(plane);
+ struct drm_plane_state *state = plane->state; + struct drm_plane_state *state = plane->state;
+ u32 lofs = plane->index * LAY_OFS; + u32 lofs = plane->index * LAY_OFS;
@ -1811,7 +2079,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
+ DRM_ERROR("color range %d not supported, use limited range by default\n", ran); + DRM_ERROR("color range %d not supported, use limited range by default\n", ran);
+ /* set by default color range to DRM_COLOR_YCBCR_LIMITED_RANGE */ + /* set by default color range to DRM_COLOR_YCBCR_LIMITED_RANGE */
+ ran = DRM_COLOR_YCBCR_LIMITED_RANGE; + ran = DRM_COLOR_YCBCR_LIMITED_RANGE;
+ } }
+ +
+ DRM_DEBUG_DRIVER("Color encoding=%d, range=%d\n", enc, ran); + DRM_DEBUG_DRIVER("Color encoding=%d, range=%d\n", enc, ran);
+ regmap_write(ldev->regmap, LTDC_L1CYR0R + lofs, + regmap_write(ldev->regmap, LTDC_L1CYR0R + lofs,
@ -1829,7 +2097,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
+ if (ldev->crc_skip_count < CRC_SKIP_FRAMES) { + if (ldev->crc_skip_count < CRC_SKIP_FRAMES) {
+ ldev->crc_skip_count++; + ldev->crc_skip_count++;
+ return; + return;
} + }
+ +
+ /* Get the CRC of the frame */ + /* Get the CRC of the frame */
+ ret = regmap_read(ldev->regmap, LTDC_CCRCR, &crc); + ret = regmap_read(ldev->regmap, LTDC_CCRCR, &crc);
@ -1920,7 +2188,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
} }
@@ -447,18 +799,32 @@ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc, @@ -447,18 +799,38 @@ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
{ {
struct ltdc_device *ldev = crtc_to_ltdc(crtc); struct ltdc_device *ldev = crtc_to_ltdc(crtc);
struct drm_device *ddev = crtc->dev; struct drm_device *ddev = crtc->dev;
@ -1931,9 +2199,15 @@ index 9d235b60b428..3dcd63f20ee0 100644
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
+ /* Disable all layers */ + /* Disable all layers */
+ for (layer_index = 0; layer_index < ldev->caps.nb_layers; layer_index++) + for (layer_index = 0; layer_index < ldev->caps.nb_layers; layer_index++) {
+ regmap_write_bits(ldev->regmap, LTDC_L1CR + layer_index * LAY_OFS, + regmap_write_bits(ldev->regmap, LTDC_L1CR + layer_index * LAY_OFS,
+ LXCR_CLUTEN | LXCR_LEN, 0); + LXCR_CLUTEN | LXCR_LEN, 0);
+
+ /* immediately commit disable of layer */
+ if (ldev->caps.plane_reg_shadow)
+ regmap_write_bits(ldev->regmap, LTDC_L1RCR + layer_index * LAY_OFS,
+ LXRCR_IMR | LXRCR_VBR | LXRCR_GRMSK, LXRCR_IMR);
+ }
+ +
/* disable IRQ */ /* disable IRQ */
- reg_clear(ldev->regs, LTDC_IER, IER_RRIE | IER_FUIE | IER_TERRIE); - reg_clear(ldev->regs, LTDC_IER, IER_RRIE | IER_FUIE | IER_TERRIE);
@ -1943,10 +2217,10 @@ index 9d235b60b428..3dcd63f20ee0 100644
- reg_set(ldev->regs, LTDC_SRCR, SRCR_IMR); - reg_set(ldev->regs, LTDC_SRCR, SRCR_IMR);
+ if (!ldev->caps.plane_reg_shadow) + if (!ldev->caps.plane_reg_shadow)
+ regmap_set_bits(ldev->regmap, LTDC_SRCR, SRCR_IMR); + regmap_set_bits(ldev->regmap, LTDC_SRCR, SRCR_IMR);
+
+ pm_runtime_put_sync_suspend(ddev->dev);
- pm_runtime_put_sync(ddev->dev); - pm_runtime_put_sync(ddev->dev);
+ pm_runtime_put_sync_suspend(ddev->dev);
+
+ /* clear interrupt error counters */ + /* clear interrupt error counters */
+ mutex_lock(&ldev->err_lock); + mutex_lock(&ldev->err_lock);
+ ldev->transfer_err = 0; + ldev->transfer_err = 0;
@ -1956,7 +2230,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
#define CLK_TOLERANCE_HZ 50 #define CLK_TOLERANCE_HZ 50
@@ -533,6 +899,7 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -533,6 +905,7 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc)
struct drm_display_mode *mode = &crtc->state->adjusted_mode; struct drm_display_mode *mode = &crtc->state->adjusted_mode;
u32 hsync, vsync, accum_hbp, accum_vbp, accum_act_w, accum_act_h; u32 hsync, vsync, accum_hbp, accum_vbp, accum_act_w, accum_act_h;
u32 total_width, total_height; u32 total_width, total_height;
@ -1964,7 +2238,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
u32 bus_flags = 0; u32 bus_flags = 0;
u32 val; u32 val;
int ret; int ret;
@@ -560,10 +927,13 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -560,10 +933,13 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc)
drm_connector_list_iter_end(&iter); drm_connector_list_iter_end(&iter);
} }
@ -1980,7 +2254,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
if (!pm_runtime_active(ddev->dev)) { if (!pm_runtime_active(ddev->dev)) {
ret = pm_runtime_get_sync(ddev->dev); ret = pm_runtime_get_sync(ddev->dev);
@@ -608,26 +978,59 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -608,26 +984,59 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc)
if (bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) if (bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
val |= GCR_PCPOL; val |= GCR_PCPOL;
@ -2011,10 +2285,10 @@ index 9d235b60b428..3dcd63f20ee0 100644
val = (total_width << 16) | total_height; val = (total_width << 16) | total_height;
- reg_update_bits(ldev->regs, LTDC_TWCR, TWCR_TOTALH | TWCR_TOTALW, val); - reg_update_bits(ldev->regs, LTDC_TWCR, TWCR_TOTALH | TWCR_TOTALW, val);
+ regmap_update_bits(ldev->regmap, LTDC_TWCR, TWCR_TOTALH | TWCR_TOTALW, val); + regmap_update_bits(ldev->regmap, LTDC_TWCR, TWCR_TOTALH | TWCR_TOTALW, val);
+
+ regmap_write(ldev->regmap, LTDC_LIPCR, (accum_act_h + 1));
- reg_write(ldev->regs, LTDC_LIPCR, (accum_act_h + 1)); - reg_write(ldev->regs, LTDC_LIPCR, (accum_act_h + 1));
+ regmap_write(ldev->regmap, LTDC_LIPCR, (accum_act_h + 1));
+
+ /* Configure the output format (hw version dependent) */ + /* Configure the output format (hw version dependent) */
+ if (ldev->caps.ycbcr_output) { + if (ldev->caps.ycbcr_output) {
+ /* Input video dynamic_range & colorimetry */ + /* Input video dynamic_range & colorimetry */
@ -2047,7 +2321,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc, static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
@@ -642,7 +1045,8 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc, @@ -642,7 +1051,8 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
ltdc_crtc_update_clut(crtc); ltdc_crtc_update_clut(crtc);
/* Commit shadow registers = update planes at next vblank */ /* Commit shadow registers = update planes at next vblank */
@ -2057,7 +2331,28 @@ index 9d235b60b428..3dcd63f20ee0 100644
if (event) { if (event) {
crtc->state->event = NULL; crtc->state->event = NULL;
@@ -684,10 +1088,14 @@ static bool ltdc_crtc_get_scanout_position(struct drm_crtc *crtc, @@ -656,6 +1066,20 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
}
}
+static int ltdc_crtc_atomic_check(struct drm_crtc *crtc,
+ struct drm_atomic_state *state)
+{
+ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+
+ DRM_DEBUG_ATOMIC("\n");
+
+ /* force a full mode set if active state changed */
+ if (crtc_state->active_changed)
+ crtc_state->mode_changed = true;
+
+ return 0;
+}
+
static bool ltdc_crtc_get_scanout_position(struct drm_crtc *crtc,
bool in_vblank_irq,
int *vpos, int *hpos,
@@ -684,10 +1108,14 @@ static bool ltdc_crtc_get_scanout_position(struct drm_crtc *crtc,
* simplify the code and only test if line > vactive_end * simplify the code and only test if line > vactive_end
*/ */
if (pm_runtime_active(ddev->dev)) { if (pm_runtime_active(ddev->dev)) {
@ -2076,7 +2371,15 @@ index 9d235b60b428..3dcd63f20ee0 100644
if (line > vactive_end) if (line > vactive_end)
*vpos = line - vtotal - vactive_start; *vpos = line - vtotal - vactive_start;
@@ -723,7 +1131,7 @@ static int ltdc_crtc_enable_vblank(struct drm_crtc *crtc) @@ -712,6 +1140,7 @@ static const struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
.atomic_flush = ltdc_crtc_atomic_flush,
.atomic_enable = ltdc_crtc_atomic_enable,
.atomic_disable = ltdc_crtc_atomic_disable,
+ .atomic_check = ltdc_crtc_atomic_check,
.get_scanout_position = ltdc_crtc_get_scanout_position,
};
@@ -723,7 +1152,7 @@ static int ltdc_crtc_enable_vblank(struct drm_crtc *crtc)
DRM_DEBUG_DRIVER("\n"); DRM_DEBUG_DRIVER("\n");
if (state->enable) if (state->enable)
@ -2085,7 +2388,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
else else
return -EPERM; return -EPERM;
@@ -735,7 +1143,61 @@ static void ltdc_crtc_disable_vblank(struct drm_crtc *crtc) @@ -735,7 +1164,61 @@ static void ltdc_crtc_disable_vblank(struct drm_crtc *crtc)
struct ltdc_device *ldev = crtc_to_ltdc(crtc); struct ltdc_device *ldev = crtc_to_ltdc(crtc);
DRM_DEBUG_DRIVER("\n"); DRM_DEBUG_DRIVER("\n");
@ -2148,7 +2451,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
static const struct drm_crtc_funcs ltdc_crtc_funcs = { static const struct drm_crtc_funcs ltdc_crtc_funcs = {
@@ -748,6 +1210,22 @@ static const struct drm_crtc_funcs ltdc_crtc_funcs = { @@ -748,6 +1231,22 @@ static const struct drm_crtc_funcs ltdc_crtc_funcs = {
.enable_vblank = ltdc_crtc_enable_vblank, .enable_vblank = ltdc_crtc_enable_vblank,
.disable_vblank = ltdc_crtc_disable_vblank, .disable_vblank = ltdc_crtc_disable_vblank,
.get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
@ -2171,7 +2474,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
}; };
/* /*
@@ -773,7 +1251,8 @@ static int ltdc_plane_atomic_check(struct drm_plane *plane, @@ -773,7 +1272,8 @@ static int ltdc_plane_atomic_check(struct drm_plane *plane,
/* Reject scaling */ /* Reject scaling */
if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) { if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) {
@ -2181,7 +2484,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
return -EINVAL; return -EINVAL;
} }
@@ -784,6 +1263,7 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, @@ -784,6 +1284,7 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
struct ltdc_device *ldev = plane_to_ltdc(plane); struct ltdc_device *ldev = plane_to_ltdc(plane);
@ -2189,7 +2492,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
struct drm_plane_state *newstate = drm_atomic_get_new_plane_state(state, struct drm_plane_state *newstate = drm_atomic_get_new_plane_state(state,
plane); plane);
struct drm_framebuffer *fb = newstate->fb; struct drm_framebuffer *fb = newstate->fb;
@@ -793,7 +1273,8 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, @@ -793,7 +1294,8 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
u32 y0 = newstate->crtc_y; u32 y0 = newstate->crtc_y;
u32 y1 = newstate->crtc_y + newstate->crtc_h - 1; u32 y1 = newstate->crtc_y + newstate->crtc_h - 1;
u32 src_x, src_y, src_w, src_h; u32 src_x, src_y, src_w, src_h;
@ -2199,7 +2502,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
enum ltdc_pix_fmt pf; enum ltdc_pix_fmt pf;
if (!newstate->crtc || !fb) { if (!newstate->crtc || !fb) {
@@ -813,19 +1294,23 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, @@ -813,19 +1315,23 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
newstate->crtc_w, newstate->crtc_h, newstate->crtc_w, newstate->crtc_h,
newstate->crtc_x, newstate->crtc_y); newstate->crtc_x, newstate->crtc_y);
@ -2228,7 +2531,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
/* Specifies the pixel format */ /* Specifies the pixel format */
pf = to_ltdc_pixelformat(fb->format->format); pf = to_ltdc_pixelformat(fb->format->format);
@@ -833,24 +1318,20 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, @@ -833,24 +1339,20 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
if (ldev->caps.pix_fmt_hw[val] == pf) if (ldev->caps.pix_fmt_hw[val] == pf)
break; break;
@ -2260,7 +2563,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
/* Specifies the blending factors */ /* Specifies the blending factors */
val = BF1_PAXCA | BF2_1PAXCA; val = BF1_PAXCA | BF2_1PAXCA;
@@ -862,35 +1343,168 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, @@ -862,35 +1364,168 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
plane->type != DRM_PLANE_TYPE_PRIMARY) plane->type != DRM_PLANE_TYPE_PRIMARY)
val = BF1_PAXCA | BF2_1PAXCA; val = BF1_PAXCA | BF2_1PAXCA;
@ -2444,7 +2747,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
mutex_unlock(&ldev->err_lock); mutex_unlock(&ldev->err_lock);
} }
@@ -901,10 +1515,19 @@ static void ltdc_plane_atomic_disable(struct drm_plane *plane, @@ -901,10 +1536,19 @@ static void ltdc_plane_atomic_disable(struct drm_plane *plane,
struct drm_plane_state *oldstate = drm_atomic_get_old_plane_state(state, struct drm_plane_state *oldstate = drm_atomic_get_old_plane_state(state,
plane); plane);
struct ltdc_device *ldev = plane_to_ltdc(plane); struct ltdc_device *ldev = plane_to_ltdc(plane);
@ -2466,7 +2769,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
DRM_DEBUG_DRIVER("CRTC:%d plane:%d\n", DRM_DEBUG_DRIVER("CRTC:%d plane:%d\n",
oldstate->crtc->base.id, plane->base.id); oldstate->crtc->base.id, plane->base.id);
@@ -957,36 +1580,57 @@ static const struct drm_plane_helper_funcs ltdc_plane_helper_funcs = { @@ -957,36 +1601,57 @@ static const struct drm_plane_helper_funcs ltdc_plane_helper_funcs = {
}; };
static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, static struct drm_plane *ltdc_plane_create(struct drm_device *ddev,
@ -2515,11 +2818,11 @@ index 9d235b60b428..3dcd63f20ee0 100644
+ if (ldev->caps.non_alpha_only_l1) + if (ldev->caps.non_alpha_only_l1)
+ if (type != DRM_PLANE_TYPE_PRIMARY && is_xrgb(drm_fmt)) + if (type != DRM_PLANE_TYPE_PRIMARY && is_xrgb(drm_fmt))
+ continue; /* XR24 & RX24 like formats supported only on primary layer */ + continue; /* XR24 & RX24 like formats supported only on primary layer */
+
+ formats[nb_fmt++] = drm_fmt;
+ }
- formats[nb_fmt++] = drm_fmt_no_alpha; - formats[nb_fmt++] = drm_fmt_no_alpha;
+ formats[nb_fmt++] = drm_fmt;
+ }
+
+ /* Add YCbCr supported pixel formats */ + /* Add YCbCr supported pixel formats */
+ if (ldev->caps.ycbcr_input) { + if (ldev->caps.ycbcr_input) {
+ regmap_read(ldev->regmap, LTDC_L1C1R + lofs, &val); + regmap_read(ldev->regmap, LTDC_L1C1R + lofs, &val);
@ -2541,7 +2844,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL); plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL);
@@ -999,8 +1643,21 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, @@ -999,8 +1664,21 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev,
if (ret < 0) if (ret < 0)
return NULL; return NULL;
@ -2563,7 +2866,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
DRM_DEBUG_DRIVER("plane:%d created\n", plane->base.id); DRM_DEBUG_DRIVER("plane:%d created\n", plane->base.id);
return plane; return plane;
@@ -1019,17 +1676,42 @@ static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc) @@ -1019,17 +1697,42 @@ static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc)
{ {
struct ltdc_device *ldev = ddev->dev_private; struct ltdc_device *ldev = ddev->dev_private;
struct drm_plane *primary, *overlay; struct drm_plane *primary, *overlay;
@ -2609,7 +2912,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
if (ret) { if (ret) {
DRM_ERROR("Can not initialize CRTC\n"); DRM_ERROR("Can not initialize CRTC\n");
goto cleanup; goto cleanup;
@@ -1044,12 +1726,20 @@ static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc) @@ -1044,12 +1747,20 @@ static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc)
/* Add planes. Note : the first layer is used by primary plane */ /* Add planes. Note : the first layer is used by primary plane */
for (i = 1; i < ldev->caps.nb_layers; i++) { for (i = 1; i < ldev->caps.nb_layers; i++) {
@ -2631,7 +2934,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
return 0; return 0;
@@ -1067,7 +1757,7 @@ static void ltdc_encoder_disable(struct drm_encoder *encoder) @@ -1067,7 +1778,7 @@ static void ltdc_encoder_disable(struct drm_encoder *encoder)
DRM_DEBUG_DRIVER("\n"); DRM_DEBUG_DRIVER("\n");
/* Disable LTDC */ /* Disable LTDC */
@ -2640,7 +2943,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
/* Set to sleep state the pinctrl whatever type of encoder */ /* Set to sleep state the pinctrl whatever type of encoder */
pinctrl_pm_select_sleep_state(ddev->dev); pinctrl_pm_select_sleep_state(ddev->dev);
@@ -1080,8 +1770,12 @@ static void ltdc_encoder_enable(struct drm_encoder *encoder) @@ -1080,8 +1791,12 @@ static void ltdc_encoder_enable(struct drm_encoder *encoder)
DRM_DEBUG_DRIVER("\n"); DRM_DEBUG_DRIVER("\n");
@ -2654,7 +2957,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
} }
static void ltdc_encoder_mode_set(struct drm_encoder *encoder, static void ltdc_encoder_mode_set(struct drm_encoder *encoder,
@@ -1144,21 +1838,25 @@ static int ltdc_get_caps(struct drm_device *ddev) @@ -1144,21 +1859,25 @@ static int ltdc_get_caps(struct drm_device *ddev)
* at least 1 layer must be managed & the number of layers * at least 1 layer must be managed & the number of layers
* must not exceed LTDC_MAX_LAYER * must not exceed LTDC_MAX_LAYER
*/ */
@ -2684,7 +2987,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
/* /*
* Hw older versions support non-alpha color formats derived * Hw older versions support non-alpha color formats derived
* from native alpha color formats only on the primary layer. * from native alpha color formats only on the primary layer.
@@ -1171,13 +1869,49 @@ static int ltdc_get_caps(struct drm_device *ddev) @@ -1171,13 +1890,49 @@ static int ltdc_get_caps(struct drm_device *ddev)
if (ldev->caps.hw_version == HWVER_10200) if (ldev->caps.hw_version == HWVER_10200)
ldev->caps.pad_max_freq_hz = 65000000; ldev->caps.pad_max_freq_hz = 65000000;
ldev->caps.nb_irq = 2; ldev->caps.nb_irq = 2;
@ -2735,7 +3038,24 @@ index 9d235b60b428..3dcd63f20ee0 100644
break; break;
default: default:
return -ENODEV; return -ENODEV;
@@ -1295,9 +2029,12 @@ int ltdc_load(struct drm_device *ddev) @@ -1220,7 +1975,6 @@ int ltdc_load(struct drm_device *ddev)
struct drm_panel *panel;
struct drm_crtc *crtc;
struct reset_control *rstc;
- struct resource *res;
int irq, i, nb_endpoints;
int ret = -ENODEV;
@@ -1287,17 +2041,19 @@ int ltdc_load(struct drm_device *ddev)
reset_control_deassert(rstc);
}
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- ldev->regs = devm_ioremap_resource(dev, res);
+ ldev->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ldev->regs)) {
DRM_ERROR("Unable to get ltdc registers\n");
ret = PTR_ERR(ldev->regs);
goto err; goto err;
} }
@ -2751,7 +3071,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
ret = ltdc_get_caps(ddev); ret = ltdc_get_caps(ddev);
if (ret) { if (ret) {
@@ -1306,8 +2043,22 @@ int ltdc_load(struct drm_device *ddev) @@ -1306,8 +2062,22 @@ int ltdc_load(struct drm_device *ddev)
goto err; goto err;
} }
@ -2774,7 +3094,7 @@ index 9d235b60b428..3dcd63f20ee0 100644
for (i = 0; i < ldev->caps.nb_irq; i++) { for (i = 0; i < ldev->caps.nb_irq; i++) {
irq = platform_get_irq(pdev, i); irq = platform_get_irq(pdev, i);
if (irq < 0) { if (irq < 0) {
@@ -1322,7 +2073,6 @@ int ltdc_load(struct drm_device *ddev) @@ -1322,7 +2092,6 @@ int ltdc_load(struct drm_device *ddev)
DRM_ERROR("Failed to register LTDC interrupt\n"); DRM_ERROR("Failed to register LTDC interrupt\n");
goto err; goto err;
} }

View File

@ -1,95 +1,16 @@
From 8fade81923d0fc70c09d3f2beae3466cc5e71c2d Mon Sep 17 00:00:00 2001 From af1a71eda7ad9bacd5a5c577b6b89a70c4b1a53a Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:28:58 +0100 Date: Tue, 25 Jul 2023 10:41:17 +0200
Subject: [PATCH 08/22] v5.15-stm32mp-r2 HWSPINLOCK Subject: [PATCH 08/22] v5.15-stm32mp-r2.1 HWSPINLOCK
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../devicetree/bindings/hwlock/hwlock.txt | 27 +++++--
.../bindings/hwlock/st,stm32-hwspinlock.yaml | 4 +-
Documentation/locking/hwspinlock.rst | 10 ++- Documentation/locking/hwspinlock.rst | 10 ++-
drivers/hwspinlock/hwspinlock_core.c | 80 +++++++++++++++---- drivers/hwspinlock/hwspinlock_core.c | 80 +++++++++++++++++++-----
drivers/hwspinlock/hwspinlock_internal.h | 2 + drivers/hwspinlock/hwspinlock_internal.h | 2 +
drivers/hwspinlock/stm32_hwspinlock.c | 58 +++++++++----- drivers/hwspinlock/stm32_hwspinlock.c | 58 ++++++++++-------
6 files changed, 131 insertions(+), 50 deletions(-) 4 files changed, 109 insertions(+), 41 deletions(-)
diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt b/Documentation/devicetree/bindings/hwlock/hwlock.txt
index 085d1f5c916a..e98088a409ba 100644
--- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
+++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
@@ -13,7 +13,7 @@ hwlock providers:
Required properties:
- #hwlock-cells: Specifies the number of cells needed to represent a
- specific lock.
+ specific lock. Shall be 1 or 2 (see hwlocks below).
hwlock users:
=============
@@ -27,6 +27,11 @@ Required properties:
#hwlock-cells. The list can have just a single hwlock
or multiple hwlocks, with each hwlock represented by
a phandle and a corresponding args specifier.
+ If #hwlock-cells is 1, all of the locks are exclusive
+ (cannot be used by several users).
+ If #hwlock-cells is 2, the value of the second cell
+ defines whether the lock is for exclusive usage (0) or
+ shared (1) i.e. can be used by several users.
Optional properties:
- hwlock-names: List of hwlock name strings defined in the same order
@@ -46,14 +51,22 @@ of length 1.
...
};
-2. Example of a node using multiple specific hwlocks:
+2. Example of nodes using multiple and shared specific hwlocks:
-The following example has a node requesting two hwlocks, a hwlock within
-the hwlock device node 'hwlock1' with #hwlock-cells value of 1, and another
-hwlock within the hwlock device node 'hwlock2' with #hwlock-cells value of 2.
+The following example has a nodeA requesting two hwlocks:
+- an exclusive one (#hwlock-cells = 1) within the hwlock device node 'hwlock1'
+- a shared one (#hwlock-cells = 2, second cell = 1) within the hwlock device
+ node 'hwlock2'.
+The shared lock is also be used by nodeB.
- node {
+ nodeA {
...
- hwlocks = <&hwlock1 2>, <&hwlock2 0 3>;
+ hwlocks = <&hwlock1 2>, <&hwlock2 0 1>;
...
};
+
+ nodeB {
+ ...
+ hwlocks = <&hwlock2 0 1>;
+ ...
+ };
\ No newline at end of file
diff --git a/Documentation/devicetree/bindings/hwlock/st,stm32-hwspinlock.yaml b/Documentation/devicetree/bindings/hwlock/st,stm32-hwspinlock.yaml
index 47cf9c8d97e9..539a1dc052b7 100644
--- a/Documentation/devicetree/bindings/hwlock/st,stm32-hwspinlock.yaml
+++ b/Documentation/devicetree/bindings/hwlock/st,stm32-hwspinlock.yaml
@@ -12,7 +12,7 @@ maintainers:
properties:
"#hwlock-cells":
- const: 1
+ const: 2
compatible:
const: st,stm32-hwspinlock
@@ -41,7 +41,7 @@ examples:
#include <dt-bindings/clock/stm32mp1-clks.h>
hwspinlock@4c000000 {
compatible = "st,stm32-hwspinlock";
- #hwlock-cells = <1>;
+ #hwlock-cells = <2>;
reg = <0x4c000000 0x400>;
clocks = <&rcc HSEM>;
clock-names = "hsem";
diff --git a/Documentation/locking/hwspinlock.rst b/Documentation/locking/hwspinlock.rst diff --git a/Documentation/locking/hwspinlock.rst b/Documentation/locking/hwspinlock.rst
index 6f03713b7003..605bd2dc8a03 100644 index 6f03713b7003..605bd2dc8a03 100644
--- a/Documentation/locking/hwspinlock.rst --- a/Documentation/locking/hwspinlock.rst

View File

@ -1,327 +1,23 @@
From e02af9ac4cbbe463217ac8c34eee18170d57e5af Mon Sep 17 00:00:00 2001 From 56ee138f53ea518a8d1bf9178496e6a4ed65a582 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:36:23 +0100 Date: Tue, 25 Jul 2023 10:43:45 +0200
Subject: [PATCH 09/22] v5.15-stm32mp-r2 I2C-IIO-IRQCHIP Subject: [PATCH 09/22] v5.15-stm32mp-r2.1 I2C-IIO-IRQCHIP
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../devicetree/bindings/i2c/st,stm32-i2c.yaml | 2 + drivers/i2c/busses/i2c-stm32f7.c | 265 ++++-----
.../iio/adc/sigma-delta-modulator.yaml | 3 + drivers/iio/adc/sd_adc_modulator.c | 89 ++-
.../bindings/iio/adc/st,stm32-adc.yaml | 175 +++- drivers/iio/adc/stm32-adc-core.c | 208 ++++++-
drivers/i2c/busses/i2c-stm32f7.c | 265 +++--- drivers/iio/adc/stm32-adc-core.h | 90 +++
drivers/iio/adc/sd_adc_modulator.c | 89 +- drivers/iio/adc/stm32-adc.c | 861 +++++++++++++++++++++++++----
drivers/iio/adc/stm32-adc-core.c | 208 ++++- drivers/iio/adc/stm32-dfsdm-adc.c | 107 +++-
drivers/iio/adc/stm32-adc-core.h | 90 ++ drivers/iio/adc/stm32-dfsdm-core.c | 91 ++-
drivers/iio/adc/stm32-adc.c | 861 ++++++++++++++++-- drivers/iio/adc/stm32-dfsdm.h | 69 ++-
drivers/iio/adc/stm32-dfsdm-adc.c | 108 ++- drivers/irqchip/irq-stm32-exti.c | 427 ++++++++++----
drivers/iio/adc/stm32-dfsdm-core.c | 91 +-
drivers/iio/adc/stm32-dfsdm.h | 69 +-
drivers/irqchip/irq-stm32-exti.c | 427 ++++++---
include/linux/irqdomain.h | 4 + include/linux/irqdomain.h | 4 +
kernel/irq/irqdomain.c | 6 +- kernel/irq/irqdomain.c | 6 +-
14 files changed, 1965 insertions(+), 433 deletions(-) 11 files changed, 1793 insertions(+), 424 deletions(-)
diff --git a/Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml b/Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml
index d747f4990ad8..5df3dbd6091f 100644
--- a/Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml
+++ b/Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml
@@ -17,6 +17,7 @@ allOf:
contains:
enum:
- st,stm32f7-i2c
+ - st,stm32mp13-i2c
- st,stm32mp15-i2c
then:
properties:
@@ -52,6 +53,7 @@ properties:
enum:
- st,stm32f4-i2c
- st,stm32f7-i2c
+ - st,stm32mp13-i2c
- st,stm32mp15-i2c
reg:
diff --git a/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.yaml b/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.yaml
index a390343d0c2a..bf5d71fb60da 100644
--- a/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.yaml
@@ -21,6 +21,9 @@ properties:
'#io-channel-cells':
const: 0
+ vref-supply:
+ description: Phandle to the vref input analog reference voltage.
+
required:
- compatible
- '#io-channel-cells'
diff --git a/Documentation/devicetree/bindings/iio/adc/st,stm32-adc.yaml b/Documentation/devicetree/bindings/iio/adc/st,stm32-adc.yaml
index a58334c3bb76..47883701e331 100644
--- a/Documentation/devicetree/bindings/iio/adc/st,stm32-adc.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/st,stm32-adc.yaml
@@ -27,6 +27,7 @@ properties:
- st,stm32f4-adc-core
- st,stm32h7-adc-core
- st,stm32mp1-adc-core
+ - st,stm32mp13-adc-core
reg:
maxItems: 1
@@ -37,6 +38,7 @@ properties:
- stm32f4 and stm32h7 share a common ADC interrupt line.
- stm32mp1 has two separate interrupt lines, one for each ADC within
ADC block.
+ - stm32mp13 has an interrupt line per ADC block.
minItems: 1
maxItems: 2
@@ -182,6 +184,34 @@ allOf:
maximum: 36000000
default: 36000000
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: st,stm32mp13-adc-core
+
+ then:
+ properties:
+ clocks:
+ minItems: 1
+ maxItems: 2
+
+ clock-names:
+ items:
+ - const: bus
+ - const: adc
+ minItems: 1
+ maxItems: 2
+
+ interrupts:
+ items:
+ - description: ADC interrupt line
+
+ st,max-clk-rate-hz:
+ minimum: 120000
+ maximum: 36000000
+ default: 36000000
+
additionalProperties: false
required:
@@ -210,6 +240,7 @@ patternProperties:
- st,stm32f4-adc
- st,stm32h7-adc
- st,stm32mp1-adc
+ - st,stm32mp13-adc
reg:
description: |
@@ -222,10 +253,16 @@ patternProperties:
'#io-channel-cells':
const: 1
+ '#address-cells':
+ const: 1
+
+ '#size-cells':
+ const: 0
+
interrupts:
description: |
IRQ Line for the ADC instance. Valid values are:
- - 0 for adc@0
+ - 0 for adc@0 (single adc for stm32mp13)
- 1 for adc@100
- 2 for adc@200 (stm32f4 only)
maxItems: 1
@@ -246,16 +283,18 @@ patternProperties:
assigned-resolution-bits:
description: |
Resolution (bits) to use for conversions:
- - can be 6, 8, 10 or 12 on stm32f4
+ - can be 6, 8, 10 or 12 on stm32f4 and stm32mp13
- can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
st,adc-channels:
description: |
List of single-ended channels muxed for this ADC. It can have up to:
- 16 channels, numbered from 0 to 15 (for in0..in15) on stm32f4
+ - 19 channels, numbered from 0 to 18 (for in0..in18) on stm32mp13.
- 20 channels, numbered from 0 to 19 (for in0..in19) on stm32h7 and
stm32mp1.
$ref: /schemas/types.yaml#/definitions/uint32-array
+ deprecated: true
st,adc-diff-channels:
description: |
@@ -265,7 +304,9 @@ patternProperties:
<vinp vinn>, <vinp vinn>,... vinp and vinn are numbered from 0 to 19.
Note: At least one of "st,adc-channels" or "st,adc-diff-channels" is
- required. Both properties can be used together. Some channels can be
+ required if no adc generic channel is defined. These legacy channel
+ properties are exclusive with adc generic channel bindings.
+ Both properties can be used together. Some channels can be
used as single-ended and some other ones as differential (mixed). But
channels can't be configured both as single-ended and differential.
$ref: /schemas/types.yaml#/definitions/uint32-matrix
@@ -279,6 +320,7 @@ patternProperties:
"vinn" indicates negative input number
minimum: 0
maximum: 19
+ deprecated: true
st,min-sample-time-nsecs:
description:
@@ -289,6 +331,50 @@ patternProperties:
list, to set sample time resp. for all channels, or independently for
each channel.
$ref: /schemas/types.yaml#/definitions/uint32-array
+ deprecated: true
+
+ nvmem-cells:
+ items:
+ - description: Phandle to the calibration vrefint data provided by otp
+
+ nvmem-cell-names:
+ items:
+ - const: vrefint
+
+ patternProperties:
+ "^channel@([0-9]|1[0-9])$":
+ type: object
+ $ref: "adc.yaml"
+ description: Represents the external channels which are connected to the ADC.
+
+ properties:
+ reg:
+ items:
+ minimum: 0
+ maximum: 19
+
+ label:
+ description: |
+ Unique name to identify which channel this is.
+ Reserved label names "vddcore", "vddcpu", "vddq_ddr", "vrefint" and "vbat"
+ are used to identify internal channels with matching names.
+
+ diff-channels:
+ $ref: /schemas/types.yaml#/definitions/uint32-array
+ items:
+ minimum: 0
+ maximum: 19
+
+ st,min-sample-time-ns:
+ description: |
+ Minimum sampling time in nanoseconds. Depending on hardware (board)
+ e.g. high/low analog input source impedance, fine tune of ADC
+ sampling time may be recommended.
+
+ required:
+ - reg
+
+ additionalProperties: false
allOf:
- if:
@@ -367,13 +453,38 @@ patternProperties:
items:
minimum: 40
- additionalProperties: false
- anyOf:
- - required:
- - st,adc-channels
- - required:
- - st,adc-diff-channels
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: st,stm32mp13-adc
+
+ then:
+ properties:
+ reg:
+ const: 0x0
+
+ interrupts:
+ const: 0
+
+ assigned-resolution-bits:
+ enum: [6, 8, 10, 12]
+ default: 12
+
+ st,adc-channels:
+ minItems: 1
+ maxItems: 19
+ items:
+ minimum: 0
+ maximum: 18
+
+ st,min-sample-time-nsecs:
+ minItems: 1
+ maxItems: 19
+ items:
+ minimum: 40
+ additionalProperties: false
required:
- compatible
@@ -451,4 +562,50 @@ examples:
// other adc child node follow...
};
+ - |
+ // Example 3: with stm32mp157c to setup ADC2 with:
+ // - internal channels 13, 14, 15.
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/clock/stm32mp1-clks.h>
+ adc122: adc@48003000 {
+ compatible = "st,stm32mp1-adc-core";
+ reg = <0x48003000 0x400>;
+ interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&rcc ADC12>, <&rcc ADC12_K>;
+ clock-names = "bus", "adc";
+ booster-supply = <&booster>;
+ vdd-supply = <&vdd>;
+ vdda-supply = <&vdda>;
+ vref-supply = <&vref>;
+ st,syscfg = <&syscfg>;
+ interrupt-controller;
+ #interrupt-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ adc@100 {
+ compatible = "st,stm32mp1-adc";
+ #io-channel-cells = <1>;
+ reg = <0x100>;
+ interrupts = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ channel@13 {
+ reg = <13>;
+ label = "vrefint";
+ st,min-sample-time-ns = <9000>;
+ };
+ channel@14 {
+ reg = <14>;
+ label = "vddcore";
+ st,min-sample-time-ns = <9000>;
+ };
+ channel@15 {
+ reg = <15>;
+ label = "vbat";
+ st,min-sample-time-ns = <9000>;
+ };
+ };
+ };
+
...
diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c
index 50d5ae81d227..791baea3623b 100644 index 50d5ae81d227..791baea3623b 100644
--- a/drivers/i2c/busses/i2c-stm32f7.c --- a/drivers/i2c/busses/i2c-stm32f7.c
@ -2770,7 +2466,7 @@ index ef5b54ed9661..d05e081e1009 100644
}; };
MODULE_DEVICE_TABLE(of, stm32_adc_of_match); MODULE_DEVICE_TABLE(of, stm32_adc_of_match);
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index 1cfefb3b5e56..997f1f387a04 100644 index 6592221cbe21..997f1f387a04 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c --- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c +++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
@ -2951,14 +2647,6 @@ index 1cfefb3b5e56..997f1f387a04 100644
} }
indio_dev->num_channels = num_ch; indio_dev->num_channels = num_ch;
@@ -1521,6 +1620,7 @@ static const struct of_device_id stm32_dfsdm_adc_match[] = {
},
{}
};
+MODULE_DEVICE_TABLE(of, stm32_dfsdm_adc_match);
static int stm32_dfsdm_adc_probe(struct platform_device *pdev)
{
diff --git a/drivers/iio/adc/stm32-dfsdm-core.c b/drivers/iio/adc/stm32-dfsdm-core.c diff --git a/drivers/iio/adc/stm32-dfsdm-core.c b/drivers/iio/adc/stm32-dfsdm-core.c
index a627af9a825e..65c01d522ce3 100644 index a627af9a825e..65c01d522ce3 100644
--- a/drivers/iio/adc/stm32-dfsdm-core.c --- a/drivers/iio/adc/stm32-dfsdm-core.c
@ -3906,10 +3594,10 @@ index 9ee238ad29ce..553da4899f55 100644
* Should several domains have the same device node, but serve * Should several domains have the same device node, but serve
* different purposes (for example one domain is for PCI/MSI, and the * different purposes (for example one domain is for PCI/MSI, and the
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 035e3038c4de..5c74ebb13a77 100644 index e0b67784ac1e..0c768e06a798 100644
--- a/kernel/irq/irqdomain.c --- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c
@@ -744,9 +744,8 @@ static int irq_domain_translate(struct irq_domain *d, @@ -794,9 +794,8 @@ static int irq_domain_translate(struct irq_domain *d,
return 0; return 0;
} }
@ -3921,7 +3609,7 @@ index 035e3038c4de..5c74ebb13a77 100644
{ {
int i; int i;
@@ -756,6 +755,7 @@ static void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args, @@ -806,6 +805,7 @@ static void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args,
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
fwspec->param[i] = args[i]; fwspec->param[i] = args[i];
} }

View File

@ -1,53 +1,50 @@
From 2af007b9996146b7357a9b3952bc16940da1ee58 Mon Sep 17 00:00:00 2001 From 1114fa4cbc859f4a0cc5e19f267c66634888c798 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:40:22 +0100 Date: Tue, 25 Jul 2023 10:45:56 +0200
Subject: [PATCH 10/22] v5.15-stm32mp-r2 REMOTEPROC-RPMSG Subject: [PATCH 10/22] v5.15-stm32mp-r2.1 REMOTEPROC-RPMSG
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/remoteproc/rproc-srm.txt | 58 ++
.../bindings/remoteproc/st,stm32-rproc.yaml | 25 +-
Documentation/staging/remoteproc.rst | 22 + Documentation/staging/remoteproc.rst | 22 +
Documentation/staging/tee.rst | 30 + Documentation/staging/tee.rst | 30 +
drivers/remoteproc/Kconfig | 29 + drivers/remoteproc/Kconfig | 29 +
drivers/remoteproc/Makefile | 3 + drivers/remoteproc/Makefile | 3 +
drivers/remoteproc/remoteproc_core.c | 8 + drivers/remoteproc/remoteproc_core.c | 8 +
drivers/remoteproc/rproc_srm_core.c | 303 +++++++ drivers/remoteproc/rproc_srm_core.c | 303 ++++++++++
drivers/remoteproc/rproc_srm_core.h | 98 +++ drivers/remoteproc/rproc_srm_core.h | 98 ++++
drivers/remoteproc/rproc_srm_dev.c | 744 ++++++++++++++++ drivers/remoteproc/rproc_srm_dev.c | 744 ++++++++++++++++++++++++
drivers/remoteproc/stm32_rproc.c | 324 ++++--- drivers/remoteproc/stm32_rproc.c | 324 +++++++----
drivers/remoteproc/tee_remoteproc.c | 378 ++++++++ drivers/remoteproc/tee_remoteproc.c | 378 +++++++++++++
drivers/rpmsg/Kconfig | 8 + drivers/rpmsg/Kconfig | 8 +
drivers/rpmsg/Makefile | 1 + drivers/rpmsg/Makefile | 1 +
drivers/rpmsg/qcom_glink_native.c | 2 +- drivers/rpmsg/qcom_glink_native.c | 2 +-
drivers/rpmsg/qcom_smd.c | 2 +- drivers/rpmsg/qcom_smd.c | 2 +-
drivers/rpmsg/rpmsg_char.c | 229 ++--- drivers/rpmsg/rpmsg_char.c | 229 +++-----
drivers/rpmsg/rpmsg_char.h | 46 + drivers/rpmsg/rpmsg_char.h | 46 ++
drivers/rpmsg/rpmsg_core.c | 36 +- drivers/rpmsg/rpmsg_core.c | 36 +-
drivers/rpmsg/rpmsg_ctrl.c | 243 ++++++ drivers/rpmsg/rpmsg_ctrl.c | 243 ++++++++
drivers/rpmsg/rpmsg_internal.h | 12 +- drivers/rpmsg/rpmsg_internal.h | 12 +-
drivers/rpmsg/virtio_rpmsg_bus.c | 12 +- drivers/rpmsg/virtio_rpmsg_bus.c | 12 +-
drivers/tee/amdtee/amdtee_private.h | 8 +- drivers/tee/amdtee/amdtee_private.h | 8 +-
drivers/tee/amdtee/core.c | 22 +- drivers/tee/amdtee/core.c | 22 +-
drivers/tee/optee/Makefile | 2 + drivers/tee/optee/Makefile | 2 +
drivers/tee/optee/call.c | 814 ++++++++++++++---- drivers/tee/optee/call.c | 814 +++++++++++++++++++++------
drivers/tee/optee/call_queue.c | 86 ++ drivers/tee/optee/call_queue.c | 86 +++
drivers/tee/optee/core.c | 463 +++++++++- drivers/tee/optee/core.c | 463 +++++++++++++--
drivers/tee/optee/notif.c | 125 +++ drivers/tee/optee/notif.c | 125 ++++
drivers/tee/optee/optee_msg.h | 160 +++- drivers/tee/optee/optee_msg.h | 160 +++++-
drivers/tee/optee/optee_private.h | 180 +++- drivers/tee/optee/optee_private.h | 180 +++++-
drivers/tee/optee/optee_rpc_cmd.h | 31 +- drivers/tee/optee/optee_rpc_cmd.h | 31 +-
drivers/tee/optee/optee_smc.h | 94 +- drivers/tee/optee/optee_smc.h | 94 +++-
drivers/tee/optee/rpc.c | 99 +-- drivers/tee/optee/rpc.c | 99 ++--
drivers/tee/tee_core.c | 73 +- drivers/tee/tee_core.c | 73 ++-
drivers/tee/tee_shm.c | 13 +- drivers/tee/tee_shm.c | 13 +-
include/linux/rpmsg.h | 10 + include/linux/rpmsg.h | 10 +
include/linux/tee_drv.h | 17 +- include/linux/tee_drv.h | 17 +-
include/linux/tee_remoteproc.h | 101 +++ include/linux/tee_remoteproc.h | 101 ++++
include/uapi/linux/rpmsg.h | 10 + include/uapi/linux/rpmsg.h | 10 +
include/uapi/linux/tee.h | 36 +- include/uapi/linux/tee.h | 36 +-
41 files changed, 4358 insertions(+), 599 deletions(-) 39 files changed, 4292 insertions(+), 582 deletions(-)
create mode 100644 Documentation/devicetree/bindings/remoteproc/rproc-srm.txt
create mode 100644 drivers/remoteproc/rproc_srm_core.c create mode 100644 drivers/remoteproc/rproc_srm_core.c
create mode 100644 drivers/remoteproc/rproc_srm_core.h create mode 100644 drivers/remoteproc/rproc_srm_core.h
create mode 100644 drivers/remoteproc/rproc_srm_dev.c create mode 100644 drivers/remoteproc/rproc_srm_dev.c
@ -58,122 +55,6 @@ Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
create mode 100644 drivers/tee/optee/notif.c create mode 100644 drivers/tee/optee/notif.c
create mode 100644 include/linux/tee_remoteproc.h create mode 100644 include/linux/tee_remoteproc.h
diff --git a/Documentation/devicetree/bindings/remoteproc/rproc-srm.txt b/Documentation/devicetree/bindings/remoteproc/rproc-srm.txt
new file mode 100644
index 000000000000..baa6e8e135e1
--- /dev/null
+++ b/Documentation/devicetree/bindings/remoteproc/rproc-srm.txt
@@ -0,0 +1,58 @@
+Remoteproc System Resource Manager
+----------------------------------
+
+The remoteproc SRM (System Resource Manager) handles resources allocated
+to remote processors.
+This makes it possible for remote proc to reserve and initialize system
+resources for a peripheral assigned to a coprocessor.
+
+The devices are grouped in a core node
+
+Core
+====
+Required properties:
+- compatible: should be "rproc-srm-core"
+
+Dev
+===
+Required properties:
+- compatible: should be "rproc-srm-dev"
+
+Optional properties:
+- reg: register base address and length
+- clocks: clocks required by the coprocessor
+- clock-names: see clock-bindings.txt
+- pinctrl-0: pins configurations required by the coprocessor
+ The SRM reserves the pins for the coprocessor, which prevents the local
+ processor to use them.
+- pinctrl-names: must be "default".
+- x-supply: power supplies required by the coprocessor
+- interrupts: external interrupts configurations required by the coprocessor.
+ This is optional since the configuration is done by the coprocessor.
+ When defined, the SRM (over)writes the configuration which allows the
+ interrupt controller to check for configuration conflicts.
+- interrupt-parent: see interrupts.txt
+- interrupt-names: see interrupts.txt
+
+Example:
+ system_resources {
+ compatible = "rproc-srm-core";
+
+ mmc0: sdhci@09060000 {
+ compatible = "rproc-srm-dev";
+ reg = <0x09060000 0x100>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&m4_pinctrl_mmc0>;
+ clock-names = "mmc", "icn";
+ clocks = <&clk_s_c0_flexgen CLK_MMC_0>,
+ <&clk_s_c0_flexgen CLK_RX_ICN_HVA>;
+ vdda-supply = <&vdda>;
+ };
+
+ button {
+ compatible = "rproc-srm-dev";
+ interrupt-parent = <&gpioa>;
+ interrupts = <5 1>;
+ interrupt-names = "gpio_key";
+ };
+ };
diff --git a/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml b/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
index 1e6225677e00..93c27e3ecd85 100644
--- a/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
+++ b/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
@@ -25,21 +25,12 @@ properties:
maxItems: 3
resets:
- maxItems: 1
-
- st,syscfg-holdboot:
- description: remote processor reset hold boot
- - Phandle of syscon block.
- - The offset of the hold boot setting register.
- - The field mask of the hold boot.
- $ref: "/schemas/types.yaml#/definitions/phandle-array"
- maxItems: 1
+ maxItems: 2
- st,syscfg-tz:
- description:
- Reference to the system configuration which holds the RCC trust zone mode
- $ref: "/schemas/types.yaml#/definitions/phandle-array"
- maxItems: 1
+ reset-names:
+ items:
+ - const: mcu_rst
+ - const: hold_boot
interrupts:
description: Should contain the WWDG1 watchdog reset interrupt
@@ -119,7 +110,6 @@ required:
- reg
- resets
- st,syscfg-holdboot
- - st,syscfg-tz
additionalProperties: false
@@ -131,9 +121,10 @@ examples:
reg = <0x10000000 0x40000>,
<0x30000000 0x40000>,
<0x38000000 0x10000>;
- resets = <&rcc MCU_R>;
+ resets = <&scmi_reset RST_SCMI_MCU>,
+ <&scmi_reset RST_SCMI_MCU_HOLD_BOOT>;
+ reset-names = "mcu_rst", "hold_boot";
st,syscfg-holdboot = <&rcc 0x10C 0x1>;
- st,syscfg-tz = <&rcc 0x000 0x1>;
st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
};
diff --git a/Documentation/staging/remoteproc.rst b/Documentation/staging/remoteproc.rst diff --git a/Documentation/staging/remoteproc.rst b/Documentation/staging/remoteproc.rst
index 9cccd3dd6a4b..c2367e3c0b19 100644 index 9cccd3dd6a4b..c2367e3c0b19 100644
--- a/Documentation/staging/remoteproc.rst --- a/Documentation/staging/remoteproc.rst
@ -314,7 +195,7 @@ index bb26c9e4ef9c..521dd3384fba 100644
obj-$(CONFIG_INGENIC_VPU_RPROC) += ingenic_rproc.o obj-$(CONFIG_INGENIC_VPU_RPROC) += ingenic_rproc.o
obj-$(CONFIG_MTK_SCP) += mtk_scp.o mtk_scp_ipi.o obj-$(CONFIG_MTK_SCP) += mtk_scp.o mtk_scp_ipi.o
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 775df165eb45..df31b9222b38 100644 index 97e59f746126..4312fe52a826 100644
--- a/drivers/remoteproc/remoteproc_core.c --- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c
@@ -38,6 +38,7 @@ @@ -38,6 +38,7 @@
@ -325,7 +206,7 @@ index 775df165eb45..df31b9222b38 100644
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
@@ -2356,6 +2357,11 @@ int rproc_add(struct rproc *rproc) @@ -2363,6 +2364,11 @@ int rproc_add(struct rproc *rproc)
/* create debugfs entries */ /* create debugfs entries */
rproc_create_debug_dir(rproc); rproc_create_debug_dir(rproc);
@ -337,7 +218,7 @@ index 775df165eb45..df31b9222b38 100644
/* if rproc is marked always-on, request it to boot */ /* if rproc is marked always-on, request it to boot */
if (rproc->auto_boot) { if (rproc->auto_boot) {
ret = rproc_trigger_auto_boot(rproc); ret = rproc_trigger_auto_boot(rproc);
@@ -2637,6 +2643,8 @@ int rproc_del(struct rproc *rproc) @@ -2644,6 +2650,8 @@ int rproc_del(struct rproc *rproc)
list_del_rcu(&rproc->node); list_del_rcu(&rproc->node);
mutex_unlock(&rproc_list_mutex); mutex_unlock(&rproc_list_mutex);
@ -1510,7 +1391,7 @@ index 000000000000..e47654af3e3a
+MODULE_DESCRIPTION("Remoteproc System Resource Manager driver - dev"); +MODULE_DESCRIPTION("Remoteproc System Resource Manager driver - dev");
+MODULE_LICENSE("GPL v2"); +MODULE_LICENSE("GPL v2");
diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index b643efcf995a..4b713b74ad44 100644 index aba3df1d1bf5..5c7cdeae917e 100644
--- a/drivers/remoteproc/stm32_rproc.c --- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c +++ b/drivers/remoteproc/stm32_rproc.c
@@ -20,13 +20,11 @@ @@ -20,13 +20,11 @@
@ -1701,7 +1582,7 @@ index b643efcf995a..4b713b74ad44 100644
static int stm32_rproc_prepare(struct rproc *rproc) static int stm32_rproc_prepare(struct rproc *rproc)
{ {
struct device *dev = rproc->dev.parent; struct device *dev = rproc->dev.parent;
@@ -266,7 +405,14 @@ static int stm32_rproc_prepare(struct rproc *rproc) @@ -270,7 +409,14 @@ static int stm32_rproc_prepare(struct rproc *rproc)
static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
{ {
@ -1717,7 +1598,7 @@ index b643efcf995a..4b713b74ad44 100644
dev_warn(&rproc->dev, "no resource table found for this firmware\n"); dev_warn(&rproc->dev, "no resource table found for this firmware\n");
return 0; return 0;
@@ -394,30 +540,6 @@ static int stm32_rproc_request_mbox(struct rproc *rproc) @@ -406,30 +552,6 @@ static int stm32_rproc_request_mbox(struct rproc *rproc)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
@ -1748,7 +1629,7 @@ index b643efcf995a..4b713b74ad44 100644
static void stm32_rproc_add_coredump_trace(struct rproc *rproc) static void stm32_rproc_add_coredump_trace(struct rproc *rproc)
{ {
struct rproc_debug_trace *trace; struct rproc_debug_trace *trace;
@@ -457,18 +579,20 @@ static int stm32_rproc_start(struct rproc *rproc) @@ -469,18 +591,20 @@ static int stm32_rproc_start(struct rproc *rproc)
} }
} }
@ -1772,7 +1653,7 @@ index b643efcf995a..4b713b74ad44 100644
} }
static int stm32_rproc_detach(struct rproc *rproc) static int stm32_rproc_detach(struct rproc *rproc)
@@ -485,27 +609,21 @@ static int stm32_rproc_detach(struct rproc *rproc) @@ -497,27 +621,21 @@ static int stm32_rproc_detach(struct rproc *rproc)
} }
/* Allow remote processor to auto-reboot */ /* Allow remote processor to auto-reboot */
@ -1807,7 +1688,7 @@ index b643efcf995a..4b713b74ad44 100644
err = reset_control_assert(ddata->rst); err = reset_control_assert(ddata->rst);
if (err) { if (err) {
@@ -513,29 +631,8 @@ static int stm32_rproc_stop(struct rproc *rproc) @@ -525,29 +643,8 @@ static int stm32_rproc_stop(struct rproc *rproc)
return err; return err;
} }
@ -1838,7 +1719,7 @@ index b643efcf995a..4b713b74ad44 100644
} }
static void stm32_rproc_kick(struct rproc *rproc, int vqid) static void stm32_rproc_kick(struct rproc *rproc, int vqid)
@@ -647,8 +744,21 @@ static const struct rproc_ops st_rproc_ops = { @@ -659,8 +756,21 @@ static const struct rproc_ops st_rproc_ops = {
.get_boot_addr = rproc_elf_get_boot_addr, .get_boot_addr = rproc_elf_get_boot_addr,
}; };
@ -1861,7 +1742,7 @@ index b643efcf995a..4b713b74ad44 100644
{}, {},
}; };
MODULE_DEVICE_TABLE(of, stm32_rproc_match); MODULE_DEVICE_TABLE(of, stm32_rproc_match);
@@ -680,8 +790,6 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev, @@ -692,8 +802,6 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
@ -1870,7 +1751,7 @@ index b643efcf995a..4b713b74ad44 100644
int err, irq; int err, irq;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
@@ -705,35 +813,15 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev, @@ -717,35 +825,15 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
dev_info(dev, "wdg irq registered\n"); dev_info(dev, "wdg irq registered\n");
} }
@ -1911,7 +1792,7 @@ index b643efcf995a..4b713b74ad44 100644
err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds); err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds);
if (err) if (err)
@@ -789,6 +877,7 @@ static int stm32_rproc_probe(struct platform_device *pdev) @@ -801,6 +889,7 @@ static int stm32_rproc_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct stm32_rproc *ddata; struct stm32_rproc *ddata;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
@ -1919,7 +1800,7 @@ index b643efcf995a..4b713b74ad44 100644
struct rproc *rproc; struct rproc *rproc;
unsigned int state; unsigned int state;
int ret; int ret;
@@ -797,11 +886,32 @@ static int stm32_rproc_probe(struct platform_device *pdev) @@ -809,11 +898,32 @@ static int stm32_rproc_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
@ -1955,7 +1836,7 @@ index b643efcf995a..4b713b74ad44 100644
rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE); rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
@@ -852,6 +962,10 @@ static int stm32_rproc_probe(struct platform_device *pdev) @@ -864,6 +974,10 @@ static int stm32_rproc_probe(struct platform_device *pdev)
device_init_wakeup(dev, false); device_init_wakeup(dev, false);
} }
rproc_free(rproc); rproc_free(rproc);
@ -1966,7 +1847,7 @@ index b643efcf995a..4b713b74ad44 100644
return ret; return ret;
} }
@@ -873,10 +987,21 @@ static int stm32_rproc_remove(struct platform_device *pdev) @@ -885,10 +999,21 @@ static int stm32_rproc_remove(struct platform_device *pdev)
device_init_wakeup(dev, false); device_init_wakeup(dev, false);
} }
rproc_free(rproc); rproc_free(rproc);
@ -1988,7 +1869,7 @@ index b643efcf995a..4b713b74ad44 100644
static int __maybe_unused stm32_rproc_suspend(struct device *dev) static int __maybe_unused stm32_rproc_suspend(struct device *dev)
{ {
struct rproc *rproc = dev_get_drvdata(dev); struct rproc *rproc = dev_get_drvdata(dev);
@@ -905,6 +1030,7 @@ static SIMPLE_DEV_PM_OPS(stm32_rproc_pm_ops, @@ -917,6 +1042,7 @@ static SIMPLE_DEV_PM_OPS(stm32_rproc_pm_ops,
static struct platform_driver stm32_rproc_driver = { static struct platform_driver stm32_rproc_driver = {
.probe = stm32_rproc_probe, .probe = stm32_rproc_probe,
.remove = stm32_rproc_remove, .remove = stm32_rproc_remove,
@ -2412,10 +2293,10 @@ index 8d452656f0ee..58e3b382e316 100644
obj-$(CONFIG_RPMSG_MTK_SCP) += mtk_rpmsg.o obj-$(CONFIG_RPMSG_MTK_SCP) += mtk_rpmsg.o
qcom_glink-objs := qcom_glink_native.o qcom_glink_ssr.o qcom_glink-objs := qcom_glink_native.o qcom_glink_ssr.o
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index 05533c71b10e..7d7e809800ec 100644 index fd4c2f0fa4b1..0a7dabf3f329 100644
--- a/drivers/rpmsg/qcom_glink_native.c --- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c
@@ -1642,7 +1642,7 @@ static int qcom_glink_create_chrdev(struct qcom_glink *glink) @@ -1643,7 +1643,7 @@ static int qcom_glink_create_chrdev(struct qcom_glink *glink)
rpdev->dev.parent = glink->dev; rpdev->dev.parent = glink->dev;
rpdev->dev.release = qcom_glink_device_release; rpdev->dev.release = qcom_glink_device_release;
@ -2425,7 +2306,7 @@ index 05533c71b10e..7d7e809800ec 100644
struct qcom_glink *qcom_glink_native_probe(struct device *dev, struct qcom_glink *qcom_glink_native_probe(struct device *dev,
diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
index c1c07ff39a79..b2cd71c350ee 100644 index 56bc622de25e..754161b02407 100644
--- a/drivers/rpmsg/qcom_smd.c --- a/drivers/rpmsg/qcom_smd.c
+++ b/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c
@@ -1113,7 +1113,7 @@ static int qcom_smd_create_chrdev(struct qcom_smd_edge *edge) @@ -1113,7 +1113,7 @@ static int qcom_smd_create_chrdev(struct qcom_smd_edge *edge)
@ -3316,7 +3197,7 @@ index 6d0f7062bb87..73c183510c26 100644
int amdtee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session); int amdtee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session);
diff --git a/drivers/tee/amdtee/core.c b/drivers/tee/amdtee/core.c diff --git a/drivers/tee/amdtee/core.c b/drivers/tee/amdtee/core.c
index 297dc62bca29..e6f1e331d3c3 100644 index 372d64756ed6..78511ae99b91 100644
--- a/drivers/tee/amdtee/core.c --- a/drivers/tee/amdtee/core.c
+++ b/drivers/tee/amdtee/core.c +++ b/drivers/tee/amdtee/core.c
@@ -230,7 +230,9 @@ static void destroy_session(struct kref *ref) @@ -230,7 +230,9 @@ static void destroy_session(struct kref *ref)
@ -3342,7 +3223,7 @@ index 297dc62bca29..e6f1e331d3c3 100644
if (arg->clnt_login != TEE_IOCTL_LOGIN_PUBLIC) { if (arg->clnt_login != TEE_IOCTL_LOGIN_PUBLIC) {
pr_err("unsupported client login method\n"); pr_err("unsupported client login method\n");
return -EINVAL; return -EINVAL;
@@ -283,7 +290,7 @@ int amdtee_open_session(struct tee_context *ctx, @@ -268,7 +275,7 @@ int amdtee_open_session(struct tee_context *ctx,
} }
/* Open session with loaded TA */ /* Open session with loaded TA */
@ -3350,8 +3231,8 @@ index 297dc62bca29..e6f1e331d3c3 100644
+ handle_open_session(arg, &session_info, normal_param); + handle_open_session(arg, &session_info, normal_param);
if (arg->ret != TEEC_SUCCESS) { if (arg->ret != TEEC_SUCCESS) {
pr_err("open_session failed %d\n", arg->ret); pr_err("open_session failed %d\n", arg->ret);
spin_lock(&sess->lock); handle_unload_ta(ta_handle);
@@ -405,12 +412,19 @@ void amdtee_unmap_shmem(struct tee_shm *shm) @@ -404,12 +411,19 @@ void amdtee_unmap_shmem(struct tee_shm *shm)
int amdtee_invoke_func(struct tee_context *ctx, int amdtee_invoke_func(struct tee_context *ctx,
struct tee_ioctl_invoke_arg *arg, struct tee_ioctl_invoke_arg *arg,
@ -3372,7 +3253,7 @@ index 297dc62bca29..e6f1e331d3c3 100644
/* Check that the session is valid */ /* Check that the session is valid */
mutex_lock(&session_list_mutex); mutex_lock(&session_list_mutex);
sess = find_session(ctxdata, arg->session); sess = find_session(ctxdata, arg->session);
@@ -423,7 +437,7 @@ int amdtee_invoke_func(struct tee_context *ctx, @@ -422,7 +436,7 @@ int amdtee_invoke_func(struct tee_context *ctx,
if (!sess) if (!sess)
return -EINVAL; return -EINVAL;
@ -6014,10 +5895,10 @@ index 456833d82007..ae41f4e640ab 100644
+ return false; + return false;
+} +}
diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c
index 3fc426dad2df..705bb4e53301 100644 index a44e5b53e7a9..4c2103fb4cf8 100644
--- a/drivers/tee/tee_core.c --- a/drivers/tee/tee_core.c
+++ b/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c
@@ -356,6 +356,14 @@ tee_ioctl_shm_register(struct tee_context *ctx, @@ -359,6 +359,14 @@ tee_ioctl_shm_register(struct tee_context *ctx,
return ret; return ret;
} }
@ -6032,7 +5913,7 @@ index 3fc426dad2df..705bb4e53301 100644
static int params_from_user(struct tee_context *ctx, struct tee_param *params, static int params_from_user(struct tee_context *ctx, struct tee_param *params,
size_t num_params, size_t num_params,
struct tee_ioctl_param __user *uparams) struct tee_ioctl_param __user *uparams)
@@ -464,6 +472,33 @@ static int params_to_user(struct tee_ioctl_param __user *uparams, @@ -467,6 +475,33 @@ static int params_to_user(struct tee_ioctl_param __user *uparams,
return 0; return 0;
} }
@ -6066,7 +5947,7 @@ index 3fc426dad2df..705bb4e53301 100644
static int tee_ioctl_open_session(struct tee_context *ctx, static int tee_ioctl_open_session(struct tee_context *ctx,
struct tee_ioctl_buf_data __user *ubuf) struct tee_ioctl_buf_data __user *ubuf)
{ {
@@ -511,7 +546,9 @@ static int tee_ioctl_open_session(struct tee_context *ctx, @@ -514,7 +549,9 @@ static int tee_ioctl_open_session(struct tee_context *ctx,
goto out; goto out;
} }
@ -6077,7 +5958,7 @@ index 3fc426dad2df..705bb4e53301 100644
if (rc) if (rc)
goto out; goto out;
have_session = true; have_session = true;
@@ -582,7 +619,9 @@ static int tee_ioctl_invoke(struct tee_context *ctx, @@ -585,7 +622,9 @@ static int tee_ioctl_invoke(struct tee_context *ctx,
goto out; goto out;
} }
@ -6088,7 +5969,7 @@ index 3fc426dad2df..705bb4e53301 100644
if (rc) if (rc)
goto out; goto out;
@@ -1159,9 +1198,22 @@ int tee_client_open_session(struct tee_context *ctx, @@ -1162,9 +1201,22 @@ int tee_client_open_session(struct tee_context *ctx,
struct tee_ioctl_open_session_arg *arg, struct tee_ioctl_open_session_arg *arg,
struct tee_param *param) struct tee_param *param)
{ {
@ -6112,7 +5993,7 @@ index 3fc426dad2df..705bb4e53301 100644
} }
EXPORT_SYMBOL_GPL(tee_client_open_session); EXPORT_SYMBOL_GPL(tee_client_open_session);
@@ -1177,9 +1229,22 @@ int tee_client_invoke_func(struct tee_context *ctx, @@ -1180,9 +1232,22 @@ int tee_client_invoke_func(struct tee_context *ctx,
struct tee_ioctl_invoke_arg *arg, struct tee_ioctl_invoke_arg *arg,
struct tee_param *param) struct tee_param *param)
{ {
@ -6137,10 +6018,10 @@ index 3fc426dad2df..705bb4e53301 100644
EXPORT_SYMBOL_GPL(tee_client_invoke_func); EXPORT_SYMBOL_GPL(tee_client_invoke_func);
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 6e662fb131d5..94282f2bb154 100644 index 6fb4400333fb..36304fe6accd 100644
--- a/drivers/tee/tee_shm.c --- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c
@@ -157,7 +157,8 @@ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr, @@ -158,7 +158,8 @@ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr,
int num_pages; int num_pages;
unsigned long start; unsigned long start;
@ -6150,7 +6031,7 @@ index 6e662fb131d5..94282f2bb154 100644
return ERR_PTR(-ENOTSUPP); return ERR_PTR(-ENOTSUPP);
if (!tee_device_get(teedev)) if (!tee_device_get(teedev))
@@ -434,6 +435,16 @@ struct tee_shm *tee_shm_get_from_id(struct tee_context *ctx, int id) @@ -432,6 +433,16 @@ struct tee_shm *tee_shm_get_from_id(struct tee_context *ctx, int id)
} }
EXPORT_SYMBOL_GPL(tee_shm_get_from_id); EXPORT_SYMBOL_GPL(tee_shm_get_from_id);

View File

@ -1,25 +1,23 @@
From ba945334e6168553846f1fcc73a59a463a276255 Mon Sep 17 00:00:00 2001 From 7ec3e513a3c37c2e20b1f2545f6cb84e4422b045 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:54:37 +0100 Date: Tue, 25 Jul 2023 10:50:21 +0200
Subject: [PATCH 11/22] v5.15-stm32mp-r2 MISC-MEDIA-SOC-THERMAL Subject: [PATCH 11/22] v5.15-stm32mp-r2.1 MISC-MEDIA-SOC-THERMAL
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
CONTRIBUTING.md | 30 + CONTRIBUTING.md | 30 +
.../bindings/media/i2c/galaxycore,gc2145.yaml | 115 +
.../bindings/media/st,stm32-dcmipp.yaml | 96 +
.../bindings/soc/stm32/st,stm32mp1-hslv.yaml | 44 +
.../bindings/soc/stm32/stm32_hdp.txt | 39 +
MAINTAINERS | 17 + MAINTAINERS | 17 +
SECURITY.md | 8 + SECURITY.md | 8 +
drivers/char/hw_random/stm32-rng.c | 229 +- drivers/char/hw_random/stm32-rng.c | 229 +-
drivers/firmware/Kconfig | 2 +- drivers/firmware/Kconfig | 2 +-
drivers/gpio/gpiolib.c | 20 +- drivers/gpio/gpiolib-acpi.c | 3 +
drivers/input/touchscreen/edt-ft5x06.c | 20 + drivers/gpio/gpiolib-of.c | 7 +
drivers/input/touchscreen/goodix.c | 39 +- drivers/gpio/gpiolib.c | 28 +-
drivers/input/touchscreen/edt-ft5x06.c | 31 +
drivers/input/touchscreen/goodix.c | 51 +-
drivers/media/i2c/Kconfig | 12 + drivers/media/i2c/Kconfig | 12 +
drivers/media/i2c/Makefile | 1 + drivers/media/i2c/Makefile | 1 +
drivers/media/i2c/gc2145.c | 1949 +++++++++++++++++ drivers/media/i2c/gc2145.c | 1948 +++++++++++++++++
drivers/media/i2c/ov5640.c | 459 +++- drivers/media/i2c/ov5640.c | 459 +++-
drivers/media/i2c/st-mipid02.c | 10 +- drivers/media/i2c/st-mipid02.c | 10 +-
drivers/media/platform/Kconfig | 13 + drivers/media/platform/Kconfig | 13 +
@ -44,18 +42,16 @@ Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
drivers/soc/st/stm32-hslv.c | 157 ++ drivers/soc/st/stm32-hslv.c | 157 ++
drivers/soc/st/stm32_hdp.c | 242 ++ drivers/soc/st/stm32_hdp.c | 242 ++
drivers/soc/st/stm32_pm_domain.c | 212 ++ drivers/soc/st/stm32_pm_domain.c | 212 ++
drivers/thermal/st/Kconfig | 4 +-
drivers/thermal/st/stm_thermal.c | 30 +- drivers/thermal/st/stm_thermal.c | 30 +-
include/dt-bindings/soc/stm32-hdp.h | 108 + include/dt-bindings/soc/stm32-hdp.h | 108 +
include/dt-bindings/soc/stm32mp13-hdp.h | 133 ++ include/dt-bindings/soc/stm32mp13-hdp.h | 133 ++
include/linux/gpio/machine.h | 1 +
include/linux/smscphy.h | 20 + include/linux/smscphy.h | 20 +
include/media/mipi-csi2.h | 45 + include/media/mipi-csi2.h | 45 +
include/media/v4l2-fwnode.h | 2 + include/media/v4l2-fwnode.h | 2 +
45 files changed, 8058 insertions(+), 253 deletions(-) 45 files changed, 7805 insertions(+), 257 deletions(-)
create mode 100644 CONTRIBUTING.md create mode 100644 CONTRIBUTING.md
create mode 100644 Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml
create mode 100644 Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml
create mode 100644 Documentation/devicetree/bindings/soc/stm32/st,stm32mp1-hslv.yaml
create mode 100644 Documentation/devicetree/bindings/soc/stm32/stm32_hdp.txt
create mode 100644 SECURITY.md create mode 100644 SECURITY.md
create mode 100644 drivers/media/i2c/gc2145.c create mode 100644 drivers/media/i2c/gc2145.c
create mode 100644 drivers/media/platform/stm32/stm32-dcmipp/Makefile create mode 100644 drivers/media/platform/stm32/stm32-dcmipp/Makefile
@ -110,329 +106,11 @@ index 000000000000..3d1bacd78a54
+__Note__ +__Note__
+ +
+Merge will not be done directly in GitHub but it will need first to follow internal integration process before public deliver in a standard release. The Pull request will stay open until it is merged and delivered. +Merge will not be done directly in GitHub but it will need first to follow internal integration process before public deliver in a standard release. The Pull request will stay open until it is merged and delivered.
diff --git a/Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml b/Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml
new file mode 100644
index 000000000000..af07250ceadb
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml
@@ -0,0 +1,115 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/i2c/galaxycore,gc2145.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Galaxy Core 1/5'' UXGA CMOS Image Sensor
+
+maintainers:
+ - Alain Volmat <alain.volmat@foss.st.com>
+
+description: |
+ The Galaxy Core GC2145 is a high quality 2 Mega CMOS image sensor, for mobile phone camera
+ applications and digital camera products. GC2145 incorporates a 1616V x 1232H active pixel
+ array, on-chip 10-bit ADC, and image signal processor. It is programmable through an I2C
+ interface. Image data is sent either through a parallel interface or through MIPI CSI-2.
+
+allOf:
+ - $ref: ../video-interface-devices.yaml#
+
+properties:
+ compatible:
+ const: galaxycore,gc2145
+
+ reg:
+ enum:
+ - 0x3c
+
+ clocks:
+ description: Reference to the xclk clock.
+ maxItems: 1
+
+ powerdown-gpios:
+ description: GPIO descriptor for the powerdown pin.
+ maxItems: 1
+
+ reset-gpios:
+ description: GPIO descriptor for the reset pin.
+ maxItems: 1
+
+ IOVDD-supply:
+ description: Power Supply for I/O circuits (1.7 - 3V).
+
+ AVDD-supply:
+ description: Power for analog circuit/sensor array (2.7 - 3V).
+
+ DVDD-supply:
+ description: Power for digital core (1.7 - 1.9V).
+
+ port:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ description: |
+ Video output port.
+
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ data-lanes:
+ anyOf:
+ - items:
+ - const: 1
+ - const: 2
+ - items:
+ - const: 1
+ - const: 2
+
+ required:
+ - data-lanes
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - powerdown-gpios
+ - reset-gpios
+ - IOVDD-supply
+ - AVDD-supply
+ - DVDD-supply
+ - port
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ i2c5 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ gc2145@3c {
+ compatible = "galaxycore,gc2145";
+ reg = <0x3c>;
+ clocks = <&clk_ext_camera>;
+ IOVDD-supply = <&scmi_v3v3_sw>;
+ AVDD-supply = <&scmi_v3v3_sw>;
+ DVDD-supply = <&scmi_v3v3_sw>;
+ powerdown-gpios = <&mcp23017 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;
+ reset-gpios = <&mcp23017 4 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;
+
+ port {
+ gc2145_ep: endpoint {
+ remote-endpoint = <&mipid02_0>;
+ data-lanes = <1 2>;
+ };
+ };
+ };
+ };
+
+...
diff --git a/Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml b/Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml
new file mode 100644
index 000000000000..70631046017d
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml
@@ -0,0 +1,96 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/st,stm32-dcmipp.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STMicroelectronics STM32 DCMIPP Digital Camera Memory Interface Pixel Processor binding
+
+maintainers:
+ - Hugues Fruchet <hugues.fruchet@foss.st.com>
+ - Alain Volmat <alain.volmat@foss.st.com>
+
+properties:
+ compatible:
+ const: st,stm32mp13-dcmipp
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ clock-names:
+ items:
+ - const: kclk
+
+ resets:
+ maxItems: 1
+
+ port:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ unevaluatedProperties: false
+ description:
+ DCMIPP supports a single port node with parallel bus.
+
+ properties:
+ endpoint:
+ $ref: video-interfaces.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ bus-type:
+ enum: [5, 6]
+ default: 5
+
+ bus-width:
+ enum: [8, 10, 12, 14]
+ default: 8
+
+ pclk-sample: true
+ hsync-active: true
+ vsync-active: true
+
+ required:
+ - pclk-sample
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - clocks
+ - clock-names
+ - resets
+ - port
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/clock/stm32mp13-clks.h>
+ #include <dt-bindings/reset/stm32mp13-resets.h>
+ dcmipp: dcmipp@5a000000 {
+ compatible = "st,stm32mp13-dcmipp";
+ reg = <0x5a000000 0x400>;
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+ resets = <&rcc DCMIPP_R>;
+ clocks = <&rcc DCMIPP_K>;
+ clock-names = "kclk";
+
+ port {
+ dcmipp_0: endpoint {
+ remote-endpoint = <&mipid02_2>;
+ bus-width = <8>;
+ hsync-active = <0>;
+ vsync-active = <0>;
+ pclk-sample = <0>;
+ pclk-max-frequency = <120000000>;
+ };
+ };
+ };
+
+...
diff --git a/Documentation/devicetree/bindings/soc/stm32/st,stm32mp1-hslv.yaml b/Documentation/devicetree/bindings/soc/stm32/st,stm32mp1-hslv.yaml
new file mode 100644
index 000000000000..a228a5b262d3
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/stm32/st,stm32mp1-hslv.yaml
@@ -0,0 +1,44 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/st,stm32mp1-hslv.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STM32MP1 HSLV IO Speed config assistant
+
+maintainers:
+ - Pascal Paillet <p.paillet@st.com>
+
+description: |
+ Some of the STMicroelectronics's STM32 MP13 IOs can be set to high speed mode
+ if their supply is lower than a 2.7V. The goal of this driver is to
+ automatically set the IOs to high speed mode depending on their supply's
+ regulator voltage value.
+
+properties:
+ compatible:
+ const: st,stm32mp13,hslv
+
+ hslv-supply:
+ description: Input supply phandle(s) for hslv input
+
+ st,syscon:
+ description: hslv sysconf register offset and mask
+
+required:
+ - compatible
+ - hslv-supply
+ - st,syscon
+
+additionalProperties: false
+
+examples:
+ - |
+ hslv@1 {
+ compatible = "st,stm32mp13,hslv";
+
+ /* sdmmc1 hslv = 0x50 + 4 * 4 = 0x60 */
+ st,syscon = <&syscfg 0x60 0x1018>;
+ hslv-supply = <&sdmmc1_regu>;
+ };
+...
diff --git a/Documentation/devicetree/bindings/soc/stm32/stm32_hdp.txt b/Documentation/devicetree/bindings/soc/stm32/stm32_hdp.txt
new file mode 100644
index 000000000000..e2bd82f4980e
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/stm32/stm32_hdp.txt
@@ -0,0 +1,39 @@
+STM32 - STM32MP1- HDP Pin configuration for STM32MP1
+=======================================================
+
+The Hardware Debug Port (HDP) allows the observation of internal signals. By using multiplexers,
+up to 16 signals for each of 8-bit output can be observed.
+
+Required Properties:
+
+ - compatible: Must be "st,stm32mp1-hdp"
+ - muxing-hdp: Indicates for each HDP pins selected which HDP output among the 16 available signals you want
+
+For each HDP pins you can select one of 16 signals which will be described in file : include/dt-bindings/soc/stm32-hdp.h
+
+Example
+-------
+
+In common dtsi file:
+
+hdp: hdp@5002a000 {
+ compatible = "st,stm32mp1-hdp";
+ reg = <0x5002a000 0x400>;
+ clocks = <&rcc HDP>;
+ clock-names = "hdp";
+};
+
+In board-specific file:
+
+In this example I've selected HDP0, HDP6 and HDP7, and for HDP0 the output signal is HDP0_GPOVAL_0,
+for HDP6 is HDP6_GPOVAL_6, and for HDP7 is HDP7_GPOVAL_7.
+
+&hdp {
+ pinctrl-names = "default", "sleep";
+ pinctrl-0 = <&hdp0_pins_a &hdp6_pins_a &hdp7_pins_a>;
+ pinctrl-1 = <&hdp0_pins_sleep_a &hdp6_pins_sleep_a &hdp7_pins_sleep_a>;
+
+ muxing-hdp = <(STM32_HDP(0, HDP0_GPOVAL_0) |
+ STM32_HDP(6, HDP6_GPOVAL_6) |
+ STM32_HDP(7, HDP7_GPOVAL_7))>;
+};
diff --git a/MAINTAINERS b/MAINTAINERS diff --git a/MAINTAINERS b/MAINTAINERS
index edc32575828b..29e2729008d9 100644 index 2bf1ad0fb2a6..f27b6574d93e 100644
--- a/MAINTAINERS --- a/MAINTAINERS
+++ b/MAINTAINERS +++ b/MAINTAINERS
@@ -7753,6 +7753,14 @@ F: kernel/futex.c @@ -7743,6 +7743,14 @@ F: kernel/futex/*
F: tools/perf/bench/futex* F: tools/perf/bench/futex*
F: tools/testing/selftests/futex/ F: tools/testing/selftests/futex/
@ -447,7 +125,7 @@ index edc32575828b..29e2729008d9 100644
GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER
M: Tim Harvey <tharvey@gateworks.com> M: Tim Harvey <tharvey@gateworks.com>
M: Robert Jones <rjones@gateworks.com> M: Robert Jones <rjones@gateworks.com>
@@ -11732,6 +11740,15 @@ T: git git://linuxtv.org/media_tree.git @@ -11720,6 +11728,15 @@ T: git git://linuxtv.org/media_tree.git
F: Documentation/devicetree/bindings/media/st,stm32-dcmi.yaml F: Documentation/devicetree/bindings/media/st,stm32-dcmi.yaml
F: drivers/media/platform/stm32/stm32-dcmi.c F: drivers/media/platform/stm32/stm32-dcmi.c
@ -787,11 +465,57 @@ index 97ce31e667fc..b54bfd332613 100644
help help
System Control and Power Interface (SCPI) Message Protocol is System Control and Power Interface (SCPI) Message Protocol is
defined for the purpose of communication between the Application defined for the purpose of communication between the Application
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 53be0bdf2bc3..dba8dfebf26a 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -702,6 +702,9 @@ int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
case ACPI_PIN_CONFIG_PULLDOWN:
*lookupflags |= GPIO_PULL_DOWN;
break;
+ case ACPI_PIN_CONFIG_NOPULL:
+ *lookupflags |= GPIO_PULL_DISABLE;
+ break;
default:
break;
}
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index 7a96eb626a08..e37a619aed56 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -354,6 +354,9 @@ struct gpio_desc *gpiod_get_from_of_node(const struct device_node *node,
if (flags & OF_GPIO_PULL_DOWN)
lflags |= GPIO_PULL_DOWN;
+ if (flags & OF_GPIO_PULL_DISABLE)
+ lflags |= GPIO_PULL_DISABLE;
+
ret = gpiod_configure_flags(desc, propname, lflags, dflags);
if (ret < 0) {
gpiod_put(desc);
@@ -556,6 +559,8 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
*flags |= GPIO_PULL_UP;
if (of_flags & OF_GPIO_PULL_DOWN)
*flags |= GPIO_PULL_DOWN;
+ if (of_flags & OF_GPIO_PULL_DISABLE)
+ *flags |= GPIO_PULL_DISABLE;
return desc;
}
@@ -621,6 +626,8 @@ static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
*lflags |= GPIO_PULL_UP;
if (xlate_flags & OF_GPIO_PULL_DOWN)
*lflags |= GPIO_PULL_DOWN;
+ if (xlate_flags & OF_GPIO_PULL_DISABLE)
+ *lflags |= GPIO_PULL_DISABLE;
if (of_property_read_bool(np, "input"))
*dflags |= GPIOD_IN;
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 320baed949ee..db4ad34fcac4 100644 index 8c041a8dd9d8..73737407cc82 100644
--- a/drivers/gpio/gpiolib.c --- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c
@@ -422,8 +422,16 @@ static int devprop_gpiochip_set_names(struct gpio_chip *chip) @@ -421,8 +421,16 @@ static int devprop_gpiochip_set_names(struct gpio_chip *chip)
if (count > chip->ngpio) if (count > chip->ngpio)
count = chip->ngpio; count = chip->ngpio;
@ -810,7 +534,7 @@ index 320baed949ee..db4ad34fcac4 100644
kfree(names); kfree(names);
@@ -708,10 +716,12 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, @@ -733,10 +741,12 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
INIT_LIST_HEAD(&gdev->pin_ranges); INIT_LIST_HEAD(&gdev->pin_ranges);
#endif #endif
@ -826,8 +550,31 @@ index 320baed949ee..db4ad34fcac4 100644
if (ret) if (ret)
goto err_remove_from_list; goto err_remove_from_list;
@@ -3869,9 +3879,11 @@ int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
if (lflags & GPIO_OPEN_SOURCE)
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
- if ((lflags & GPIO_PULL_UP) && (lflags & GPIO_PULL_DOWN)) {
+ if (((lflags & GPIO_PULL_UP) && (lflags & GPIO_PULL_DOWN)) ||
+ ((lflags & GPIO_PULL_UP) && (lflags & GPIO_PULL_DISABLE)) ||
+ ((lflags & GPIO_PULL_DOWN) && (lflags & GPIO_PULL_DISABLE))) {
gpiod_err(desc,
- "both pull-up and pull-down enabled, invalid configuration\n");
+ "multiple pull-up, pull-down or pull-disable enabled, invalid configuration\n");
return -EINVAL;
}
@@ -3879,6 +3891,8 @@ int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
set_bit(FLAG_PULL_UP, &desc->flags);
else if (lflags & GPIO_PULL_DOWN)
set_bit(FLAG_PULL_DOWN, &desc->flags);
+ else if (lflags & GPIO_PULL_DISABLE)
+ set_bit(FLAG_BIAS_DISABLE, &desc->flags);
ret = gpiod_set_transitory(desc, (lflags & GPIO_TRANSITORY));
if (ret < 0)
diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
index bb2e1cbffba7..918d81e6ebac 100644 index bb2e1cbffba7..8acf3d4d8d75 100644
--- a/drivers/input/touchscreen/edt-ft5x06.c --- a/drivers/input/touchscreen/edt-ft5x06.c
+++ b/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c
@@ -30,6 +30,8 @@ @@ -30,6 +30,8 @@
@ -850,7 +597,7 @@ index bb2e1cbffba7..918d81e6ebac 100644
case 0x5a: /* Solomon Goldentek Display */ case 0x5a: /* Solomon Goldentek Display */
snprintf(model_name, EDT_NAME_LEN, "GKTW50SCED1R0"); snprintf(model_name, EDT_NAME_LEN, "GKTW50SCED1R0");
break; break;
@@ -1078,6 +1084,8 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, @@ -1078,13 +1084,38 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
const struct edt_i2c_chip_data *chip_data; const struct edt_i2c_chip_data *chip_data;
struct edt_ft5x06_ts_data *tsdata; struct edt_ft5x06_ts_data *tsdata;
u8 buf[2] = { 0xfc, 0x00 }; u8 buf[2] = { 0xfc, 0x00 };
@ -858,10 +605,11 @@ index bb2e1cbffba7..918d81e6ebac 100644
+ struct device_node *np; + struct device_node *np;
struct input_dev *input; struct input_dev *input;
unsigned long irq_flags; unsigned long irq_flags;
+ struct device_link *dlink;
int error; int error;
@@ -1255,6 +1263,18 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, char fw_version[EDT_NAME_LEN];
if (error)
return error; dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n");
+ np = of_parse_phandle(client->dev.of_node, "panel", 0); + np = of_parse_phandle(client->dev.of_node, "panel", 0);
+ if (np) { + if (np) {
@ -870,16 +618,26 @@ index bb2e1cbffba7..918d81e6ebac 100644
+ if (!panel) + if (!panel)
+ return -EPROBE_DEFER; + return -EPROBE_DEFER;
+ +
+ device_link_add(&client->dev, &panel->dev, DL_FLAG_STATELESS | + dlink = device_link_add(&client->dev, &panel->dev, DL_FLAG_AUTOREMOVE_CONSUMER);
+ DL_FLAG_AUTOREMOVE_SUPPLIER); +
+ if (IS_ERR(dlink)) {
+ error = PTR_ERR(dlink);
+ dev_err(&client->dev,
+ "Failed to add link to device %d\n", error);
+ return error;
+ }
+
+ if (dlink && dlink->status != DL_STATE_CONSUMER_PROBE)
+ return -EPROBE_DEFER;
+
+ put_device(&panel->dev); + put_device(&panel->dev);
+ } + }
+ +
edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL);
if (!tsdata) {
dev_dbg(&client->dev, dev_err(&client->dev, "failed to allocate driver data.\n");
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 3667f7e51fde..890cc8270c6a 100644 index 166d36b2626e..819880e7d00c 100644
--- a/drivers/input/touchscreen/goodix.c --- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c +++ b/drivers/input/touchscreen/goodix.c
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
@ -890,7 +648,7 @@ index 3667f7e51fde..890cc8270c6a 100644
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/slab.h> #include <linux/slab.h>
@@ -248,7 +249,7 @@ static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8 *data) @@ -257,7 +258,7 @@ static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8 *data)
error = goodix_i2c_read(ts->client, addr, data, error = goodix_i2c_read(ts->client, addr, data,
header_contact_keycode_size); header_contact_keycode_size);
if (error) { if (error) {
@ -899,7 +657,7 @@ index 3667f7e51fde..890cc8270c6a 100644
error); error);
return error; return error;
} }
@@ -376,7 +377,7 @@ static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) @@ -385,7 +386,7 @@ static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
goodix_process_events(ts); goodix_process_events(ts);
if (goodix_i2c_write_u8(ts->client, GOODIX_READ_COOR_ADDR, 0) < 0) if (goodix_i2c_write_u8(ts->client, GOODIX_READ_COOR_ADDR, 0) < 0)
@ -908,16 +666,43 @@ index 3667f7e51fde..890cc8270c6a 100644
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@@ -1135,6 +1136,8 @@ static int goodix_ts_probe(struct i2c_client *client, @@ -1155,10 +1156,35 @@ static int goodix_ts_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct goodix_ts_data *ts; struct goodix_ts_data *ts;
+ struct mipi_dsi_device *panel; + struct mipi_dsi_device *panel;
+ struct device_node *np; + struct device_node *np;
+ struct device_link *dlink;
int error; int error;
dev_dbg(&client->dev, "I2C Address: 0x%02x\n", client->addr); dev_dbg(&client->dev, "I2C Address: 0x%02x\n", client->addr);
@@ -1186,6 +1189,26 @@ static int goodix_ts_probe(struct i2c_client *client,
+ np = of_parse_phandle(client->dev.of_node, "panel", 0);
+ if (np) {
+ panel = of_find_mipi_dsi_device_by_node(np);
+ of_node_put(np);
+ if (!panel)
+ return -EPROBE_DEFER;
+
+ dlink = device_link_add(&client->dev, &panel->dev, DL_FLAG_AUTOREMOVE_CONSUMER);
+
+ if (IS_ERR(dlink)) {
+ error = PTR_ERR(dlink);
+ dev_err(&client->dev,
+ "Failed to add link to device %d\n", error);
+ return error;
+ }
+
+ if (dlink && dlink->status != DL_STATE_CONSUMER_PROBE)
+ return -EPROBE_DEFER;
+
+ put_device(&panel->dev);
+ }
+
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
dev_err(&client->dev, "I2C check functionality failed.\n");
return -ENXIO;
@@ -1206,6 +1232,26 @@ static int goodix_ts_probe(struct i2c_client *client,
error = goodix_reset(ts); error = goodix_reset(ts);
if (error) if (error)
return error; return error;
@ -944,25 +729,7 @@ index 3667f7e51fde..890cc8270c6a 100644
} }
error = goodix_i2c_test(client); error = goodix_i2c_test(client);
@@ -1232,6 +1255,17 @@ static int goodix_ts_probe(struct i2c_client *client, @@ -1307,6 +1353,7 @@ static int __maybe_unused goodix_suspend(struct device *dev)
return error;
}
+ np = of_parse_phandle(client->dev.of_node, "panel", 0);
+ if (np) {
+ panel = of_find_mipi_dsi_device_by_node(np);
+ of_node_put(np);
+ if (!panel)
+ return -EPROBE_DEFER;
+ device_link_add(&client->dev, &panel->dev, DL_FLAG_STATELESS |
+ DL_FLAG_AUTOREMOVE_SUPPLIER);
+ put_device(&panel->dev);
+ }
+
return 0;
}
@@ -1287,6 +1321,7 @@ static int __maybe_unused goodix_suspend(struct device *dev)
* sooner, delay 58ms here. * sooner, delay 58ms here.
*/ */
msleep(58); msleep(58);
@ -1005,10 +772,10 @@ index 83268f20aa3a..3916c2818522 100644
obj-$(CONFIG_SDR_MAX2175) += max2175.o obj-$(CONFIG_SDR_MAX2175) += max2175.o
diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c
new file mode 100644 new file mode 100644
index 000000000000..f892f18dc19b index 000000000000..222e47d76321
--- /dev/null --- /dev/null
+++ b/drivers/media/i2c/gc2145.c +++ b/drivers/media/i2c/gc2145.c
@@ -0,0 +1,1949 @@ @@ -0,0 +1,1948 @@
+// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0
+/* +/*
+ * A V4L2 driver for Galaxycore GC2145 camera. + * A V4L2 driver for Galaxycore GC2145 camera.
@ -2351,14 +2118,13 @@ index 000000000000..f892f18dc19b
+ +
+ /* + /*
+ * Adjust the MIPI Fifo Full Level + * Adjust the MIPI Fifo Full Level
+ * TODO - would need to understand better the constraints
+ * 640x480 RGB: 0x0190 + * 640x480 RGB: 0x0190
+ * 1280x720 / 1600x1200 (aka no scaler) non RAW: 0x0010 + * 1280x720 / 1600x1200 (aka no scaler) non RAW: 0x0001
+ * 1600x1200 RAW: 0x0190 + * 1600x1200 RAW: 0x0190
+ */ + */
+ if (gc2145_format->colorspace != V4L2_COLORSPACE_RAW) { + if (gc2145_format->colorspace != V4L2_COLORSPACE_RAW) {
+ if ((gc2145->mode->width == 720) || (gc2145->mode->width == 1200)) + if (gc2145->mode->width == 1280 || gc2145->mode->width == 1600)
+ fifo_full_lvl = 0x0010; + fifo_full_lvl = 0x0001;
+ else + else
+ fifo_full_lvl = 0x0190; + fifo_full_lvl = 0x0190;
+ } else + } else
@ -2959,7 +2725,7 @@ index 000000000000..f892f18dc19b
+MODULE_DESCRIPTION("GalaxyCore GC2145 sensor driver"); +MODULE_DESCRIPTION("GalaxyCore GC2145 sensor driver");
+MODULE_LICENSE("GPL v2"); +MODULE_LICENSE("GPL v2");
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index db5a19babe67..df2b1fc1a4eb 100644 index a141552531f7..5ec6addf777b 100644
--- a/drivers/media/i2c/ov5640.c --- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c +++ b/drivers/media/i2c/ov5640.c
@@ -65,6 +65,7 @@ @@ -65,6 +65,7 @@
@ -8400,7 +8166,7 @@ index 74afbb7a4f5e..654ca9e9808c 100644
of_platform_default_populate(NULL, NULL, NULL); of_platform_default_populate(NULL, NULL, NULL);
diff --git a/drivers/pwm/pwm-stm32-lp.c b/drivers/pwm/pwm-stm32-lp.c diff --git a/drivers/pwm/pwm-stm32-lp.c b/drivers/pwm/pwm-stm32-lp.c
index 3115abb3f52a..917428242775 100644 index 61a1c87cd501..1c03db71661d 100644
--- a/drivers/pwm/pwm-stm32-lp.c --- a/drivers/pwm/pwm-stm32-lp.c
+++ b/drivers/pwm/pwm-stm32-lp.c +++ b/drivers/pwm/pwm-stm32-lp.c
@@ -58,7 +58,7 @@ static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm, @@ -58,7 +58,7 @@ static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm,
@ -8462,7 +8228,7 @@ index a05e9fbcd3e0..e4909f6467f9 100644
obj-y += ti/ obj-y += ti/
diff --git a/drivers/soc/st/Kconfig b/drivers/soc/st/Kconfig diff --git a/drivers/soc/st/Kconfig b/drivers/soc/st/Kconfig
new file mode 100644 new file mode 100644
index 000000000000..8fde9d232291 index 000000000000..e0ee54bcd04e
--- /dev/null --- /dev/null
+++ b/drivers/soc/st/Kconfig +++ b/drivers/soc/st/Kconfig
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
@ -8486,9 +8252,9 @@ index 000000000000..8fde9d232291
+ +
+config STM32_PM_DOMAINS +config STM32_PM_DOMAINS
+ bool "STM32 PM domains" + bool "STM32 PM domains"
+ depends on MACH_STM32MP157 + depends on MACH_STM32MP157 || MACH_STM32MP13
+ select PM_GENERIC_DOMAINS + select PM_GENERIC_DOMAINS
+ default y if MACH_STM32MP157 + default y if MACH_STM32MP157 || MACH_STM32MP13
+ +
+endif # ARCH_STM32 +endif # ARCH_STM32
diff --git a/drivers/soc/st/Makefile b/drivers/soc/st/Makefile diff --git a/drivers/soc/st/Makefile b/drivers/soc/st/Makefile
@ -9129,6 +8895,23 @@ index 000000000000..0386624c20f2
+ return platform_driver_register(&stm32_pm_domains_driver); + return platform_driver_register(&stm32_pm_domains_driver);
+} +}
+core_initcall(stm32_pm_domains_init); +core_initcall(stm32_pm_domains_init);
diff --git a/drivers/thermal/st/Kconfig b/drivers/thermal/st/Kconfig
index 58ece381956b..91db3e2885d6 100644
--- a/drivers/thermal/st/Kconfig
+++ b/drivers/thermal/st/Kconfig
@@ -18,10 +18,10 @@ config ST_THERMAL_MEMMAP
config STM32_THERMAL
tristate "Thermal framework support on STMicroelectronics STM32 series of SoCs"
- depends on MACH_STM32MP157
+ depends on MACH_STM32MP157 || MACH_STM32MP13
default y
help
Support for thermal framework on STMicroelectronics STM32 series of
SoCs. This thermal driver allows to access to general thermal framework
functionalities and to access to SoC sensor functionalities. This
- configuration is fully dependent of MACH_STM32MP157.
+ configuration is fully dependent of MACH_STM32MP157 or MACH_STM32MP13.
diff --git a/drivers/thermal/st/stm_thermal.c b/drivers/thermal/st/stm_thermal.c diff --git a/drivers/thermal/st/stm_thermal.c b/drivers/thermal/st/stm_thermal.c
index 5fd3fb8912a6..1e065a3323f9 100644 index 5fd3fb8912a6..1e065a3323f9 100644
--- a/drivers/thermal/st/stm_thermal.c --- a/drivers/thermal/st/stm_thermal.c
@ -9465,6 +9248,18 @@ index 000000000000..091c1c83587a
+#define HDP7_GPOVAL_7 15 +#define HDP7_GPOVAL_7 15
+ +
+#endif /* _DT_BINDINGS_STM32_HDP_H */ +#endif /* _DT_BINDINGS_STM32_HDP_H */
diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h
index d755e529c1e3..1ed588fec969 100644
--- a/include/linux/gpio/machine.h
+++ b/include/linux/gpio/machine.h
@@ -14,6 +14,7 @@ enum gpio_lookup_flags {
GPIO_TRANSITORY = (1 << 3),
GPIO_PULL_UP = (1 << 4),
GPIO_PULL_DOWN = (1 << 5),
+ GPIO_PULL_DISABLE = (1 << 6),
GPIO_LOOKUP_FLAGS_DEFAULT = GPIO_ACTIVE_HIGH | GPIO_PERSISTENT,
};
diff --git a/include/linux/smscphy.h b/include/linux/smscphy.h diff --git a/include/linux/smscphy.h b/include/linux/smscphy.h
index 1a136271ba6a..00884908e509 100644 index 1a136271ba6a..00884908e509 100644
--- a/include/linux/smscphy.h --- a/include/linux/smscphy.h

View File

@ -1,105 +1,39 @@
From 69ed3aa4864f05afff66ffd7596de3b45d739360 Mon Sep 17 00:00:00 2001 From e2857bb430c4d142e2d73a55fdb488eabb0e4805 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:55:56 +0100 Date: Tue, 25 Jul 2023 10:51:02 +0200
Subject: [PATCH 12/22] v5.15-stm32mp-r2 MFD Subject: [PATCH 12/22] v5.15-stm32mp-r2.1 MFD
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/mfd/st,stm32-lptimer.yaml | 3 + drivers/memory/Kconfig | 2 +-
.../bindings/mfd/st,stm32mp1-pwr.txt | 57 +++
drivers/mfd/Kconfig | 10 + drivers/mfd/Kconfig | 10 +
drivers/mfd/Makefile | 1 + drivers/mfd/Makefile | 1 +
drivers/mfd/stm32-pwr.c | 423 ++++++++++++++++++ drivers/mfd/stm32-pwr.c | 423 +++++++++++++++++++++++++++++++
drivers/mfd/stmfx.c | 2 - drivers/mfd/stmfx.c | 2 -
drivers/mfd/stpmic1.c | 6 + drivers/mfd/stpmic1.c | 6 +
drivers/mfd/wm8994-core.c | 6 + drivers/mfd/wm8994-core.c | 6 +
include/linux/mfd/stm32-timers.h | 1 + include/linux/mfd/stm32-timers.h | 1 +
9 files changed, 507 insertions(+), 2 deletions(-) 8 files changed, 448 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/mfd/st,stm32mp1-pwr.txt
create mode 100644 drivers/mfd/stm32-pwr.c create mode 100644 drivers/mfd/stm32-pwr.c
diff --git a/Documentation/devicetree/bindings/mfd/st,stm32-lptimer.yaml b/Documentation/devicetree/bindings/mfd/st,stm32-lptimer.yaml diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig
index 8bcea8dd7d90..6e518ae12e7f 100644 index 72c0df129d5c..dbbc96ad730e 100644
--- a/Documentation/devicetree/bindings/mfd/st,stm32-lptimer.yaml --- a/drivers/memory/Kconfig
+++ b/Documentation/devicetree/bindings/mfd/st,stm32-lptimer.yaml +++ b/drivers/memory/Kconfig
@@ -44,6 +44,9 @@ properties: @@ -217,7 +217,7 @@ config RENESAS_RPCIF
wakeup-source: true config STM32_FMC2_EBI
tristate "Support for FMC2 External Bus Interface on STM32MP SoCs"
+ power-domains: - depends on MACH_STM32MP157 || COMPILE_TEST
+ maxItems: 1 + depends on ARCH_STM32 || COMPILE_TEST
+ select MFD_SYSCON
pwm: help
type: object Select this option to enable the STM32 FMC2 External Bus Interface
diff --git a/Documentation/devicetree/bindings/mfd/st,stm32mp1-pwr.txt b/Documentation/devicetree/bindings/mfd/st,stm32mp1-pwr.txt
new file mode 100644
index 000000000000..b5f414a19120
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/st,stm32mp1-pwr.txt
@@ -0,0 +1,57 @@
+STMicroelectronics STM32MP1 Power Management Controller
+=======================================================
+
+The PWR IP is responsible for handling the power related resources such as
+clocks, power supplies and resets. It provides 6 wake-up pins that are handled
+by an interrupt-controller. Wake-up pin can be used to wake-up from STANDBY SoC state.
+
+Required properties:
+- compatible should be: "st,stm32mp1-pwr"
+- reg: should be register base and length as documented in the
+ datasheet
+- interrupts: contains the reference to the gic wake-up pin interrupt
+- interrupt-controller; Enable interrupt controller for wake-up pins.
+- #interrupt-cells = <3>
+- st,wakeup-pins: contains a list of GPIO spec describing each wake-up pin.
+
+Optional Properties:
+- pwr-supply: main soc power supply
+
+Interrupt consumers have to specify 3 cells:
+ - cell 1: wake-up pin id from 0 to 5
+ - cell 2: IRQ_TYPE_EDGE_FALLING or IRQ_TYPE_EDGE_RISING
+ - cell 3: Pull config: 0 = No Pull, 1=Pull Up, 2=Pull Down
+
+
+Example:
+
+ pwr: pwr@50001000 {
+ compatible = "st,stm32mp1-pwr", "simple-mfd";
+ reg = <0x50001000 0x400>;
+ interrupts = <GIC_SPI 149 IRQ_TYPE_NONE>;
+ interrupt-controller;
+ #interrupt-cells = <3>;
+
+ st,wakeup-pins = <&gpioa 0 0>, <&gpioa 2 0>,
+ <&gpioc 13 0>, <&gpioi 8 0>,
+ <&gpioi 11 0>, <&gpioc 1 0>;
+
+ pwr-supply = <&vdd>;
+ };
+
+
+Example of interrupt user:
+gpio_keys {
+ compatible = "gpio-keys";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ button@4 {
+ label = "WakeUp4";
+ linux,code = <BTN_4>;
+ interrupt-parent = <&pwr>;
+ interrupts = <3 IRQ_TYPE_EDGE_FALLING 1>;
+ wakeup-source;
+ };
+};
+
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index d2f345245538..181730a693a1 100644 index ef550d33af92..8b035ef7d7e9 100644
--- a/drivers/mfd/Kconfig --- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig
@@ -2042,6 +2042,16 @@ config MFD_STPMIC1 @@ -2044,6 +2044,16 @@ config MFD_STPMIC1
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called stpmic1. module will be called stpmic1.
@ -617,7 +551,7 @@ index 7b1d270722ba..e2c98c66bf9f 100644
wm8994->supplies); wm8994->supplies);
if (ret != 0) { if (ret != 0) {
diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h
index f8db83aedb2b..f48f04dc4187 100644 index 5f5c43fd69dd..1b94325febb3 100644
--- a/include/linux/mfd/stm32-timers.h --- a/include/linux/mfd/stm32-timers.h
+++ b/include/linux/mfd/stm32-timers.h +++ b/include/linux/mfd/stm32-timers.h
@@ -31,6 +31,7 @@ @@ -31,6 +31,7 @@

View File

@ -0,0 +1,553 @@
From d366624fc551bb25c4a1a9b94de2408eb75b56fd Mon Sep 17 00:00:00 2001
From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Tue, 25 Jul 2023 10:51:31 +0200
Subject: [PATCH 13/22] v5.15-stm32mp-r2.1 MMC
Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
---
drivers/mmc/host/mmci.c | 70 ++++++++++++-
drivers/mmc/host/mmci.h | 4 +
drivers/mmc/host/mmci_stm32_sdmmc.c | 137 ++++++++++++++++++++-----
drivers/mtd/nand/raw/Kconfig | 2 +-
drivers/mtd/nand/raw/stm32_fmc2_nand.c | 40 +++++++-
5 files changed, 222 insertions(+), 31 deletions(-)
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 2c4eda83ca18..05cfc28a5e98 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -270,6 +270,7 @@ static struct variant_data variant_stm32_sdmmc = {
.datactrl_any_blocksz = true,
.datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN,
.stm32_idmabsize_mask = GENMASK(12, 5),
+ .use_sdio_irq = true,
.busy_timeout = true,
.busy_detect = true,
.busy_detect_flag = MCI_STM32_BUSYD0,
@@ -280,7 +281,7 @@ static struct variant_data variant_stm32_sdmmc = {
static struct variant_data variant_stm32_sdmmcv2 = {
.fifosize = 16 * 4,
.fifohalfsize = 8 * 4,
- .f_max = 208000000,
+ .f_max = 267000000,
.stm32_clkdiv = true,
.cmdreg_cpsm_enable = MCI_CPSM_STM32_ENABLE,
.cmdreg_lrsp_crc = MCI_CPSM_STM32_LRSP_CRC,
@@ -296,6 +297,7 @@ static struct variant_data variant_stm32_sdmmcv2 = {
.datactrl_any_blocksz = true,
.datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN,
.stm32_idmabsize_mask = GENMASK(16, 5),
+ .use_sdio_irq = true,
.dma_lli = true,
.busy_timeout = true,
.busy_detect = true,
@@ -392,6 +394,10 @@ static void mmci_write_datactrlreg(struct mmci_host *host, u32 datactrl)
/* Keep busy mode in DPSM if enabled */
datactrl |= host->datactrl_reg & host->variant->busy_dpsm_flag;
+ /* Keep SD I/O interrupt mode enabled */
+ if (host->variant->use_sdio_irq && host->mmc->caps & MMC_CAP_SDIO_IRQ)
+ datactrl |= host->variant->datactrl_mask_sdio;
+
if (host->datactrl_reg != datactrl) {
host->datactrl_reg = datactrl;
writel(datactrl, host->base + MMCIDATACTRL);
@@ -1644,6 +1650,11 @@ static irqreturn_t mmci_irq(int irq, void *dev_id)
mmci_data_irq(host, host->data, status);
}
+ if (host->variant->use_sdio_irq &&
+ host->mmc->caps & MMC_CAP_SDIO_IRQ &&
+ host->ops && host->ops->sdio_irq)
+ host->ops->sdio_irq(host, status);
+
/*
* Busy detection has been handled by mmci_cmd_irq() above.
* Clear the status bit to prevent polling in IRQ context.
@@ -1729,7 +1740,8 @@ static void mmci_set_max_busy_timeout(struct mmc_host *mmc)
return;
if (host->variant->busy_timeout && mmc->actual_clock)
- max_busy_timeout = ~0UL / (mmc->actual_clock / MSEC_PER_SEC);
+ max_busy_timeout = U32_MAX / DIV_ROUND_UP(mmc->actual_clock,
+ MSEC_PER_SEC);
mmc->max_busy_timeout = max_busy_timeout;
}
@@ -1883,6 +1895,45 @@ static int mmci_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
return ret;
}
+static void mmci_enable_sdio_irq(struct mmc_host *mmc, int enable)
+{
+ struct mmci_host *host = mmc_priv(mmc);
+ unsigned long flags;
+
+ if (!host->variant->use_sdio_irq)
+ return;
+
+ if (host->ops && host->ops->enable_sdio_irq) {
+ if (enable)
+ /* Keep device active while SDIO IRQ is enabled */
+ pm_runtime_get_sync(mmc_dev(mmc));
+
+ spin_lock_irqsave(&host->lock, flags);
+ host->ops->enable_sdio_irq(host, enable);
+ spin_unlock_irqrestore(&host->lock, flags);
+
+ if (!enable) {
+ pm_runtime_mark_last_busy(mmc_dev(mmc));
+ pm_runtime_put_autosuspend(mmc_dev(mmc));
+ }
+ }
+}
+
+static void mmci_ack_sdio_irq(struct mmc_host *mmc)
+{
+ struct mmci_host *host = mmc_priv(mmc);
+ unsigned long flags;
+
+ if (!host->variant->use_sdio_irq)
+ return;
+
+ if (host->ops && host->ops->enable_sdio_irq) {
+ spin_lock_irqsave(&host->lock, flags);
+ host->ops->enable_sdio_irq(host, 1);
+ spin_unlock_irqrestore(&host->lock, flags);
+ }
+}
+
static struct mmc_host_ops mmci_ops = {
.request = mmci_request,
.pre_req = mmci_pre_request,
@@ -1891,6 +1942,8 @@ static struct mmc_host_ops mmci_ops = {
.get_ro = mmc_gpio_get_ro,
.get_cd = mmci_get_cd,
.start_signal_voltage_switch = mmci_sig_volt_switch,
+ .enable_sdio_irq = mmci_enable_sdio_irq,
+ .ack_sdio_irq = mmci_ack_sdio_irq,
};
static void mmci_probe_level_translator(struct mmc_host *mmc)
@@ -2158,6 +2211,14 @@ static int mmci_probe(struct amba_device *dev,
mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY;
}
+ if (variant->use_sdio_irq && host->mmc->caps & MMC_CAP_SDIO_IRQ) {
+ mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD;
+
+ if (variant->datactrl_mask_sdio)
+ mmci_write_datactrlreg(host,
+ host->variant->datactrl_mask_sdio);
+ }
+
/* Variants with mandatory busy timeout in HW needs R1B responses. */
if (variant->busy_timeout)
mmc->caps |= MMC_CAP_NEED_RSP_BUSY;
@@ -2433,6 +2494,11 @@ static const struct amba_id mmci_ids[] = {
.mask = 0xf0ffffff,
.data = &variant_stm32_sdmmcv2,
},
+ {
+ .id = 0x20253180,
+ .mask = 0xf0ffffff,
+ .data = &variant_stm32_sdmmcv2,
+ },
/* Qualcomm variants */
{
.id = 0x00051180,
diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h
index e1a9b96a3396..a710cd686cb2 100644
--- a/drivers/mmc/host/mmci.h
+++ b/drivers/mmc/host/mmci.h
@@ -316,6 +316,7 @@ struct mmci_host;
* @opendrain: bitmask identifying the OPENDRAIN bit inside MMCIPOWER register
* @dma_lli: true if variant has dma link list feature.
* @stm32_idmabsize_mask: stm32 sdmmc idma buffer size.
+ * @use_sdio_irq: allow SD I/O card to interrupt the host
*/
struct variant_data {
unsigned int clkreg;
@@ -360,6 +361,7 @@ struct variant_data {
u32 start_err;
u32 opendrain;
u8 dma_lli:1;
+ u8 use_sdio_irq:1;
u32 stm32_idmabsize_mask;
void (*init)(struct mmci_host *host);
};
@@ -383,6 +385,8 @@ struct mmci_host_ops {
bool (*busy_complete)(struct mmci_host *host, u32 status, u32 err_msk);
void (*pre_sig_volt_switch)(struct mmci_host *host);
int (*post_sig_volt_switch)(struct mmci_host *host, struct mmc_ios *ios);
+ void (*enable_sdio_irq)(struct mmci_host *host, int enable);
+ void (*sdio_irq)(struct mmci_host *host, u32 status);
};
struct mmci_host {
diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_stm32_sdmmc.c
index 4cceb9bab036..0cc33b172080 100644
--- a/drivers/mmc/host/mmci_stm32_sdmmc.c
+++ b/drivers/mmc/host/mmci_stm32_sdmmc.c
@@ -43,6 +43,9 @@ struct sdmmc_lli_desc {
struct sdmmc_idma {
dma_addr_t sg_dma;
void *sg_cpu;
+ dma_addr_t bounce_dma_addr;
+ void *bounce_buf;
+ bool use_bounce_buffer;
};
struct sdmmc_dlyb {
@@ -54,6 +57,8 @@ struct sdmmc_dlyb {
static int sdmmc_idma_validate_data(struct mmci_host *host,
struct mmc_data *data)
{
+ struct sdmmc_idma *idma = host->dma_priv;
+ struct device *dev = mmc_dev(host->mmc);
struct scatterlist *sg;
int i;
@@ -61,41 +66,69 @@ static int sdmmc_idma_validate_data(struct mmci_host *host,
* idma has constraints on idmabase & idmasize for each element
* excepted the last element which has no constraint on idmasize
*/
+ idma->use_bounce_buffer = false;
for_each_sg(data->sg, sg, data->sg_len - 1, i) {
if (!IS_ALIGNED(sg->offset, sizeof(u32)) ||
!IS_ALIGNED(sg->length, SDMMC_IDMA_BURST)) {
- dev_err(mmc_dev(host->mmc),
+ dev_dbg(mmc_dev(host->mmc),
"unaligned scatterlist: ofst:%x length:%d\n",
data->sg->offset, data->sg->length);
- return -EINVAL;
+ goto use_bounce_buffer;
}
}
if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
- dev_err(mmc_dev(host->mmc),
+ dev_dbg(mmc_dev(host->mmc),
"unaligned last scatterlist: ofst:%x length:%d\n",
data->sg->offset, data->sg->length);
- return -EINVAL;
+ goto use_bounce_buffer;
}
+ return 0;
+
+use_bounce_buffer:
+ if (!idma->bounce_buf) {
+ idma->bounce_buf = dmam_alloc_coherent(dev,
+ host->mmc->max_req_size,
+ &idma->bounce_dma_addr,
+ GFP_KERNEL);
+ if (!idma->bounce_buf) {
+ dev_err(dev, "Unable to map allocate DMA bounce buffer.\n");
+ return -ENOMEM;
+ }
+ }
+
+ idma->use_bounce_buffer = true;
+
return 0;
}
static int _sdmmc_idma_prep_data(struct mmci_host *host,
struct mmc_data *data)
{
- int n_elem;
+ struct sdmmc_idma *idma = host->dma_priv;
- n_elem = dma_map_sg(mmc_dev(host->mmc),
- data->sg,
- data->sg_len,
- mmc_get_dma_dir(data));
+ if (idma->use_bounce_buffer) {
+ if (data->flags & MMC_DATA_WRITE) {
+ unsigned int xfer_bytes = data->blksz * data->blocks;
- if (!n_elem) {
- dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n");
- return -EINVAL;
- }
+ sg_copy_to_buffer(data->sg, data->sg_len,
+ idma->bounce_buf, xfer_bytes);
+ dma_wmb();
+ }
+ } else {
+ int n_elem;
+
+ n_elem = dma_map_sg(mmc_dev(host->mmc),
+ data->sg,
+ data->sg_len,
+ mmc_get_dma_dir(data));
+ if (!n_elem) {
+ dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n");
+ return -EINVAL;
+ }
+ }
return 0;
}
@@ -112,8 +145,19 @@ static int sdmmc_idma_prep_data(struct mmci_host *host,
static void sdmmc_idma_unprep_data(struct mmci_host *host,
struct mmc_data *data, int err)
{
- dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
- mmc_get_dma_dir(data));
+ struct sdmmc_idma *idma = host->dma_priv;
+
+ if (idma->use_bounce_buffer) {
+ if (data->flags & MMC_DATA_READ) {
+ unsigned int xfer_bytes = data->blksz * data->blocks;
+
+ sg_copy_from_buffer(data->sg, data->sg_len,
+ idma->bounce_buf, xfer_bytes);
+ }
+ } else {
+ dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
+ mmc_get_dma_dir(data));
+ }
}
static int sdmmc_idma_setup(struct mmci_host *host)
@@ -137,6 +181,8 @@ static int sdmmc_idma_setup(struct mmci_host *host)
host->mmc->max_segs = SDMMC_LLI_BUF_LEN /
sizeof(struct sdmmc_lli_desc);
host->mmc->max_seg_size = host->variant->stm32_idmabsize_mask;
+
+ host->mmc->max_req_size = SZ_1M;
} else {
host->mmc->max_segs = 1;
host->mmc->max_seg_size = host->mmc->max_req_size;
@@ -154,8 +200,16 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)
struct scatterlist *sg;
int i;
- if (!host->variant->dma_lli || data->sg_len == 1) {
- writel_relaxed(sg_dma_address(data->sg),
+ if (!host->variant->dma_lli || data->sg_len == 1 ||
+ idma->use_bounce_buffer) {
+ u32 dma_addr;
+
+ if (idma->use_bounce_buffer)
+ dma_addr = idma->bounce_dma_addr;
+ else
+ dma_addr = sg_dma_address(data->sg);
+
+ writel_relaxed(dma_addr,
host->base + MMCI_STM32_IDMABASE0R);
writel_relaxed(MMCI_STM32_IDMAEN,
host->base + MMCI_STM32_IDMACTRLR);
@@ -239,17 +293,8 @@ static void mmci_sdmmc_set_clkreg(struct mmci_host *host, unsigned int desired)
clk |= host->clk_reg_add;
clk |= ddr;
- /*
- * SDMMC_FBCK is selected when an external Delay Block is needed
- * with SDR104.
- */
- if (host->mmc->ios.timing >= MMC_TIMING_UHS_SDR50) {
+ if (host->mmc->ios.timing >= MMC_TIMING_UHS_SDR50)
clk |= MCI_STM32_CLK_BUSSPEED;
- if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104) {
- clk &= ~MCI_STM32_CLK_SEL_MSK;
- clk |= MCI_STM32_CLK_SELFBCK;
- }
- }
mmci_write_clkreg(host, clk);
}
@@ -456,10 +501,27 @@ static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode)
{
struct mmci_host *host = mmc_priv(mmc);
struct sdmmc_dlyb *dlyb = host->variant_priv;
+ u32 clk;
+
+ if ((host->mmc->ios.timing != MMC_TIMING_UHS_SDR104 &&
+ host->mmc->ios.timing != MMC_TIMING_MMC_HS200) ||
+ host->mmc->actual_clock <= 50000000)
+ return 0;
if (!dlyb || !dlyb->base)
return -EINVAL;
+ writel_relaxed(DLYB_CR_DEN, dlyb->base + DLYB_CR);
+
+ /*
+ * SDMMC_FBCK is selected when an external Delay Block is needed
+ * with SDR104 or HS200.
+ */
+ clk = host->clk_reg;
+ clk &= ~MCI_STM32_CLK_SEL_MSK;
+ clk |= MCI_STM32_CLK_SELFBCK;
+ mmci_write_clkreg(host, clk);
+
if (sdmmc_dlyb_lng_tuning(host))
return -EINVAL;
@@ -504,6 +566,25 @@ static int sdmmc_post_sig_volt_switch(struct mmci_host *host,
return ret;
}
+static void sdmmc_enable_sdio_irq(struct mmci_host *host, int enable)
+{
+ void __iomem *base = host->base;
+ u32 mask = readl_relaxed(base + MMCIMASK0);
+
+ if (enable)
+ writel_relaxed(mask | MCI_ST_SDIOITMASK, base + MMCIMASK0);
+ else
+ writel_relaxed(mask & ~MCI_ST_SDIOITMASK, base + MMCIMASK0);
+}
+
+static void sdmmc_sdio_irq(struct mmci_host *host, u32 status)
+{
+ if (status & MCI_ST_SDIOIT) {
+ sdmmc_enable_sdio_irq(host, 0);
+ sdio_signal_irq(host->mmc);
+ }
+}
+
static struct mmci_host_ops sdmmc_variant_ops = {
.validate_data = sdmmc_idma_validate_data,
.prep_data = sdmmc_idma_prep_data,
@@ -517,6 +598,8 @@ static struct mmci_host_ops sdmmc_variant_ops = {
.busy_complete = sdmmc_busy_complete,
.pre_sig_volt_switch = sdmmc_pre_sig_volt_vswitch,
.post_sig_volt_switch = sdmmc_post_sig_volt_switch,
+ .enable_sdio_irq = sdmmc_enable_sdio_irq,
+ .sdio_irq = sdmmc_sdio_irq,
};
void sdmmc_variant_init(struct mmci_host *host)
diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig
index 67b7cb67c030..dccb86e577a3 100644
--- a/drivers/mtd/nand/raw/Kconfig
+++ b/drivers/mtd/nand/raw/Kconfig
@@ -385,7 +385,7 @@ config MTD_NAND_TEGRA
config MTD_NAND_STM32_FMC2
tristate "Support for NAND controller on STM32MP SoCs"
- depends on MACH_STM32MP157 || COMPILE_TEST
+ depends on ARCH_STM32 || COMPILE_TEST
select MFD_SYSCON
help
Enables support for NAND Flash chips on SoCs containing the FMC2
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
index 1ac8c4887ce0..7c491e5a661d 100644
--- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
@@ -9,6 +9,7 @@
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <linux/errno.h>
+#include <linux/gpio/consumer.h>
#include <linux/interrupt.h>
#include <linux/iopoll.h>
#include <linux/mfd/syscon.h>
@@ -231,6 +232,7 @@ struct stm32_fmc2_timings {
struct stm32_fmc2_nand {
struct nand_chip chip;
+ struct gpio_desc *wp_gpio;
struct stm32_fmc2_timings timings;
int ncs;
int cs_used[FMC2_MAX_CE];
@@ -1750,6 +1752,18 @@ static const struct nand_controller_ops stm32_fmc2_nfc_controller_ops = {
.setup_interface = stm32_fmc2_nfc_setup_interface,
};
+static void stm32_fmc2_nfc_wp_enable(struct stm32_fmc2_nand *nand)
+{
+ if (nand->wp_gpio)
+ gpiod_set_value(nand->wp_gpio, 1);
+}
+
+static void stm32_fmc2_nfc_wp_disable(struct stm32_fmc2_nand *nand)
+{
+ if (nand->wp_gpio)
+ gpiod_set_value(nand->wp_gpio, 0);
+}
+
static int stm32_fmc2_nfc_parse_child(struct stm32_fmc2_nfc *nfc,
struct device_node *dn)
{
@@ -1788,6 +1802,18 @@ static int stm32_fmc2_nfc_parse_child(struct stm32_fmc2_nfc *nfc,
nand->cs_used[i] = cs;
}
+ nand->wp_gpio = devm_gpiod_get_from_of_node(nfc->dev, dn,
+ "wp-gpios", 0,
+ GPIOD_OUT_HIGH, "wp");
+ if (IS_ERR(nand->wp_gpio)) {
+ ret = PTR_ERR(nand->wp_gpio);
+ if (ret != -ENOENT)
+ return dev_err_probe(nfc->dev, ret,
+ "failed to request WP GPIO\n");
+
+ nand->wp_gpio = NULL;
+ }
+
nand_set_flash_node(&nand->chip, dn);
return 0;
@@ -1963,10 +1989,12 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
chip->options |= NAND_BUSWIDTH_AUTO | NAND_NO_SUBPAGE_WRITE |
NAND_USES_DMA;
+ stm32_fmc2_nfc_wp_disable(nand);
+
/* Scan to find existence of the device */
ret = nand_scan(chip, nand->ncs);
if (ret)
- goto err_release_dma;
+ goto err_wp_enable;
ret = mtd_device_register(mtd, NULL, 0);
if (ret)
@@ -1979,6 +2007,9 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
err_nand_cleanup:
nand_cleanup(chip);
+err_wp_enable:
+ stm32_fmc2_nfc_wp_enable(nand);
+
err_release_dma:
if (nfc->dma_ecc_ch)
dma_release_channel(nfc->dma_ecc_ch);
@@ -2019,15 +2050,20 @@ static int stm32_fmc2_nfc_remove(struct platform_device *pdev)
clk_disable_unprepare(nfc->clk);
+ stm32_fmc2_nfc_wp_enable(nand);
+
return 0;
}
static int __maybe_unused stm32_fmc2_nfc_suspend(struct device *dev)
{
struct stm32_fmc2_nfc *nfc = dev_get_drvdata(dev);
+ struct stm32_fmc2_nand *nand = &nfc->nand;
clk_disable_unprepare(nfc->clk);
+ stm32_fmc2_nfc_wp_enable(nand);
+
pinctrl_pm_select_sleep_state(dev);
return 0;
@@ -2049,6 +2085,8 @@ static int __maybe_unused stm32_fmc2_nfc_resume(struct device *dev)
stm32_fmc2_nfc_init(nfc);
+ stm32_fmc2_nfc_wp_disable(nand);
+
for (chip_cs = 0; chip_cs < FMC2_MAX_CE; chip_cs++) {
if (!(nfc->cs_assigned & BIT(chip_cs)))
continue;
--
2.17.1

View File

@ -1,19 +1,17 @@
From df5b54b2fc266fd51fff7130ee8707027e2aa3ea Mon Sep 17 00:00:00 2001 From 780373655145ec7ceb3689781dd9dc6c422a0c81 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:58:41 +0100 Date: Tue, 25 Jul 2023 10:53:28 +0200
Subject: [PATCH 15/22] v5.15-stm32mp-r2 PERF Subject: [PATCH 15/22] v5.15-stm32mp-r2.1 PERF
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
Documentation/admin-guide/perf/index.rst | 1 + Documentation/admin-guide/perf/index.rst | 1 +
.../admin-guide/perf/stm32-ddr-pmu.rst | 44 ++ .../admin-guide/perf/stm32-ddr-pmu.rst | 44 ++
.../bindings/perf/stm32-ddr-pmu.yaml | 44 ++
drivers/perf/Kconfig | 7 + drivers/perf/Kconfig | 7 +
drivers/perf/Makefile | 1 + drivers/perf/Makefile | 1 +
drivers/perf/stm32_ddr_pmu.c | 439 ++++++++++++++++++ drivers/perf/stm32_ddr_pmu.c | 439 ++++++++++++++++++
6 files changed, 536 insertions(+) 5 files changed, 492 insertions(+)
create mode 100644 Documentation/admin-guide/perf/stm32-ddr-pmu.rst create mode 100644 Documentation/admin-guide/perf/stm32-ddr-pmu.rst
create mode 100644 Documentation/devicetree/bindings/perf/stm32-ddr-pmu.yaml
create mode 100644 drivers/perf/stm32_ddr_pmu.c create mode 100644 drivers/perf/stm32_ddr_pmu.c
diff --git a/Documentation/admin-guide/perf/index.rst b/Documentation/admin-guide/perf/index.rst diff --git a/Documentation/admin-guide/perf/index.rst b/Documentation/admin-guide/perf/index.rst
@ -78,56 +76,6 @@ index 000000000000..db647fc1acad
+ +
+ 20.021068551 seconds time elapsed + 20.021068551 seconds time elapsed
+ +
diff --git a/Documentation/devicetree/bindings/perf/stm32-ddr-pmu.yaml b/Documentation/devicetree/bindings/perf/stm32-ddr-pmu.yaml
new file mode 100644
index 000000000000..085f2886e580
--- /dev/null
+++ b/Documentation/devicetree/bindings/perf/stm32-ddr-pmu.yaml
@@ -0,0 +1,44 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/perf/stm32-ddr-pmu.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+maintainers:
+ - Gerald Baeza <gerald.baeza@st.com>
+
+title: STMicroelectronics STM32 DDR Performance Monitor (DDRPERFM) bindings
+
+properties:
+ compatible:
+ const: st,stm32-ddr-pmu
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ resets:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - resets
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/stm32mp1-clks.h>
+ #include <dt-bindings/reset/stm32mp1-resets.h>
+
+ ddrperfm: perf@5a007000 {
+ compatible = "st,stm32-ddr-pmu";
+ reg = <0x5a007000 0x400>;
+ clocks = <&rcc DDRPERFM>;
+ resets = <&rcc DDRPERFM_R>;
+ };
+...
diff --git a/drivers/perf/Kconfig b/drivers/perf/Kconfig diff --git a/drivers/perf/Kconfig b/drivers/perf/Kconfig
index 77522e5efe11..fb55e0bbfb90 100644 index 77522e5efe11..fb55e0bbfb90 100644
--- a/drivers/perf/Kconfig --- a/drivers/perf/Kconfig

View File

@ -1,385 +1,34 @@
From f593955537b76035054bfc42586146cd974c9ae3 Mon Sep 17 00:00:00 2001 From 55c55e32e74d48375a64917346cf768ef4da86e6 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:59:56 +0100 Date: Tue, 25 Jul 2023 10:54:38 +0200
Subject: [PATCH 16/22] v5.15-stm32mp-r2 PHY-USB Subject: [PATCH 16/22] v5.15-stm32mp-r2.1 PHY-USB
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/phy/phy-stm32-usbphyc.yaml | 133 +++ drivers/phy/st/phy-stm32-usbphyc.c | 233 +++++++-
.../devicetree/bindings/usb/dwc2.yaml | 33 +-
.../devicetree/bindings/usb/generic-ehci.yaml | 5 +
.../devicetree/bindings/usb/generic-ohci.yaml | 5 +
.../bindings/usb/st,typec-stm32g0.yaml | 83 ++
drivers/phy/st/phy-stm32-usbphyc.c | 233 +++++-
drivers/usb/core/hcd.c | 9 +- drivers/usb/core/hcd.c | 9 +-
drivers/usb/core/phy.c | 22 +- drivers/usb/core/phy.c | 22 +-
drivers/usb/core/phy.h | 6 +- drivers/usb/core/phy.h | 6 +-
drivers/usb/dwc2/core.h | 22 +- drivers/usb/dwc2/core.h | 24 +-
drivers/usb/dwc2/core_intr.c | 3 +- drivers/usb/dwc2/core_intr.c | 3 +-
drivers/usb/dwc2/debugfs.c | 4 +- drivers/usb/dwc2/debugfs.c | 4 +-
drivers/usb/dwc2/drd.c | 79 +- drivers/usb/dwc2/drd.c | 79 ++-
drivers/usb/dwc2/gadget.c | 2 +- drivers/usb/dwc2/gadget.c | 2 +-
drivers/usb/dwc2/hcd.c | 61 +- drivers/usb/dwc2/hcd.c | 61 +-
drivers/usb/dwc2/params.c | 75 +- drivers/usb/dwc2/params.c | 75 +--
drivers/usb/dwc2/platform.c | 82 +- drivers/usb/dwc2/platform.c | 119 ++--
drivers/usb/host/ehci-platform.c | 16 +- drivers/usb/host/ehci-platform.c | 16 +-
drivers/usb/host/ohci-platform.c | 14 +- drivers/usb/host/ohci-platform.c | 14 +-
drivers/usb/typec/ucsi/Kconfig | 10 + drivers/usb/typec/ucsi/Kconfig | 10 +
drivers/usb/typec/ucsi/Makefile | 1 + drivers/usb/typec/ucsi/Makefile | 1 +
drivers/usb/typec/ucsi/ucsi.c | 49 +- drivers/usb/typec/ucsi/ucsi.c | 49 +-
drivers/usb/typec/ucsi/ucsi.h | 2 + drivers/usb/typec/ucsi/ucsi.h | 2 +
drivers/usb/typec/ucsi/ucsi_stm32g0.c | 770 ++++++++++++++++++ drivers/usb/typec/ucsi/ucsi_stm32g0.c | 770 ++++++++++++++++++++++++++
24 files changed, 1551 insertions(+), 168 deletions(-) 19 files changed, 1334 insertions(+), 165 deletions(-)
create mode 100644 Documentation/devicetree/bindings/usb/st,typec-stm32g0.yaml
create mode 100644 drivers/usb/typec/ucsi/ucsi_stm32g0.c create mode 100644 drivers/usb/typec/ucsi/ucsi_stm32g0.c
diff --git a/Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml b/Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml
index 3329f1d33a4f..750ce7074648 100644
--- a/Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml
+++ b/Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml
@@ -74,6 +74,10 @@ patternProperties:
"#phy-cells":
enum: [ 0x0, 0x1 ]
+ interrupts:
+ maxItems: 1
+ description: interrupt used for wakeup when port is used by USBH controller
+
connector:
type: object
allOf:
@@ -81,6 +85,119 @@ patternProperties:
properties:
vbus-supply: true
+ # It can be necessary to adjust the PHY settings to compensate parasitics, which can be due
+ # to USB connector/receptacle, routing, ESD protection component,... Here is the list of
+ # all optional parameters to tune the interface of the PHY (HS for High-Speed, FS for Full-
+ # Speed, LS for Low-Speed)
+
+ st,current-boost-microamp:
+ description: Current boosting in uA
+ enum: [ 1000, 2000 ]
+
+ st,no-lsfs-fb-cap:
+ description: Disables the LS/FS feedback capacitor
+ type: boolean
+
+ st,decrease-hs-slew-rate:
+ description: Decreases the HS driver slew rate by 10%
+ type: boolean
+
+ st,tune-hs-dc-level:
+ description: |
+ Tunes the HS driver DC level
+ - <0> normal level
+ - <1> increases the level by 5 to 7 mV
+ - <2> increases the level by 10 to 14 mV
+ - <3> decreases the level by 5 to 7 mV
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 3
+ default: 0
+
+ st,enable-fs-rftime-tuning:
+ description: Enables the FS rise/fall tuning option
+ type: boolean
+
+ st,enable-hs-rftime-reduction:
+ description: Enables the HS rise/fall reduction feature
+ type: boolean
+
+ st,trim-hs-current:
+ description: |
+ Controls HS driver current trimming for choke compensation
+ - <0> = 18.87 mA target current / nominal + 0%
+ - <1> = 19.165 mA target current / nominal + 1.56%
+ - <2> = 19.46 mA target current / nominal + 3.12%
+ - <3> = 19.755 mA target current / nominal + 4.68%
+ - <4> = 20.05 mA target current / nominal + 6.24%
+ - <5> = 20.345 mA target current / nominal + 7.8%
+ - <6> = 20.64 mA target current / nominal + 9.36%
+ - <7> = 20.935 mA target current / nominal + 10.92%
+ - <8> = 21.23 mA target current / nominal + 12.48%
+ - <9> = 21.525 mA target current / nominal + 14.04%
+ - <10> = 21.82 mA target current / nominal + 15.6%
+ - <11> = 22.115 mA target current / nominal + 17.16%
+ - <12> = 22.458 mA target current / nominal + 19.01%
+ - <13> = 22.755 mA target current / nominal + 20.58%
+ - <14> = 23.052 mA target current / nominal + 22.16%
+ - <15> = 23.348 mA target current / nominal + 23.73%
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 15
+ default: 0
+
+ st,trim-hs-impedance:
+ description: |
+ Controls HS driver impedance tuning for choke compensation
+ - <0> = no impedance offset
+ - <1> = reduce the impedance by 2 ohms
+ - <2> = reduce the impedance by 4 ohms
+ - <3> = reduce the impedance by 6 ohms
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 3
+ default: 0
+
+ st,tune-squelch-level:
+ description: |
+ Tunes the squelch DC threshold value
+ - <0> = no shift in threshold
+ - <1> = threshold shift by +7 mV
+ - <2> = threshold shift by -5 mV
+ - <3> = threshold shift by +14 mV
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 3
+ default: 0
+
+ st,enable-hs-rx-gain-eq:
+ description: Enables the HS Rx gain equalizer
+ type: boolean
+
+ st,tune-hs-rx-offset:
+ description: |
+ Adjusts the HS Rx offset
+ - <0> = no offset
+ - <1> = offset of +5 mV
+ - <2> = offset of +10 mV
+ - <3> = offset of -5 mV
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 3
+ default: 0
+
+ st,no-hs-ftime-ctrl:
+ description: Disables the HS fall time control of single ended signals during pre-emphasis
+ type: boolean
+
+ st,no-lsfs-sc:
+ description: Disables the short circuit protection in LS/FS driver
+ type: boolean
+
+ st,enable-hs-tx-staggering:
+ description: Enables the basic staggering in HS Tx mode
+ type: boolean
+
allOf:
- if:
properties:
@@ -137,6 +254,14 @@ examples:
reg = <0>;
phy-supply = <&vdd_usb>;
#phy-cells = <0>;
+ st,tune-hs-dc-level = <2>;
+ st,enable-fs-rftime-tuning;
+ st,enable-hs-rftime-reduction;
+ st,trim-hs-current = <15>;
+ st,trim-hs-impedance = <1>;
+ st,tune-squelch-level = <3>;
+ st,tune-hs-rx-offset = <2>;
+ st,no-lsfs-sc;
connector {
compatible = "usb-a-connector";
vbus-supply = <&vbus_sw>;
@@ -147,6 +272,14 @@ examples:
reg = <1>;
phy-supply = <&vdd_usb>;
#phy-cells = <1>;
+ st,tune-hs-dc-level = <2>;
+ st,enable-fs-rftime-tuning;
+ st,enable-hs-rftime-reduction;
+ st,trim-hs-current = <15>;
+ st,trim-hs-impedance = <1>;
+ st,tune-squelch-level = <3>;
+ st,tune-hs-rx-offset = <2>;
+ st,no-lsfs-sc;
};
};
...
diff --git a/Documentation/devicetree/bindings/usb/dwc2.yaml b/Documentation/devicetree/bindings/usb/dwc2.yaml
index 10c7d9b6cc53..882a2f1e0738 100644
--- a/Documentation/devicetree/bindings/usb/dwc2.yaml
+++ b/Documentation/devicetree/bindings/usb/dwc2.yaml
@@ -9,6 +9,9 @@ title: DesignWare HS OTG USB 2.0 controller Bindings
maintainers:
- Rob Herring <robh@kernel.org>
+allOf:
+ - $ref: usb-drd.yaml#
+
properties:
compatible:
oneOf:
@@ -101,12 +104,17 @@ properties:
description: reference to the VBUS and ID sensing comparators supply, in
order to perform OTG operation, used on STM32MP15 SoCs.
- dr_mode:
- enum: [host, peripheral, otg]
+ dr_mode: true
- usb-role-switch:
- $ref: /schemas/types.yaml#/definitions/flag
- description: Support role switch.
+ otg-rev: true
+
+ hnp-disable: true
+
+ srp-disable: true
+
+ usb-role-switch: true
+
+ role-switch-default-mode: true
g-rx-fifo-size:
$ref: /schemas/types.yaml#/definitions/uint32
@@ -130,6 +138,21 @@ properties:
description: If present indicates that we need to reset the PHY when we
detect a wakeup. This is due to a hardware errata.
+ port:
+ description:
+ Any connector to the data bus of this controller should be modelled
+ using the OF graph bindings specified, if the "usb-role-switch"
+ property is used.
+ $ref: /schemas/graph.yaml#/properties/port
+
+ wakeup-source:
+ $ref: /schemas/types.yaml#/definitions/flag
+ description: If present indicates this device has wakeup capabilities
+
+dependencies:
+ port: [ usb-role-switch ]
+ role-switch-default-mode: [ usb-role-switch ]
+
required:
- compatible
- reg
diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml
index cb5da1df8d40..0b12acf804ec 100644
--- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml
+++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml
@@ -149,6 +149,11 @@ properties:
- host
- otg
+ wakeup-source:
+ $ref: /schemas/types.yaml#/definitions/flag
+ description:
+ Indicate this device has wakeup capabilities.
+
required:
- compatible
- reg
diff --git a/Documentation/devicetree/bindings/usb/generic-ohci.yaml b/Documentation/devicetree/bindings/usb/generic-ohci.yaml
index d5fd3aa53ed2..ef237675a83a 100644
--- a/Documentation/devicetree/bindings/usb/generic-ohci.yaml
+++ b/Documentation/devicetree/bindings/usb/generic-ohci.yaml
@@ -116,6 +116,11 @@ properties:
- host
- otg
+ wakeup-source:
+ $ref: /schemas/types.yaml#/definitions/flag
+ description:
+ Indicate this device has wakeup capabilities.
+
required:
- compatible
- reg
diff --git a/Documentation/devicetree/bindings/usb/st,typec-stm32g0.yaml b/Documentation/devicetree/bindings/usb/st,typec-stm32g0.yaml
new file mode 100644
index 000000000000..b2729bd015a1
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/st,typec-stm32g0.yaml
@@ -0,0 +1,83 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/usb/st,typec-stm32g0.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: STMicroelectronics STM32G0 Type-C controller bindings
+
+description: |
+ The STM32G0 MCU can be programmed to control Type-C connector(s) through I2C
+ typically using the UCSI protocol over I2C, with a dedicated alert
+ (interrupt) pin.
+
+maintainers:
+ - Fabrice Gasnier <fabrice.gasnier@foss.st.com>
+
+properties:
+ compatible:
+ const: st,stm32g0-typec
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ connector:
+ type: object
+ allOf:
+ - $ref: ../connector/usb-connector.yaml#
+
+ firmware-name:
+ description: |
+ Should contain the name of the default firmware image
+ file located on the firmware search path
+
+ wakeup-source: true
+ power-domains: true
+
+required:
+ - compatible
+ - reg
+ - interrupts
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ i2c5 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ stm32g0@53 {
+ compatible = "st,stm32g0-typec";
+ reg = <0x53>;
+ /* Alert pin on GPIO PE12 */
+ interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
+ interrupt-parent = <&gpioe>;
+
+ /* Example with one type-C connector */
+ connector {
+ compatible = "usb-c-connector";
+ label = "USB-C";
+
+ port {
+ con_usb_c_ep: endpoint {
+ remote-endpoint = <&usbotg_hs_ep>;
+ };
+ };
+ };
+ };
+ };
+
+ usbotg_hs {
+ usb-role-switch;
+ port {
+ usbotg_hs_ep: endpoint {
+ remote-endpoint = <&con_usb_c_ep>;
+ };
+ };
+ };
+...
diff --git a/drivers/phy/st/phy-stm32-usbphyc.c b/drivers/phy/st/phy-stm32-usbphyc.c diff --git a/drivers/phy/st/phy-stm32-usbphyc.c b/drivers/phy/st/phy-stm32-usbphyc.c
index cd0747ab6267..af198f7c3f09 100644 index 27f7e2292cf0..6115f9b21ee1 100644
--- a/drivers/phy/st/phy-stm32-usbphyc.c --- a/drivers/phy/st/phy-stm32-usbphyc.c
+++ b/drivers/phy/st/phy-stm32-usbphyc.c +++ b/drivers/phy/st/phy-stm32-usbphyc.c
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
@ -649,7 +298,7 @@ index cd0747ab6267..af198f7c3f09 100644
goto clk_disable; goto clk_disable;
} }
@@ -552,6 +744,15 @@ static int stm32_usbphyc_probe(struct platform_device *pdev) @@ -554,6 +746,15 @@ static int stm32_usbphyc_probe(struct platform_device *pdev)
usbphyc->phys[port]->vbus = NULL; usbphyc->phys[port]->vbus = NULL;
} }
@ -665,7 +314,7 @@ index cd0747ab6267..af198f7c3f09 100644
port++; port++;
} }
@@ -600,6 +801,25 @@ static int stm32_usbphyc_remove(struct platform_device *pdev) @@ -602,6 +803,25 @@ static int stm32_usbphyc_remove(struct platform_device *pdev)
return 0; return 0;
} }
@ -691,7 +340,7 @@ index cd0747ab6267..af198f7c3f09 100644
static const struct of_device_id stm32_usbphyc_of_match[] = { static const struct of_device_id stm32_usbphyc_of_match[] = {
{ .compatible = "st,stm32mp1-usbphyc", }, { .compatible = "st,stm32mp1-usbphyc", },
{ }, { },
@@ -612,6 +832,7 @@ static struct platform_driver stm32_usbphyc_driver = { @@ -614,6 +834,7 @@ static struct platform_driver stm32_usbphyc_driver = {
.driver = { .driver = {
.of_match_table = stm32_usbphyc_of_match, .of_match_table = stm32_usbphyc_of_match,
.name = "stm32-usbphyc", .name = "stm32-usbphyc",
@ -802,7 +451,7 @@ index 20a267cd986b..3df4ddbb6046 100644
#endif /* __USB_CORE_PHY_H_ */ #endif /* __USB_CORE_PHY_H_ */
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 71e62b3081db..255fca4e8346 100644 index 71e62b3081db..3edf73858ec3 100644
--- a/drivers/usb/dwc2/core.h --- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h
@@ -238,11 +238,14 @@ enum dwc2_ep0_state { @@ -238,11 +238,14 @@ enum dwc2_ep0_state {
@ -847,7 +496,15 @@ index 71e62b3081db..255fca4e8346 100644
* @hcd_enabled: Host mode sub-driver initialization indicator. * @hcd_enabled: Host mode sub-driver initialization indicator.
* @gadget_enabled: Peripheral mode sub-driver initialization indicator. * @gadget_enabled: Peripheral mode sub-driver initialization indicator.
* @ll_hw_enabled: Status of low-level hardware resources. * @ll_hw_enabled: Status of low-level hardware resources.
@@ -1066,6 +1067,7 @@ struct dwc2_hsotg { @@ -1027,6 +1028,7 @@ struct dwc2_hregs_backup {
* @ctrl_out_desc: EP0 OUT data phase desc chain pointer
* @irq: Interrupt request line number
* @clk: Pointer to otg clock
+ * @utmi_clk: Pointer to utmi_clk clock
* @reset: Pointer to dwc2 reset controller
* @reset_ecc: Pointer to dwc2 optional reset controller in Stratix10.
* @regset: A pointer to a struct debugfs_regset32, which contains
@@ -1066,6 +1068,7 @@ struct dwc2_hsotg {
enum usb_otg_state op_state; enum usb_otg_state op_state;
enum usb_dr_mode dr_mode; enum usb_dr_mode dr_mode;
struct usb_role_switch *role_sw; struct usb_role_switch *role_sw;
@ -855,6 +512,14 @@ index 71e62b3081db..255fca4e8346 100644
unsigned int hcd_enabled:1; unsigned int hcd_enabled:1;
unsigned int gadget_enabled:1; unsigned int gadget_enabled:1;
unsigned int ll_hw_enabled:1; unsigned int ll_hw_enabled:1;
@@ -1088,6 +1091,7 @@ struct dwc2_hsotg {
void *priv;
int irq;
struct clk *clk;
+ struct clk *utmi_clk;
struct reset_control *reset;
struct reset_control *reset_ecc;
diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index a5c52b237e72..c786560fb54e 100644 index a5c52b237e72..c786560fb54e 100644
--- a/drivers/usb/dwc2/core_intr.c --- a/drivers/usb/dwc2/core_intr.c
@ -1390,10 +1055,69 @@ index 59e119345994..d300ae3d9274 100644
if (!valid) if (!valid)
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 265d437ca0f1..d16a69355e89 100644 index 7a09476e9f19..7defbe5d8b04 100644
--- a/drivers/usb/dwc2/platform.c --- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c
@@ -222,20 +222,16 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) @@ -131,10 +131,16 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)
if (ret)
return ret;
+ if (hsotg->utmi_clk) {
+ ret = clk_prepare_enable(hsotg->utmi_clk);
+ if (ret)
+ goto err_dis_reg;
+ }
+
if (hsotg->clk) {
ret = clk_prepare_enable(hsotg->clk);
if (ret)
- return ret;
+ goto err_dis_utmi_clk;
}
if (hsotg->uphy) {
@@ -143,10 +149,29 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)
ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type);
} else {
ret = phy_init(hsotg->phy);
- if (ret == 0)
+ if (ret == 0) {
ret = phy_power_on(hsotg->phy);
+ if (ret)
+ phy_exit(hsotg->phy);
+ }
}
+ if (ret)
+ goto err_dis_clk;
+
+ return 0;
+
+err_dis_clk:
+ if (hsotg->clk)
+ clk_disable_unprepare(hsotg->clk);
+
+err_dis_utmi_clk:
+ if (hsotg->utmi_clk)
+ clk_disable_unprepare(hsotg->utmi_clk);
+
+err_dis_reg:
+ regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
+
return ret;
}
@@ -186,6 +211,9 @@ static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg)
if (hsotg->clk)
clk_disable_unprepare(hsotg->clk);
+ if (hsotg->utmi_clk)
+ clk_disable_unprepare(hsotg->utmi_clk);
+
return regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
}
@@ -210,20 +238,16 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
int i, ret; int i, ret;
hsotg->reset = devm_reset_control_get_optional(hsotg->dev, "dwc2"); hsotg->reset = devm_reset_control_get_optional(hsotg->dev, "dwc2");
@ -1420,7 +1144,7 @@ index 265d437ca0f1..d16a69355e89 100644
reset_control_deassert(hsotg->reset_ecc); reset_control_deassert(hsotg->reset_ecc);
@@ -251,11 +247,8 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) @@ -239,11 +263,8 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
case -ENOSYS: case -ENOSYS:
hsotg->phy = NULL; hsotg->phy = NULL;
break; break;
@ -1433,7 +1157,7 @@ index 265d437ca0f1..d16a69355e89 100644
} }
} }
@@ -268,12 +261,8 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) @@ -256,12 +277,8 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
case -ENXIO: case -ENXIO:
hsotg->uphy = NULL; hsotg->uphy = NULL;
break; break;
@ -1447,7 +1171,7 @@ index 265d437ca0f1..d16a69355e89 100644
} }
} }
} }
@@ -282,10 +271,8 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) @@ -270,10 +287,13 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
/* Clock */ /* Clock */
hsotg->clk = devm_clk_get_optional(hsotg->dev, "otg"); hsotg->clk = devm_clk_get_optional(hsotg->dev, "otg");
@ -1457,10 +1181,15 @@ index 265d437ca0f1..d16a69355e89 100644
- } - }
+ if (IS_ERR(hsotg->clk)) + if (IS_ERR(hsotg->clk))
+ return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->clk), "cannot get otg clock\n"); + return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->clk), "cannot get otg clock\n");
+
+ hsotg->utmi_clk = devm_clk_get_optional(hsotg->dev, "utmi");
+ if (IS_ERR(hsotg->utmi_clk))
+ return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->utmi_clk),
+ "cannot get utmi clock\n");
/* Regulators */ /* Regulators */
for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++) for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++)
@@ -293,12 +280,9 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) @@ -281,12 +301,9 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
ret = devm_regulator_bulk_get(hsotg->dev, ARRAY_SIZE(hsotg->supplies), ret = devm_regulator_bulk_get(hsotg->dev, ARRAY_SIZE(hsotg->supplies),
hsotg->supplies); hsotg->supplies);
@ -1476,7 +1205,7 @@ index 265d437ca0f1..d16a69355e89 100644
return 0; return 0;
} }
@@ -558,16 +542,12 @@ static int dwc2_driver_probe(struct platform_device *dev) @@ -546,16 +563,12 @@ static int dwc2_driver_probe(struct platform_device *dev)
hsotg->usb33d = devm_regulator_get(hsotg->dev, "usb33d"); hsotg->usb33d = devm_regulator_get(hsotg->dev, "usb33d");
if (IS_ERR(hsotg->usb33d)) { if (IS_ERR(hsotg->usb33d)) {
retval = PTR_ERR(hsotg->usb33d); retval = PTR_ERR(hsotg->usb33d);
@ -1495,7 +1224,7 @@ index 265d437ca0f1..d16a69355e89 100644
goto error; goto error;
} }
@@ -582,8 +562,7 @@ static int dwc2_driver_probe(struct platform_device *dev) @@ -570,8 +583,7 @@ static int dwc2_driver_probe(struct platform_device *dev)
retval = dwc2_drd_init(hsotg); retval = dwc2_drd_init(hsotg);
if (retval) { if (retval) {
@ -1505,7 +1234,7 @@ index 265d437ca0f1..d16a69355e89 100644
goto error_init; goto error_init;
} }
@@ -669,8 +648,19 @@ static int __maybe_unused dwc2_suspend(struct device *dev) @@ -657,8 +669,19 @@ static int __maybe_unused dwc2_suspend(struct device *dev)
bool is_device_mode = dwc2_is_device_mode(dwc2); bool is_device_mode = dwc2_is_device_mode(dwc2);
int ret = 0; int ret = 0;
@ -1526,7 +1255,7 @@ index 265d437ca0f1..d16a69355e89 100644
dwc2_drd_suspend(dwc2); dwc2_drd_suspend(dwc2);
@@ -711,6 +701,9 @@ static int __maybe_unused dwc2_suspend(struct device *dev) @@ -699,6 +722,9 @@ static int __maybe_unused dwc2_suspend(struct device *dev)
dwc2->phy_off_for_suspend = true; dwc2->phy_off_for_suspend = true;
} }
@ -1536,7 +1265,7 @@ index 265d437ca0f1..d16a69355e89 100644
return ret; return ret;
} }
@@ -719,6 +712,9 @@ static int __maybe_unused dwc2_resume(struct device *dev) @@ -707,6 +733,9 @@ static int __maybe_unused dwc2_resume(struct device *dev)
struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev); struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
@ -1546,7 +1275,7 @@ index 265d437ca0f1..d16a69355e89 100644
if (dwc2->phy_off_for_suspend && dwc2->ll_hw_enabled) { if (dwc2->phy_off_for_suspend && dwc2->ll_hw_enabled) {
ret = __dwc2_lowlevel_hw_enable(dwc2); ret = __dwc2_lowlevel_hw_enable(dwc2);
if (ret) if (ret)
@@ -751,10 +747,12 @@ static int __maybe_unused dwc2_resume(struct device *dev) @@ -739,10 +768,12 @@ static int __maybe_unused dwc2_resume(struct device *dev)
spin_unlock_irqrestore(&dwc2->lock, flags); spin_unlock_irqrestore(&dwc2->lock, flags);
} }
@ -1707,7 +1436,7 @@ index 8a8eb5cb8e0f..480d533d762f 100644
obj-$(CONFIG_UCSI_CCG) += ucsi_ccg.o obj-$(CONFIG_UCSI_CCG) += ucsi_ccg.o
+obj-$(CONFIG_UCSI_STM32G0) += ucsi_stm32g0.o +obj-$(CONFIG_UCSI_STM32G0) += ucsi_stm32g0.o
diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 1f23eb543d8f..9659819ca2c9 100644 index dca6803a75bd..cde70a9c838e 100644
--- a/drivers/usb/typec/ucsi/ucsi.c --- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -205,8 +205,11 @@ void ucsi_altmode_update_active(struct ucsi_connector *con) @@ -205,8 +205,11 @@ void ucsi_altmode_update_active(struct ucsi_connector *con)
@ -1724,7 +1453,7 @@ index 1f23eb543d8f..9659819ca2c9 100644
return; return;
} }
cur = 0xff; cur = 0xff;
@@ -1156,12 +1159,8 @@ static int ucsi_register_port(struct ucsi *ucsi, int index) @@ -1154,12 +1157,8 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
ucsi_port_psy_changed(con); ucsi_port_psy_changed(con);
} }
@ -1739,7 +1468,7 @@ index 1f23eb543d8f..9659819ca2c9 100644
/* Only notify USB controller if partner supports USB data */ /* Only notify USB controller if partner supports USB data */
if (!(UCSI_CONSTAT_PARTNER_FLAGS(con->status.flags) & UCSI_CONSTAT_PARTNER_FLAG_USB)) if (!(UCSI_CONSTAT_PARTNER_FLAGS(con->status.flags) & UCSI_CONSTAT_PARTNER_FLAG_USB))
@@ -1345,7 +1344,9 @@ EXPORT_SYMBOL_GPL(ucsi_destroy); @@ -1344,7 +1343,9 @@ EXPORT_SYMBOL_GPL(ucsi_destroy);
*/ */
int ucsi_register(struct ucsi *ucsi) int ucsi_register(struct ucsi *ucsi)
{ {
@ -1750,7 +1479,7 @@ index 1f23eb543d8f..9659819ca2c9 100644
ret = ucsi->ops->read(ucsi, UCSI_VERSION, &ucsi->version, ret = ucsi->ops->read(ucsi, UCSI_VERSION, &ucsi->version,
sizeof(ucsi->version)); sizeof(ucsi->version));
@@ -1355,6 +1356,33 @@ int ucsi_register(struct ucsi *ucsi) @@ -1354,6 +1355,33 @@ int ucsi_register(struct ucsi *ucsi)
if (!ucsi->version) if (!ucsi->version)
return -ENODEV; return -ENODEV;
@ -1784,7 +1513,7 @@ index 1f23eb543d8f..9659819ca2c9 100644
queue_work(system_long_wq, &ucsi->work); queue_work(system_long_wq, &ucsi->work);
return 0; return 0;
@@ -1388,6 +1416,9 @@ void ucsi_unregister(struct ucsi *ucsi) @@ -1387,6 +1415,9 @@ void ucsi_unregister(struct ucsi *ucsi)
} }
kfree(ucsi->connector); kfree(ucsi->connector);

View File

@ -1,16 +1,11 @@
From f7a7db118a4e7aa18f8038644ea143c5f1432c4d Mon Sep 17 00:00:00 2001 From 91f1de6f27098c2093dcea33a16450d5934454b9 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:03:16 +0100 Date: Tue, 25 Jul 2023 10:56:09 +0200
Subject: [PATCH 17/22] v5.15-stm32mp-r2 PINCTRL-REGULATOR-SPI Subject: [PATCH 17/22] v5.15-stm32mp-r2.1 PINCTRL-REGULATOR-SPI
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../bindings/pinctrl/st,stm32-pinctrl.yaml | 8 + drivers/pinctrl/stm32/pinctrl-stm32.c | 237 ++++++++----
.../regulator/protection-consumer.txt | 23 ++
.../bindings/regulator/st,stm32-vrefbuf.yaml | 4 +-
.../bindings/spi/st,stm32-qspi.yaml | 8 +
.../devicetree/bindings/spi/st,stm32-spi.yaml | 23 ++
drivers/pinctrl/stm32/pinctrl-stm32.c | 237 ++++++++---
drivers/pinctrl/stm32/pinctrl-stm32.h | 16 +- drivers/pinctrl/stm32/pinctrl-stm32.h | 16 +-
drivers/pinctrl/stm32/pinctrl-stm32mp135.c | 3 +- drivers/pinctrl/stm32/pinctrl-stm32mp135.c | 3 +-
drivers/pinctrl/stm32/pinctrl-stm32mp157.c | 2 +- drivers/pinctrl/stm32/pinctrl-stm32mp157.c | 2 +-
@ -18,157 +13,22 @@ Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
drivers/regulator/Makefile | 1 + drivers/regulator/Makefile | 1 +
drivers/regulator/protection-consumer.c | 137 +++++++ drivers/regulator/protection-consumer.c | 137 +++++++
drivers/regulator/scmi-regulator.c | 99 +++-- drivers/regulator/scmi-regulator.c | 99 +++--
drivers/regulator/stm32-pwr.c | 85 +++- drivers/regulator/stm32-pwr.c | 85 ++++-
drivers/regulator/stm32-vrefbuf.c | 69 +++- drivers/regulator/stm32-vrefbuf.c | 69 +++-
drivers/regulator/stpmic1_regulator.c | 182 +++++++- drivers/regulator/stpmic1_regulator.c | 182 ++++++++-
drivers/spi/Kconfig | 1 + drivers/spi/Kconfig | 1 +
drivers/spi/spi-mem.c | 2 +- drivers/spi/spi-mem.c | 2 +-
drivers/spi/spi-stm32-qspi.c | 151 +++++-- drivers/spi/spi-stm32-qspi.c | 151 ++++++--
drivers/spi/spi-stm32.c | 388 ++++++++++++------ drivers/spi/spi-stm32.c | 396 ++++++++++++++------
include/dt-bindings/pinctrl/stm32-pinfunc.h | 1 + include/dt-bindings/pinctrl/stm32-pinfunc.h | 1 +
include/dt-bindings/spi/spi-stm32.h | 15 + include/dt-bindings/spi/spi-stm32.h | 15 +
22 files changed, 1188 insertions(+), 278 deletions(-) include/linux/of_gpio.h | 1 +
create mode 100644 Documentation/devicetree/bindings/regulator/protection-consumer.txt 18 files changed, 1132 insertions(+), 277 deletions(-)
create mode 100644 drivers/regulator/protection-consumer.c create mode 100644 drivers/regulator/protection-consumer.c
create mode 100644 include/dt-bindings/spi/spi-stm32.h create mode 100644 include/dt-bindings/spi/spi-stm32.h
diff --git a/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml
index dfee6d38a701..7348f40d49b5 100644
--- a/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml
@@ -140,9 +140,13 @@ patternProperties:
* ...
* 16 : Alternate Function 15
* 17 : Analog
+ * 18 : Reserved
To simplify the usage, macro is available to generate "pinmux" field.
This macro is available here:
- include/dt-bindings/pinctrl/stm32-pinfunc.h
+ Setting the pinmux's function to the Reserved (RSVD) value is used to inform
+ the driver that it shall not apply the mux setting. This can be used to
+ reserve some pins, for example to a co-processor not running Linux.
Some examples of using macro:
/* GPIO A9 set as alernate function 2 */
... {
@@ -156,6 +160,10 @@ patternProperties:
... {
pinmux = <STM32_PINMUX('A', 9, ANALOG)>;
};
+ /* GPIO A9 reserved for co-processor */
+ ... {
+ pinmux = <STM32_PINMUX('A', 9, RSVD)>;
+ };
bias-disable:
type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/protection-consumer.txt b/Documentation/devicetree/bindings/regulator/protection-consumer.txt
new file mode 100644
index 000000000000..bf8169e008c3
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/protection-consumer.txt
@@ -0,0 +1,23 @@
+regulator protection bindings
+
+
+Required properties:
+ compatible: "protection-consumer"
+ protection-supply: the phandle of the regulator to control
+
+Optional properties:
+--------------------
+ interrupt
+
+
+Example:
+
+ regulator_protection {
+ compatible = "protection-consumer";
+ protection-supply = <&vdd>;
+ status = "okay";
+
+ interrupts = <15 2>;
+ interrupt-parent = <&gpiof>;
+ };
+
diff --git a/Documentation/devicetree/bindings/regulator/st,stm32-vrefbuf.yaml b/Documentation/devicetree/bindings/regulator/st,stm32-vrefbuf.yaml
index 3cd4a254e4cb..fe9c5e83c459 100644
--- a/Documentation/devicetree/bindings/regulator/st,stm32-vrefbuf.yaml
+++ b/Documentation/devicetree/bindings/regulator/st,stm32-vrefbuf.yaml
@@ -19,7 +19,9 @@ allOf:
properties:
compatible:
- const: st,stm32-vrefbuf
+ enum:
+ - st,stm32-vrefbuf
+ - st,stm32mp13-vrefbuf
reg:
maxItems: 1
diff --git a/Documentation/devicetree/bindings/spi/st,stm32-qspi.yaml b/Documentation/devicetree/bindings/spi/st,stm32-qspi.yaml
index 983c4e54c0be..a21246712f3f 100644
--- a/Documentation/devicetree/bindings/spi/st,stm32-qspi.yaml
+++ b/Documentation/devicetree/bindings/spi/st,stm32-qspi.yaml
@@ -46,6 +46,14 @@ properties:
- const: tx
- const: rx
+ st,dual-flash:
+ type: boolean
+ description:
+ Allows to use 8 data lines in case cs-gpios property is defined.
+
+dependencies:
+ st,dual-flash: [ cs-gpios ]
+
required:
- compatible
- reg
diff --git a/Documentation/devicetree/bindings/spi/st,stm32-spi.yaml b/Documentation/devicetree/bindings/spi/st,stm32-spi.yaml
index 2d9af4c506bb..8962b2b4de9d 100644
--- a/Documentation/devicetree/bindings/spi/st,stm32-spi.yaml
+++ b/Documentation/devicetree/bindings/spi/st,stm32-spi.yaml
@@ -27,8 +27,13 @@ allOf:
then:
properties:
st,spi-midi-ns: false
+ spi-slave: false
+ st,spi-slave-underrun: false
properties:
+ "#address-cells": true
+ "#size-cells": true
+
compatible:
enum:
- st,stm32f4-spi
@@ -59,6 +64,24 @@ properties:
- const: rx
- const: tx
+ spi-slave:
+ description:
+ The SPI controller acts as a slave, instead of a master.
+
+ cs-gpios:
+ description:
+ In case of spi-slave not defined, cs-gpios behave as defined in
+ spi-controller.yaml.
+ In case of spi-slave defined, if <0>, indicate that SS should be
+ detected via the dedicated HW pin
+
+ st,spi-slave-underrun:
+ $ref: /schemas/types.yaml#/definitions/uint32-array
+ description:
+ First parameter enables and selects slave underrun reaction.
+ Refer to "dt-bindings/spi/spi-stm32.h" for the supported values.
+ Second parameter is the pattern in case of SPI_SEND_PATTERN mode.
+
patternProperties:
"^[a-zA-Z][a-zA-Z0-9,+\\-._]{0,63}@[0-9a-f]+$":
type: object
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c
index d3fa8cf0d72c..98acad49b960 100644 index abb12a5c3c32..b852894d7da9 100644
--- a/drivers/pinctrl/stm32/pinctrl-stm32.c --- a/drivers/pinctrl/stm32/pinctrl-stm32.c
+++ b/drivers/pinctrl/stm32/pinctrl-stm32.c +++ b/drivers/pinctrl/stm32/pinctrl-stm32.c
@@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
@ -684,7 +544,7 @@ index d3fa8cf0d72c..98acad49b960 100644
} }
static struct irq_domain *stm32_pctrl_get_irq_domain(struct device_node *np) static struct irq_domain *stm32_pctrl_get_irq_domain(struct device_node *np)
@@ -1426,7 +1515,8 @@ static int stm32_pctrl_create_pins_tab(struct stm32_pinctrl *pctl, @@ -1427,7 +1516,8 @@ static int stm32_pctrl_create_pins_tab(struct stm32_pinctrl *pctl,
if (pctl->pkg && !(pctl->pkg & p->pkg)) if (pctl->pkg && !(pctl->pkg & p->pkg))
continue; continue;
pins->pin = p->pin; pins->pin = p->pin;
@ -694,7 +554,7 @@ index d3fa8cf0d72c..98acad49b960 100644
pins++; pins++;
nb_pins_available++; nb_pins_available++;
} }
@@ -1436,17 +1526,6 @@ static int stm32_pctrl_create_pins_tab(struct stm32_pinctrl *pctl, @@ -1437,17 +1527,6 @@ static int stm32_pctrl_create_pins_tab(struct stm32_pinctrl *pctl,
return 0; return 0;
} }
@ -712,7 +572,7 @@ index d3fa8cf0d72c..98acad49b960 100644
int stm32_pctl_probe(struct platform_device *pdev) int stm32_pctl_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
@@ -1496,8 +1575,9 @@ int stm32_pctl_probe(struct platform_device *pdev) @@ -1497,8 +1576,9 @@ int stm32_pctl_probe(struct platform_device *pdev)
pctl->dev = dev; pctl->dev = dev;
pctl->match_data = match->data; pctl->match_data = match->data;
@ -724,7 +584,7 @@ index d3fa8cf0d72c..98acad49b960 100644
pctl->pins = devm_kcalloc(pctl->dev, pctl->match_data->npins, pctl->pins = devm_kcalloc(pctl->dev, pctl->match_data->npins,
sizeof(*pctl->pins), GFP_KERNEL); sizeof(*pctl->pins), GFP_KERNEL);
@@ -1589,6 +1669,10 @@ int stm32_pctl_probe(struct platform_device *pdev) @@ -1590,6 +1670,10 @@ int stm32_pctl_probe(struct platform_device *pdev)
ret = stm32_gpiolib_register_bank(pctl, child); ret = stm32_gpiolib_register_bank(pctl, child);
if (ret) { if (ret) {
of_node_put(child); of_node_put(child);
@ -735,7 +595,7 @@ index d3fa8cf0d72c..98acad49b960 100644
return ret; return ret;
} }
@@ -1615,6 +1699,9 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs( @@ -1616,6 +1700,9 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
if (!range) if (!range)
return 0; return 0;
@ -745,7 +605,7 @@ index d3fa8cf0d72c..98acad49b960 100644
pin_is_irq = gpiochip_line_is_irq(range->gc, offset); pin_is_irq = gpiochip_line_is_irq(range->gc, offset);
if (!desc || (!pin_is_irq && !desc->gpio_owner)) if (!desc || (!pin_is_irq && !desc->gpio_owner))
@@ -1661,12 +1748,26 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs( @@ -1662,12 +1749,26 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
return 0; return 0;
} }
@ -1217,7 +1077,7 @@ index 41ae7ac27ff6..fd884082c578 100644
sreg->rdev = devm_regulator_register(&sdev->dev, &sreg->desc, sreg->rdev = devm_regulator_register(&sdev->dev, &sreg->desc,
diff --git a/drivers/regulator/stm32-pwr.c b/drivers/regulator/stm32-pwr.c diff --git a/drivers/regulator/stm32-pwr.c b/drivers/regulator/stm32-pwr.c
index 2a42acb7c24e..2b328b970b46 100644 index e5dd4db6403b..87f160d2b461 100644
--- a/drivers/regulator/stm32-pwr.c --- a/drivers/regulator/stm32-pwr.c
+++ b/drivers/regulator/stm32-pwr.c +++ b/drivers/regulator/stm32-pwr.c
@@ -3,12 +3,15 @@ @@ -3,12 +3,15 @@
@ -1355,8 +1215,8 @@ index 2a42acb7c24e..2b328b970b46 100644
+ +
static int stm32_pwr_regulator_probe(struct platform_device *pdev) static int stm32_pwr_regulator_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct stm32_pwr_reg *priv;
@@ -135,6 +200,11 @@ static int stm32_pwr_regulator_probe(struct platform_device *pdev) @@ -134,6 +199,11 @@ static int stm32_pwr_regulator_probe(struct platform_device *pdev)
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct regulator_config config = { }; struct regulator_config config = { };
int i, ret = 0; int i, ret = 0;
@ -1366,9 +1226,9 @@ index 2a42acb7c24e..2b328b970b46 100644
+ if (ret) + if (ret)
+ return ret; + return ret;
base = of_iomap(np, 0); base = devm_platform_ioremap_resource(pdev, 0);
if (!base) { if (IS_ERR(base)) {
@@ -149,6 +219,7 @@ static int stm32_pwr_regulator_probe(struct platform_device *pdev) @@ -148,6 +218,7 @@ static int stm32_pwr_regulator_probe(struct platform_device *pdev)
GFP_KERNEL); GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
@ -1503,7 +1363,7 @@ index 161622ea7259..d7eb7607b1b2 100644
}; };
MODULE_DEVICE_TABLE(of, stm32_vrefbuf_of_match); MODULE_DEVICE_TABLE(of, stm32_vrefbuf_of_match);
diff --git a/drivers/regulator/stpmic1_regulator.c b/drivers/regulator/stpmic1_regulator.c diff --git a/drivers/regulator/stpmic1_regulator.c b/drivers/regulator/stpmic1_regulator.c
index 2d7597c76e4a..c2cddba6dcda 100644 index 2d7597c76e4a..6ff66e874951 100644
--- a/drivers/regulator/stpmic1_regulator.c --- a/drivers/regulator/stpmic1_regulator.c
+++ b/drivers/regulator/stpmic1_regulator.c +++ b/drivers/regulator/stpmic1_regulator.c
@@ -2,7 +2,9 @@ @@ -2,7 +2,9 @@
@ -1667,7 +1527,7 @@ index 2d7597c76e4a..c2cddba6dcda 100644
} }
} }
@@ -598,15 +690,60 @@ static int stpmic1_regulator_register(struct platform_device *pdev, int id, @@ -598,15 +690,62 @@ static int stpmic1_regulator_register(struct platform_device *pdev, int id,
pdev->name, rdev); pdev->name, rdev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Request IRQ failed\n"); dev_err(&pdev->dev, "Request IRQ failed\n");
@ -1705,6 +1565,8 @@ index 2d7597c76e4a..c2cddba6dcda 100644
+ return rdev; + return rdev;
+ } + }
+ +
+ usb_data->boost_rdev = rdev;
+
+ /* setup an irq handler for over-current detection */ + /* setup an irq handler for over-current detection */
+ irq = of_irq_get(config.of_node, 0); + irq = of_irq_get(config.of_node, 0);
+ if (irq > 0) { + if (irq > 0) {
@ -1730,7 +1592,7 @@ index 2d7597c76e4a..c2cddba6dcda 100644
ret = of_regulator_match(&pdev->dev, pdev->dev.of_node, stpmic1_matches, ret = of_regulator_match(&pdev->dev, pdev->dev.of_node, stpmic1_matches,
ARRAY_SIZE(stpmic1_matches)); ARRAY_SIZE(stpmic1_matches));
@@ -616,11 +753,30 @@ static int stpmic1_regulator_probe(struct platform_device *pdev) @@ -616,11 +755,28 @@ static int stpmic1_regulator_probe(struct platform_device *pdev)
return ret; return ret;
} }
@ -1748,8 +1610,6 @@ index 2d7597c76e4a..c2cddba6dcda 100644
+ stpmic1_boost_register(pdev, i, &stpmic1_matches[i], + stpmic1_boost_register(pdev, i, &stpmic1_matches[i],
+ &stpmic1_regulator_cfgs[i], + &stpmic1_regulator_cfgs[i],
+ usb_data); + usb_data);
+
+ usb_data->boost_rdev = rdev;
+ } else { + } else {
+ rdev = + rdev =
+ stpmic1_regulator_register(pdev, i, &stpmic1_matches[i], + stpmic1_regulator_register(pdev, i, &stpmic1_matches[i],
@ -1766,10 +1626,10 @@ index 2d7597c76e4a..c2cddba6dcda 100644
dev_dbg(&pdev->dev, "stpmic1_regulator driver probed\n"); dev_dbg(&pdev->dev, "stpmic1_regulator driver probed\n");
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 83e352b0c8f9..a9342e57843f 100644 index 4fc23236d3bd..29d363e14b5f 100644
--- a/drivers/spi/Kconfig --- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig
@@ -807,6 +807,7 @@ config SPI_SPRD_ADI @@ -806,6 +806,7 @@ config SPI_SPRD_ADI
config SPI_STM32 config SPI_STM32
tristate "STMicroelectronics STM32 SPI controller" tristate "STMicroelectronics STM32 SPI controller"
depends on ARCH_STM32 || COMPILE_TEST depends on ARCH_STM32 || COMPILE_TEST
@ -2087,7 +1947,7 @@ index dd38cb8ffbc2..00e84f3cb239 100644
ctrl->dev.of_node = dev->of_node; ctrl->dev.of_node = dev->of_node;
diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
index 9bd3fd1652f7..573f51e630d3 100644 index 3c6f201b5dd8..f9ebc01194ce 100644
--- a/drivers/spi/spi-stm32.c --- a/drivers/spi/spi-stm32.c
+++ b/drivers/spi/spi-stm32.c +++ b/drivers/spi/spi-stm32.c
@@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
@ -2215,7 +2075,15 @@ index 9bd3fd1652f7..573f51e630d3 100644
* @cfg: compatible configuration data * @cfg: compatible configuration data
* @base: virtual memory area * @base: virtual memory area
* @clk: hw kernel clock feeding the SPI clock generator * @clk: hw kernel clock feeding the SPI clock generator
@@ -280,10 +302,13 @@ struct stm32_spi_cfg { @@ -268,6 +290,7 @@ struct stm32_spi_cfg {
* @fifo_size: size of the embedded fifo in bytes
* @cur_midi: master inter-data idleness in ns
* @cur_speed: speed configured in Hz
+ * @cur_half_period: time of a half bit in us
* @cur_bpw: number of bits in a single SPI data frame
* @cur_fthlv: fifo threshold level (data frames in a single data packet)
* @cur_comm: SPI communication mode
@@ -280,10 +303,13 @@ struct stm32_spi_cfg {
* @dma_tx: dma channel for TX transfer * @dma_tx: dma channel for TX transfer
* @dma_rx: dma channel for RX transfer * @dma_rx: dma channel for RX transfer
* @phys_addr: SPI registers physical base address * @phys_addr: SPI registers physical base address
@ -2230,7 +2098,15 @@ index 9bd3fd1652f7..573f51e630d3 100644
const struct stm32_spi_cfg *cfg; const struct stm32_spi_cfg *cfg;
void __iomem *base; void __iomem *base;
struct clk *clk; struct clk *clk;
@@ -307,6 +332,10 @@ struct stm32_spi { @@ -294,6 +320,7 @@ struct stm32_spi {
unsigned int cur_midi;
unsigned int cur_speed;
+ unsigned int cur_half_period;
unsigned int cur_bpw;
unsigned int cur_fthlv;
unsigned int cur_comm;
@@ -307,6 +334,10 @@ struct stm32_spi {
struct dma_chan *dma_tx; struct dma_chan *dma_tx;
struct dma_chan *dma_rx; struct dma_chan *dma_rx;
dma_addr_t phys_addr; dma_addr_t phys_addr;
@ -2241,7 +2117,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
}; };
static const struct stm32_spi_regspec stm32f4_spi_regspec = { static const struct stm32_spi_regspec stm32f4_spi_regspec = {
@@ -318,6 +347,7 @@ static const struct stm32_spi_regspec stm32f4_spi_regspec = { @@ -318,6 +349,7 @@ static const struct stm32_spi_regspec stm32f4_spi_regspec = {
.cpol = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPOL }, .cpol = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPOL },
.cpha = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPHA }, .cpha = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPHA },
.lsb_first = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_LSBFRST }, .lsb_first = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_LSBFRST },
@ -2249,7 +2125,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
.br = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_BR, STM32F4_SPI_CR1_BR_SHIFT }, .br = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_BR, STM32F4_SPI_CR1_BR_SHIFT },
.rx = { STM32F4_SPI_DR }, .rx = { STM32F4_SPI_DR },
@@ -336,6 +366,7 @@ static const struct stm32_spi_regspec stm32h7_spi_regspec = { @@ -336,6 +368,7 @@ static const struct stm32_spi_regspec stm32h7_spi_regspec = {
.cpol = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPOL }, .cpol = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPOL },
.cpha = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPHA }, .cpha = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPHA },
.lsb_first = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_LSBFRST }, .lsb_first = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_LSBFRST },
@ -2257,8 +2133,8 @@ index 9bd3fd1652f7..573f51e630d3 100644
.br = { STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_MBR, .br = { STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_MBR,
STM32H7_SPI_CFG1_MBR_SHIFT }, STM32H7_SPI_CFG1_MBR_SHIFT },
@@ -437,9 +468,9 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz, @@ -437,9 +470,9 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz); div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
/* /*
- * SPI framework set xfer->speed_hz to master->max_speed_hz if - * SPI framework set xfer->speed_hz to master->max_speed_hz if
@ -2270,7 +2146,16 @@ index 9bd3fd1652f7..573f51e630d3 100644
* no need to check it there. * no need to check it there.
* However, we need to ensure the following calculations. * However, we need to ensure the following calculations.
*/ */
@@ -657,9 +688,9 @@ static void stm32f4_spi_disable(struct stm32_spi *spi) @@ -454,6 +487,8 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
spi->cur_speed = spi->clk_rate / (1 << mbrdiv);
+ spi->cur_half_period = DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * spi->cur_speed);
+
return mbrdiv - 1;
}
@@ -657,9 +692,9 @@ static void stm32f4_spi_disable(struct stm32_spi *spi)
} }
if (spi->cur_usedma && spi->dma_tx) if (spi->cur_usedma && spi->dma_tx)
@ -2282,9 +2167,14 @@ index 9bd3fd1652f7..573f51e630d3 100644
stm32_spi_clr_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_SPE); stm32_spi_clr_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_SPE);
@@ -696,9 +727,9 @@ static void stm32h7_spi_disable(struct stm32_spi *spi) @@ -695,10 +730,14 @@ static void stm32h7_spi_disable(struct stm32_spi *spi)
return;
} }
+ /* Add a delay to make sure that transmission is ended. */
+ if (spi->cur_half_period)
+ udelay(spi->cur_half_period);
+
if (spi->cur_usedma && spi->dma_tx) if (spi->cur_usedma && spi->dma_tx)
- dmaengine_terminate_all(spi->dma_tx); - dmaengine_terminate_all(spi->dma_tx);
+ dmaengine_terminate_async(spi->dma_tx); + dmaengine_terminate_async(spi->dma_tx);
@ -2294,7 +2184,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
stm32_spi_clr_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE); stm32_spi_clr_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE);
@@ -714,19 +745,19 @@ static void stm32h7_spi_disable(struct stm32_spi *spi) @@ -714,19 +753,19 @@ static void stm32h7_spi_disable(struct stm32_spi *spi)
/** /**
* stm32_spi_can_dma - Determine if the transfer is eligible for DMA use * stm32_spi_can_dma - Determine if the transfer is eligible for DMA use
@ -2317,7 +2207,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
if (spi->cfg->has_fifo) if (spi->cfg->has_fifo)
dma_size = spi->fifo_size; dma_size = spi->fifo_size;
@@ -742,12 +773,12 @@ static bool stm32_spi_can_dma(struct spi_master *master, @@ -742,12 +781,12 @@ static bool stm32_spi_can_dma(struct spi_master *master,
/** /**
* stm32f4_spi_irq_event - Interrupt handler for SPI controller events * stm32f4_spi_irq_event - Interrupt handler for SPI controller events
* @irq: interrupt line * @irq: interrupt line
@ -2333,7 +2223,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
u32 sr, mask = 0; u32 sr, mask = 0;
bool end = false; bool end = false;
@@ -830,14 +861,14 @@ static irqreturn_t stm32f4_spi_irq_event(int irq, void *dev_id) @@ -830,14 +869,14 @@ static irqreturn_t stm32f4_spi_irq_event(int irq, void *dev_id)
/** /**
* stm32f4_spi_irq_thread - Thread of interrupt handler for SPI controller * stm32f4_spi_irq_thread - Thread of interrupt handler for SPI controller
* @irq: interrupt line * @irq: interrupt line
@ -2352,7 +2242,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
stm32f4_spi_disable(spi); stm32f4_spi_disable(spi);
return IRQ_HANDLED; return IRQ_HANDLED;
@@ -846,12 +877,12 @@ static irqreturn_t stm32f4_spi_irq_thread(int irq, void *dev_id) @@ -846,12 +885,12 @@ static irqreturn_t stm32f4_spi_irq_thread(int irq, void *dev_id)
/** /**
* stm32h7_spi_irq_thread - Thread of interrupt handler for SPI controller * stm32h7_spi_irq_thread - Thread of interrupt handler for SPI controller
* @irq: interrupt line * @irq: interrupt line
@ -2368,7 +2258,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
u32 sr, ier, mask; u32 sr, ier, mask;
unsigned long flags; unsigned long flags;
bool end = false; bool end = false;
@@ -908,6 +939,14 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) @@ -909,6 +948,14 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
end = true; end = true;
} }
@ -2383,7 +2273,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
if (sr & STM32H7_SPI_SR_EOT) { if (sr & STM32H7_SPI_SR_EOT) {
if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
stm32h7_spi_read_rxfifo(spi); stm32h7_spi_read_rxfifo(spi);
@@ -930,7 +969,7 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) @@ -931,7 +978,7 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
if (end) { if (end) {
stm32h7_spi_disable(spi); stm32h7_spi_disable(spi);
@ -2392,7 +2282,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
} }
return IRQ_HANDLED; return IRQ_HANDLED;
@@ -938,13 +977,13 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) @@ -939,13 +986,13 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
/** /**
* stm32_spi_prepare_msg - set up the controller to transfer a single message * stm32_spi_prepare_msg - set up the controller to transfer a single message
@ -2409,7 +2299,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
struct spi_device *spi_dev = msg->spi; struct spi_device *spi_dev = msg->spi;
struct device_node *np = spi_dev->dev.of_node; struct device_node *np = spi_dev->dev.of_node;
unsigned long flags; unsigned long flags;
@@ -970,6 +1009,11 @@ static int stm32_spi_prepare_msg(struct spi_master *master, @@ -971,6 +1018,11 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
else else
clrb |= spi->cfg->regs->lsb_first.mask; clrb |= spi->cfg->regs->lsb_first.mask;
@ -2421,7 +2311,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
dev_dbg(spi->dev, "cpol=%d cpha=%d lsb_first=%d cs_high=%d\n", dev_dbg(spi->dev, "cpol=%d cpha=%d lsb_first=%d cs_high=%d\n",
!!(spi_dev->mode & SPI_CPOL), !!(spi_dev->mode & SPI_CPOL),
!!(spi_dev->mode & SPI_CPHA), !!(spi_dev->mode & SPI_CPHA),
@@ -983,7 +1027,7 @@ static int stm32_spi_prepare_msg(struct spi_master *master, @@ -984,7 +1036,7 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
if (spi->cfg->set_number_of_data) { if (spi->cfg->set_number_of_data) {
int ret; int ret;
@ -2430,7 +2320,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
STM32H7_SPI_TSIZE_MAX, STM32H7_SPI_TSIZE_MAX,
GFP_KERNEL | GFP_DMA); GFP_KERNEL | GFP_DMA);
if (ret) if (ret)
@@ -1015,7 +1059,7 @@ static void stm32f4_spi_dma_tx_cb(void *data) @@ -1016,7 +1068,7 @@ static void stm32f4_spi_dma_tx_cb(void *data)
struct stm32_spi *spi = data; struct stm32_spi *spi = data;
if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) { if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
@ -2439,7 +2329,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
stm32f4_spi_disable(spi); stm32f4_spi_disable(spi);
} }
} }
@@ -1030,7 +1074,7 @@ static void stm32_spi_dma_rx_cb(void *data) @@ -1031,7 +1083,7 @@ static void stm32_spi_dma_rx_cb(void *data)
{ {
struct stm32_spi *spi = data; struct stm32_spi *spi = data;
@ -2448,7 +2338,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->cfg->disable(spi); spi->cfg->disable(spi);
} }
@@ -1160,7 +1204,11 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi) @@ -1161,7 +1213,11 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
if (spi->tx_buf) if (spi->tx_buf)
stm32h7_spi_write_txfifo(spi); stm32h7_spi_write_txfifo(spi);
@ -2461,7 +2351,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
writel_relaxed(ier, spi->base + STM32H7_SPI_IER); writel_relaxed(ier, spi->base + STM32H7_SPI_IER);
@@ -1203,11 +1251,15 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi) @@ -1204,11 +1260,15 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)
if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX)
ier |= STM32H7_SPI_IER_EOTIE | STM32H7_SPI_IER_TXTFIE; ier |= STM32H7_SPI_IER_EOTIE | STM32H7_SPI_IER_TXTFIE;
@ -2478,7 +2368,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
} }
/** /**
@@ -1301,7 +1353,7 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi, @@ -1302,7 +1362,7 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
dma_submit_error: dma_submit_error:
if (spi->dma_rx) if (spi->dma_rx)
@ -2487,7 +2377,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
dma_desc_error: dma_desc_error:
stm32_spi_clr_bits(spi, spi->cfg->regs->dma_rx_en.reg, stm32_spi_clr_bits(spi, spi->cfg->regs->dma_rx_en.reg,
@@ -1510,6 +1562,53 @@ static int stm32h7_spi_number_of_data(struct stm32_spi *spi, u32 nb_words) @@ -1511,6 +1571,53 @@ static int stm32h7_spi_number_of_data(struct stm32_spi *spi, u32 nb_words)
return 0; return 0;
} }
@ -2541,7 +2431,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
/** /**
* stm32_spi_transfer_one_setup - common setup to transfer a single * stm32_spi_transfer_one_setup - common setup to transfer a single
* spi_transfer either using DMA or * spi_transfer either using DMA or
@@ -1535,16 +1634,18 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi, @@ -1536,16 +1643,18 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
spi->cfg->set_bpw(spi); spi->cfg->set_bpw(spi);
/* Update spi->cur_speed with real clock speed */ /* Update spi->cur_speed with real clock speed */
@ -2569,7 +2459,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
comm_type = stm32_spi_communication_type(spi_dev, transfer); comm_type = stm32_spi_communication_type(spi_dev, transfer);
ret = spi->cfg->set_mode(spi, comm_type); ret = spi->cfg->set_mode(spi, comm_type);
@@ -1553,7 +1654,7 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi, @@ -1554,7 +1663,7 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
spi->cur_comm = comm_type; spi->cur_comm = comm_type;
@ -2578,7 +2468,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->cfg->set_data_idleness(spi, transfer->len); spi->cfg->set_data_idleness(spi, transfer->len);
if (spi->cur_bpw <= 8) if (spi->cur_bpw <= 8)
@@ -1569,12 +1670,16 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi, @@ -1570,12 +1679,16 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
goto out; goto out;
} }
@ -2596,7 +2486,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
dev_dbg(spi->dev, "transfer of %d bytes (%d data frames)\n", dev_dbg(spi->dev, "transfer of %d bytes (%d data frames)\n",
spi->cur_xferlen, nb_words); spi->cur_xferlen, nb_words);
dev_dbg(spi->dev, "dma %s\n", dev_dbg(spi->dev, "dma %s\n",
@@ -1588,18 +1693,18 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi, @@ -1589,18 +1702,18 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
/** /**
* stm32_spi_transfer_one - transfer a single spi_transfer * stm32_spi_transfer_one - transfer a single spi_transfer
@ -2618,7 +2508,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
int ret; int ret;
spi->tx_buf = transfer->tx_buf; spi->tx_buf = transfer->tx_buf;
@@ -1607,8 +1712,8 @@ static int stm32_spi_transfer_one(struct spi_master *master, @@ -1608,8 +1721,8 @@ static int stm32_spi_transfer_one(struct spi_master *master,
spi->tx_len = spi->tx_buf ? transfer->len : 0; spi->tx_len = spi->tx_buf ? transfer->len : 0;
spi->rx_len = spi->rx_buf ? transfer->len : 0; spi->rx_len = spi->rx_buf ? transfer->len : 0;
@ -2629,7 +2519,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer); ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer);
if (ret) { if (ret) {
@@ -1624,13 +1729,13 @@ static int stm32_spi_transfer_one(struct spi_master *master, @@ -1625,13 +1738,13 @@ static int stm32_spi_transfer_one(struct spi_master *master,
/** /**
* stm32_spi_unprepare_msg - relax the hardware * stm32_spi_unprepare_msg - relax the hardware
@ -2646,7 +2536,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->cfg->disable(spi); spi->cfg->disable(spi);
@@ -1669,12 +1774,13 @@ static int stm32f4_spi_config(struct stm32_spi *spi) @@ -1670,12 +1783,13 @@ static int stm32f4_spi_config(struct stm32_spi *spi)
} }
/** /**
@ -2661,7 +2551,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spin_lock_irqsave(&spi->lock, flags); spin_lock_irqsave(&spi->lock, flags);
@@ -1682,24 +1788,28 @@ static int stm32h7_spi_config(struct stm32_spi *spi) @@ -1683,24 +1797,28 @@ static int stm32h7_spi_config(struct stm32_spi *spi)
stm32_spi_clr_bits(spi, STM32H7_SPI_I2SCFGR, stm32_spi_clr_bits(spi, STM32H7_SPI_I2SCFGR,
STM32H7_SPI_I2SCFGR_I2SMOD); STM32H7_SPI_I2SCFGR_I2SMOD);
@ -2707,7 +2597,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spin_unlock_irqrestore(&spi->lock, flags); spin_unlock_irqrestore(&spi->lock, flags);
@@ -1722,6 +1832,7 @@ static const struct stm32_spi_cfg stm32f4_spi_cfg = { @@ -1723,6 +1841,7 @@ static const struct stm32_spi_cfg stm32f4_spi_cfg = {
.baud_rate_div_min = STM32F4_SPI_BR_DIV_MIN, .baud_rate_div_min = STM32F4_SPI_BR_DIV_MIN,
.baud_rate_div_max = STM32F4_SPI_BR_DIV_MAX, .baud_rate_div_max = STM32F4_SPI_BR_DIV_MAX,
.has_fifo = false, .has_fifo = false,
@ -2715,7 +2605,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
}; };
static const struct stm32_spi_cfg stm32h7_spi_cfg = { static const struct stm32_spi_cfg stm32h7_spi_cfg = {
@@ -1745,6 +1856,7 @@ static const struct stm32_spi_cfg stm32h7_spi_cfg = { @@ -1746,6 +1865,7 @@ static const struct stm32_spi_cfg stm32h7_spi_cfg = {
.baud_rate_div_min = STM32H7_SPI_MBR_DIV_MIN, .baud_rate_div_min = STM32H7_SPI_MBR_DIV_MIN,
.baud_rate_div_max = STM32H7_SPI_MBR_DIV_MAX, .baud_rate_div_max = STM32H7_SPI_MBR_DIV_MAX,
.has_fifo = true, .has_fifo = true,
@ -2723,7 +2613,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
}; };
static const struct of_device_id stm32_spi_of_match[] = { static const struct of_device_id stm32_spi_of_match[] = {
@@ -1754,24 +1866,64 @@ static const struct of_device_id stm32_spi_of_match[] = { @@ -1755,24 +1875,64 @@ static const struct of_device_id stm32_spi_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, stm32_spi_of_match); MODULE_DEVICE_TABLE(of, stm32_spi_of_match);
@ -2795,7 +2685,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spin_lock_init(&spi->lock); spin_lock_init(&spi->lock);
spi->cfg = (const struct stm32_spi_cfg *) spi->cfg = (const struct stm32_spi_cfg *)
@@ -1793,13 +1945,16 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1794,13 +1954,16 @@ static int stm32_spi_probe(struct platform_device *pdev)
ret = devm_request_threaded_irq(&pdev->dev, spi->irq, ret = devm_request_threaded_irq(&pdev->dev, spi->irq,
spi->cfg->irq_handler_event, spi->cfg->irq_handler_event,
spi->cfg->irq_handler_thread, spi->cfg->irq_handler_thread,
@ -2813,7 +2703,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->clk = devm_clk_get(&pdev->dev, NULL); spi->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(spi->clk)) { if (IS_ERR(spi->clk)) {
ret = PTR_ERR(spi->clk); ret = PTR_ERR(spi->clk);
@@ -1842,19 +1997,21 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1843,19 +2006,21 @@ static int stm32_spi_probe(struct platform_device *pdev)
goto err_clk_disable; goto err_clk_disable;
} }
@ -2848,7 +2738,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->dma_tx = dma_request_chan(spi->dev, "tx"); spi->dma_tx = dma_request_chan(spi->dev, "tx");
if (IS_ERR(spi->dma_tx)) { if (IS_ERR(spi->dma_tx)) {
@@ -1865,7 +2022,7 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1866,7 +2031,7 @@ static int stm32_spi_probe(struct platform_device *pdev)
dev_warn(&pdev->dev, "failed to request tx dma channel\n"); dev_warn(&pdev->dev, "failed to request tx dma channel\n");
} else { } else {
@ -2857,7 +2747,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
} }
spi->dma_rx = dma_request_chan(spi->dev, "rx"); spi->dma_rx = dma_request_chan(spi->dev, "rx");
@@ -1877,11 +2034,11 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1878,11 +2043,11 @@ static int stm32_spi_probe(struct platform_device *pdev)
dev_warn(&pdev->dev, "failed to request rx dma channel\n"); dev_warn(&pdev->dev, "failed to request rx dma channel\n");
} else { } else {
@ -2871,7 +2761,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
pm_runtime_set_autosuspend_delay(&pdev->dev, pm_runtime_set_autosuspend_delay(&pdev->dev,
STM32_SPI_AUTOSUSPEND_DELAY); STM32_SPI_AUTOSUSPEND_DELAY);
@@ -1890,9 +2047,9 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1891,9 +2056,9 @@ static int stm32_spi_probe(struct platform_device *pdev)
pm_runtime_get_noresume(&pdev->dev); pm_runtime_get_noresume(&pdev->dev);
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@ -2883,7 +2773,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
ret); ret);
goto err_pm_disable; goto err_pm_disable;
} }
@@ -1900,7 +2057,8 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1901,7 +2066,8 @@ static int stm32_spi_probe(struct platform_device *pdev)
pm_runtime_mark_last_busy(&pdev->dev); pm_runtime_mark_last_busy(&pdev->dev);
pm_runtime_put_autosuspend(&pdev->dev); pm_runtime_put_autosuspend(&pdev->dev);
@ -2893,7 +2783,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
return 0; return 0;
@@ -1922,12 +2080,12 @@ static int stm32_spi_probe(struct platform_device *pdev) @@ -1923,12 +2089,12 @@ static int stm32_spi_probe(struct platform_device *pdev)
static int stm32_spi_remove(struct platform_device *pdev) static int stm32_spi_remove(struct platform_device *pdev)
{ {
@ -2909,7 +2799,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
spi->cfg->disable(spi); spi->cfg->disable(spi);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
@@ -1935,10 +2093,10 @@ static int stm32_spi_remove(struct platform_device *pdev) @@ -1936,10 +2102,10 @@ static int stm32_spi_remove(struct platform_device *pdev)
pm_runtime_set_suspended(&pdev->dev); pm_runtime_set_suspended(&pdev->dev);
pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_dont_use_autosuspend(&pdev->dev);
@ -2924,7 +2814,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
clk_disable_unprepare(spi->clk); clk_disable_unprepare(spi->clk);
@@ -1950,8 +2108,8 @@ static int stm32_spi_remove(struct platform_device *pdev) @@ -1951,8 +2117,8 @@ static int stm32_spi_remove(struct platform_device *pdev)
static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev) static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev)
{ {
@ -2935,7 +2825,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
clk_disable_unprepare(spi->clk); clk_disable_unprepare(spi->clk);
@@ -1960,8 +2118,8 @@ static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev) @@ -1961,8 +2127,8 @@ static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev)
static int __maybe_unused stm32_spi_runtime_resume(struct device *dev) static int __maybe_unused stm32_spi_runtime_resume(struct device *dev)
{ {
@ -2946,7 +2836,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
int ret; int ret;
ret = pinctrl_pm_select_default_state(dev); ret = pinctrl_pm_select_default_state(dev);
@@ -1973,10 +2131,10 @@ static int __maybe_unused stm32_spi_runtime_resume(struct device *dev) @@ -1974,10 +2140,10 @@ static int __maybe_unused stm32_spi_runtime_resume(struct device *dev)
static int __maybe_unused stm32_spi_suspend(struct device *dev) static int __maybe_unused stm32_spi_suspend(struct device *dev)
{ {
@ -2959,7 +2849,7 @@ index 9bd3fd1652f7..573f51e630d3 100644
if (ret) if (ret)
return ret; return ret;
@@ -1985,15 +2143,15 @@ static int __maybe_unused stm32_spi_suspend(struct device *dev) @@ -1986,15 +2152,15 @@ static int __maybe_unused stm32_spi_suspend(struct device *dev)
static int __maybe_unused stm32_spi_resume(struct device *dev) static int __maybe_unused stm32_spi_resume(struct device *dev)
{ {
@ -3011,6 +2901,18 @@ index 000000000000..7c818a399a0c
+#define SPI_REPEAT_LAST_TRANSMITTED_DATA 3 +#define SPI_REPEAT_LAST_TRANSMITTED_DATA 3
+ +
+#endif +#endif
diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h
index 8bf2ea859653..a5166eb93437 100644
--- a/include/linux/of_gpio.h
+++ b/include/linux/of_gpio.h
@@ -29,6 +29,7 @@ enum of_gpio_flags {
OF_GPIO_TRANSITORY = 0x8,
OF_GPIO_PULL_UP = 0x10,
OF_GPIO_PULL_DOWN = 0x20,
+ OF_GPIO_PULL_DISABLE = 0x40,
};
#ifdef CONFIG_OF_GPIO
-- --
2.17.1 2.17.1

View File

@ -1,102 +1,19 @@
From b0e70738cf7a9a1c9b4e10c3aec7cea6004ed9a4 Mon Sep 17 00:00:00 2001 From d046f916a037e6dcb46bdb7083a5b46132702090 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:04:20 +0100 Date: Tue, 25 Jul 2023 10:56:49 +0200
Subject: [PATCH 18/22] v5.15-stm32mp-r2 RESET-RTC Subject: [PATCH 18/22] v5.15-stm32mp-r2.1 RESET-RTC
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../devicetree/bindings/rtc/st,stm32-rtc.yaml | 37 ++
drivers/rtc/Kconfig | 1 + drivers/rtc/Kconfig | 1 +
drivers/rtc/rtc-stm32.c | 365 ++++++++++++++---- drivers/rtc/rtc-stm32.c | 365 +++++++++++++++----
include/dt-bindings/reset/stm32mp1-resets.h | 24 +- include/dt-bindings/reset/stm32mp1-resets.h | 24 +-
include/dt-bindings/reset/stm32mp13-resets.h | 100 +++++ include/dt-bindings/reset/stm32mp13-resets.h | 100 +++++
include/dt-bindings/rtc/rtc-stm32.h | 14 + include/dt-bindings/rtc/rtc-stm32.h | 14 +
6 files changed, 459 insertions(+), 82 deletions(-) 5 files changed, 422 insertions(+), 82 deletions(-)
create mode 100644 include/dt-bindings/reset/stm32mp13-resets.h create mode 100644 include/dt-bindings/reset/stm32mp13-resets.h
create mode 100644 include/dt-bindings/rtc/rtc-stm32.h create mode 100644 include/dt-bindings/rtc/rtc-stm32.h
diff --git a/Documentation/devicetree/bindings/rtc/st,stm32-rtc.yaml b/Documentation/devicetree/bindings/rtc/st,stm32-rtc.yaml
index 5456604b1c14..d94e1d13d908 100644
--- a/Documentation/devicetree/bindings/rtc/st,stm32-rtc.yaml
+++ b/Documentation/devicetree/bindings/rtc/st,stm32-rtc.yaml
@@ -52,6 +52,20 @@ properties:
override default rtc_ck parent clock phandle of the new parent clock of rtc_ck
maxItems: 1
+ st,lsco:
+ $ref: "/schemas/types.yaml#/definitions/uint32"
+ description: |
+ To select and enable RTC Low Speed Clock Output.
+ Refer to <include/dt-bindings/rtc/rtc-stm32.h> for the supported values.
+ Pinctrl state named "default" may be defined to reserve pin for RTC output.
+
+ st,alarm:
+ $ref: "/schemas/types.yaml#/definitions/uint32"
+ description: |
+ To select and enable RTC Alarm A output.
+ Refer to <include/dt-bindings/rtc/rtc-stm32.h> for the supported values.
+ Pinctrl state named "default" may be defined to reserve pin for RTC output.
+
allOf:
- if:
properties:
@@ -65,6 +79,12 @@ allOf:
minItems: 1
maxItems: 1
+ st,lsco:
+ maxItems: 0
+
+ st,alarm:
+ maxItems: 0
+
clock-names: false
required:
@@ -82,6 +102,12 @@ allOf:
minItems: 2
maxItems: 2
+ st,lsco:
+ maxItems: 0
+
+ st,alarm:
+ maxItems: 0
+
required:
- clock-names
- st,syscfg
@@ -101,6 +127,12 @@ allOf:
assigned-clocks: false
assigned-clock-parents: false
+ st,lsco:
+ maxItems: 1
+
+ st,alarm:
+ maxItems: 1
+
required:
- clock-names
@@ -129,12 +161,17 @@ examples:
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/clock/stm32mp1-clks.h>
+ #include <dt-bindings/rtc/rtc-stm32.h>
rtc@5c004000 {
compatible = "st,stm32mp1-rtc";
reg = <0x5c004000 0x400>;
clocks = <&rcc RTCAPB>, <&rcc RTC>;
clock-names = "pclk", "rtc_ck";
interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+ st,alarm = <RTC_OUT1>;
+ st,lsco = <RTC_OUT2_RMP>;
+ pinctrl-0 = <&rtc_out1_pins_a &rtc_out2_rmp_pins_a>;
+ pinctrl-names = "default";
};
...
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index e1bc5214494e..57ef1efdfc3c 100644 index e1bc5214494e..57ef1efdfc3c 100644
--- a/drivers/rtc/Kconfig --- a/drivers/rtc/Kconfig

View File

@ -1,9 +1,9 @@
From ae4d172fd1f74a9adc7eed21b80dc3049a56a462 Mon Sep 17 00:00:00 2001 From efeb9aad0de2f5453e9c27a8a4e0e18e6faa1938 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:05:11 +0100 Date: Tue, 25 Jul 2023 10:57:24 +0200
Subject: [PATCH 19/22] v5.15-stm32mp-r2 SCMI Subject: [PATCH 19/22] v5.15-stm32mp-r2.1 SCMI
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
drivers/firmware/arm_scmi/Makefile | 1 + drivers/firmware/arm_scmi/Makefile | 1 +
drivers/firmware/arm_scmi/clock.c | 78 +++ drivers/firmware/arm_scmi/clock.c | 78 +++
@ -27,7 +27,7 @@ index 1dcf123d64ab..d1460cf7e9de 100644
scmi-module-objs := $(scmi-bus-y) $(scmi-driver-y) $(scmi-protocols-y) \ scmi-module-objs := $(scmi-bus-y) $(scmi-driver-y) $(scmi-protocols-y) \
$(scmi-transport-y) $(scmi-transport-y)
diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index 492f3a9197ec..47814d175ce7 100644 index e76194a60edf..86e84f8ff6f6 100644
--- a/drivers/firmware/arm_scmi/clock.c --- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c +++ b/drivers/firmware/arm_scmi/clock.c
@@ -16,6 +16,8 @@ enum scmi_clock_protocol_cmd { @@ -16,6 +16,8 @@ enum scmi_clock_protocol_cmd {
@ -134,7 +134,7 @@ index 492f3a9197ec..47814d175ce7 100644
static int static int
scmi_clock_config_set(const struct scmi_protocol_handle *ph, u32 clk_id, scmi_clock_config_set(const struct scmi_protocol_handle *ph, u32 clk_id,
u32 config) u32 config)
@@ -331,6 +407,8 @@ static const struct scmi_clk_proto_ops clk_proto_ops = { @@ -335,6 +411,8 @@ static const struct scmi_clk_proto_ops clk_proto_ops = {
.rate_set = scmi_clock_rate_set, .rate_set = scmi_clock_rate_set,
.enable = scmi_clock_enable, .enable = scmi_clock_enable,
.disable = scmi_clock_disable, .disable = scmi_clock_disable,
@ -144,10 +144,10 @@ index 492f3a9197ec..47814d175ce7 100644
static int scmi_clock_protocol_init(const struct scmi_protocol_handle *ph) static int scmi_clock_protocol_init(const struct scmi_protocol_handle *ph)
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index dea1bfbe1052..82ff3c3a6d2d 100644 index b9f5829c0c4d..14f70b4f7874 100644
--- a/drivers/firmware/arm_scmi/common.h --- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h +++ b/drivers/firmware/arm_scmi/common.h
@@ -421,6 +421,9 @@ extern const struct scmi_desc scmi_smc_desc; @@ -422,6 +422,9 @@ extern const struct scmi_desc scmi_smc_desc;
#ifdef CONFIG_ARM_SCMI_TRANSPORT_VIRTIO #ifdef CONFIG_ARM_SCMI_TRANSPORT_VIRTIO
extern const struct scmi_desc scmi_virtio_desc; extern const struct scmi_desc scmi_virtio_desc;
#endif #endif
@ -158,10 +158,10 @@ index dea1bfbe1052..82ff3c3a6d2d 100644
void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv); void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv);
void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id); void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id);
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index e815b8f98739..4a5b9c2c0c53 100644 index 7ccda7d720a1..02db19079701 100644
--- a/drivers/firmware/arm_scmi/driver.c --- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c
@@ -1998,6 +1998,9 @@ static const struct of_device_id scmi_of_match[] = { @@ -2011,6 +2011,9 @@ static const struct of_device_id scmi_of_match[] = {
#ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC #ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC
{ .compatible = "arm,scmi-smc", .data = &scmi_smc_desc}, { .compatible = "arm,scmi-smc", .data = &scmi_smc_desc},
#endif #endif
@ -1026,7 +1026,7 @@ index 000000000000..4ec54b3c6628
+MODULE_AUTHOR("Etienne Carriere <etienne.carriere@linaro.org>"); +MODULE_AUTHOR("Etienne Carriere <etienne.carriere@linaro.org>");
+MODULE_DESCRIPTION("OP-TEE SCMI transport driver"); +MODULE_DESCRIPTION("OP-TEE SCMI transport driver");
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index 80e781c51ddc..f0b8bc4cf83a 100644 index d22f62203ee3..74cee314fa91 100644
--- a/include/linux/scmi_protocol.h --- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h
@@ -82,6 +82,10 @@ struct scmi_clk_proto_ops { @@ -82,6 +82,10 @@ struct scmi_clk_proto_ops {

View File

@ -1,20 +1,20 @@
From bf84be1a6e25855048a341b6e8d86a660d6fac1a Mon Sep 17 00:00:00 2001 From 73957b4c529874c1c4ddcad2db33caff026973e1 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:05:34 +0100 Date: Tue, 25 Jul 2023 10:57:46 +0200
Subject: [PATCH 20/22] v5.15-stm32mp-r2 SOUND Subject: [PATCH 20/22] v5.15-stm32mp-r2.1 SOUND
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
sound/soc/codecs/Kconfig | 2 +- sound/soc/codecs/Kconfig | 2 +-
sound/soc/codecs/wm8994.c | 81 ++++++++++++++++++++++++++++++++--- sound/soc/codecs/wm8994.c | 81 ++++++++++++++++++++++++++++++++---
sound/soc/stm/stm32_adfsdm.c | 22 ++++++++-- sound/soc/stm/stm32_adfsdm.c | 11 +++--
sound/soc/stm/stm32_i2s.c | 6 ++- sound/soc/stm/stm32_i2s.c | 6 ++-
sound/soc/stm/stm32_sai_sub.c | 4 +- sound/soc/stm/stm32_sai_sub.c | 4 +-
sound/soc/stm/stm32_spdifrx.c | 4 ++ sound/soc/stm/stm32_spdifrx.c | 4 ++
6 files changed, 106 insertions(+), 13 deletions(-) 6 files changed, 95 insertions(+), 13 deletions(-)
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index d59a7e99ce42..31ed450b4069 100644 index c3deb82c5da3..76981d82b005 100644
--- a/sound/soc/codecs/Kconfig --- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig
@@ -1774,7 +1774,7 @@ config SND_SOC_WM8993 @@ -1774,7 +1774,7 @@ config SND_SOC_WM8993
@ -27,7 +27,7 @@ index d59a7e99ce42..31ed450b4069 100644
config SND_SOC_WM8995 config SND_SOC_WM8995
tristate tristate
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index f117ec0c489f..98e803516fe5 100644 index 6759db92f6c4..c037368acdd4 100644
--- a/sound/soc/codecs/wm8994.c --- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
@ -163,7 +163,7 @@ index f117ec0c489f..98e803516fe5 100644
ret = wm8994_set_mclk_rate(wm8994, dai->id - 1, &freq); ret = wm8994_set_mclk_rate(wm8994, dai->id - 1, &freq);
if (ret < 0) if (ret < 0)
return ret; return ret;
@@ -4438,6 +4499,14 @@ static int wm8994_component_probe(struct snd_soc_component *component) @@ -4443,6 +4504,14 @@ static int wm8994_component_probe(struct snd_soc_component *component)
ARRAY_SIZE(wm8994_snd_controls)); ARRAY_SIZE(wm8994_snd_controls));
snd_soc_dapm_new_controls(dapm, wm8994_specific_dapm_widgets, snd_soc_dapm_new_controls(dapm, wm8994_specific_dapm_widgets,
ARRAY_SIZE(wm8994_specific_dapm_widgets)); ARRAY_SIZE(wm8994_specific_dapm_widgets));
@ -179,7 +179,7 @@ index f117ec0c489f..98e803516fe5 100644
snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widgets, snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widgets,
ARRAY_SIZE(wm8994_lateclk_revd_widgets)); ARRAY_SIZE(wm8994_lateclk_revd_widgets));
diff --git a/sound/soc/stm/stm32_adfsdm.c b/sound/soc/stm/stm32_adfsdm.c diff --git a/sound/soc/stm/stm32_adfsdm.c b/sound/soc/stm/stm32_adfsdm.c
index e6078f50e508..75e75cc7fa02 100644 index 1e9b4b1df69e..75e75cc7fa02 100644
--- a/sound/soc/stm/stm32_adfsdm.c --- a/sound/soc/stm/stm32_adfsdm.c
+++ b/sound/soc/stm/stm32_adfsdm.c +++ b/sound/soc/stm/stm32_adfsdm.c
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
@ -191,32 +191,7 @@ index e6078f50e508..75e75cc7fa02 100644
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/iio/consumer.h> #include <linux/iio/consumer.h>
#include <linux/iio/adc/stm32-dfsdm-adc.h> #include <linux/iio/adc/stm32-dfsdm-adc.h>
@@ -303,6 +303,11 @@ static int stm32_adfsdm_dummy_cb(const void *data, void *private) @@ -374,15 +374,20 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
return 0;
}
+static void stm32_adfsdm_cleanup(void *data)
+{
+ iio_channel_release_all_cb(data);
+}
+
static struct snd_soc_component_driver stm32_adfsdm_soc_platform = {
.open = stm32_adfsdm_pcm_open,
.close = stm32_adfsdm_pcm_close,
@@ -349,6 +354,12 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
if (IS_ERR(priv->iio_cb))
return PTR_ERR(priv->iio_cb);
+ ret = devm_add_action_or_reset(&pdev->dev, stm32_adfsdm_cleanup, priv->iio_cb);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Unable to add action\n");
+ return ret;
+ }
+
component = devm_kzalloc(&pdev->dev, sizeof(*component), GFP_KERNEL);
if (!component)
return -ENOMEM;
@@ -363,15 +374,20 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
#endif #endif
ret = snd_soc_add_component(component, NULL, 0); ret = snd_soc_add_component(component, NULL, 0);

View File

@ -1,23 +1,23 @@
From ff0775651b034096b3f72ed6ec90efc39eb8627c Mon Sep 17 00:00:00 2001 From 5b3e499d2722661e1d1290a86939f3f4cd93541e Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com> From: Romuald Jeanne <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 16:51:45 +0100 Date: Tue, 25 Jul 2023 10:58:05 +0200
Subject: [PATCH 22/22] v5.15-stm32mp-r2 CONFIG Subject: [PATCH 22/22] v5.15-stm32mp-r2.1 CONFIG
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com> Signed-off-by: Romuald Jeanne <romuald.jeanne@st.com>
--- ---
.../fragment-01-multiv7_cleanup.config | 408 +++++++++++++++++ .../fragment-01-multiv7_cleanup.config | 412 +++++++++++++++++
.../configs/fragment-02-multiv7_addons.config | 426 ++++++++++++++++++ .../configs/fragment-02-multiv7_addons.config | 426 ++++++++++++++++++
arch/arm/configs/multi_v7_defconfig | 1 + arch/arm/configs/multi_v7_defconfig | 1 +
3 files changed, 835 insertions(+) 3 files changed, 839 insertions(+)
create mode 100644 arch/arm/configs/fragment-01-multiv7_cleanup.config create mode 100644 arch/arm/configs/fragment-01-multiv7_cleanup.config
create mode 100644 arch/arm/configs/fragment-02-multiv7_addons.config create mode 100644 arch/arm/configs/fragment-02-multiv7_addons.config
diff --git a/arch/arm/configs/fragment-01-multiv7_cleanup.config b/arch/arm/configs/fragment-01-multiv7_cleanup.config diff --git a/arch/arm/configs/fragment-01-multiv7_cleanup.config b/arch/arm/configs/fragment-01-multiv7_cleanup.config
new file mode 100644 new file mode 100644
index 000000000000..52f28a765b25 index 000000000000..23eb90e36f33
--- /dev/null --- /dev/null
+++ b/arch/arm/configs/fragment-01-multiv7_cleanup.config +++ b/arch/arm/configs/fragment-01-multiv7_cleanup.config
@@ -0,0 +1,408 @@ @@ -0,0 +1,412 @@
+# +#
+# CPU Core family selection +# CPU Core family selection
+# +#
@ -426,6 +426,10 @@ index 000000000000..52f28a765b25
+ +
+# Remove Console display driver support +# Remove Console display driver support
+# CONFIG_FRAMEBUFFER_CONSOLE is not set +# CONFIG_FRAMEBUFFER_CONSOLE is not set
+
+# Remove RNDIS support
+# CONFIG_USB_CONFIGFS_RNDIS is not set
+# CONFIG_USB_ETH_RNDIS is not set
diff --git a/arch/arm/configs/fragment-02-multiv7_addons.config b/arch/arm/configs/fragment-02-multiv7_addons.config diff --git a/arch/arm/configs/fragment-02-multiv7_addons.config b/arch/arm/configs/fragment-02-multiv7_addons.config
new file mode 100644 new file mode 100644
index 000000000000..7b5ffd562d8a index 000000000000..7b5ffd562d8a
@ -859,7 +863,7 @@ index 000000000000..7b5ffd562d8a
+CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_OFB=m +CONFIG_CRYPTO_OFB=m
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 33572998dbbe..afb97c5051c9 100644 index 2eafcf1c5d89..ea6a2dc838fe 100644
--- a/arch/arm/configs/multi_v7_defconfig --- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig
@@ -646,6 +646,7 @@ CONFIG_V4L_PLATFORM_DRIVERS=y @@ -646,6 +646,7 @@ CONFIG_V4L_PLATFORM_DRIVERS=y

View File

@ -1,341 +0,0 @@
From 99e2eb7f37c25b7e9a5e0b18af405d8bae95df12 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com>
Date: Thu, 3 Nov 2022 15:56:26 +0100
Subject: [PATCH 13/22] v5.15-stm32mp-r2 MMC
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
---
.../devicetree/bindings/mmc/arm,pl18x.yaml | 6 ++
drivers/mmc/host/mmci.c | 7 +-
drivers/mmc/host/mmci_stm32_sdmmc.c | 93 +++++++++++++++----
drivers/mtd/nand/raw/stm32_fmc2_nand.c | 40 +++++++-
4 files changed, 125 insertions(+), 21 deletions(-)
diff --git a/Documentation/devicetree/bindings/mmc/arm,pl18x.yaml b/Documentation/devicetree/bindings/mmc/arm,pl18x.yaml
index 47595cb483be..eed54bee7665 100644
--- a/Documentation/devicetree/bindings/mmc/arm,pl18x.yaml
+++ b/Documentation/devicetree/bindings/mmc/arm,pl18x.yaml
@@ -53,6 +53,12 @@ properties:
items:
- const: arm,pl18x
- const: arm,primecell
+ - description: Entry for STMicroelectronics variant of PL18x.
+ This dedicated compatible is used by bootloaders.
+ items:
+ - const: st,stm32-sdmmc2
+ - const: arm,pl18x
+ - const: arm,primecell
clocks:
description: One or two clocks, the "apb_pclk" and the "MCLK"
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 3765e2f4ad98..3d416c4edc7c 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -280,7 +280,7 @@ static struct variant_data variant_stm32_sdmmc = {
static struct variant_data variant_stm32_sdmmcv2 = {
.fifosize = 16 * 4,
.fifohalfsize = 8 * 4,
- .f_max = 208000000,
+ .f_max = 267000000,
.stm32_clkdiv = true,
.cmdreg_cpsm_enable = MCI_CPSM_STM32_ENABLE,
.cmdreg_lrsp_crc = MCI_CPSM_STM32_LRSP_CRC,
@@ -2431,6 +2431,11 @@ static const struct amba_id mmci_ids[] = {
.mask = 0xf0ffffff,
.data = &variant_stm32_sdmmcv2,
},
+ {
+ .id = 0x20253180,
+ .mask = 0xf0ffffff,
+ .data = &variant_stm32_sdmmcv2,
+ },
/* Qualcomm variants */
{
.id = 0x00051180,
diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_stm32_sdmmc.c
index 4cceb9bab036..60bca78a72b1 100644
--- a/drivers/mmc/host/mmci_stm32_sdmmc.c
+++ b/drivers/mmc/host/mmci_stm32_sdmmc.c
@@ -43,6 +43,9 @@ struct sdmmc_lli_desc {
struct sdmmc_idma {
dma_addr_t sg_dma;
void *sg_cpu;
+ dma_addr_t bounce_dma_addr;
+ void *bounce_buf;
+ bool use_bounce_buffer;
};
struct sdmmc_dlyb {
@@ -54,6 +57,8 @@ struct sdmmc_dlyb {
static int sdmmc_idma_validate_data(struct mmci_host *host,
struct mmc_data *data)
{
+ struct sdmmc_idma *idma = host->dma_priv;
+ struct device *dev = mmc_dev(host->mmc);
struct scatterlist *sg;
int i;
@@ -61,41 +66,69 @@ static int sdmmc_idma_validate_data(struct mmci_host *host,
* idma has constraints on idmabase & idmasize for each element
* excepted the last element which has no constraint on idmasize
*/
+ idma->use_bounce_buffer = false;
for_each_sg(data->sg, sg, data->sg_len - 1, i) {
if (!IS_ALIGNED(sg->offset, sizeof(u32)) ||
!IS_ALIGNED(sg->length, SDMMC_IDMA_BURST)) {
- dev_err(mmc_dev(host->mmc),
+ dev_dbg(mmc_dev(host->mmc),
"unaligned scatterlist: ofst:%x length:%d\n",
data->sg->offset, data->sg->length);
- return -EINVAL;
+ goto use_bounce_buffer;
}
}
if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
- dev_err(mmc_dev(host->mmc),
+ dev_dbg(mmc_dev(host->mmc),
"unaligned last scatterlist: ofst:%x length:%d\n",
data->sg->offset, data->sg->length);
- return -EINVAL;
+ goto use_bounce_buffer;
}
+ return 0;
+
+use_bounce_buffer:
+ if (!idma->bounce_buf) {
+ idma->bounce_buf = dmam_alloc_coherent(dev,
+ host->mmc->max_req_size,
+ &idma->bounce_dma_addr,
+ GFP_KERNEL);
+ if (!idma->bounce_buf) {
+ dev_err(dev, "Unable to map allocate DMA bounce buffer.\n");
+ return -ENOMEM;
+ }
+ }
+
+ idma->use_bounce_buffer = true;
+
return 0;
}
static int _sdmmc_idma_prep_data(struct mmci_host *host,
struct mmc_data *data)
{
- int n_elem;
+ struct sdmmc_idma *idma = host->dma_priv;
- n_elem = dma_map_sg(mmc_dev(host->mmc),
- data->sg,
- data->sg_len,
- mmc_get_dma_dir(data));
+ if (idma->use_bounce_buffer) {
+ if (data->flags & MMC_DATA_WRITE) {
+ unsigned int xfer_bytes = data->blksz * data->blocks;
- if (!n_elem) {
- dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n");
- return -EINVAL;
- }
+ sg_copy_to_buffer(data->sg, data->sg_len,
+ idma->bounce_buf, xfer_bytes);
+ dma_wmb();
+ }
+ } else {
+ int n_elem;
+
+ n_elem = dma_map_sg(mmc_dev(host->mmc),
+ data->sg,
+ data->sg_len,
+ mmc_get_dma_dir(data));
+ if (!n_elem) {
+ dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n");
+ return -EINVAL;
+ }
+ }
return 0;
}
@@ -112,8 +145,19 @@ static int sdmmc_idma_prep_data(struct mmci_host *host,
static void sdmmc_idma_unprep_data(struct mmci_host *host,
struct mmc_data *data, int err)
{
- dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
- mmc_get_dma_dir(data));
+ struct sdmmc_idma *idma = host->dma_priv;
+
+ if (idma->use_bounce_buffer) {
+ if (data->flags & MMC_DATA_READ) {
+ unsigned int xfer_bytes = data->blksz * data->blocks;
+
+ sg_copy_from_buffer(data->sg, data->sg_len,
+ idma->bounce_buf, xfer_bytes);
+ }
+ } else {
+ dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
+ mmc_get_dma_dir(data));
+ }
}
static int sdmmc_idma_setup(struct mmci_host *host)
@@ -137,6 +181,8 @@ static int sdmmc_idma_setup(struct mmci_host *host)
host->mmc->max_segs = SDMMC_LLI_BUF_LEN /
sizeof(struct sdmmc_lli_desc);
host->mmc->max_seg_size = host->variant->stm32_idmabsize_mask;
+
+ host->mmc->max_req_size = SZ_1M;
} else {
host->mmc->max_segs = 1;
host->mmc->max_seg_size = host->mmc->max_req_size;
@@ -154,8 +200,16 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)
struct scatterlist *sg;
int i;
- if (!host->variant->dma_lli || data->sg_len == 1) {
- writel_relaxed(sg_dma_address(data->sg),
+ if (!host->variant->dma_lli || data->sg_len == 1 ||
+ idma->use_bounce_buffer) {
+ u32 dma_addr;
+
+ if (idma->use_bounce_buffer)
+ dma_addr = idma->bounce_dma_addr;
+ else
+ dma_addr = sg_dma_address(data->sg);
+
+ writel_relaxed(dma_addr,
host->base + MMCI_STM32_IDMABASE0R);
writel_relaxed(MMCI_STM32_IDMAEN,
host->base + MMCI_STM32_IDMACTRLR);
@@ -241,11 +295,12 @@ static void mmci_sdmmc_set_clkreg(struct mmci_host *host, unsigned int desired)
/*
* SDMMC_FBCK is selected when an external Delay Block is needed
- * with SDR104.
+ * with SDR104 or HS200.
*/
if (host->mmc->ios.timing >= MMC_TIMING_UHS_SDR50) {
clk |= MCI_STM32_CLK_BUSSPEED;
- if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104) {
+ if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104 ||
+ host->mmc->ios.timing == MMC_TIMING_MMC_HS200) {
clk &= ~MCI_STM32_CLK_SEL_MSK;
clk |= MCI_STM32_CLK_SELFBCK;
}
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
index 1c277fbb91f2..733f9857e801 100644
--- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
@@ -9,6 +9,7 @@
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <linux/errno.h>
+#include <linux/gpio/consumer.h>
#include <linux/interrupt.h>
#include <linux/iopoll.h>
#include <linux/mfd/syscon.h>
@@ -231,6 +232,7 @@ struct stm32_fmc2_timings {
struct stm32_fmc2_nand {
struct nand_chip chip;
+ struct gpio_desc *wp_gpio;
struct stm32_fmc2_timings timings;
int ncs;
int cs_used[FMC2_MAX_CE];
@@ -1747,6 +1749,18 @@ static const struct nand_controller_ops stm32_fmc2_nfc_controller_ops = {
.setup_interface = stm32_fmc2_nfc_setup_interface,
};
+static void stm32_fmc2_nfc_wp_enable(struct stm32_fmc2_nand *nand)
+{
+ if (nand->wp_gpio)
+ gpiod_set_value(nand->wp_gpio, 1);
+}
+
+static void stm32_fmc2_nfc_wp_disable(struct stm32_fmc2_nand *nand)
+{
+ if (nand->wp_gpio)
+ gpiod_set_value(nand->wp_gpio, 0);
+}
+
static int stm32_fmc2_nfc_parse_child(struct stm32_fmc2_nfc *nfc,
struct device_node *dn)
{
@@ -1785,6 +1799,18 @@ static int stm32_fmc2_nfc_parse_child(struct stm32_fmc2_nfc *nfc,
nand->cs_used[i] = cs;
}
+ nand->wp_gpio = devm_gpiod_get_from_of_node(nfc->dev, dn,
+ "wp-gpios", 0,
+ GPIOD_OUT_HIGH, "wp");
+ if (IS_ERR(nand->wp_gpio)) {
+ ret = PTR_ERR(nand->wp_gpio);
+ if (ret != -ENOENT)
+ return dev_err_probe(nfc->dev, ret,
+ "failed to request WP GPIO\n");
+
+ nand->wp_gpio = NULL;
+ }
+
nand_set_flash_node(&nand->chip, dn);
return 0;
@@ -1960,10 +1986,12 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
chip->options |= NAND_BUSWIDTH_AUTO | NAND_NO_SUBPAGE_WRITE |
NAND_USES_DMA;
+ stm32_fmc2_nfc_wp_disable(nand);
+
/* Scan to find existence of the device */
ret = nand_scan(chip, nand->ncs);
if (ret)
- goto err_release_dma;
+ goto err_wp_enable;
ret = mtd_device_register(mtd, NULL, 0);
if (ret)
@@ -1976,6 +2004,9 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
err_nand_cleanup:
nand_cleanup(chip);
+err_wp_enable:
+ stm32_fmc2_nfc_wp_enable(nand);
+
err_release_dma:
if (nfc->dma_ecc_ch)
dma_release_channel(nfc->dma_ecc_ch);
@@ -2016,15 +2047,20 @@ static int stm32_fmc2_nfc_remove(struct platform_device *pdev)
clk_disable_unprepare(nfc->clk);
+ stm32_fmc2_nfc_wp_enable(nand);
+
return 0;
}
static int __maybe_unused stm32_fmc2_nfc_suspend(struct device *dev)
{
struct stm32_fmc2_nfc *nfc = dev_get_drvdata(dev);
+ struct stm32_fmc2_nand *nand = &nfc->nand;
clk_disable_unprepare(nfc->clk);
+ stm32_fmc2_nfc_wp_enable(nand);
+
pinctrl_pm_select_sleep_state(dev);
return 0;
@@ -2046,6 +2082,8 @@ static int __maybe_unused stm32_fmc2_nfc_resume(struct device *dev)
stm32_fmc2_nfc_init(nfc);
+ stm32_fmc2_nfc_wp_disable(nand);
+
for (chip_cs = 0; chip_cs < FMC2_MAX_CE; chip_cs++) {
if (!(nfc->cs_assigned & BIT(chip_cs)))
continue;
--
2.17.1

View File

@ -149,10 +149,10 @@ We highly preconized the build is a build directory method as:
$ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-01-xxx.config $ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-01-xxx.config
$ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-02-xxx.config $ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-02-xxx.config
... ...
$ yes '' | make ARCH=arm oldconfig O="$PWD/../build" $ (yes '' || true) | make ARCH=arm oldconfig O="$PWD/../build"
* or, by loop: * or, by loop:
$> for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config $f; done $> for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config $f; done
$> yes '' | make ARCH=arm oldconfig O="$PWD/../build" $> (yes '' || true) | make ARCH=arm oldconfig O="$PWD/../build"
* Configure on the current source code directory * Configure on the current source code directory
$ cd <directory to kernel source code> $ cd <directory to kernel source code>
@ -163,10 +163,10 @@ We highly preconized the build is a build directory method as:
$ scripts/kconfig/merge_config.sh -m -r .config ../fragment-01-xxxx.config $ scripts/kconfig/merge_config.sh -m -r .config ../fragment-01-xxxx.config
$ scripts/kconfig/merge_config.sh -m -r .config ../fragment-02-xxxx.config $ scripts/kconfig/merge_config.sh -m -r .config ../fragment-02-xxxx.config
... ...
$ yes '' | make oldconfig $ (yes '' || true) | make oldconfig
* or, by loop: * or, by loop:
$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done $ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
$ yes '' | make ARCH=arm oldconfig $ (yes '' || true) | make ARCH=arm oldconfig
NB: Two types of fragments are provided: NB: Two types of fragments are provided:
* official fragments (fragment-xxx.config) * official fragments (fragment-xxx.config)

View File

@ -7,41 +7,41 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
include linux-stm32mp.inc include linux-stm32mp.inc
LINUX_VERSION = "5.15" LINUX_VERSION = "5.15"
LINUX_SUBVERSION = "67" LINUX_SUBVERSION = "118"
LINUX_TARNAME = "linux-${LINUX_VERSION}.${LINUX_SUBVERSION}" LINUX_TARNAME = "linux-${LINUX_VERSION}.${LINUX_SUBVERSION}"
SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v5.x/${LINUX_TARNAME}.tar.xz;name=kernel" SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v5.x/${LINUX_TARNAME}.tar.xz;name=kernel"
#SRC_URI = "https://git.kernel.org/torvalds/t/linux-${LINUX_VERSION}-${LINUX_SUBVERSION}.tar.gz;name=kernel" #SRC_URI = "https://git.kernel.org/torvalds/t/linux-${LINUX_VERSION}-${LINUX_SUBVERSION}.tar.gz;name=kernel"
SRC_URI[kernel.sha256sum] = "da47d9a80b694548835ccb553b6eb1a1f3f5d5cddd9e2bd6f4886b99ca14f940" SRC_URI[kernel.sha256sum] = "4e6bf4dadb04d5d11d1d4cc37c0eabcf33bc333b7dd3dc2143c3099a823eb5b3"
SRC_URI += " \ SRC_URI += " \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-v5.15-stm32mp-r2-MACHINE.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-v5.15-stm32mp-r2.1-MACHINE.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-v5.15-stm32mp-r2-CLOCK.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-v5.15-stm32mp-r2.1-CLOCK.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0003-v5.15-stm32mp-r2-CPUFREQ.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0003-v5.15-stm32mp-r2.1-CPUFREQ.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0004-v5.15-stm32mp-r2-CPUIDLE-POWER.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0004-v5.15-stm32mp-r2.1-CPUIDLE-POWER.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0005-v5.15-stm32mp-r2-CRYPTO.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0005-v5.15-stm32mp-r2.1-CRYPTO.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0006-v5.15-stm32mp-r2-DMA.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0006-v5.15-stm32mp-r2.1-DMA.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0007-v5.15-stm32mp-r2-DRM.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0007-v5.15-stm32mp-r2.1-DRM.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0008-v5.15-stm32mp-r2-HWSPINLOCK.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0008-v5.15-stm32mp-r2.1-HWSPINLOCK.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0009-v5.15-stm32mp-r2-I2C-IIO-IRQCHIP.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0009-v5.15-stm32mp-r2.1-I2C-IIO-IRQCHIP.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0010-v5.15-stm32mp-r2-REMOTEPROC-RPMSG.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0010-v5.15-stm32mp-r2.1-REMOTEPROC-RPMSG.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0011-v5.15-stm32mp-r2-MISC-MEDIA-SOC-THERMAL.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0011-v5.15-stm32mp-r2.1-MISC-MEDIA-SOC-THERMAL.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0012-v5.15-stm32mp-r2-MFD.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0012-v5.15-stm32mp-r2.1-MFD.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0013-v5.15-stm32mp-r2-MMC.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0013-v5.15-stm32mp-r2.1-MMC.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0014-v5.15-stm32mp-r2-NET-TTY.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0014-v5.15-stm32mp-r2.1-NET-TTY.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0015-v5.15-stm32mp-r2-PERF.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0015-v5.15-stm32mp-r2.1-PERF.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0016-v5.15-stm32mp-r2-PHY-USB.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0016-v5.15-stm32mp-r2.1-PHY-USB.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0017-v5.15-stm32mp-r2-PINCTRL-REGULATOR-SPI.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0017-v5.15-stm32mp-r2.1-PINCTRL-REGULATOR-SPI.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0018-v5.15-stm32mp-r2-RESET-RTC.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0018-v5.15-stm32mp-r2.1-RESET-RTC.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0019-v5.15-stm32mp-r2-SCMI.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0019-v5.15-stm32mp-r2.1-SCMI.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0020-v5.15-stm32mp-r2-SOUND.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0020-v5.15-stm32mp-r2.1-SOUND.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0021-v5.15-stm32mp-r2-DEVICETREE.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0021-v5.15-stm32mp-r2.1-DEVICETREE.patch \
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0022-v5.15-stm32mp-r2-CONFIG.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0022-v5.15-stm32mp-r2.1-CONFIG.patch \
" "
LINUX_TARGET = "stm32mp" LINUX_TARGET = "stm32mp"
LINUX_RELEASE = "r2" LINUX_RELEASE = "r2.1"
PV = "${LINUX_VERSION}.${LINUX_SUBVERSION}-${LINUX_TARGET}-${LINUX_RELEASE}" PV = "${LINUX_VERSION}.${LINUX_SUBVERSION}-${LINUX_TARGET}-${LINUX_RELEASE}"
@ -59,7 +59,7 @@ S = "${WORKDIR}/linux-${LINUX_VERSION}.${LINUX_SUBVERSION}"
BBCLASSEXTEND = "devupstream:target" BBCLASSEXTEND = "devupstream:target"
SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/linux.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}" SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/linux.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}"
SRCREV:class-devupstream = "661e4b11da679e4e1f4de088279282f6fbbe528b" SRCREV:class-devupstream = "61ca40c154195a5b3b288db386086f0bf9c5273f"
# --------------------------------- # ---------------------------------
# Configure default preference to manage dynamic selection between tarball and github # Configure default preference to manage dynamic selection between tarball and github

View File

@ -9,13 +9,14 @@ SRC_URI += " \
file://fonts.tar.gz;subdir=git;name=fonts \ file://fonts.tar.gz;subdir=git;name=fonts \
file://0001-3.16.0-stm32mp-r1.patch \ file://0001-3.16.0-stm32mp-r1.patch \
file://0002-3.16.0-stm32mp-r2.patch \ file://0002-3.16.0-stm32mp-r2.patch \
file://0003-3.16.0-stm32mp-r2.1.patch \
" "
SRC_URI[fonts.sha256sum] = "4941e8bb6d8ac377838e27b214bf43008c496a24a8f897e0b06433988cbd53b2" SRC_URI[fonts.sha256sum] = "4941e8bb6d8ac377838e27b214bf43008c496a24a8f897e0b06433988cbd53b2"
OPTEE_VERSION = "3.16.0" OPTEE_VERSION = "3.16.0"
OPTEE_SUBVERSION = "stm32mp" OPTEE_SUBVERSION = "stm32mp"
OPTEE_RELEASE = "r2" OPTEE_RELEASE = "r2.1"
PV = "${OPTEE_VERSION}-${OPTEE_SUBVERSION}-${OPTEE_RELEASE}" PV = "${OPTEE_VERSION}-${OPTEE_SUBVERSION}-${OPTEE_RELEASE}"
@ -50,7 +51,7 @@ include ${@oe.utils.ifelse(d.getVar('ST_ARCHIVER_ENABLE') == '1', 'optee-os-stm3
BBCLASSEXTEND = "devupstream:target" BBCLASSEXTEND = "devupstream:target"
SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/optee_os.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}" SRC_URI:class-devupstream = "git://github.com/STMicroelectronics/optee_os.git;protocol=https;branch=${ARCHIVER_ST_BRANCH}"
SRCREV:class-devupstream = "0f631da995da50fe7e19e0b7291032d77f7048bc" SRCREV:class-devupstream = "b8750c4600166f0019a8c1cf35362b1889840ec3"
# --------------------------------- # ---------------------------------
# Configure default preference to manage dynamic selection between tarball and github # Configure default preference to manage dynamic selection between tarball and github

View File

@ -0,0 +1,848 @@
From 40bea7e6dd305b8fec278fa56bc38eed127ce946 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Mon, 3 Jul 2023 10:30:06 +0200
Subject: [PATCH] 3.16.0-stm32mp-r2.1-rc1
---
core/arch/arm/dts/stm32mp135f-dk.dts | 4 +-
core/arch/arm/plat-stm32mp1/conf.mk | 4 +-
.../arm/plat-stm32mp1/drivers/stm32mp1_pmic.c | 151 +++++++++++++-----
.../plat-stm32mp1/drivers/stm32mp1_pwr_irq.c | 78 ++++++---
core/arch/arm/plat-stm32mp1/main.c | 4 +-
core/arch/arm/plat-stm32mp1/pm/context.c | 12 +-
core/arch/arm/plat-stm32mp1/pm/low_power.c | 15 +-
core/drivers/crypto/stm32/stm32_saes.c | 7 +
core/drivers/regulator/core.c | 5 +
core/drivers/stm32_iwdg.c | 18 ++-
core/drivers/stm32_rng.c | 12 +-
core/drivers/stm32_uart.c | 4 +-
core/include/drivers/stpmic1.h | 35 ----
core/include/kernel/huk_subkey.h | 5 +
core/kernel/huk_subkey.c | 16 +-
.../devicetree/bindings/mfd/st,stpmic1.yaml | 51 ++++++
16 files changed, 293 insertions(+), 128 deletions(-)
diff --git a/core/arch/arm/dts/stm32mp135f-dk.dts b/core/arch/arm/dts/stm32mp135f-dk.dts
index 4400b2b13..710446101 100644
--- a/core/arch/arm/dts/stm32mp135f-dk.dts
+++ b/core/arch/arm/dts/stm32mp135f-dk.dts
@@ -9,6 +9,7 @@
#include <dt-bindings/clock/stm32mp13-clksrc.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/gpio/stm32mp_gpio.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
#include <dt-bindings/power/stm32mp1-power.h>
#include <dt-bindings/rtc/rtc-stm32.h>
#include <dt-bindings/soc/stm32mp-tzc400-macro.h>
@@ -192,7 +193,8 @@
reg = <0x33>;
status = "okay";
st,wakeup-pin-number = <1>;
- st,notif-it-id = <0>;
+ st,pmic-it-id = <IT_PONKEY_F IT_PONKEY_R>;
+ st,notif-it-id = <0 2>;
regulators {
compatible = "st,stpmic1-regulators";
diff --git a/core/arch/arm/plat-stm32mp1/conf.mk b/core/arch/arm/plat-stm32mp1/conf.mk
index 6c959d4bc..05229e61e 100644
--- a/core/arch/arm/plat-stm32mp1/conf.mk
+++ b/core/arch/arm/plat-stm32mp1/conf.mk
@@ -310,10 +310,8 @@ CFG_ENABLE_EMBEDDED_TESTS ?= y
CFG_WITH_STATS ?= y
CFG_WERROR ?= y
-# Enable to allow debug
-ifeq ($(CFG_TEE_CORE_DEBUG),y)
+# Enable OTP update with BSEC driver
CFG_STM32_BSEC_WRITE ?= y
-endif
# Default disable some support for pager memory size constraint
ifeq ($(CFG_WITH_PAGER),y)
diff --git a/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pmic.c b/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pmic.c
index 4eda619cf..653ac4f7d 100644
--- a/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pmic.c
+++ b/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pmic.c
@@ -12,6 +12,7 @@
#include <drivers/stm32mp1_pmic.h>
#include <drivers/stm32mp1_pwr.h>
#include <drivers/stpmic1.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
#include <io.h>
#include <keep.h>
#include <kernel/boot.h>
@@ -26,6 +27,7 @@
#include <platform_config.h>
#include <stdbool.h>
#include <stm32_util.h>
+#include <sys/queue.h>
#include <trace.h>
#include <util.h>
@@ -42,6 +44,17 @@
static struct i2c_handle_s *i2c_pmic_handle;
static uint32_t pmic_i2c_addr;
+struct pmic_it_handle_s {
+ uint8_t pmic_reg;
+ uint8_t pmic_bit;
+ uint8_t notif_id;
+
+ SLIST_ENTRY(pmic_it_handle_s) link;
+};
+
+static SLIST_HEAD(pmic_it_handle_head, pmic_it_handle_s) pmic_it_handle_list =
+ SLIST_HEAD_INITIALIZER(pmic_it_handle_list);
+
/* CPU voltage supplier if found */
static char cpu_supply_name[PMIC_REGU_SUPPLY_NAME_LEN];
@@ -508,11 +521,10 @@ static void register_non_secure_pmic(void)
}
}
-static enum itr_return stpmic1_irq_handler(struct itr_handler *handler)
+static enum itr_return stpmic1_irq_handler(struct itr_handler *handler __unused)
{
uint8_t read_val = 0U;
unsigned int i = 0U;
- uint32_t *it_id = handler->data;
FMSG("Stpmic1 irq handler");
@@ -523,16 +535,22 @@ static enum itr_return stpmic1_irq_handler(struct itr_handler *handler)
panic();
if (read_val) {
+ struct pmic_it_handle_s *prv = NULL;
+
FMSG("Stpmic1 irq pending %u: %#"PRIx8, i, read_val);
if (stpmic1_register_write(ITCLEARLATCH1_REG + i,
read_val))
panic();
- /* forward falling interrupt to non-secure */
- if (i == 0 && (read_val & BIT(IT_PONKEY_F)))
- if (it_id)
- notif_send_it(*it_id);
+ SLIST_FOREACH(prv, &pmic_it_handle_list, link)
+ if ((prv->pmic_reg == ITCLEARMASK1_REG + i) &&
+ (read_val & BIT(prv->pmic_bit))) {
+ FMSG("STPMIC1 send notif %u",
+ prv->notif_id);
+
+ notif_send_it(prv->notif_id);
+ }
}
}
@@ -587,57 +605,104 @@ static void initialize_pmic(const void *fdt, int pmic_node)
stm32mp_put_pmic();
}
-static TEE_Result stm32_pmic_probe(const void *fdt, int node,
- const void *compat_data __unused)
+static TEE_Result stm32_pmic_init_it(const void *fdt, int node)
{
- TEE_Result res = TEE_SUCCESS;
- const fdt32_t *cuint = NULL;
+ TEE_Result res = TEE_ERROR_GENERIC;
+ const uint32_t *notif_ids = NULL;
+ int nb_notif = 0;
+ size_t pwr_it = 0;
struct itr_handler *hdl = NULL;
- size_t it = 0;
- uint32_t *it_id = NULL;
+ const fdt32_t *cuint = NULL;
- res = i2c_dt_get_by_subnode(fdt, node, &i2c_pmic_handle);
- if (res)
- return res;
+ cuint = fdt_getprop(fdt, node, "st,wakeup-pin-number", NULL);
+ if (!cuint) {
+ IMSG("Missing wake-up pin description");
+ return TEE_SUCCESS;
+ }
- initialize_pmic(fdt, node);
+ pwr_it = fdt32_to_cpu(*cuint) - 1U;
- if (IS_ENABLED(CFG_STM32MP13)) {
- cuint = fdt_getprop(fdt, node, "st,wakeup-pin-number", NULL);
- if (!cuint) {
- IMSG("Missing wake-up pin description");
- return TEE_SUCCESS;
- }
+ notif_ids = fdt_getprop(fdt, node, "st,notif-it-id", &nb_notif);
+ if (!notif_ids)
+ return TEE_ERROR_ITEM_NOT_FOUND;
- it = fdt32_to_cpu(*cuint) - 1U;
+ if (nb_notif > 0) {
+ struct pmic_it_handle_s *prv = NULL;
+ unsigned int i = 0;
+ const uint32_t *pmic_its = NULL;
+ int nb_it = 0;
- cuint = fdt_getprop(fdt, node, "st,notif-it-id", NULL);
- if (cuint) {
- it_id = calloc(1, sizeof(it_id));
- if (!it_id)
- return TEE_ERROR_OUT_OF_MEMORY;
+ pmic_its = fdt_getprop(fdt, node, "st,pmic-it-id", &nb_it);
+ if (!pmic_its)
+ return TEE_ERROR_ITEM_NOT_FOUND;
- *it_id = fdt32_to_cpu(*cuint);
- }
+ if (nb_it != nb_notif)
+ panic("st,notif-it-id incorrect description");
- res = stm32mp1_pwr_itr_alloc_add(it, stpmic1_irq_handler,
- PWR_WKUP_FLAG_FALLING |
- PWR_WKUP_FLAG_THREADED,
- it_id, &hdl);
- if (res)
- panic("pmic: Couldn't allocate itr");
+ for (i = 0; i < (nb_notif / sizeof(uint32_t)); i++) {
+ uint8_t val = 0;
+ uint8_t pmic_it = 0;
- stm32mp1_pwr_itr_enable(hdl->it);
+ prv = calloc(1, sizeof(*prv));
+ if (!prv)
+ panic("pmic: Couldn't allocate pmic it");
- /* Enable ponkey irq */
- stm32mp_get_pmic();
- if (stpmic1_register_write(ITCLEARMASK1_REG,
- BIT(IT_PONKEY_F) | BIT(IT_PONKEY_R)))
- panic();
+ pmic_it = fdt32_to_cpu(pmic_its[i]);
+
+ assert(pmic_it <= IT_SWIN_R);
+
+ prv->pmic_reg = ITCLEARMASK1_REG + pmic_it / U(8);
+ prv->pmic_bit = pmic_it % U(8);
+ prv->notif_id = fdt32_to_cpu(notif_ids[i]);
+
+ SLIST_INSERT_HEAD(&pmic_it_handle_list, prv, link);
+
+ stm32mp_get_pmic();
- stm32mp_put_pmic();
+ /* Enable requested interrupt */
+ if (stpmic1_register_read(prv->pmic_reg, &val))
+ panic();
+
+ val |= BIT(prv->pmic_bit);
+
+ if (stpmic1_register_write(prv->pmic_reg, val))
+ panic();
+
+ stm32mp_put_pmic();
+ }
+
+ SLIST_FOREACH(prv, &pmic_it_handle_list, link) {
+ FMSG("STPMIC1 forwards irq reg:%u bit:%u as notif:%u",
+ prv->pmic_reg, prv->pmic_bit, prv->notif_id);
+ }
}
+ res = stm32mp1_pwr_itr_alloc_add(pwr_it, stpmic1_irq_handler,
+ PWR_WKUP_FLAG_FALLING |
+ PWR_WKUP_FLAG_THREADED,
+ NULL, &hdl);
+ if (res)
+ panic("pmic: Couldn't allocate itr");
+
+ stm32mp1_pwr_itr_enable(hdl->it);
+
+ return res;
+}
+
+static TEE_Result stm32_pmic_probe(const void *fdt, int node,
+ const void *compat_data __unused)
+{
+ TEE_Result res = TEE_SUCCESS;
+
+ res = i2c_dt_get_by_subnode(fdt, node, &i2c_pmic_handle);
+ if (res)
+ return res;
+
+ initialize_pmic(fdt, node);
+
+ if (IS_ENABLED(CFG_STM32MP13))
+ res = stm32_pmic_init_it(fdt, node);
+
return res;
}
diff --git a/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pwr_irq.c b/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pwr_irq.c
index 0913e9151..ca2761a81 100644
--- a/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pwr_irq.c
+++ b/core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pwr_irq.c
@@ -13,6 +13,7 @@
#include <kernel/dt.h>
#include <kernel/notif.h>
#include <kernel/panic.h>
+#include <kernel/spinlock.h>
#include <libfdt.h>
#include <platform_config.h>
#include <stm32_util.h>
@@ -47,6 +48,7 @@ struct stm32_pwr_data {
struct itr_handler *gic_hdl;
bool threaded[PWR_NB_WAKEUPPINS];
bool pending[PWR_NB_WAKEUPPINS];
+ unsigned int spinlock;
};
static struct stm32_pwr_data *pwr_data;
@@ -148,6 +150,7 @@ static TEE_Result
stm32_pwr_irq_set_pull_config(size_t it, enum wkup_pull_setting config)
{
struct stm32_pwr_data *priv = pwr_data;
+ uint32_t exceptions = 0;
VERBOSE_PWR("irq:%zu pull config:0%#"PRIx32, it, config);
@@ -156,29 +159,59 @@ stm32_pwr_irq_set_pull_config(size_t it, enum wkup_pull_setting config)
return TEE_ERROR_GENERIC;
}
+ exceptions = cpu_spin_lock_xsave(&priv->spinlock);
+
io_mask32(priv->base + WKUPCR,
(config & WKUP_PULL_MASK) << (WKUP_PULL_SHIFT + it * 2),
(WKUP_PULL_MASK) << (WKUP_PULL_SHIFT + it * 2));
+ cpu_spin_unlock_xrestore(&priv->spinlock, exceptions);
+
return TEE_SUCCESS;
}
-static TEE_Result
-stm32_pwr_irq_set_trig(size_t it, enum pwr_wkup_flags trig)
+static void stm32mp1_pwr_itr_enable_nolock(size_t it)
+{
+ struct stm32_pwr_data *priv = pwr_data;
+
+ VERBOSE_PWR("Pwr irq enable");
+
+ if (IS_ENABLED(CFG_STM32_EXTI))
+ stm32_exti_enable_wake(PWR_EXTI_WKUP1 + it);
+
+ io_setbits32(priv->base + MPUWKUPENR, BIT(it));
+}
+
+static void stm32mp1_pwr_itr_disable_nolock(size_t it)
+{
+ struct stm32_pwr_data *priv = pwr_data;
+
+ VERBOSE_PWR("Pwr irq disable");
+
+ io_clrbits32(priv->base + MPUWKUPENR, BIT(it));
+
+ if (IS_ENABLED(CFG_STM32_EXTI))
+ stm32_exti_disable_wake(PWR_EXTI_WKUP1 + it);
+}
+
+static TEE_Result stm32_pwr_irq_set_trig(size_t it, enum pwr_wkup_flags trig)
{
struct stm32_pwr_data *priv = pwr_data;
+ uint32_t exceptions = 0;
uint32_t wkupcr = 0;
int en = 0;
VERBOSE_PWR("irq:%zu trig:%#"PRIx32, it, trig);
+ exceptions = cpu_spin_lock_xsave(&priv->spinlock);
+
en = io_read32(priv->base + MPUWKUPENR) & BIT(it);
/*
* Reference manual request to disable the wakeup pin while
- * changing the edge detection setting
+ * changing the edge detection setting.
*/
if (en)
- stm32mp1_pwr_itr_disable(it);
+ stm32mp1_pwr_itr_disable_nolock(it);
wkupcr = io_read32(priv->base + WKUPCR);
switch (trig) {
@@ -195,7 +228,9 @@ stm32_pwr_irq_set_trig(size_t it, enum pwr_wkup_flags trig)
io_write32(priv->base + WKUPCR, wkupcr);
if (en)
- stm32mp1_pwr_itr_enable(it);
+ stm32mp1_pwr_itr_enable_nolock(it);
+
+ cpu_spin_unlock_xrestore(&priv->spinlock, exceptions);
return TEE_SUCCESS;
}
@@ -203,25 +238,21 @@ stm32_pwr_irq_set_trig(size_t it, enum pwr_wkup_flags trig)
void stm32mp1_pwr_itr_enable(size_t it)
{
struct stm32_pwr_data *priv = pwr_data;
+ uint32_t exceptions = 0;
- VERBOSE_PWR("Pwr irq enable");
-
- if (IS_ENABLED(CFG_STM32_EXTI))
- stm32_exti_enable_wake(PWR_EXTI_WKUP1 + it);
-
- io_setbits32(priv->base + MPUWKUPENR, BIT(it));
+ exceptions = cpu_spin_lock_xsave(&priv->spinlock);
+ stm32mp1_pwr_itr_enable_nolock(it);
+ cpu_spin_unlock_xrestore(&priv->spinlock, exceptions);
}
void stm32mp1_pwr_itr_disable(size_t it)
{
struct stm32_pwr_data *priv = pwr_data;
+ uint32_t exceptions = 0;
- VERBOSE_PWR("Pwr irq disable");
-
- io_clrbits32(priv->base + MPUWKUPENR, BIT(it));
-
- if (IS_ENABLED(CFG_STM32_EXTI))
- stm32_exti_disable_wake(PWR_EXTI_WKUP1 + it);
+ exceptions = cpu_spin_lock_xsave(&priv->spinlock);
+ stm32mp1_pwr_itr_disable_nolock(it);
+ cpu_spin_unlock_xrestore(&priv->spinlock, exceptions);
}
static TEE_Result stm32mp1_pwr_irt_add(struct itr_handler *hdl)
@@ -231,7 +262,9 @@ static TEE_Result stm32mp1_pwr_irt_add(struct itr_handler *hdl)
struct stm32_pinctrl_list pinctrl_list = { };
struct stm32_pinctrl pin = { };
struct stm32_pinctrl *pinctrl = NULL;
+ uint32_t exceptions = 0;
unsigned int i = 0;
+ bool itr_free = false;
VERBOSE_PWR("Pwr IRQ add");
@@ -241,10 +274,15 @@ static TEE_Result stm32mp1_pwr_irt_add(struct itr_handler *hdl)
}
assert(it >= PWR_WKUP_PIN1 && it < PWR_NB_WAKEUPPINS);
- /* check IRQ not already in use */
- assert(!priv->hdl[it]);
- priv->hdl[it] = hdl;
+ /* Use PWR lock to ensure consistent interrupt registering */
+ exceptions = cpu_spin_lock_xsave(&priv->spinlock);
+ itr_free = !priv->hdl[it];
+ if (itr_free)
+ priv->hdl[it] = hdl;
+ cpu_spin_unlock_xrestore(&priv->spinlock, exceptions);
+ if (!itr_free)
+ return TEE_ERROR_GENERIC;
if (hdl->flags & PWR_WKUP_FLAG_THREADED)
priv->threaded[it] = true;
diff --git a/core/arch/arm/plat-stm32mp1/main.c b/core/arch/arm/plat-stm32mp1/main.c
index 2e9f7a699..3ae327ee5 100644
--- a/core/arch/arm/plat-stm32mp1/main.c
+++ b/core/arch/arm/plat-stm32mp1/main.c
@@ -165,9 +165,9 @@ static TEE_Result init_console_from_dt(void)
/* Replace early console with the new one */
console_flush();
console_data = *pd;
- free(pd);
register_serial_console(&console_data.chip);
IMSG("DTB enables console (%ssecure)", pd->secure ? "" : "non-");
+ free(pd);
return TEE_SUCCESS;
}
@@ -727,7 +727,7 @@ static TEE_Result stm32_configure_tamp(void)
return TEE_SUCCESS;
}
-driver_init_late(stm32_configure_tamp);
+service_init(stm32_configure_tamp);
#endif
#ifdef CFG_STM32_HSE_MONITORING
diff --git a/core/arch/arm/plat-stm32mp1/pm/context.c b/core/arch/arm/plat-stm32mp1/pm/context.c
index c9d26ee37..7e08bc0a2 100644
--- a/core/arch/arm/plat-stm32mp1/pm/context.c
+++ b/core/arch/arm/plat-stm32mp1/pm/context.c
@@ -213,7 +213,7 @@ static void __maybe_unused print_ccm_decryption_duration(void)
((unsigned long long)ctx->stgen_cnt * 1000) /
io_read32(stgen + CNTFID_OFFSET));
- clk_enable(pm_clocks.bkpsram);
+ clk_disable(pm_clocks.bkpsram);
}
#else
static void __maybe_unused print_ccm_decryption_duration(void)
@@ -582,15 +582,17 @@ TEE_Result stm32mp_pm_call_bl2_lp_entry(unsigned int soc_mode)
dcache_op_all(DCACHE_OP_CLEAN_INV);
+ /* Disable Cache & MMU before calling low_power section */
+ write_sctlr(read_sctlr() & ~(SCTLR_C | SCTLR_M));
+
dsb();
+ isb();
- /* Disable MMU before calling low_power section */
- write_sctlr(read_sctlr() & ~SCTLR_M);
(*stm32_pwr_down_wfi)(true, soc_mode);
- /* Enable MMU */
- write_sctlr(read_sctlr() | SCTLR_M);
+ /* Enable Cache & MMU */
+ write_sctlr(read_sctlr() | SCTLR_C | SCTLR_M);
clk_disable(pm_clocks.bkpsram);
diff --git a/core/arch/arm/plat-stm32mp1/pm/low_power.c b/core/arch/arm/plat-stm32mp1/pm/low_power.c
index cbc5fa151..653c3dfb7 100644
--- a/core/arch/arm/plat-stm32mp1/pm/low_power.c
+++ b/core/arch/arm/plat-stm32mp1/pm/low_power.c
@@ -292,13 +292,6 @@ void stm32_enter_cstop(uint32_t mode)
io_clrsetbits32(pwr_base + PWR_CR3_OFF, PWR_CR3_POPL_MASK,
20U << PWR_CR3_POPL_SHIFT);
- /* Keep backup RAM content in standby */
- io_setbits32(pwr_base + PWR_CR2_OFF, PWR_CR2_BREN);
-
- // TODO add a timeout?
- while (!(io_read32(pwr_base + PWR_CR2_OFF) & PWR_CR2_BRRDY))
- ;
-
#ifndef CFG_STM32MP13
if (stm32mp1_is_retram_during_standby()) {
/* Keep retention in standby */
@@ -344,9 +337,6 @@ void stm32_exit_cstop(void)
dsb();
isb();
- /* Disable retention and backup RAM content after stop */
- io_clrbits32(stm32_pwr_base() + PWR_CR2_OFF, PWR_CR2_BREN);
-
#ifndef CFG_STM32MP13
/* Disable retention and backup RAM content after stop */
io_clrbits32(stm32_pwr_base() + PWR_CR2_OFF, PWR_CR2_RREN);
@@ -525,6 +515,11 @@ static TEE_Result init_low_power(void)
RCC_MP_SREQSETR_STPREQ_P0 | RCC_MP_SREQSETR_STPREQ_P1);
#endif
+ /* Keep backup RAM content in standby */
+ io_setbits32(pwr_base + PWR_CR2_OFF, PWR_CR2_BREN);
+ while (!(io_read32(pwr_base + PWR_CR2_OFF) & PWR_CR2_BRRDY))
+ ;
+
return TEE_SUCCESS;
}
driver_init_late(init_low_power);
diff --git a/core/drivers/crypto/stm32/stm32_saes.c b/core/drivers/crypto/stm32/stm32_saes.c
index 9453d0d52..d8495a16e 100644
--- a/core/drivers/crypto/stm32/stm32_saes.c
+++ b/core/drivers/crypto/stm32/stm32_saes.c
@@ -1337,6 +1337,13 @@ TEE_Result huk_subkey_derive(enum huk_subkey_usage usage,
struct stm32_saes_context ctx = { };
uint8_t separator = 0;
+ // Check if driver is probed
+ if (saes_pdata.base.pa == 0) {
+ DMSG("Use __huk_subkey_derive instead of SAES IP features");
+ return __huk_subkey_derive(usage, const_data, const_data_len,
+ subkey, subkey_len);
+ }
+
input = malloc(const_data_len + sizeof(separator) + sizeof(usage) +
sizeof(subkey_bitlen) + AES_BLOCK_SIZE);
if (!input)
diff --git a/core/drivers/regulator/core.c b/core/drivers/regulator/core.c
index d4dc3751d..7ef58b268 100644
--- a/core/drivers/regulator/core.c
+++ b/core/drivers/regulator/core.c
@@ -575,6 +575,11 @@ static TEE_Result parse_properties(const void *fdt, struct rdev *rdev, int node)
}
rdev->reg_name = fdt_getprop(fdt, node, "regulator-name", NULL);
+ if (rdev->reg_name) {
+ rdev->reg_name = strdup(rdev->reg_name);
+ if (!rdev->reg_name)
+ panic();
+ }
return TEE_SUCCESS;
}
diff --git a/core/drivers/stm32_iwdg.c b/core/drivers/stm32_iwdg.c
index 49e4fad50..fba4abe7e 100644
--- a/core/drivers/stm32_iwdg.c
+++ b/core/drivers/stm32_iwdg.c
@@ -35,6 +35,7 @@
#define IWDG_EWCR_OFFSET U(0x14)
/* Registers values */
+#define IWDG_KR_WPROT_KEY U(0x0000)
#define IWDG_KR_ACCESS_KEY U(0x5555)
#define IWDG_KR_RELOAD_KEY U(0xAAAA)
#define IWDG_KR_START_KEY U(0xCCCC)
@@ -45,6 +46,7 @@
#define IWDG_RLR_RL_MASK GENMASK_32(11, 0)
#define IWDG_SR_EWU BIT(3)
+#define IWDG_SR_EWIF BIT(14)
#define IWDG_EWCR_EWIE BIT(15)
#define IWDG_EWCR_EWIC BIT(14)
@@ -88,10 +90,22 @@ static enum itr_return stm32_iwdg_it_handler(struct itr_handler *handler)
stm32mp_dump_core_registers(true);
- iwdg_refresh(iwdg);
-
clk_enable(iwdg->pdata.clock);
+ /* Check for spurious interrupt */
+ if (!(io_read32(iwdg_base + IWDG_SR_OFFSET) & IWDG_SR_EWIF)) {
+ clk_disable(iwdg->pdata.clock);
+ return ITRR_NONE;
+ }
+
+ /*
+ * Writing IWDG_EWCR_EWIT triggers a watchdog refresh.
+ * To prevent the watchdog refresh, write-protect all the registers;
+ * this makes read-only all IWDG_EWCR fields except IWDG_EWCR_EWIC.
+ */
+ io_write32(iwdg_base + IWDG_KR_OFFSET, IWDG_KR_WPROT_KEY);
+
+ /* Disable early interrupt */
io_setbits32(iwdg_base + IWDG_EWCR_OFFSET, IWDG_EWCR_EWIC);
clk_disable(iwdg->pdata.clock);
diff --git a/core/drivers/stm32_rng.c b/core/drivers/stm32_rng.c
index ef5862308..363aeee00 100644
--- a/core/drivers/stm32_rng.c
+++ b/core/drivers/stm32_rng.c
@@ -140,9 +140,19 @@ static TEE_Result stm32_rng_read_available(struct stm32_rng_device *dev,
/* RNG is ready: read up to 4 32bit words */
while (size) {
- uint32_t data32 = io_read32(base + RNG_DR);
+ uint32_t data32 = 0;
size_t sz = MIN(size, sizeof(uint32_t));
+ if (!(io_read32(base + RNG_SR) & RNG_SR_DRDY))
+ return TEE_ERROR_NO_DATA;
+
+ data32 = io_read32(base + RNG_DR);
+ /* Late seed error case: DR being 0 is an error status */
+ if (!data32) {
+ conceal_seed_error(dev);
+ return TEE_ERROR_NO_DATA;
+ }
+
memcpy(buf, &data32, sz);
buf += sz;
size -= sz;
diff --git a/core/drivers/stm32_uart.c b/core/drivers/stm32_uart.c
index 5105b14bc..1ffc99117 100644
--- a/core/drivers/stm32_uart.c
+++ b/core/drivers/stm32_uart.c
@@ -38,12 +38,12 @@
* Bit 5 RXNE: Read data register not empty/RXFIFO not empty
* Bit 6 TC: Transmission complete
* Bit 7 TXE/TXFNF: Transmit data register empty/TXFIFO not full
- * Bit 27 TXFE: TXFIFO threshold reached
+ * Bit 23 TXFE: TXFIFO empty
*/
#define USART_ISR_RXNE_RXFNE BIT(5)
#define USART_ISR_TC BIT(6)
#define USART_ISR_TXE_TXFNF BIT(7)
-#define USART_ISR_TXFE BIT(27)
+#define USART_ISR_TXFE BIT(23)
static vaddr_t loc_chip_to_base(struct serial_chip *chip)
{
diff --git a/core/include/drivers/stpmic1.h b/core/include/drivers/stpmic1.h
index 5fe48232f..b293c846f 100644
--- a/core/include/drivers/stpmic1.h
+++ b/core/include/drivers/stpmic1.h
@@ -171,41 +171,6 @@
#define USBSW_OTG_SWITCH_ENABLED_POS 1
#define BOOST_ENABLED_POS 0
-/* IRQ definitions */
-#define IT_PONKEY_F 0
-#define IT_PONKEY_R 1
-#define IT_WAKEUP_F 2
-#define IT_WAKEUP_R 3
-#define IT_VBUS_OTG_F 4
-#define IT_VBUS_OTG_R 5
-#define IT_SWOUT_F 6
-#define IT_SWOUT_R 7
-
-#define IT_CURLIM_BUCK1 0
-#define IT_CURLIM_BUCK2 1
-#define IT_CURLIM_BUCK3 2
-#define IT_CURLIM_BUCK4 3
-#define IT_OCP_OTG 4
-#define IT_OCP_SWOUT 5
-#define IT_OCP_BOOST 6
-#define IT_OVP_BOOST 7
-
-#define IT_CURLIM_LDO1 0
-#define IT_CURLIM_LDO2 1
-#define IT_CURLIM_LDO3 2
-#define IT_CURLIM_LDO4 3
-#define IT_CURLIM_LDO5 4
-#define IT_CURLIM_LDO6 5
-#define IT_SHORT_SWOTG 6
-#define IT_SHORT_SWOUT 7
-
-#define IT_TWARN_F 0
-#define IT_TWARN_R 1
-#define IT_VINLOW_F 2
-#define IT_VINLOW_R 3
-#define IT_SWIN_F 4
-#define IT_SWIN_R 5
-
/*
* Bind SPMIC1 device driver with a specific I2C bus instance
* @i2c_handle: target I2C instance to use
diff --git a/core/include/kernel/huk_subkey.h b/core/include/kernel/huk_subkey.h
index 59bcf2773..a6a18e953 100644
--- a/core/include/kernel/huk_subkey.h
+++ b/core/include/kernel/huk_subkey.h
@@ -49,12 +49,17 @@ enum huk_subkey_usage {
*
* Returns a subkey derived from the hardware unique key. Given the same
* input the same subkey is returned each time.
+ * Function huk_subkey_derive is __weak to allow platform custom implementation.
+ * __huk_subkey_derive implements the default behavior of huk_subkey_derive.
*
* Return TEE_SUCCES on success or an error code on failure.
*/
TEE_Result huk_subkey_derive(enum huk_subkey_usage usage,
const void *const_data, size_t const_data_len,
uint8_t *subkey, size_t subkey_len);
+TEE_Result __huk_subkey_derive(enum huk_subkey_usage usage,
+ const void *const_data, size_t const_data_len,
+ uint8_t *subkey, size_t subkey_len);
#endif /*__KERNEL_HUK_SUBKEY_H*/
diff --git a/core/kernel/huk_subkey.c b/core/kernel/huk_subkey.c
index 5481120b6..3db2cfe5f 100644
--- a/core/kernel/huk_subkey.c
+++ b/core/kernel/huk_subkey.c
@@ -58,10 +58,9 @@ static TEE_Result huk_compat(void *ctx, enum huk_subkey_usage usage)
}
#endif /*CFG_CORE_HUK_SUBKEY_COMPAT*/
-__weak
-TEE_Result huk_subkey_derive(enum huk_subkey_usage usage,
- const void *const_data, size_t const_data_len,
- uint8_t *subkey, size_t subkey_len)
+TEE_Result __huk_subkey_derive(enum huk_subkey_usage usage,
+ const void *const_data, size_t const_data_len,
+ uint8_t *subkey, size_t subkey_len)
{
void *ctx = NULL;
struct tee_hw_unique_key huk = { };
@@ -106,3 +105,12 @@ out:
crypto_mac_free_ctx(ctx);
return res;
}
+
+__weak
+TEE_Result huk_subkey_derive(enum huk_subkey_usage usage,
+ const void *const_data, size_t const_data_len,
+ uint8_t *subkey, size_t subkey_len)
+{
+ return __huk_subkey_derive(usage, const_data, const_data_len, subkey,
+ subkey_len);
+}
diff --git a/documentation/devicetree/bindings/mfd/st,stpmic1.yaml b/documentation/devicetree/bindings/mfd/st,stpmic1.yaml
index 344623f1f..7d97a7082 100644
--- a/documentation/devicetree/bindings/mfd/st,stpmic1.yaml
+++ b/documentation/devicetree/bindings/mfd/st,stpmic1.yaml
@@ -262,6 +262,51 @@ properties:
minItems: 1
maxItems: 1
+ st,pmic-it-id:
+ description: PMIC interruptions id to forward to the non-secure world
+ in the form of OPTEE notifications described by st,notif-it-id.
+ IT_PONKEY_F = 0
+ IT_PONKEY_R = 1
+ IT_WAKEUP_F = 2
+ IT_WAKEUP_R = 3
+ IT_VBUS_OTG_F = 4
+ IT_VBUS_OTG_R = 5
+ IT_SWOUT_F = 6
+ IT_SWOUT_R = 7
+ IT_CURLIM_BUCK1 = 8
+ IT_CURLIM_BUCK2 = 9
+ IT_CURLIM_BUCK3 = 10
+ IT_CURLIM_BUCK4 = 11
+ IT_OCP_OTG = 12
+ IT_OCP_SWOUT = 13
+ IT_OCP_BOOST = 14
+ IT_OVP_BOOST = 15
+ IT_CURLIM_LDO1 = 16
+ IT_CURLIM_LDO2 = 17
+ IT_CURLIM_LDO3 = 18
+ IT_CURLIM_LDO4 = 19
+ IT_CURLIM_LDO5 = 20
+ IT_CURLIM_LDO6 = 21
+ IT_SHORT_SWOTG = 22
+ IT_SHORT_SWOUT = 23
+ IT_TWARN_F = 24
+ IT_TWARN_R = 25
+ IT_VINLOW_F = 26
+ IT_VINLOW_R = 27
+ IT_SWIN_F = 30
+ IT_SWIN_R = 31
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minItems: 1
+ maxItems: 32
+
+ st,notif-it-id:
+ description: OPTEE notification numbers to send to the non-secure world.
+ One notification is needed for each interruption listed by st,pmic-it-id,
+ so the number of notifications must be eaqual to the number of interrupts.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minItems: 1
+ maxItems: 32
+
additionalProperties: false
required:
@@ -271,6 +316,10 @@ required:
- "#interrupt-cells"
- interrupt-controller
+dependencies:
+ st,notif-it-id: [ 'st,pmic-it-id' ]
+ st,pmic-it-id: [ 'st,notif-it-id' ]
+
examples:
- |
#include <dt-bindings/mfd/st,stpmic1.h>
@@ -289,6 +338,8 @@ examples:
#interrupt-cells = <2>;
st,wakeup-pin-number = <1>;
+ st,pmic-it-id = <IT_PONKEY_F IT_PONKEY_R>;
+ st,notif-it-id = <0 2>;
onkey {
compatible = "st,stpmic1-onkey";
--
2.25.1