12
12
#include <zephyr/pm/device_runtime.h>
13
13
14
14
#include "flash_mspi_nor.h"
15
+ #include "flash_mspi_nor_sfdp.h"
15
16
#include "flash_mspi_nor_quirks.h"
16
17
17
18
LOG_MODULE_REGISTER (flash_mspi_nor , CONFIG_FLASH_LOG_LEVEL );
@@ -110,7 +111,9 @@ static inline uint32_t dev_flash_size(const struct device *dev)
110
111
111
112
static inline uint16_t dev_page_size (const struct device * dev )
112
113
{
113
- return SPI_NOR_PAGE_SIZE ;
114
+ const struct flash_mspi_nor_config * dev_config = dev -> config ;
115
+
116
+ return dev_config -> page_size ;
114
117
}
115
118
116
119
static 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)
528
531
return rc ;
529
532
}
530
533
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 ) {
532
535
const struct flash_mspi_nor_cmd cmd_status = {
533
536
.dir = MSPI_TX ,
534
537
.cmd = SPI_NOR_CMD_WRSR ,
@@ -564,10 +567,11 @@ static int quad_enable_set(const struct device *dev, bool enable)
564
567
static int default_io_mode (const struct device * dev )
565
568
{
566
569
const struct flash_mspi_nor_config * dev_config = dev -> config ;
570
+ struct flash_mspi_nor_data * dev_data = dev -> data ;
567
571
enum mspi_io_mode io_mode = dev_config -> mspi_nor_cfg .io_mode ;
568
572
int rc = 0 ;
569
573
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 ) {
571
575
/* For Quad 1-1-4 and 1-4-4, entering or leaving mode is defined
572
576
* in JEDEC216 BFP DW15 QER
573
577
*/
@@ -651,7 +655,7 @@ static int flash_chip_init(const struct device *dev)
651
655
/* Some chips reuse RESET pin for data in Quad modes:
652
656
* force single line mode before resetting.
653
657
*/
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 &&
655
659
(io_mode == MSPI_IO_MODE_SINGLE ||
656
660
io_mode == MSPI_IO_MODE_QUAD_1_1_4 ||
657
661
io_mode == MSPI_IO_MODE_QUAD_1_4_4 )) {
@@ -743,6 +747,11 @@ static int drv_init(const struct device *dev)
743
747
return - ENODEV ;
744
748
}
745
749
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
+
746
755
rc = pm_device_runtime_get (dev_config -> bus );
747
756
if (rc < 0 ) {
748
757
LOG_ERR ("pm_device_runtime_get() failed: %d" , rc );
@@ -793,7 +802,15 @@ static DEVICE_API(flash, drv_api) = {
793
802
.dqs_enable = false, \
794
803
}
795
804
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)
797
814
798
815
/* Define copies of mspi_io_mode enum values, so they can be used inside
799
816
* the COND_CODE_1 macros.
@@ -829,23 +846,17 @@ extern const struct flash_mspi_nor_cmds mspi_io_mode_not_supported;
829
846
830
847
#define FLASH_QUIRKS (inst ) FLASH_MSPI_QUIRKS_GET(DT_DRV_INST(inst))
831
848
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
-
838
849
#if defined(CONFIG_FLASH_PAGE_LAYOUT )
839
850
BUILD_ASSERT ((CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE % 4096 ) == 0 ,
840
851
"MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE must be multiple of 4096" );
841
852
#define FLASH_PAGE_LAYOUT_DEFINE (inst ) \
842
853
.layout = { \
843
854
.pages_size = CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
844
- .pages_count = FLASH_SIZE_INST (inst) \
855
+ .pages_count = FLASH_SIZE (inst) \
845
856
/ CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
846
857
},
847
858
#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, \
849
860
"MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE incompatible with flash size, instance " #inst);
850
861
#else
851
862
#define FLASH_PAGE_LAYOUT_DEFINE (inst )
@@ -867,11 +878,14 @@ BUILD_ASSERT((FLASH_SIZE_INST(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) ==
867
878
(DT_INST_ENUM_IDX(inst, mspi_io_mode) == \
868
879
MSPI_IO_MODE_OCTAL), \
869
880
"Only 1x, 1-4-4 and 8x I/O modes are supported for now"); \
881
+ SFDP_BUILD_ASSERTS(inst); \
870
882
PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \
883
+ DEFAULT_ERASE_TYPES_DEFINE(inst); \
871
884
static struct flash_mspi_nor_data dev##inst##_data; \
872
885
static const struct flash_mspi_nor_config dev##inst##_config = { \
873
886
.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), \
875
889
.mspi_id = MSPI_DEVICE_ID_DT_INST(inst), \
876
890
.mspi_nor_cfg = MSPI_DEVICE_CONFIG_DT_INST(inst), \
877
891
.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) ==
892
906
.jedec_id = DT_INST_PROP(inst, jedec_id), \
893
907
.jedec_cmds = FLASH_CMDS(inst), \
894
908
.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), \
896
912
}; \
897
913
FLASH_PAGE_LAYOUT_CHECK(inst) \
898
914
DEVICE_DT_INST_DEFINE(inst, \
0 commit comments