Skip to content

Commit 7b561f7

Browse files
Albort12138cfriedt
authored andcommitted
drivers: flash: flash_mcux_flexspi_nor: Adjust bit field check sequence.
Adjust the bit field check sequence for "en4b" to support some flash devices that offer multiple mechanisms for entering 4-byte address mode. Signed-off-by: Albort Xue <[email protected]>
1 parent 2a6bb84 commit 7b561f7

File tree

1 file changed

+31
-28
lines changed

1 file changed

+31
-28
lines changed

drivers/flash/flash_mcux_flexspi_nor.c

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -757,17 +757,11 @@ static int flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data *data,
757757
if (en4b & BIT(6)) {
758758
/* Flash is always in 4 byte mode. We just need to configure LUT */
759759
return 0;
760-
} else if (en4b & BIT(5)) {
761-
/* Dedicated vendor instruction set, which we don't support. Exit here */
762-
return -ENOTSUP;
763-
} else if (en4b & BIT(4)) {
764-
/* Set bit 0 of 16 bit configuration register */
760+
} else if (en4b & BIT(0)) {
761+
/* Issue instruction 0xB7 */
765762
flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
766-
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB5,
767-
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
768-
flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
769-
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB1,
770-
kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
763+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB7,
764+
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
771765
ret = memc_flexspi_set_device_config(&data->controller,
772766
&config,
773767
(uint32_t *)flexspi_lut,
@@ -776,18 +770,9 @@ static int flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data *data,
776770
if (ret < 0) {
777771
return ret;
778772
}
779-
transfer.dataSize = 2;
773+
transfer.dataSize = 0;
780774
transfer.seqIndex = SCRATCH_CMD;
781-
transfer.cmdType = kFLEXSPI_Read;
782-
/* Read config register */
783-
ret = memc_flexspi_transfer(&data->controller, &transfer);
784-
if (ret < 0) {
785-
return ret;
786-
}
787-
buffer |= BIT(0);
788-
/* Set config register */
789-
transfer.seqIndex = SCRATCH_CMD2;
790-
transfer.cmdType = kFLEXSPI_Read;
775+
transfer.cmdType = kFLEXSPI_Command;
791776
return memc_flexspi_transfer(&data->controller, &transfer);
792777
} else if (en4b & BIT(1)) {
793778
/* Issue write enable, then instruction 0xB7 */
@@ -807,11 +792,14 @@ static int flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data *data,
807792
transfer.seqIndex = SCRATCH_CMD;
808793
transfer.cmdType = kFLEXSPI_Command;
809794
return memc_flexspi_transfer(&data->controller, &transfer);
810-
} else if (en4b & BIT(0)) {
811-
/* Issue instruction 0xB7 */
795+
} else if (en4b & BIT(4)) {
796+
/* Set bit 0 of 16 bit configuration register */
812797
flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
813-
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB7,
814-
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
798+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB5,
799+
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
800+
flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
801+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB1,
802+
kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
815803
ret = memc_flexspi_set_device_config(&data->controller,
816804
&config,
817805
(uint32_t *)flexspi_lut,
@@ -820,12 +808,27 @@ static int flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data *data,
820808
if (ret < 0) {
821809
return ret;
822810
}
823-
transfer.dataSize = 0;
811+
transfer.dataSize = 2;
824812
transfer.seqIndex = SCRATCH_CMD;
825-
transfer.cmdType = kFLEXSPI_Command;
813+
transfer.cmdType = kFLEXSPI_Read;
814+
/* Read config register */
815+
ret = memc_flexspi_transfer(&data->controller, &transfer);
816+
if (ret < 0) {
817+
return ret;
818+
}
819+
buffer |= BIT(0);
820+
/* Set config register */
821+
transfer.seqIndex = SCRATCH_CMD2;
822+
transfer.cmdType = kFLEXSPI_Read;
826823
return memc_flexspi_transfer(&data->controller, &transfer);
827824
}
828-
/* Other methods not supported */
825+
826+
/* Other methods not supported. Include:
827+
*
828+
* BIT(2): 8-bit volatile extended address register used to define A[31:24] bits.
829+
* BIT(3): 8-bit volatile bank register used to define A[31:24] bits.
830+
* BIT(5): Dedicated vendor instruction set.
831+
*/
829832
return -ENOTSUP;
830833
}
831834

0 commit comments

Comments
 (0)