Skip to content

Commit 7a65dc2

Browse files
committed
drivers: flash: stm32: qspi: support DTS writeoc
Adds support for DTS writeoc. Uses 1-4-4 mode by default (as the original driver). Signed-off-by: Georgij Cernysiov <[email protected]>
1 parent d3238d1 commit 7a65dc2

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

drivers/flash/flash_stm32_qspi.c

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Copyright (c) 2020 Piotr Mienkowski
33
* Copyright (c) 2020 Linaro Limited
4+
* Copyright (c) 2022 Georgij Cernysiov
45
*
56
* SPDX-License-Identifier: Apache-2.0
67
*/
@@ -91,6 +92,7 @@ struct flash_stm32_qspi_data {
9192
uint16_t page_size;
9293
int cmd_status;
9394
struct stream dma;
95+
uint8_t qspi_write_cmd;
9496
uint8_t qspi_read_cmd;
9597
uint8_t qspi_read_cmd_latency;
9698
/*
@@ -144,25 +146,30 @@ static inline void qspi_prepare_quad_read(const struct device *dev,
144146
}
145147
}
146148

147-
static inline void qspi_prepare_quad_program(const struct device *dev,
149+
static inline int qspi_prepare_quad_program(const struct device *dev,
148150
QSPI_CommandTypeDef *cmd)
149151
{
150152
struct flash_stm32_qspi_data *dev_data = dev->data;
151-
/*
152-
* There is no info about PP/4PP command in the SFDP tables,
153-
* hence it has been assumed that NOR flash memory supporting
154-
* 1-4-4 mode also would support fast page programming.
155-
*/
153+
156154
if (IS_ENABLED(STM32_QSPI_USE_QUAD_IO) && dev_data->flag_quad_io_en) {
157-
cmd->Instruction = SPI_NOR_CMD_4PP;
158-
cmd->AddressMode = QSPI_ADDRESS_4_LINES;
155+
cmd->Instruction = dev_data->qspi_write_cmd;
156+
157+
switch (cmd->Instruction) {
158+
case SPI_NOR_CMD_PP_1_1_4:
159+
cmd->AddressMode = QSPI_ADDRESS_1_LINE;
160+
break;
161+
case SPI_NOR_CMD_PP_1_4_4:
162+
cmd->AddressMode = QSPI_ADDRESS_4_LINES;
163+
break;
164+
default:
165+
return -ENOTSUP;
166+
}
167+
159168
cmd->DataMode = QSPI_DATA_4_LINES;
160-
/*
161-
* Dummy cycles are not required for 4PP command -
162-
* data to be programmed are sent just after address.
163-
*/
164169
cmd->DummyCycles = 0;
165170
}
171+
172+
return 0;
166173
}
167174

168175
/*
@@ -379,7 +386,10 @@ static int flash_stm32_qspi_write(const struct device *dev, off_t addr,
379386
};
380387

381388
qspi_set_address_size(dev, &cmd_pp);
382-
qspi_prepare_quad_program(dev, &cmd_pp);
389+
ret = qspi_prepare_quad_program(dev, &cmd_pp);
390+
if (ret < 0) {
391+
return ret;
392+
}
383393
qspi_lock_thread(dev);
384394

385395
while (size > 0) {
@@ -1141,6 +1151,11 @@ static int flash_stm32_qspi_init(const struct device *dev)
11411151

11421152
static void flash_stm32_qspi_irq_config_func(const struct device *dev);
11431153

1154+
#define DT_WRITEOC_PROP_OR(inst, default_value) \
1155+
COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, writeoc), \
1156+
(_CONCAT(SPI_NOR_CMD_, DT_STRING_TOKEN(DT_DRV_INST(inst), writeoc))), \
1157+
((default_value)))
1158+
11441159
#define STM32_QSPI_NODE DT_INST_PARENT(0)
11451160

11461161
PINCTRL_DT_DEFINE(STM32_QSPI_NODE);
@@ -1170,6 +1185,7 @@ static struct flash_stm32_qspi_data flash_stm32_qspi_dev_data = {
11701185
.ClockMode = QSPI_CLOCK_MODE_0,
11711186
},
11721187
},
1188+
.qspi_write_cmd = DT_WRITEOC_PROP_OR(0, SPI_NOR_CMD_PP_1_4_4),
11731189
QSPI_DMA_CHANNEL(STM32_QSPI_NODE, tx_rx)
11741190
};
11751191

0 commit comments

Comments
 (0)