diff --git a/drivers/rkflash/sfc_nor.c b/drivers/rkflash/sfc_nor.c index 2d9fe65b5adb..ca1dece2d9bb 100644 --- a/drivers/rkflash/sfc_nor.c +++ b/drivers/rkflash/sfc_nor.c @@ -337,8 +337,7 @@ int snor_prog_page(struct SFNOR_DEV *p_dev, op.sfctrl.d32 = 0; op.sfctrl.b.datalines = p_dev->prog_lines; op.sfctrl.b.enbledma = 1; - if (p_dev->prog_lines == DATA_LINES_X4) - op.sfctrl.b.addrlines = SFC_4BITS_LINE; + op.sfctrl.b.addrlines = p_dev->prog_addr_lines; if (p_dev->addr_mode == ADDR_MODE_4BYTE) op.sfcmd.b.addrbits = SFC_ADDR_32BITS; @@ -642,6 +641,10 @@ static int snor_parse_flash_table(struct SFNOR_DEV *p_dev, p_dev->read_lines == DATA_LINES_X4) { p_dev->prog_lines = DATA_LINES_X4; p_dev->prog_cmd = g_spi_flash_info->prog_cmd_4; + if ((p_dev->manufacturer == MID_MACRONIX) && + (p_dev->prog_cmd == CMD_PAGE_PROG_A4 || + p_dev->prog_cmd == CMD_PAGE_PROG_4PP)) + p_dev->prog_addr_lines = DATA_LINES_X4; } if (g_spi_flash_info->feature & FEA_4BYTE_ADDR) @@ -686,6 +689,7 @@ int snor_init(struct SFNOR_DEV *p_dev) p_dev->sec_erase_cmd = CMD_SECTOR_ERASE; p_dev->blk_erase_cmd = CMD_BLOCK_ERASE; p_dev->prog_lines = DATA_LINES_X1; + p_dev->prog_addr_lines = DATA_LINES_X1; p_dev->read_lines = DATA_LINES_X1; p_dev->write_status = snor_write_status; snor_reset_device(); diff --git a/drivers/rkflash/sfc_nor.h b/drivers/rkflash/sfc_nor.h index fd800143ca97..950af6a5e686 100644 --- a/drivers/rkflash/sfc_nor.h +++ b/drivers/rkflash/sfc_nor.h @@ -59,6 +59,8 @@ #define CMD_PAGE_PROG_X4 (0x32) /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */ #define CMD_PAGE_PROG_A4 (0x38) +/* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */ +#define CMD_PAGE_PROG_4PP (0x3E) #define CMD_RESET_NAND (0xFF) #define CMD_ENTER_4BYTE_MODE (0xB7) #define CMD_EXIT_4BYTE_MODE (0xE9) @@ -108,6 +110,7 @@ struct SFNOR_DEV { enum SFC_DATA_LINES read_lines; enum SFC_DATA_LINES prog_lines; + enum SFC_DATA_LINES prog_addr_lines; SNOR_WRITE_STATUS write_status; u32 max_iosize;