Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'spi-nor/for-4.16' of git://git.infradead.org/linux-mtd into mtd/next

Pull spi-nor changes from Cyrille Pitchen:

"
This pull-request contains the following notable changes:

Core changes:
* Add support to new ISSI and Cypress/Spansion memory parts.
* Fix support of Micron memories by checking error bits in the FSR.
* Fix update of block-protection bits by reading back the SR.
* Restore the internal state of the SPI flash memory when removing the
device.

Driver changes:
* Maintenance for Freescale, Intel and Metiatek drivers.
* Add support of the direct access mode for the Cadence QSPI controller.
"

+246 -164
+1 -1
Documentation/devicetree/bindings/mtd/fsl-quadspi.txt
··· 12 12 - reg-names: Should contain the reg names "QuadSPI" and "QuadSPI-memory" 13 13 - interrupts : Should contain the interrupt for the device 14 14 - clocks : The clocks needed by the QuadSPI controller 15 - - clock-names : the name of the clocks 15 + - clock-names : Should contain the name of the clocks: "qspi_en" and "qspi". 16 16 17 17 Optional properties: 18 18 - fsl,qspi-has-second-chip: The controller has two buses, bus A and bus B.
+3
Documentation/mtd/spi-nor.txt
··· 60 60 initialize the necessary fields for spi_nor{}. Please see 61 61 drivers/mtd/spi-nor/spi-nor.c for detail. Please also refer to fsl-quadspi.c 62 62 when you want to write a new driver for a SPI NOR controller. 63 + Another API is spi_nor_restore(), this is used to restore the status of SPI 64 + flash chip such as addressing mode. Call it whenever detach the driver from 65 + device or reboot the system.
+9
drivers/mtd/devices/m25p80.c
··· 307 307 { 308 308 struct m25p *flash = spi_get_drvdata(spi); 309 309 310 + spi_nor_restore(&flash->spi_nor); 311 + 310 312 /* Clean up MTD stuff. */ 311 313 return mtd_device_unregister(&flash->spi_nor.mtd); 312 314 } 313 315 316 + static void m25p_shutdown(struct spi_device *spi) 317 + { 318 + struct m25p *flash = spi_get_drvdata(spi); 319 + 320 + spi_nor_restore(&flash->spi_nor); 321 + } 314 322 /* 315 323 * Do NOT add to this array without reading the following: 316 324 * ··· 394 386 .id_table = m25p_ids, 395 387 .probe = m25p_probe, 396 388 .remove = m25p_remove, 389 + .shutdown = m25p_shutdown, 397 390 398 391 /* REVISIT: many of these chips have deep power-down modes, which 399 392 * should clearly be entered on suspend() to minimize power use.
+39 -16
drivers/mtd/spi-nor/cadence-quadspi.c
··· 58 58 u8 data_width; 59 59 u8 cs; 60 60 bool registered; 61 + bool use_direct_mode; 61 62 }; 62 63 63 64 struct cqspi_st { ··· 69 68 70 69 void __iomem *iobase; 71 70 void __iomem *ahb_base; 71 + resource_size_t ahb_size; 72 72 struct completion transfer_complete; 73 73 struct mutex bus_mutex; 74 74 ··· 105 103 /* Register map */ 106 104 #define CQSPI_REG_CONFIG 0x00 107 105 #define CQSPI_REG_CONFIG_ENABLE_MASK BIT(0) 106 + #define CQSPI_REG_CONFIG_ENB_DIR_ACC_CTRL BIT(7) 108 107 #define CQSPI_REG_CONFIG_DECODE_MASK BIT(9) 109 108 #define CQSPI_REG_CONFIG_CHIPSELECT_LSB 10 110 109 #define CQSPI_REG_CONFIG_DMA_MASK BIT(15) ··· 453 450 return cqspi_exec_flash_cmd(cqspi, reg); 454 451 } 455 452 456 - static int cqspi_indirect_read_setup(struct spi_nor *nor, 457 - const unsigned int from_addr) 453 + static int cqspi_read_setup(struct spi_nor *nor) 458 454 { 459 455 struct cqspi_flash_pdata *f_pdata = nor->priv; 460 456 struct cqspi_st *cqspi = f_pdata->cqspi; 461 457 void __iomem *reg_base = cqspi->iobase; 462 458 unsigned int dummy_clk = 0; 463 459 unsigned int reg; 464 - 465 - writel(from_addr, reg_base + CQSPI_REG_INDIRECTRDSTARTADDR); 466 460 467 461 reg = nor->read_opcode << CQSPI_REG_RD_INSTR_OPCODE_LSB; 468 462 reg |= cqspi_calc_rdreg(nor, nor->read_opcode); ··· 493 493 return 0; 494 494 } 495 495 496 - static int cqspi_indirect_read_execute(struct spi_nor *nor, 497 - u8 *rxbuf, const unsigned n_rx) 496 + static int cqspi_indirect_read_execute(struct spi_nor *nor, u8 *rxbuf, 497 + loff_t from_addr, const size_t n_rx) 498 498 { 499 499 struct cqspi_flash_pdata *f_pdata = nor->priv; 500 500 struct cqspi_st *cqspi = f_pdata->cqspi; ··· 504 504 unsigned int bytes_to_read = 0; 505 505 int ret = 0; 506 506 507 + writel(from_addr, reg_base + CQSPI_REG_INDIRECTRDSTARTADDR); 507 508 writel(remaining, reg_base + CQSPI_REG_INDIRECTRDBYTES); 508 509 509 510 /* Clear all interrupts. */ ··· 571 570 return ret; 572 571 } 573 572 574 - static int cqspi_indirect_write_setup(struct spi_nor *nor, 575 - const unsigned int to_addr) 573 + static int cqspi_write_setup(struct spi_nor *nor) 576 574 { 577 575 unsigned int reg; 578 576 struct cqspi_flash_pdata *f_pdata = nor->priv; ··· 584 584 reg = cqspi_calc_rdreg(nor, nor->program_opcode); 585 585 writel(reg, reg_base + CQSPI_REG_RD_INSTR); 586 586 587 - writel(to_addr, reg_base + CQSPI_REG_INDIRECTWRSTARTADDR); 588 - 589 587 reg = readl(reg_base + CQSPI_REG_SIZE); 590 588 reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK; 591 589 reg |= (nor->addr_width - 1); ··· 591 593 return 0; 592 594 } 593 595 594 - static int cqspi_indirect_write_execute(struct spi_nor *nor, 595 - const u8 *txbuf, const unsigned n_tx) 596 + static int cqspi_indirect_write_execute(struct spi_nor *nor, loff_t to_addr, 597 + const u8 *txbuf, const size_t n_tx) 596 598 { 597 599 const unsigned int page_size = nor->page_size; 598 600 struct cqspi_flash_pdata *f_pdata = nor->priv; ··· 602 604 unsigned int write_bytes; 603 605 int ret; 604 606 607 + writel(to_addr, reg_base + CQSPI_REG_INDIRECTWRSTARTADDR); 605 608 writel(remaining, reg_base + CQSPI_REG_INDIRECTWRBYTES); 606 609 607 610 /* Clear all interrupts. */ ··· 893 894 static ssize_t cqspi_write(struct spi_nor *nor, loff_t to, 894 895 size_t len, const u_char *buf) 895 896 { 897 + struct cqspi_flash_pdata *f_pdata = nor->priv; 898 + struct cqspi_st *cqspi = f_pdata->cqspi; 896 899 int ret; 897 900 898 901 ret = cqspi_set_protocol(nor, 0); 899 902 if (ret) 900 903 return ret; 901 904 902 - ret = cqspi_indirect_write_setup(nor, to); 905 + ret = cqspi_write_setup(nor); 903 906 if (ret) 904 907 return ret; 905 908 906 - ret = cqspi_indirect_write_execute(nor, buf, len); 909 + if (f_pdata->use_direct_mode) 910 + memcpy_toio(cqspi->ahb_base + to, buf, len); 911 + else 912 + ret = cqspi_indirect_write_execute(nor, to, buf, len); 907 913 if (ret) 908 914 return ret; 909 915 ··· 918 914 static ssize_t cqspi_read(struct spi_nor *nor, loff_t from, 919 915 size_t len, u_char *buf) 920 916 { 917 + struct cqspi_flash_pdata *f_pdata = nor->priv; 918 + struct cqspi_st *cqspi = f_pdata->cqspi; 921 919 int ret; 922 920 923 921 ret = cqspi_set_protocol(nor, 1); 924 922 if (ret) 925 923 return ret; 926 924 927 - ret = cqspi_indirect_read_setup(nor, from); 925 + ret = cqspi_read_setup(nor); 928 926 if (ret) 929 927 return ret; 930 928 931 - ret = cqspi_indirect_read_execute(nor, buf, len); 929 + if (f_pdata->use_direct_mode) 930 + memcpy_fromio(buf, cqspi->ahb_base + from, len); 931 + else 932 + ret = cqspi_indirect_read_execute(nor, buf, from, len); 932 933 if (ret) 933 934 return ret; 934 935 ··· 1068 1059 1069 1060 static void cqspi_controller_init(struct cqspi_st *cqspi) 1070 1061 { 1062 + u32 reg; 1063 + 1071 1064 cqspi_controller_enable(cqspi, 0); 1072 1065 1073 1066 /* Configure the remap address register, no remap */ ··· 1091 1080 /* Program write watermark -- 1/8 of the FIFO. */ 1092 1081 writel(cqspi->fifo_depth * cqspi->fifo_width / 8, 1093 1082 cqspi->iobase + CQSPI_REG_INDIRECTWRWATERMARK); 1083 + 1084 + /* Enable Direct Access Controller */ 1085 + reg = readl(cqspi->iobase + CQSPI_REG_CONFIG); 1086 + reg |= CQSPI_REG_CONFIG_ENB_DIR_ACC_CTRL; 1087 + writel(reg, cqspi->iobase + CQSPI_REG_CONFIG); 1094 1088 1095 1089 cqspi_controller_enable(cqspi, 1); 1096 1090 } ··· 1172 1156 goto err; 1173 1157 1174 1158 f_pdata->registered = true; 1159 + 1160 + if (mtd->size <= cqspi->ahb_size) { 1161 + f_pdata->use_direct_mode = true; 1162 + dev_dbg(nor->dev, "using direct mode for %s\n", 1163 + mtd->name); 1164 + } 1175 1165 } 1176 1166 1177 1167 return 0; ··· 1237 1215 dev_err(dev, "Cannot remap AHB address.\n"); 1238 1216 return PTR_ERR(cqspi->ahb_base); 1239 1217 } 1218 + cqspi->ahb_size = resource_size(res_ahb); 1240 1219 1241 1220 init_completion(&cqspi->transfer_complete); 1242 1221
+4 -4
drivers/mtd/spi-nor/fsl-quadspi.c
··· 801 801 } 802 802 803 803 static const struct of_device_id fsl_qspi_dt_ids[] = { 804 - { .compatible = "fsl,vf610-qspi", .data = (void *)&vybrid_data, }, 805 - { .compatible = "fsl,imx6sx-qspi", .data = (void *)&imx6sx_data, }, 806 - { .compatible = "fsl,imx7d-qspi", .data = (void *)&imx7d_data, }, 807 - { .compatible = "fsl,imx6ul-qspi", .data = (void *)&imx6ul_data, }, 804 + { .compatible = "fsl,vf610-qspi", .data = &vybrid_data, }, 805 + { .compatible = "fsl,imx6sx-qspi", .data = &imx6sx_data, }, 806 + { .compatible = "fsl,imx7d-qspi", .data = &imx7d_data, }, 807 + { .compatible = "fsl,imx6ul-qspi", .data = &imx6ul_data, }, 808 808 { .compatible = "fsl,ls1021a-qspi", .data = (void *)&ls1021a_data, }, 809 809 { /* sentinel */ } 810 810 };
-6
drivers/mtd/spi-nor/intel-spi.c
··· 138 138 * @erase_64k: 64k erase supported 139 139 * @opcodes: Opcodes which are supported. This are programmed by BIOS 140 140 * before it locks down the controller. 141 - * @preopcodes: Preopcodes which are supported. 142 141 */ 143 142 struct intel_spi { 144 143 struct device *dev; ··· 154 155 bool swseq_erase; 155 156 bool erase_64k; 156 157 u8 opcodes[8]; 157 - u8 preopcodes[2]; 158 158 }; 159 159 160 160 static bool writeable; ··· 398 400 ispi->opcodes[i] = opmenu0 >> i * 8; 399 401 ispi->opcodes[i + 4] = opmenu1 >> i * 8; 400 402 } 401 - 402 - val = readl(ispi->sregs + PREOP_OPTYPE); 403 - ispi->preopcodes[0] = val; 404 - ispi->preopcodes[1] = val >> 8; 405 403 } 406 404 } 407 405
+120 -120
drivers/mtd/spi-nor/mtk-quadspi.c
··· 110 110 #define MTK_NOR_PRG_REG(n) (MTK_NOR_PRGDATA0_REG + 4 * (n)) 111 111 #define MTK_NOR_SHREG(n) (MTK_NOR_SHREG0_REG + 4 * (n)) 112 112 113 - struct mt8173_nor { 113 + struct mtk_nor { 114 114 struct spi_nor nor; 115 115 struct device *dev; 116 116 void __iomem *base; /* nor flash base address */ ··· 118 118 struct clk *nor_clk; 119 119 }; 120 120 121 - static void mt8173_nor_set_read_mode(struct mt8173_nor *mt8173_nor) 121 + static void mtk_nor_set_read_mode(struct mtk_nor *mtk_nor) 122 122 { 123 - struct spi_nor *nor = &mt8173_nor->nor; 123 + struct spi_nor *nor = &mtk_nor->nor; 124 124 125 125 switch (nor->read_proto) { 126 126 case SNOR_PROTO_1_1_1: 127 - writeb(nor->read_opcode, mt8173_nor->base + 127 + writeb(nor->read_opcode, mtk_nor->base + 128 128 MTK_NOR_PRGDATA3_REG); 129 - writeb(MTK_NOR_FAST_READ, mt8173_nor->base + 129 + writeb(MTK_NOR_FAST_READ, mtk_nor->base + 130 130 MTK_NOR_CFG1_REG); 131 131 break; 132 132 case SNOR_PROTO_1_1_2: 133 - writeb(nor->read_opcode, mt8173_nor->base + 133 + writeb(nor->read_opcode, mtk_nor->base + 134 134 MTK_NOR_PRGDATA3_REG); 135 - writeb(MTK_NOR_DUAL_READ_EN, mt8173_nor->base + 135 + writeb(MTK_NOR_DUAL_READ_EN, mtk_nor->base + 136 136 MTK_NOR_DUAL_REG); 137 137 break; 138 138 case SNOR_PROTO_1_1_4: 139 - writeb(nor->read_opcode, mt8173_nor->base + 139 + writeb(nor->read_opcode, mtk_nor->base + 140 140 MTK_NOR_PRGDATA4_REG); 141 - writeb(MTK_NOR_QUAD_READ_EN, mt8173_nor->base + 141 + writeb(MTK_NOR_QUAD_READ_EN, mtk_nor->base + 142 142 MTK_NOR_DUAL_REG); 143 143 break; 144 144 default: 145 - writeb(MTK_NOR_DUAL_DISABLE, mt8173_nor->base + 145 + writeb(MTK_NOR_DUAL_DISABLE, mtk_nor->base + 146 146 MTK_NOR_DUAL_REG); 147 147 break; 148 148 } 149 149 } 150 150 151 - static int mt8173_nor_execute_cmd(struct mt8173_nor *mt8173_nor, u8 cmdval) 151 + static int mtk_nor_execute_cmd(struct mtk_nor *mtk_nor, u8 cmdval) 152 152 { 153 153 int reg; 154 154 u8 val = cmdval & 0x1f; 155 155 156 - writeb(cmdval, mt8173_nor->base + MTK_NOR_CMD_REG); 157 - return readl_poll_timeout(mt8173_nor->base + MTK_NOR_CMD_REG, reg, 156 + writeb(cmdval, mtk_nor->base + MTK_NOR_CMD_REG); 157 + return readl_poll_timeout(mtk_nor->base + MTK_NOR_CMD_REG, reg, 158 158 !(reg & val), 100, 10000); 159 159 } 160 160 161 - static int mt8173_nor_do_tx_rx(struct mt8173_nor *mt8173_nor, u8 op, 162 - u8 *tx, int txlen, u8 *rx, int rxlen) 161 + static int mtk_nor_do_tx_rx(struct mtk_nor *mtk_nor, u8 op, 162 + u8 *tx, int txlen, u8 *rx, int rxlen) 163 163 { 164 164 int len = 1 + txlen + rxlen; 165 165 int i, ret, idx; ··· 167 167 if (len > MTK_NOR_MAX_SHIFT) 168 168 return -EINVAL; 169 169 170 - writeb(len * 8, mt8173_nor->base + MTK_NOR_CNT_REG); 170 + writeb(len * 8, mtk_nor->base + MTK_NOR_CNT_REG); 171 171 172 172 /* start at PRGDATA5, go down to PRGDATA0 */ 173 173 idx = MTK_NOR_MAX_RX_TX_SHIFT - 1; 174 174 175 175 /* opcode */ 176 - writeb(op, mt8173_nor->base + MTK_NOR_PRG_REG(idx)); 176 + writeb(op, mtk_nor->base + MTK_NOR_PRG_REG(idx)); 177 177 idx--; 178 178 179 179 /* program TX data */ 180 180 for (i = 0; i < txlen; i++, idx--) 181 - writeb(tx[i], mt8173_nor->base + MTK_NOR_PRG_REG(idx)); 181 + writeb(tx[i], mtk_nor->base + MTK_NOR_PRG_REG(idx)); 182 182 183 183 /* clear out rest of TX registers */ 184 184 while (idx >= 0) { 185 - writeb(0, mt8173_nor->base + MTK_NOR_PRG_REG(idx)); 185 + writeb(0, mtk_nor->base + MTK_NOR_PRG_REG(idx)); 186 186 idx--; 187 187 } 188 188 189 - ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PRG_CMD); 189 + ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PRG_CMD); 190 190 if (ret) 191 191 return ret; 192 192 ··· 195 195 196 196 /* read out RX data */ 197 197 for (i = 0; i < rxlen; i++, idx--) 198 - rx[i] = readb(mt8173_nor->base + MTK_NOR_SHREG(idx)); 198 + rx[i] = readb(mtk_nor->base + MTK_NOR_SHREG(idx)); 199 199 200 200 return 0; 201 201 } 202 202 203 203 /* Do a WRSR (Write Status Register) command */ 204 - static int mt8173_nor_wr_sr(struct mt8173_nor *mt8173_nor, u8 sr) 204 + static int mtk_nor_wr_sr(struct mtk_nor *mtk_nor, u8 sr) 205 205 { 206 - writeb(sr, mt8173_nor->base + MTK_NOR_PRGDATA5_REG); 207 - writeb(8, mt8173_nor->base + MTK_NOR_CNT_REG); 208 - return mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_WRSR_CMD); 206 + writeb(sr, mtk_nor->base + MTK_NOR_PRGDATA5_REG); 207 + writeb(8, mtk_nor->base + MTK_NOR_CNT_REG); 208 + return mtk_nor_execute_cmd(mtk_nor, MTK_NOR_WRSR_CMD); 209 209 } 210 210 211 - static int mt8173_nor_write_buffer_enable(struct mt8173_nor *mt8173_nor) 211 + static int mtk_nor_write_buffer_enable(struct mtk_nor *mtk_nor) 212 212 { 213 213 u8 reg; 214 214 ··· 216 216 * 0: pre-fetch buffer use for read 217 217 * 1: pre-fetch buffer use for page program 218 218 */ 219 - writel(MTK_NOR_WR_BUF_ENABLE, mt8173_nor->base + MTK_NOR_CFG2_REG); 220 - return readb_poll_timeout(mt8173_nor->base + MTK_NOR_CFG2_REG, reg, 219 + writel(MTK_NOR_WR_BUF_ENABLE, mtk_nor->base + MTK_NOR_CFG2_REG); 220 + return readb_poll_timeout(mtk_nor->base + MTK_NOR_CFG2_REG, reg, 221 221 0x01 == (reg & 0x01), 100, 10000); 222 222 } 223 223 224 - static int mt8173_nor_write_buffer_disable(struct mt8173_nor *mt8173_nor) 224 + static int mtk_nor_write_buffer_disable(struct mtk_nor *mtk_nor) 225 225 { 226 226 u8 reg; 227 227 228 - writel(MTK_NOR_WR_BUF_DISABLE, mt8173_nor->base + MTK_NOR_CFG2_REG); 229 - return readb_poll_timeout(mt8173_nor->base + MTK_NOR_CFG2_REG, reg, 228 + writel(MTK_NOR_WR_BUF_DISABLE, mtk_nor->base + MTK_NOR_CFG2_REG); 229 + return readb_poll_timeout(mtk_nor->base + MTK_NOR_CFG2_REG, reg, 230 230 MTK_NOR_WR_BUF_DISABLE == (reg & 0x1), 100, 231 231 10000); 232 232 } 233 233 234 - static void mt8173_nor_set_addr_width(struct mt8173_nor *mt8173_nor) 234 + static void mtk_nor_set_addr_width(struct mtk_nor *mtk_nor) 235 235 { 236 236 u8 val; 237 - struct spi_nor *nor = &mt8173_nor->nor; 237 + struct spi_nor *nor = &mtk_nor->nor; 238 238 239 - val = readb(mt8173_nor->base + MTK_NOR_DUAL_REG); 239 + val = readb(mtk_nor->base + MTK_NOR_DUAL_REG); 240 240 241 241 switch (nor->addr_width) { 242 242 case 3: ··· 246 246 val |= MTK_NOR_4B_ADDR_EN; 247 247 break; 248 248 default: 249 - dev_warn(mt8173_nor->dev, "Unexpected address width %u.\n", 249 + dev_warn(mtk_nor->dev, "Unexpected address width %u.\n", 250 250 nor->addr_width); 251 251 break; 252 252 } 253 253 254 - writeb(val, mt8173_nor->base + MTK_NOR_DUAL_REG); 254 + writeb(val, mtk_nor->base + MTK_NOR_DUAL_REG); 255 255 } 256 256 257 - static void mt8173_nor_set_addr(struct mt8173_nor *mt8173_nor, u32 addr) 257 + static void mtk_nor_set_addr(struct mtk_nor *mtk_nor, u32 addr) 258 258 { 259 259 int i; 260 260 261 - mt8173_nor_set_addr_width(mt8173_nor); 261 + mtk_nor_set_addr_width(mtk_nor); 262 262 263 263 for (i = 0; i < 3; i++) { 264 - writeb(addr & 0xff, mt8173_nor->base + MTK_NOR_RADR0_REG + i * 4); 264 + writeb(addr & 0xff, mtk_nor->base + MTK_NOR_RADR0_REG + i * 4); 265 265 addr >>= 8; 266 266 } 267 267 /* Last register is non-contiguous */ 268 - writeb(addr & 0xff, mt8173_nor->base + MTK_NOR_RADR3_REG); 268 + writeb(addr & 0xff, mtk_nor->base + MTK_NOR_RADR3_REG); 269 269 } 270 270 271 - static ssize_t mt8173_nor_read(struct spi_nor *nor, loff_t from, size_t length, 272 - u_char *buffer) 271 + static ssize_t mtk_nor_read(struct spi_nor *nor, loff_t from, size_t length, 272 + u_char *buffer) 273 273 { 274 274 int i, ret; 275 275 int addr = (int)from; 276 276 u8 *buf = (u8 *)buffer; 277 - struct mt8173_nor *mt8173_nor = nor->priv; 277 + struct mtk_nor *mtk_nor = nor->priv; 278 278 279 279 /* set mode for fast read mode ,dual mode or quad mode */ 280 - mt8173_nor_set_read_mode(mt8173_nor); 281 - mt8173_nor_set_addr(mt8173_nor, addr); 280 + mtk_nor_set_read_mode(mtk_nor); 281 + mtk_nor_set_addr(mtk_nor, addr); 282 282 283 283 for (i = 0; i < length; i++) { 284 - ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PIO_READ_CMD); 284 + ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PIO_READ_CMD); 285 285 if (ret < 0) 286 286 return ret; 287 - buf[i] = readb(mt8173_nor->base + MTK_NOR_RDATA_REG); 287 + buf[i] = readb(mtk_nor->base + MTK_NOR_RDATA_REG); 288 288 } 289 289 return length; 290 290 } 291 291 292 - static int mt8173_nor_write_single_byte(struct mt8173_nor *mt8173_nor, 293 - int addr, int length, u8 *data) 292 + static int mtk_nor_write_single_byte(struct mtk_nor *mtk_nor, 293 + int addr, int length, u8 *data) 294 294 { 295 295 int i, ret; 296 296 297 - mt8173_nor_set_addr(mt8173_nor, addr); 297 + mtk_nor_set_addr(mtk_nor, addr); 298 298 299 299 for (i = 0; i < length; i++) { 300 - writeb(*data++, mt8173_nor->base + MTK_NOR_WDATA_REG); 301 - ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_PIO_WR_CMD); 300 + writeb(*data++, mtk_nor->base + MTK_NOR_WDATA_REG); 301 + ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PIO_WR_CMD); 302 302 if (ret < 0) 303 303 return ret; 304 304 } 305 305 return 0; 306 306 } 307 307 308 - static int mt8173_nor_write_buffer(struct mt8173_nor *mt8173_nor, int addr, 309 - const u8 *buf) 308 + static int mtk_nor_write_buffer(struct mtk_nor *mtk_nor, int addr, 309 + const u8 *buf) 310 310 { 311 311 int i, bufidx, data; 312 312 313 - mt8173_nor_set_addr(mt8173_nor, addr); 313 + mtk_nor_set_addr(mtk_nor, addr); 314 314 315 315 bufidx = 0; 316 316 for (i = 0; i < SFLASH_WRBUF_SIZE; i += 4) { 317 317 data = buf[bufidx + 3]<<24 | buf[bufidx + 2]<<16 | 318 318 buf[bufidx + 1]<<8 | buf[bufidx]; 319 319 bufidx += 4; 320 - writel(data, mt8173_nor->base + MTK_NOR_PP_DATA_REG); 320 + writel(data, mtk_nor->base + MTK_NOR_PP_DATA_REG); 321 321 } 322 - return mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_WR_CMD); 322 + return mtk_nor_execute_cmd(mtk_nor, MTK_NOR_WR_CMD); 323 323 } 324 324 325 - static ssize_t mt8173_nor_write(struct spi_nor *nor, loff_t to, size_t len, 326 - const u_char *buf) 325 + static ssize_t mtk_nor_write(struct spi_nor *nor, loff_t to, size_t len, 326 + const u_char *buf) 327 327 { 328 328 int ret; 329 - struct mt8173_nor *mt8173_nor = nor->priv; 329 + struct mtk_nor *mtk_nor = nor->priv; 330 330 size_t i; 331 331 332 - ret = mt8173_nor_write_buffer_enable(mt8173_nor); 332 + ret = mtk_nor_write_buffer_enable(mtk_nor); 333 333 if (ret < 0) { 334 - dev_warn(mt8173_nor->dev, "write buffer enable failed!\n"); 334 + dev_warn(mtk_nor->dev, "write buffer enable failed!\n"); 335 335 return ret; 336 336 } 337 337 338 338 for (i = 0; i + SFLASH_WRBUF_SIZE <= len; i += SFLASH_WRBUF_SIZE) { 339 - ret = mt8173_nor_write_buffer(mt8173_nor, to, buf); 339 + ret = mtk_nor_write_buffer(mtk_nor, to, buf); 340 340 if (ret < 0) { 341 - dev_err(mt8173_nor->dev, "write buffer failed!\n"); 341 + dev_err(mtk_nor->dev, "write buffer failed!\n"); 342 342 return ret; 343 343 } 344 344 to += SFLASH_WRBUF_SIZE; 345 345 buf += SFLASH_WRBUF_SIZE; 346 346 } 347 - ret = mt8173_nor_write_buffer_disable(mt8173_nor); 347 + ret = mtk_nor_write_buffer_disable(mtk_nor); 348 348 if (ret < 0) { 349 - dev_warn(mt8173_nor->dev, "write buffer disable failed!\n"); 349 + dev_warn(mtk_nor->dev, "write buffer disable failed!\n"); 350 350 return ret; 351 351 } 352 352 353 353 if (i < len) { 354 - ret = mt8173_nor_write_single_byte(mt8173_nor, to, 355 - (int)(len - i), (u8 *)buf); 354 + ret = mtk_nor_write_single_byte(mtk_nor, to, 355 + (int)(len - i), (u8 *)buf); 356 356 if (ret < 0) { 357 - dev_err(mt8173_nor->dev, "write single byte failed!\n"); 357 + dev_err(mtk_nor->dev, "write single byte failed!\n"); 358 358 return ret; 359 359 } 360 360 } ··· 362 362 return len; 363 363 } 364 364 365 - static int mt8173_nor_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) 365 + static int mtk_nor_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) 366 366 { 367 367 int ret; 368 - struct mt8173_nor *mt8173_nor = nor->priv; 368 + struct mtk_nor *mtk_nor = nor->priv; 369 369 370 370 switch (opcode) { 371 371 case SPINOR_OP_RDSR: 372 - ret = mt8173_nor_execute_cmd(mt8173_nor, MTK_NOR_RDSR_CMD); 372 + ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_RDSR_CMD); 373 373 if (ret < 0) 374 374 return ret; 375 375 if (len == 1) 376 - *buf = readb(mt8173_nor->base + MTK_NOR_RDSR_REG); 376 + *buf = readb(mtk_nor->base + MTK_NOR_RDSR_REG); 377 377 else 378 - dev_err(mt8173_nor->dev, "len should be 1 for read status!\n"); 378 + dev_err(mtk_nor->dev, "len should be 1 for read status!\n"); 379 379 break; 380 380 default: 381 - ret = mt8173_nor_do_tx_rx(mt8173_nor, opcode, NULL, 0, buf, len); 381 + ret = mtk_nor_do_tx_rx(mtk_nor, opcode, NULL, 0, buf, len); 382 382 break; 383 383 } 384 384 return ret; 385 385 } 386 386 387 - static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, 388 - int len) 387 + static int mtk_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, 388 + int len) 389 389 { 390 390 int ret; 391 - struct mt8173_nor *mt8173_nor = nor->priv; 391 + struct mtk_nor *mtk_nor = nor->priv; 392 392 393 393 switch (opcode) { 394 394 case SPINOR_OP_WRSR: 395 395 /* We only handle 1 byte */ 396 - ret = mt8173_nor_wr_sr(mt8173_nor, *buf); 396 + ret = mtk_nor_wr_sr(mtk_nor, *buf); 397 397 break; 398 398 default: 399 - ret = mt8173_nor_do_tx_rx(mt8173_nor, opcode, buf, len, NULL, 0); 399 + ret = mtk_nor_do_tx_rx(mtk_nor, opcode, buf, len, NULL, 0); 400 400 if (ret) 401 - dev_warn(mt8173_nor->dev, "write reg failure!\n"); 401 + dev_warn(mtk_nor->dev, "write reg failure!\n"); 402 402 break; 403 403 } 404 404 return ret; 405 405 } 406 406 407 - static void mt8173_nor_disable_clk(struct mt8173_nor *mt8173_nor) 407 + static void mtk_nor_disable_clk(struct mtk_nor *mtk_nor) 408 408 { 409 - clk_disable_unprepare(mt8173_nor->spi_clk); 410 - clk_disable_unprepare(mt8173_nor->nor_clk); 409 + clk_disable_unprepare(mtk_nor->spi_clk); 410 + clk_disable_unprepare(mtk_nor->nor_clk); 411 411 } 412 412 413 - static int mt8173_nor_enable_clk(struct mt8173_nor *mt8173_nor) 413 + static int mtk_nor_enable_clk(struct mtk_nor *mtk_nor) 414 414 { 415 415 int ret; 416 416 417 - ret = clk_prepare_enable(mt8173_nor->spi_clk); 417 + ret = clk_prepare_enable(mtk_nor->spi_clk); 418 418 if (ret) 419 419 return ret; 420 420 421 - ret = clk_prepare_enable(mt8173_nor->nor_clk); 421 + ret = clk_prepare_enable(mtk_nor->nor_clk); 422 422 if (ret) { 423 - clk_disable_unprepare(mt8173_nor->spi_clk); 423 + clk_disable_unprepare(mtk_nor->spi_clk); 424 424 return ret; 425 425 } 426 426 427 427 return 0; 428 428 } 429 429 430 - static int mtk_nor_init(struct mt8173_nor *mt8173_nor, 430 + static int mtk_nor_init(struct mtk_nor *mtk_nor, 431 431 struct device_node *flash_node) 432 432 { 433 433 const struct spi_nor_hwcaps hwcaps = { ··· 439 439 struct spi_nor *nor; 440 440 441 441 /* initialize controller to accept commands */ 442 - writel(MTK_NOR_ENABLE_SF_CMD, mt8173_nor->base + MTK_NOR_WRPROT_REG); 442 + writel(MTK_NOR_ENABLE_SF_CMD, mtk_nor->base + MTK_NOR_WRPROT_REG); 443 443 444 - nor = &mt8173_nor->nor; 445 - nor->dev = mt8173_nor->dev; 446 - nor->priv = mt8173_nor; 444 + nor = &mtk_nor->nor; 445 + nor->dev = mtk_nor->dev; 446 + nor->priv = mtk_nor; 447 447 spi_nor_set_flash_node(nor, flash_node); 448 448 449 449 /* fill the hooks to spi nor */ 450 - nor->read = mt8173_nor_read; 451 - nor->read_reg = mt8173_nor_read_reg; 452 - nor->write = mt8173_nor_write; 453 - nor->write_reg = mt8173_nor_write_reg; 450 + nor->read = mtk_nor_read; 451 + nor->read_reg = mtk_nor_read_reg; 452 + nor->write = mtk_nor_write; 453 + nor->write_reg = mtk_nor_write_reg; 454 454 nor->mtd.name = "mtk_nor"; 455 455 /* initialized with NULL */ 456 456 ret = spi_nor_scan(nor, NULL, &hwcaps); ··· 465 465 struct device_node *flash_np; 466 466 struct resource *res; 467 467 int ret; 468 - struct mt8173_nor *mt8173_nor; 468 + struct mtk_nor *mtk_nor; 469 469 470 470 if (!pdev->dev.of_node) { 471 471 dev_err(&pdev->dev, "No DT found\n"); 472 472 return -EINVAL; 473 473 } 474 474 475 - mt8173_nor = devm_kzalloc(&pdev->dev, sizeof(*mt8173_nor), GFP_KERNEL); 476 - if (!mt8173_nor) 475 + mtk_nor = devm_kzalloc(&pdev->dev, sizeof(*mtk_nor), GFP_KERNEL); 476 + if (!mtk_nor) 477 477 return -ENOMEM; 478 - platform_set_drvdata(pdev, mt8173_nor); 478 + platform_set_drvdata(pdev, mtk_nor); 479 479 480 480 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 481 - mt8173_nor->base = devm_ioremap_resource(&pdev->dev, res); 482 - if (IS_ERR(mt8173_nor->base)) 483 - return PTR_ERR(mt8173_nor->base); 481 + mtk_nor->base = devm_ioremap_resource(&pdev->dev, res); 482 + if (IS_ERR(mtk_nor->base)) 483 + return PTR_ERR(mtk_nor->base); 484 484 485 - mt8173_nor->spi_clk = devm_clk_get(&pdev->dev, "spi"); 486 - if (IS_ERR(mt8173_nor->spi_clk)) 487 - return PTR_ERR(mt8173_nor->spi_clk); 485 + mtk_nor->spi_clk = devm_clk_get(&pdev->dev, "spi"); 486 + if (IS_ERR(mtk_nor->spi_clk)) 487 + return PTR_ERR(mtk_nor->spi_clk); 488 488 489 - mt8173_nor->nor_clk = devm_clk_get(&pdev->dev, "sf"); 490 - if (IS_ERR(mt8173_nor->nor_clk)) 491 - return PTR_ERR(mt8173_nor->nor_clk); 489 + mtk_nor->nor_clk = devm_clk_get(&pdev->dev, "sf"); 490 + if (IS_ERR(mtk_nor->nor_clk)) 491 + return PTR_ERR(mtk_nor->nor_clk); 492 492 493 - mt8173_nor->dev = &pdev->dev; 493 + mtk_nor->dev = &pdev->dev; 494 494 495 - ret = mt8173_nor_enable_clk(mt8173_nor); 495 + ret = mtk_nor_enable_clk(mtk_nor); 496 496 if (ret) 497 497 return ret; 498 498 ··· 503 503 ret = -ENODEV; 504 504 goto nor_free; 505 505 } 506 - ret = mtk_nor_init(mt8173_nor, flash_np); 506 + ret = mtk_nor_init(mtk_nor, flash_np); 507 507 508 508 nor_free: 509 509 if (ret) 510 - mt8173_nor_disable_clk(mt8173_nor); 510 + mtk_nor_disable_clk(mtk_nor); 511 511 512 512 return ret; 513 513 } 514 514 515 515 static int mtk_nor_drv_remove(struct platform_device *pdev) 516 516 { 517 - struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev); 517 + struct mtk_nor *mtk_nor = platform_get_drvdata(pdev); 518 518 519 - mt8173_nor_disable_clk(mt8173_nor); 519 + mtk_nor_disable_clk(mtk_nor); 520 520 521 521 return 0; 522 522 } ··· 524 524 #ifdef CONFIG_PM_SLEEP 525 525 static int mtk_nor_suspend(struct device *dev) 526 526 { 527 - struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev); 527 + struct mtk_nor *mtk_nor = dev_get_drvdata(dev); 528 528 529 - mt8173_nor_disable_clk(mt8173_nor); 529 + mtk_nor_disable_clk(mtk_nor); 530 530 531 531 return 0; 532 532 } 533 533 534 534 static int mtk_nor_resume(struct device *dev) 535 535 { 536 - struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev); 536 + struct mtk_nor *mtk_nor = dev_get_drvdata(dev); 537 537 538 - return mt8173_nor_enable_clk(mt8173_nor); 538 + return mtk_nor_enable_clk(mtk_nor); 539 539 } 540 540 541 541 static const struct dev_pm_ops mtk_nor_dev_pm_ops = {
+59 -16
drivers/mtd/spi-nor/spi-nor.c
··· 330 330 int fsr = read_fsr(nor); 331 331 if (fsr < 0) 332 332 return fsr; 333 - else 334 - return fsr & FSR_READY; 333 + 334 + if (fsr & (FSR_E_ERR | FSR_P_ERR)) { 335 + if (fsr & FSR_E_ERR) 336 + dev_err(nor->dev, "Erase operation failed.\n"); 337 + else 338 + dev_err(nor->dev, "Program operation failed.\n"); 339 + 340 + if (fsr & FSR_PT_ERR) 341 + dev_err(nor->dev, 342 + "Attempted to modify a protected sector.\n"); 343 + 344 + nor->write_reg(nor, SPINOR_OP_CLFSR, NULL, 0); 345 + return -EIO; 346 + } 347 + 348 + return fsr & FSR_READY; 335 349 } 336 350 337 351 static int spi_nor_ready(struct spi_nor *nor) ··· 566 552 return ret; 567 553 } 568 554 555 + /* Write status register and ensure bits in mask match written values */ 556 + static int write_sr_and_check(struct spi_nor *nor, u8 status_new, u8 mask) 557 + { 558 + int ret; 559 + 560 + write_enable(nor); 561 + ret = write_sr(nor, status_new); 562 + if (ret) 563 + return ret; 564 + 565 + ret = spi_nor_wait_till_ready(nor); 566 + if (ret) 567 + return ret; 568 + 569 + ret = read_sr(nor); 570 + if (ret < 0) 571 + return ret; 572 + 573 + return ((ret & mask) != (status_new & mask)) ? -EIO : 0; 574 + } 575 + 569 576 static void stm_get_locked_range(struct spi_nor *nor, u8 sr, loff_t *ofs, 570 577 uint64_t *len) 571 578 { ··· 685 650 loff_t lock_len; 686 651 bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB; 687 652 bool use_top; 688 - int ret; 689 653 690 654 status_old = read_sr(nor); 691 655 if (status_old < 0) ··· 748 714 if ((status_new & mask) < (status_old & mask)) 749 715 return -EINVAL; 750 716 751 - write_enable(nor); 752 - ret = write_sr(nor, status_new); 753 - if (ret) 754 - return ret; 755 - return spi_nor_wait_till_ready(nor); 717 + return write_sr_and_check(nor, status_new, mask); 756 718 } 757 719 758 720 /* ··· 765 735 loff_t lock_len; 766 736 bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB; 767 737 bool use_top; 768 - int ret; 769 738 770 739 status_old = read_sr(nor); 771 740 if (status_old < 0) ··· 831 802 if ((status_new & mask) > (status_old & mask)) 832 803 return -EINVAL; 833 804 834 - write_enable(nor); 835 - ret = write_sr(nor, status_new); 836 - if (ret) 837 - return ret; 838 - return spi_nor_wait_till_ready(nor); 805 + return write_sr_and_check(nor, status_new, mask); 839 806 } 840 807 841 808 /* ··· 1045 1020 { "640s33b", INFO(0x898913, 0, 64 * 1024, 128, 0) }, 1046 1021 1047 1022 /* ISSI */ 1048 - { "is25cd512", INFO(0x7f9d20, 0, 32 * 1024, 2, SECT_4K) }, 1023 + { "is25cd512", INFO(0x7f9d20, 0, 32 * 1024, 2, SECT_4K) }, 1024 + { "is25lq040b", INFO(0x9d4013, 0, 64 * 1024, 8, 1025 + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, 1026 + { "is25lp080d", INFO(0x9d6014, 0, 64 * 1024, 16, 1027 + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, 1028 + { "is25lp128", INFO(0x9d6018, 0, 64 * 1024, 256, 1029 + SECT_4K | SPI_NOR_DUAL_READ) }, 1049 1030 1050 1031 /* Macronix */ 1051 1032 { "mx25l512e", INFO(0xc22010, 0, 64 * 1024, 1, SECT_4K) }, ··· 1096 1065 { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K_PMC) }, 1097 1066 { "pm25lq032", INFO(0x7f9d46, 0, 64 * 1024, 64, SECT_4K) }, 1098 1067 1099 - /* Spansion -- single (large) sector size only, at least 1068 + /* Spansion/Cypress -- single (large) sector size only, at least 1100 1069 * for the chips listed here (without boot sectors). 1101 1070 */ 1102 1071 { "s25sl032p", INFO(0x010215, 0x4d00, 64 * 1024, 64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, ··· 1125 1094 { "s25fl204k", INFO(0x014013, 0, 64 * 1024, 8, SECT_4K | SPI_NOR_DUAL_READ) }, 1126 1095 { "s25fl208k", INFO(0x014014, 0, 64 * 1024, 16, SECT_4K | SPI_NOR_DUAL_READ) }, 1127 1096 { "s25fl064l", INFO(0x016017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, 1097 + { "s25fl128l", INFO(0x016018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, 1098 + { "s25fl256l", INFO(0x016019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, 1128 1099 1129 1100 /* SST -- large erase sizes are "overlays", "sectors" are 4K */ 1130 1101 { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024, 8, SECT_4K | SST_WRITE) }, ··· 2745 2712 if (ret) 2746 2713 dev_err(dev, "resume() failed\n"); 2747 2714 } 2715 + 2716 + void spi_nor_restore(struct spi_nor *nor) 2717 + { 2718 + /* restore the addressing mode */ 2719 + if ((nor->addr_width == 4) && 2720 + (JEDEC_MFR(nor->info) != SNOR_MFR_SPANSION) && 2721 + !(nor->info->flags & SPI_NOR_4B_OPCODES)) 2722 + set_4byte(nor, nor->info, 0); 2723 + } 2724 + EXPORT_SYMBOL_GPL(spi_nor_restore); 2748 2725 2749 2726 int spi_nor_scan(struct spi_nor *nor, const char *name, 2750 2727 const struct spi_nor_hwcaps *hwcaps)
+11 -1
include/linux/mtd/spi-nor.h
··· 61 61 #define SPINOR_OP_RDSFDP 0x5a /* Read SFDP */ 62 62 #define SPINOR_OP_RDCR 0x35 /* Read configuration register */ 63 63 #define SPINOR_OP_RDFSR 0x70 /* Read flag status register */ 64 + #define SPINOR_OP_CLFSR 0x50 /* Clear flag status register */ 64 65 65 66 /* 4-byte address opcodes - used on Spansion and some Macronix flashes. */ 66 67 #define SPINOR_OP_READ_4B 0x13 /* Read data bytes (low frequency) */ ··· 131 130 #define EVCR_QUAD_EN_MICRON BIT(7) /* Micron Quad I/O */ 132 131 133 132 /* Flag Status Register bits */ 134 - #define FSR_READY BIT(7) 133 + #define FSR_READY BIT(7) /* Device status, 0 = Busy, 1 = Ready */ 134 + #define FSR_E_ERR BIT(5) /* Erase operation status */ 135 + #define FSR_P_ERR BIT(4) /* Program operation status */ 136 + #define FSR_PT_ERR BIT(1) /* Protection error bit */ 135 137 136 138 /* Configuration Register bits. */ 137 139 #define CR_QUAD_EN_SPAN BIT(1) /* Spansion Quad I/O */ ··· 402 398 */ 403 399 int spi_nor_scan(struct spi_nor *nor, const char *name, 404 400 const struct spi_nor_hwcaps *hwcaps); 401 + 402 + /** 403 + * spi_nor_restore_addr_mode() - restore the status of SPI NOR 404 + * @nor: the spi_nor structure 405 + */ 406 + void spi_nor_restore(struct spi_nor *nor); 405 407 406 408 #endif