From 4ec67271ab55327855cfc8d1d97d8a225b0301ac Mon Sep 17 00:00:00 2001 From: Georgij Cernysiov Date: Thu, 6 Jun 2024 11:13:24 +0200 Subject: [PATCH] drivers: flash: stm32 ospi correct lines on writes Correct used lines based on write opcode regardless of the data mode. The write opcode is set during init for all modes and can be overwritten in DT. Add lines correction for PP_1_1_2. Signed-off-by: Georgij Cernysiov --- drivers/flash/flash_stm32_ospi.c | 61 ++++++++++++++++---------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/drivers/flash/flash_stm32_ospi.c b/drivers/flash/flash_stm32_ospi.c index e852f743fdb586..93c31c84d2ee65 100644 --- a/drivers/flash/flash_stm32_ospi.c +++ b/drivers/flash/flash_stm32_ospi.c @@ -1463,36 +1463,37 @@ static int flash_stm32_ospi_write(const struct device *dev, off_t addr, /* using 32bits address also in SPI/STR mode */ cmd_pp.Instruction = dev_data->write_opcode; - if (dev_cfg->data_mode != OSPI_OPI_MODE) { - switch (cmd_pp.Instruction) { - case SPI_NOR_CMD_PP_4B: - __fallthrough; - case SPI_NOR_CMD_PP: { - cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; - cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE; - cmd_pp.DataMode = HAL_OSPI_DATA_1_LINE; - break; - } - case SPI_NOR_CMD_PP_1_1_4_4B: - __fallthrough; - case SPI_NOR_CMD_PP_1_1_4: { - cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; - cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE; - cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES; - break; - } - case SPI_NOR_CMD_PP_1_4_4_4B: - __fallthrough; - case SPI_NOR_CMD_PP_1_4_4: { - cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; - cmd_pp.AddressMode = HAL_OSPI_ADDRESS_4_LINES; - cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES; - break; - } - default: - /* use the mode from ospi_prepare_cmd */ - break; - } + /* Adapt lines based on write_opcode */ + switch (cmd_pp.Instruction) { + case SPI_NOR_CMD_PP_4B: + __fallthrough; + case SPI_NOR_CMD_PP: + cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; + cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE; + cmd_pp.DataMode = HAL_OSPI_DATA_1_LINE; + break; + case SPI_NOR_CMD_PP_1_1_2: + cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; + cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE; + cmd_pp.DataMode = HAL_OSPI_DATA_2_LINES; + break; + case SPI_NOR_CMD_PP_1_1_4_4B: + __fallthrough; + case SPI_NOR_CMD_PP_1_1_4: + cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; + cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE; + cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES; + break; + case SPI_NOR_CMD_PP_1_4_4_4B: + __fallthrough; + case SPI_NOR_CMD_PP_1_4_4: + cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; + cmd_pp.AddressMode = HAL_OSPI_ADDRESS_4_LINES; + cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES; + break; + default: + /* Use lines based on data mode set in ospi_prepare_cmd */ + break; } cmd_pp.Address = addr;