1212#include <zephyr/pm/device_runtime.h>
1313
1414#include "flash_mspi_nor.h"
15+ #include "flash_mspi_nor_sfdp.h"
1516#include "flash_mspi_nor_quirks.h"
1617
1718LOG_MODULE_REGISTER (flash_mspi_nor , CONFIG_FLASH_LOG_LEVEL );
@@ -110,7 +111,9 @@ static inline uint32_t dev_flash_size(const struct device *dev)
110111
111112static inline uint16_t dev_page_size (const struct device * dev )
112113{
113- return SPI_NOR_PAGE_SIZE ;
114+ const struct flash_mspi_nor_config * dev_config = dev -> config ;
115+
116+ return dev_config -> page_size ;
114117}
115118
116119static int api_read (const struct device * dev , off_t addr , void * dest ,
@@ -528,7 +531,7 @@ static int quad_enable_set(const struct device *dev, bool enable)
528531 return rc ;
529532 }
530533
531- if (dev_config -> dw15_qer == JESD216_DW15_QER_VAL_S1B6 ) {
534+ if (dev_data -> switch_info . quad_enable_req == JESD216_DW15_QER_VAL_S1B6 ) {
532535 const struct flash_mspi_nor_cmd cmd_status = {
533536 .dir = MSPI_TX ,
534537 .cmd = SPI_NOR_CMD_WRSR ,
@@ -564,10 +567,11 @@ static int quad_enable_set(const struct device *dev, bool enable)
564567static int default_io_mode (const struct device * dev )
565568{
566569 const struct flash_mspi_nor_config * dev_config = dev -> config ;
570+ struct flash_mspi_nor_data * dev_data = dev -> data ;
567571 enum mspi_io_mode io_mode = dev_config -> mspi_nor_cfg .io_mode ;
568572 int rc = 0 ;
569573
570- if (dev_config -> dw15_qer != JESD216_DW15_QER_VAL_NONE ) {
574+ if (dev_data -> switch_info . quad_enable_req != JESD216_DW15_QER_VAL_NONE ) {
571575 /* For Quad 1-1-4 and 1-4-4, entering or leaving mode is defined
572576 * in JEDEC216 BFP DW15 QER
573577 */
@@ -651,7 +655,7 @@ static int flash_chip_init(const struct device *dev)
651655 /* Some chips reuse RESET pin for data in Quad modes:
652656 * force single line mode before resetting.
653657 */
654- if (dev_config -> dw15_qer != JESD216_DW15_QER_VAL_NONE &&
658+ if (dev_data -> switch_info . quad_enable_req != JESD216_DW15_QER_VAL_NONE &&
655659 (io_mode == MSPI_IO_MODE_SINGLE ||
656660 io_mode == MSPI_IO_MODE_QUAD_1_1_4 ||
657661 io_mode == MSPI_IO_MODE_QUAD_1_4_4 )) {
@@ -743,6 +747,11 @@ static int drv_init(const struct device *dev)
743747 return - ENODEV ;
744748 }
745749
750+ memcpy (dev_data -> erase_types , dev_config -> default_erase_types ,
751+ sizeof (dev_data -> erase_types ));
752+ dev_data -> cmd_info = dev_config -> default_cmd_info ;
753+ dev_data -> switch_info = dev_config -> default_switch_info ;
754+
746755 rc = pm_device_runtime_get (dev_config -> bus );
747756 if (rc < 0 ) {
748757 LOG_ERR ("pm_device_runtime_get() failed: %d" , rc );
@@ -793,7 +802,15 @@ static DEVICE_API(flash, drv_api) = {
793802 .dqs_enable = false, \
794803}
795804
796- #define FLASH_SIZE_INST (inst ) (DT_INST_PROP(inst, size) / 8)
805+ #define FLASH_SIZE (inst ) \
806+ (DT_INST_NODE_HAS_PROP(inst, size) \
807+ ? DT_INST_PROP(inst, size) / 8 \
808+ : BFP_FLASH_DENSITY(SFDP_DW(inst, sfdp_bfp, 2)) / 8)
809+
810+ #define FLASH_PAGE_EXP (inst ) SFDP_FIELD(inst, sfdp_bfp, 11, GENMASK(7, 4))
811+ #define FLASH_PAGE_SIZE (inst ) \
812+ (FLASH_PAGE_EXP(inst) ? BIT(FLASH_PAGE_EXP(inst)) \
813+ : SPI_NOR_PAGE_SIZE)
797814
798815/* Define copies of mspi_io_mode enum values, so they can be used inside
799816 * the COND_CODE_1 macros.
@@ -829,23 +846,17 @@ extern const struct flash_mspi_nor_cmds mspi_io_mode_not_supported;
829846
830847#define FLASH_QUIRKS (inst ) FLASH_MSPI_QUIRKS_GET(DT_DRV_INST(inst))
831848
832- #define FLASH_DW15_QER_VAL (inst ) _CONCAT(JESD216_DW15_QER_VAL_, \
833- DT_INST_STRING_TOKEN(inst, quad_enable_requirements))
834- #define FLASH_DW15_QER (inst ) COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, quad_enable_requirements), \
835- (FLASH_DW15_QER_VAL(inst)), (JESD216_DW15_QER_VAL_NONE))
836-
837-
838849#if defined(CONFIG_FLASH_PAGE_LAYOUT )
839850BUILD_ASSERT ((CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE % 4096 ) == 0 ,
840851 "MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE must be multiple of 4096" );
841852#define FLASH_PAGE_LAYOUT_DEFINE (inst ) \
842853 .layout = { \
843854 .pages_size = CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
844- .pages_count = FLASH_SIZE_INST (inst) \
855+ .pages_count = FLASH_SIZE (inst) \
845856 / CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
846857 },
847858#define FLASH_PAGE_LAYOUT_CHECK (inst ) \
848- BUILD_ASSERT((FLASH_SIZE_INST (inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
859+ BUILD_ASSERT((FLASH_SIZE (inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
849860 "MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE incompatible with flash size, instance " #inst);
850861#else
851862#define FLASH_PAGE_LAYOUT_DEFINE (inst )
@@ -867,11 +878,14 @@ BUILD_ASSERT((FLASH_SIZE_INST(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) ==
867878 (DT_INST_ENUM_IDX(inst, mspi_io_mode) == \
868879 MSPI_IO_MODE_OCTAL), \
869880 "Only 1x, 1-4-4 and 8x I/O modes are supported for now"); \
881+ SFDP_BUILD_ASSERTS(inst); \
870882 PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \
883+ DEFAULT_ERASE_TYPES_DEFINE(inst); \
871884 static struct flash_mspi_nor_data dev##inst##_data; \
872885 static const struct flash_mspi_nor_config dev##inst##_config = { \
873886 .bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \
874- .flash_size = FLASH_SIZE_INST(inst), \
887+ .flash_size = FLASH_SIZE(inst), \
888+ .page_size = FLASH_PAGE_SIZE(inst), \
875889 .mspi_id = MSPI_DEVICE_ID_DT_INST(inst), \
876890 .mspi_nor_cfg = MSPI_DEVICE_CONFIG_DT_INST(inst), \
877891 .mspi_nor_init_cfg = FLASH_INITIAL_CONFIG(inst), \
@@ -892,7 +906,9 @@ BUILD_ASSERT((FLASH_SIZE_INST(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) ==
892906 .jedec_id = DT_INST_PROP(inst, jedec_id), \
893907 .jedec_cmds = FLASH_CMDS(inst), \
894908 .quirks = FLASH_QUIRKS(inst), \
895- .dw15_qer = FLASH_DW15_QER(inst), \
909+ .default_erase_types = DEFAULT_ERASE_TYPES(inst), \
910+ .default_cmd_info = DEFAULT_CMD_INFO(inst), \
911+ .default_switch_info = DEFAULT_SWITCH_INFO(inst), \
896912 }; \
897913 FLASH_PAGE_LAYOUT_CHECK(inst) \
898914 DEVICE_DT_INST_DEFINE(inst, \
0 commit comments