@@ -849,6 +849,77 @@ static int gpio_reset(const struct device *dev)
849
849
}
850
850
#endif
851
851
852
+ #if defined(WITH_SOFT_RESET )
853
+ static int soft_reset_66_99 (const struct device * dev )
854
+ {
855
+ int rc ;
856
+
857
+ set_up_xfer (dev , MSPI_TX );
858
+ rc = perform_xfer (dev , SPI_NOR_CMD_RESET_EN , false);
859
+ if (rc < 0 ) {
860
+ LOG_ERR ("CMD_RESET_EN failed: %d" , rc );
861
+ return rc ;
862
+ }
863
+
864
+ set_up_xfer (dev , MSPI_TX );
865
+ rc = perform_xfer (dev , SPI_NOR_CMD_RESET_MEM , false);
866
+ if (rc < 0 ) {
867
+ LOG_ERR ("CMD_RESET_MEM failed: %d" , rc );
868
+ return rc ;
869
+ }
870
+
871
+ return 0 ;
872
+ }
873
+
874
+ static int soft_reset (const struct device * dev )
875
+ {
876
+ const struct flash_mspi_nor_config * dev_config = dev -> config ;
877
+ struct flash_mspi_nor_data * dev_data = dev -> data ;
878
+ int rc ;
879
+
880
+ /* If the flash may expect commands sent in multi-line mode,
881
+ * send additionally the reset sequence this way.
882
+ */
883
+ if (dev_config -> multi_io_cmd ) {
884
+ rc = mspi_dev_config (dev_config -> bus , & dev_config -> mspi_id ,
885
+ MSPI_DEVICE_CONFIG_IO_MODE ,
886
+ & dev_config -> mspi_nor_cfg );
887
+ if (rc < 0 ) {
888
+ LOG_ERR ("%s: dev_config() failed: %d" , __func__ , rc );
889
+ return rc ;
890
+ }
891
+
892
+ dev_data -> in_target_io_mode = true;
893
+
894
+ rc = soft_reset_66_99 (dev );
895
+ if (rc < 0 ) {
896
+ return rc ;
897
+ }
898
+
899
+ rc = mspi_dev_config (dev_config -> bus , & dev_config -> mspi_id ,
900
+ MSPI_DEVICE_CONFIG_IO_MODE ,
901
+ & dev_config -> mspi_nor_init_cfg );
902
+ if (rc < 0 ) {
903
+ LOG_ERR ("%s: dev_config() failed: %d" , __func__ , rc );
904
+ return rc ;
905
+ }
906
+
907
+ dev_data -> in_target_io_mode = false;
908
+ }
909
+
910
+ rc = soft_reset_66_99 (dev );
911
+ if (rc < 0 ) {
912
+ return rc ;
913
+ }
914
+
915
+ if (dev_config -> reset_recovery_us != 0 ) {
916
+ k_busy_wait (dev_config -> reset_recovery_us );
917
+ }
918
+
919
+ return 0 ;
920
+ }
921
+ #endif /* WITH_SOFT_RESET */
922
+
852
923
static int flash_chip_init (const struct device * dev )
853
924
{
854
925
const struct flash_mspi_nor_config * dev_config = dev -> config ;
@@ -897,6 +968,15 @@ static int flash_chip_init(const struct device *dev)
897
968
}
898
969
#endif
899
970
971
+ #if defined(WITH_SOFT_RESET )
972
+ if (dev_config -> initial_soft_reset ) {
973
+ rc = soft_reset (dev );
974
+ if (rc < 0 ) {
975
+ return rc ;
976
+ }
977
+ }
978
+ #endif
979
+
900
980
if (dev_config -> quirks != NULL &&
901
981
dev_config -> quirks -> pre_init != NULL ) {
902
982
rc = dev_config -> quirks -> pre_init (dev );
@@ -1117,10 +1197,10 @@ BUILD_ASSERT((FLASH_SIZE(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
1117
1197
(.xip_cfg = MSPI_XIP_CONFIG_DT_INST(inst),)) \
1118
1198
IF_ENABLED(WITH_RESET_GPIO, \
1119
1199
(.reset = GPIO_DT_SPEC_INST_GET_OR(inst, reset_gpios, {0}), \
1120
- .reset_pulse_us = DT_INST_PROP_OR(inst, t_reset_pulse, 0) \
1121
- / 1000, \
1200
+ .reset_pulse_us = DT_INST_PROP_OR(inst, t_reset_pulse, 0) \
1201
+ / 1000,)) \
1122
1202
.reset_recovery_us = DT_INST_PROP_OR(inst, t_reset_recovery, 0) \
1123
- / 1000,)) \
1203
+ / 1000, \
1124
1204
.transfer_timeout = DT_INST_PROP(inst, transfer_timeout), \
1125
1205
FLASH_PAGE_LAYOUT_DEFINE(inst) \
1126
1206
.jedec_id = DT_INST_PROP(inst, jedec_id), \
@@ -1135,6 +1215,7 @@ BUILD_ASSERT((FLASH_SIZE(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
1135
1215
.multiperipheral_bus = DT_PROP(DT_INST_BUS(inst), \
1136
1216
software_multiperipheral), \
1137
1217
IO_MODE_FLAGS(DT_INST_ENUM_IDX(inst, mspi_io_mode)), \
1218
+ .initial_soft_reset = DT_INST_PROP(inst, initial_soft_reset), \
1138
1219
}; \
1139
1220
FLASH_PAGE_LAYOUT_CHECK(inst) \
1140
1221
DEVICE_DT_INST_DEFINE(inst, \
0 commit comments