1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Hisilicon NAND Flash controller driver 4 * 5 * Copyright © 2012-2014 HiSilicon Technologies Co., Ltd. 6 * http://www.hisilicon.com 7 * 8 * Author: Zhou Wang <wangzhou.bry@gmail.com> 9 * The initial developer of the original code is Zhiyong Cai 10 * <caizhiyong@huawei.com> 11 */ 12 #include <linux/of.h> 13 #include <linux/mtd/mtd.h> 14 #include <linux/sizes.h> 15 #include <linux/clk.h> 16 #include <linux/slab.h> 17 #include <linux/module.h> 18 #include <linux/delay.h> 19 #include <linux/interrupt.h> 20 #include <linux/mtd/rawnand.h> 21 #include <linux/dma-mapping.h> 22 #include <linux/platform_device.h> 23 #include <linux/mtd/partitions.h> 24 25 #define HINFC504_MAX_CHIP (4) 26 #define HINFC504_W_LATCH (5) 27 #define HINFC504_R_LATCH (7) 28 #define HINFC504_RW_LATCH (3) 29 30 #define HINFC504_NFC_TIMEOUT (2 * HZ) 31 #define HINFC504_NFC_PM_TIMEOUT (1 * HZ) 32 #define HINFC504_NFC_DMA_TIMEOUT (5 * HZ) 33 #define HINFC504_CHIP_DELAY (25) 34 35 #define HINFC504_REG_BASE_ADDRESS_LEN (0x100) 36 #define HINFC504_BUFFER_BASE_ADDRESS_LEN (2048 + 128) 37 38 #define HINFC504_ADDR_CYCLE_MASK 0x4 39 40 #define HINFC504_CON 0x00 41 #define HINFC504_CON_OP_MODE_NORMAL BIT(0) 42 #define HINFC504_CON_PAGEISZE_SHIFT (1) 43 #define HINFC504_CON_PAGESIZE_MASK (0x07) 44 #define HINFC504_CON_BUS_WIDTH BIT(4) 45 #define HINFC504_CON_READY_BUSY_SEL BIT(8) 46 #define HINFC504_CON_ECCTYPE_SHIFT (9) 47 #define HINFC504_CON_ECCTYPE_MASK (0x07) 48 49 #define HINFC504_PWIDTH 0x04 50 #define SET_HINFC504_PWIDTH(_w_lcnt, _r_lcnt, _rw_hcnt) \ 51 ((_w_lcnt) | (((_r_lcnt) & 0x0F) << 4) | (((_rw_hcnt) & 0x0F) << 8)) 52 53 #define HINFC504_CMD 0x0C 54 #define HINFC504_ADDRL 0x10 55 #define HINFC504_ADDRH 0x14 56 #define HINFC504_DATA_NUM 0x18 57 58 #define HINFC504_OP 0x1C 59 #define HINFC504_OP_READ_DATA_EN BIT(1) 60 #define HINFC504_OP_WAIT_READY_EN BIT(2) 61 #define HINFC504_OP_CMD2_EN BIT(3) 62 #define HINFC504_OP_WRITE_DATA_EN BIT(4) 63 #define HINFC504_OP_ADDR_EN BIT(5) 64 #define HINFC504_OP_CMD1_EN BIT(6) 65 #define HINFC504_OP_NF_CS_SHIFT (7) 66 #define HINFC504_OP_NF_CS_MASK (3) 67 #define HINFC504_OP_ADDR_CYCLE_SHIFT (9) 68 #define HINFC504_OP_ADDR_CYCLE_MASK (7) 69 70 #define HINFC504_STATUS 0x20 71 #define HINFC504_READY BIT(0) 72 73 #define HINFC504_INTEN 0x24 74 #define HINFC504_INTEN_DMA BIT(9) 75 #define HINFC504_INTEN_UE BIT(6) 76 #define HINFC504_INTEN_CE BIT(5) 77 78 #define HINFC504_INTS 0x28 79 #define HINFC504_INTS_DMA BIT(9) 80 #define HINFC504_INTS_UE BIT(6) 81 #define HINFC504_INTS_CE BIT(5) 82 83 #define HINFC504_INTCLR 0x2C 84 #define HINFC504_INTCLR_DMA BIT(9) 85 #define HINFC504_INTCLR_UE BIT(6) 86 #define HINFC504_INTCLR_CE BIT(5) 87 88 #define HINFC504_ECC_STATUS 0x5C 89 #define HINFC504_ECC_16_BIT_SHIFT 12 90 91 #define HINFC504_DMA_CTRL 0x60 92 #define HINFC504_DMA_CTRL_DMA_START BIT(0) 93 #define HINFC504_DMA_CTRL_WE BIT(1) 94 #define HINFC504_DMA_CTRL_DATA_AREA_EN BIT(2) 95 #define HINFC504_DMA_CTRL_OOB_AREA_EN BIT(3) 96 #define HINFC504_DMA_CTRL_BURST4_EN BIT(4) 97 #define HINFC504_DMA_CTRL_BURST8_EN BIT(5) 98 #define HINFC504_DMA_CTRL_BURST16_EN BIT(6) 99 #define HINFC504_DMA_CTRL_ADDR_NUM_SHIFT (7) 100 #define HINFC504_DMA_CTRL_ADDR_NUM_MASK (1) 101 #define HINFC504_DMA_CTRL_CS_SHIFT (8) 102 #define HINFC504_DMA_CTRL_CS_MASK (0x03) 103 104 #define HINFC504_DMA_ADDR_DATA 0x64 105 #define HINFC504_DMA_ADDR_OOB 0x68 106 107 #define HINFC504_DMA_LEN 0x6C 108 #define HINFC504_DMA_LEN_OOB_SHIFT (16) 109 #define HINFC504_DMA_LEN_OOB_MASK (0xFFF) 110 111 #define HINFC504_DMA_PARA 0x70 112 #define HINFC504_DMA_PARA_DATA_RW_EN BIT(0) 113 #define HINFC504_DMA_PARA_OOB_RW_EN BIT(1) 114 #define HINFC504_DMA_PARA_DATA_EDC_EN BIT(2) 115 #define HINFC504_DMA_PARA_OOB_EDC_EN BIT(3) 116 #define HINFC504_DMA_PARA_DATA_ECC_EN BIT(4) 117 #define HINFC504_DMA_PARA_OOB_ECC_EN BIT(5) 118 119 #define HINFC_VERSION 0x74 120 #define HINFC504_LOG_READ_ADDR 0x7C 121 #define HINFC504_LOG_READ_LEN 0x80 122 123 #define HINFC504_NANDINFO_LEN 0x10 124 125 struct hinfc_host { 126 struct nand_chip chip; 127 struct device *dev; 128 void __iomem *iobase; 129 void __iomem *mmio; 130 struct completion cmd_complete; 131 unsigned int offset; 132 unsigned int command; 133 int chipselect; 134 unsigned int addr_cycle; 135 u32 addr_value[2]; 136 u32 cache_addr_value[2]; 137 char *buffer; 138 dma_addr_t dma_buffer; 139 dma_addr_t dma_oob; 140 int version; 141 unsigned int irq_status; /* interrupt status */ 142 }; 143 144 static inline unsigned int hinfc_read(struct hinfc_host *host, unsigned int reg) 145 { 146 return readl(host->iobase + reg); 147 } 148 149 static inline void hinfc_write(struct hinfc_host *host, unsigned int value, 150 unsigned int reg) 151 { 152 writel(value, host->iobase + reg); 153 } 154 155 static void wait_controller_finished(struct hinfc_host *host) 156 { 157 unsigned long timeout = jiffies + HINFC504_NFC_TIMEOUT; 158 int val; 159 160 while (time_before(jiffies, timeout)) { 161 val = hinfc_read(host, HINFC504_STATUS); 162 if (host->command == NAND_CMD_ERASE2) { 163 /* nfc is ready */ 164 while (!(val & HINFC504_READY)) { 165 usleep_range(500, 1000); 166 val = hinfc_read(host, HINFC504_STATUS); 167 } 168 return; 169 } 170 171 if (val & HINFC504_READY) 172 return; 173 } 174 175 /* wait cmd timeout */ 176 dev_err(host->dev, "Wait NAND controller exec cmd timeout.\n"); 177 } 178 179 static void hisi_nfc_dma_transfer(struct hinfc_host *host, int todev) 180 { 181 struct nand_chip *chip = &host->chip; 182 struct mtd_info *mtd = nand_to_mtd(chip); 183 unsigned long val; 184 int ret; 185 186 hinfc_write(host, host->dma_buffer, HINFC504_DMA_ADDR_DATA); 187 hinfc_write(host, host->dma_oob, HINFC504_DMA_ADDR_OOB); 188 189 if (chip->ecc.mode == NAND_ECC_NONE) { 190 hinfc_write(host, ((mtd->oobsize & HINFC504_DMA_LEN_OOB_MASK) 191 << HINFC504_DMA_LEN_OOB_SHIFT), HINFC504_DMA_LEN); 192 193 hinfc_write(host, HINFC504_DMA_PARA_DATA_RW_EN 194 | HINFC504_DMA_PARA_OOB_RW_EN, HINFC504_DMA_PARA); 195 } else { 196 if (host->command == NAND_CMD_READOOB) 197 hinfc_write(host, HINFC504_DMA_PARA_OOB_RW_EN 198 | HINFC504_DMA_PARA_OOB_EDC_EN 199 | HINFC504_DMA_PARA_OOB_ECC_EN, HINFC504_DMA_PARA); 200 else 201 hinfc_write(host, HINFC504_DMA_PARA_DATA_RW_EN 202 | HINFC504_DMA_PARA_OOB_RW_EN 203 | HINFC504_DMA_PARA_DATA_EDC_EN 204 | HINFC504_DMA_PARA_OOB_EDC_EN 205 | HINFC504_DMA_PARA_DATA_ECC_EN 206 | HINFC504_DMA_PARA_OOB_ECC_EN, HINFC504_DMA_PARA); 207 208 } 209 210 val = (HINFC504_DMA_CTRL_DMA_START | HINFC504_DMA_CTRL_BURST4_EN 211 | HINFC504_DMA_CTRL_BURST8_EN | HINFC504_DMA_CTRL_BURST16_EN 212 | HINFC504_DMA_CTRL_DATA_AREA_EN | HINFC504_DMA_CTRL_OOB_AREA_EN 213 | ((host->addr_cycle == 4 ? 1 : 0) 214 << HINFC504_DMA_CTRL_ADDR_NUM_SHIFT) 215 | ((host->chipselect & HINFC504_DMA_CTRL_CS_MASK) 216 << HINFC504_DMA_CTRL_CS_SHIFT)); 217 218 if (todev) 219 val |= HINFC504_DMA_CTRL_WE; 220 221 init_completion(&host->cmd_complete); 222 223 hinfc_write(host, val, HINFC504_DMA_CTRL); 224 ret = wait_for_completion_timeout(&host->cmd_complete, 225 HINFC504_NFC_DMA_TIMEOUT); 226 227 if (!ret) { 228 dev_err(host->dev, "DMA operation(irq) timeout!\n"); 229 /* sanity check */ 230 val = hinfc_read(host, HINFC504_DMA_CTRL); 231 if (!(val & HINFC504_DMA_CTRL_DMA_START)) 232 dev_err(host->dev, "DMA is already done but without irq ACK!\n"); 233 else 234 dev_err(host->dev, "DMA is really timeout!\n"); 235 } 236 } 237 238 static int hisi_nfc_send_cmd_pageprog(struct hinfc_host *host) 239 { 240 host->addr_value[0] &= 0xffff0000; 241 242 hinfc_write(host, host->addr_value[0], HINFC504_ADDRL); 243 hinfc_write(host, host->addr_value[1], HINFC504_ADDRH); 244 hinfc_write(host, NAND_CMD_PAGEPROG << 8 | NAND_CMD_SEQIN, 245 HINFC504_CMD); 246 247 hisi_nfc_dma_transfer(host, 1); 248 249 return 0; 250 } 251 252 static int hisi_nfc_send_cmd_readstart(struct hinfc_host *host) 253 { 254 struct mtd_info *mtd = nand_to_mtd(&host->chip); 255 256 if ((host->addr_value[0] == host->cache_addr_value[0]) && 257 (host->addr_value[1] == host->cache_addr_value[1])) 258 return 0; 259 260 host->addr_value[0] &= 0xffff0000; 261 262 hinfc_write(host, host->addr_value[0], HINFC504_ADDRL); 263 hinfc_write(host, host->addr_value[1], HINFC504_ADDRH); 264 hinfc_write(host, NAND_CMD_READSTART << 8 | NAND_CMD_READ0, 265 HINFC504_CMD); 266 267 hinfc_write(host, 0, HINFC504_LOG_READ_ADDR); 268 hinfc_write(host, mtd->writesize + mtd->oobsize, 269 HINFC504_LOG_READ_LEN); 270 271 hisi_nfc_dma_transfer(host, 0); 272 273 host->cache_addr_value[0] = host->addr_value[0]; 274 host->cache_addr_value[1] = host->addr_value[1]; 275 276 return 0; 277 } 278 279 static int hisi_nfc_send_cmd_erase(struct hinfc_host *host) 280 { 281 hinfc_write(host, host->addr_value[0], HINFC504_ADDRL); 282 hinfc_write(host, (NAND_CMD_ERASE2 << 8) | NAND_CMD_ERASE1, 283 HINFC504_CMD); 284 285 hinfc_write(host, HINFC504_OP_WAIT_READY_EN 286 | HINFC504_OP_CMD2_EN 287 | HINFC504_OP_CMD1_EN 288 | HINFC504_OP_ADDR_EN 289 | ((host->chipselect & HINFC504_OP_NF_CS_MASK) 290 << HINFC504_OP_NF_CS_SHIFT) 291 | ((host->addr_cycle & HINFC504_OP_ADDR_CYCLE_MASK) 292 << HINFC504_OP_ADDR_CYCLE_SHIFT), 293 HINFC504_OP); 294 295 wait_controller_finished(host); 296 297 return 0; 298 } 299 300 static int hisi_nfc_send_cmd_readid(struct hinfc_host *host) 301 { 302 hinfc_write(host, HINFC504_NANDINFO_LEN, HINFC504_DATA_NUM); 303 hinfc_write(host, NAND_CMD_READID, HINFC504_CMD); 304 hinfc_write(host, 0, HINFC504_ADDRL); 305 306 hinfc_write(host, HINFC504_OP_CMD1_EN | HINFC504_OP_ADDR_EN 307 | HINFC504_OP_READ_DATA_EN 308 | ((host->chipselect & HINFC504_OP_NF_CS_MASK) 309 << HINFC504_OP_NF_CS_SHIFT) 310 | 1 << HINFC504_OP_ADDR_CYCLE_SHIFT, HINFC504_OP); 311 312 wait_controller_finished(host); 313 314 return 0; 315 } 316 317 static int hisi_nfc_send_cmd_status(struct hinfc_host *host) 318 { 319 hinfc_write(host, HINFC504_NANDINFO_LEN, HINFC504_DATA_NUM); 320 hinfc_write(host, NAND_CMD_STATUS, HINFC504_CMD); 321 hinfc_write(host, HINFC504_OP_CMD1_EN 322 | HINFC504_OP_READ_DATA_EN 323 | ((host->chipselect & HINFC504_OP_NF_CS_MASK) 324 << HINFC504_OP_NF_CS_SHIFT), 325 HINFC504_OP); 326 327 wait_controller_finished(host); 328 329 return 0; 330 } 331 332 static int hisi_nfc_send_cmd_reset(struct hinfc_host *host, int chipselect) 333 { 334 hinfc_write(host, NAND_CMD_RESET, HINFC504_CMD); 335 336 hinfc_write(host, HINFC504_OP_CMD1_EN 337 | ((chipselect & HINFC504_OP_NF_CS_MASK) 338 << HINFC504_OP_NF_CS_SHIFT) 339 | HINFC504_OP_WAIT_READY_EN, 340 HINFC504_OP); 341 342 wait_controller_finished(host); 343 344 return 0; 345 } 346 347 static void hisi_nfc_select_chip(struct nand_chip *chip, int chipselect) 348 { 349 struct hinfc_host *host = nand_get_controller_data(chip); 350 351 if (chipselect < 0) 352 return; 353 354 host->chipselect = chipselect; 355 } 356 357 static uint8_t hisi_nfc_read_byte(struct nand_chip *chip) 358 { 359 struct hinfc_host *host = nand_get_controller_data(chip); 360 361 if (host->command == NAND_CMD_STATUS) 362 return *(uint8_t *)(host->mmio); 363 364 host->offset++; 365 366 if (host->command == NAND_CMD_READID) 367 return *(uint8_t *)(host->mmio + host->offset - 1); 368 369 return *(uint8_t *)(host->buffer + host->offset - 1); 370 } 371 372 static void 373 hisi_nfc_write_buf(struct nand_chip *chip, const uint8_t *buf, int len) 374 { 375 struct hinfc_host *host = nand_get_controller_data(chip); 376 377 memcpy(host->buffer + host->offset, buf, len); 378 host->offset += len; 379 } 380 381 static void hisi_nfc_read_buf(struct nand_chip *chip, uint8_t *buf, int len) 382 { 383 struct hinfc_host *host = nand_get_controller_data(chip); 384 385 memcpy(buf, host->buffer + host->offset, len); 386 host->offset += len; 387 } 388 389 static void set_addr(struct mtd_info *mtd, int column, int page_addr) 390 { 391 struct nand_chip *chip = mtd_to_nand(mtd); 392 struct hinfc_host *host = nand_get_controller_data(chip); 393 unsigned int command = host->command; 394 395 host->addr_cycle = 0; 396 host->addr_value[0] = 0; 397 host->addr_value[1] = 0; 398 399 /* Serially input address */ 400 if (column != -1) { 401 /* Adjust columns for 16 bit buswidth */ 402 if (chip->options & NAND_BUSWIDTH_16 && 403 !nand_opcode_8bits(command)) 404 column >>= 1; 405 406 host->addr_value[0] = column & 0xffff; 407 host->addr_cycle = 2; 408 } 409 if (page_addr != -1) { 410 host->addr_value[0] |= (page_addr & 0xffff) 411 << (host->addr_cycle * 8); 412 host->addr_cycle += 2; 413 if (chip->options & NAND_ROW_ADDR_3) { 414 host->addr_cycle += 1; 415 if (host->command == NAND_CMD_ERASE1) 416 host->addr_value[0] |= ((page_addr >> 16) & 0xff) << 16; 417 else 418 host->addr_value[1] |= ((page_addr >> 16) & 0xff); 419 } 420 } 421 } 422 423 static void hisi_nfc_cmdfunc(struct nand_chip *chip, unsigned command, 424 int column, int page_addr) 425 { 426 struct mtd_info *mtd = nand_to_mtd(chip); 427 struct hinfc_host *host = nand_get_controller_data(chip); 428 int is_cache_invalid = 1; 429 unsigned int flag = 0; 430 431 host->command = command; 432 433 switch (command) { 434 case NAND_CMD_READ0: 435 case NAND_CMD_READOOB: 436 if (command == NAND_CMD_READ0) 437 host->offset = column; 438 else 439 host->offset = column + mtd->writesize; 440 441 is_cache_invalid = 0; 442 set_addr(mtd, column, page_addr); 443 hisi_nfc_send_cmd_readstart(host); 444 break; 445 446 case NAND_CMD_SEQIN: 447 host->offset = column; 448 set_addr(mtd, column, page_addr); 449 break; 450 451 case NAND_CMD_ERASE1: 452 set_addr(mtd, column, page_addr); 453 break; 454 455 case NAND_CMD_PAGEPROG: 456 hisi_nfc_send_cmd_pageprog(host); 457 break; 458 459 case NAND_CMD_ERASE2: 460 hisi_nfc_send_cmd_erase(host); 461 break; 462 463 case NAND_CMD_READID: 464 host->offset = column; 465 memset(host->mmio, 0, 0x10); 466 hisi_nfc_send_cmd_readid(host); 467 break; 468 469 case NAND_CMD_STATUS: 470 flag = hinfc_read(host, HINFC504_CON); 471 if (chip->ecc.mode == NAND_ECC_HW) 472 hinfc_write(host, 473 flag & ~(HINFC504_CON_ECCTYPE_MASK << 474 HINFC504_CON_ECCTYPE_SHIFT), HINFC504_CON); 475 476 host->offset = 0; 477 memset(host->mmio, 0, 0x10); 478 hisi_nfc_send_cmd_status(host); 479 hinfc_write(host, flag, HINFC504_CON); 480 break; 481 482 case NAND_CMD_RESET: 483 hisi_nfc_send_cmd_reset(host, host->chipselect); 484 break; 485 486 default: 487 dev_err(host->dev, "Error: unsupported cmd(cmd=%x, col=%x, page=%x)\n", 488 command, column, page_addr); 489 } 490 491 if (is_cache_invalid) { 492 host->cache_addr_value[0] = ~0; 493 host->cache_addr_value[1] = ~0; 494 } 495 } 496 497 static irqreturn_t hinfc_irq_handle(int irq, void *devid) 498 { 499 struct hinfc_host *host = devid; 500 unsigned int flag; 501 502 flag = hinfc_read(host, HINFC504_INTS); 503 /* store interrupts state */ 504 host->irq_status |= flag; 505 506 if (flag & HINFC504_INTS_DMA) { 507 hinfc_write(host, HINFC504_INTCLR_DMA, HINFC504_INTCLR); 508 complete(&host->cmd_complete); 509 } else if (flag & HINFC504_INTS_CE) { 510 hinfc_write(host, HINFC504_INTCLR_CE, HINFC504_INTCLR); 511 } else if (flag & HINFC504_INTS_UE) { 512 hinfc_write(host, HINFC504_INTCLR_UE, HINFC504_INTCLR); 513 } 514 515 return IRQ_HANDLED; 516 } 517 518 static int hisi_nand_read_page_hwecc(struct nand_chip *chip, uint8_t *buf, 519 int oob_required, int page) 520 { 521 struct mtd_info *mtd = nand_to_mtd(chip); 522 struct hinfc_host *host = nand_get_controller_data(chip); 523 int max_bitflips = 0, stat = 0, stat_max = 0, status_ecc; 524 int stat_1, stat_2; 525 526 nand_read_page_op(chip, page, 0, buf, mtd->writesize); 527 chip->legacy.read_buf(chip, chip->oob_poi, mtd->oobsize); 528 529 /* errors which can not be corrected by ECC */ 530 if (host->irq_status & HINFC504_INTS_UE) { 531 mtd->ecc_stats.failed++; 532 } else if (host->irq_status & HINFC504_INTS_CE) { 533 /* TODO: need add other ECC modes! */ 534 switch (chip->ecc.strength) { 535 case 16: 536 status_ecc = hinfc_read(host, HINFC504_ECC_STATUS) >> 537 HINFC504_ECC_16_BIT_SHIFT & 0x0fff; 538 stat_2 = status_ecc & 0x3f; 539 stat_1 = status_ecc >> 6 & 0x3f; 540 stat = stat_1 + stat_2; 541 stat_max = max_t(int, stat_1, stat_2); 542 } 543 mtd->ecc_stats.corrected += stat; 544 max_bitflips = max_t(int, max_bitflips, stat_max); 545 } 546 host->irq_status = 0; 547 548 return max_bitflips; 549 } 550 551 static int hisi_nand_read_oob(struct nand_chip *chip, int page) 552 { 553 struct mtd_info *mtd = nand_to_mtd(chip); 554 struct hinfc_host *host = nand_get_controller_data(chip); 555 556 nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize); 557 558 if (host->irq_status & HINFC504_INTS_UE) { 559 host->irq_status = 0; 560 return -EBADMSG; 561 } 562 563 host->irq_status = 0; 564 return 0; 565 } 566 567 static int hisi_nand_write_page_hwecc(struct nand_chip *chip, 568 const uint8_t *buf, int oob_required, 569 int page) 570 { 571 struct mtd_info *mtd = nand_to_mtd(chip); 572 573 nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize); 574 if (oob_required) 575 chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize); 576 577 return nand_prog_page_end_op(chip); 578 } 579 580 static void hisi_nfc_host_init(struct hinfc_host *host) 581 { 582 struct nand_chip *chip = &host->chip; 583 unsigned int flag = 0; 584 585 host->version = hinfc_read(host, HINFC_VERSION); 586 host->addr_cycle = 0; 587 host->addr_value[0] = 0; 588 host->addr_value[1] = 0; 589 host->cache_addr_value[0] = ~0; 590 host->cache_addr_value[1] = ~0; 591 host->chipselect = 0; 592 593 /* default page size: 2K, ecc_none. need modify */ 594 flag = HINFC504_CON_OP_MODE_NORMAL | HINFC504_CON_READY_BUSY_SEL 595 | ((0x001 & HINFC504_CON_PAGESIZE_MASK) 596 << HINFC504_CON_PAGEISZE_SHIFT) 597 | ((0x0 & HINFC504_CON_ECCTYPE_MASK) 598 << HINFC504_CON_ECCTYPE_SHIFT) 599 | ((chip->options & NAND_BUSWIDTH_16) ? 600 HINFC504_CON_BUS_WIDTH : 0); 601 hinfc_write(host, flag, HINFC504_CON); 602 603 memset(host->mmio, 0xff, HINFC504_BUFFER_BASE_ADDRESS_LEN); 604 605 hinfc_write(host, SET_HINFC504_PWIDTH(HINFC504_W_LATCH, 606 HINFC504_R_LATCH, HINFC504_RW_LATCH), HINFC504_PWIDTH); 607 608 /* enable DMA irq */ 609 hinfc_write(host, HINFC504_INTEN_DMA, HINFC504_INTEN); 610 } 611 612 static int hisi_ooblayout_ecc(struct mtd_info *mtd, int section, 613 struct mtd_oob_region *oobregion) 614 { 615 /* FIXME: add ECC bytes position */ 616 return -ENOTSUPP; 617 } 618 619 static int hisi_ooblayout_free(struct mtd_info *mtd, int section, 620 struct mtd_oob_region *oobregion) 621 { 622 if (section) 623 return -ERANGE; 624 625 oobregion->offset = 2; 626 oobregion->length = 6; 627 628 return 0; 629 } 630 631 static const struct mtd_ooblayout_ops hisi_ooblayout_ops = { 632 .ecc = hisi_ooblayout_ecc, 633 .free = hisi_ooblayout_free, 634 }; 635 636 static int hisi_nfc_ecc_probe(struct hinfc_host *host) 637 { 638 unsigned int flag; 639 int size, strength, ecc_bits; 640 struct device *dev = host->dev; 641 struct nand_chip *chip = &host->chip; 642 struct mtd_info *mtd = nand_to_mtd(chip); 643 644 size = chip->ecc.size; 645 strength = chip->ecc.strength; 646 if (size != 1024) { 647 dev_err(dev, "error ecc size: %d\n", size); 648 return -EINVAL; 649 } 650 651 if ((size == 1024) && ((strength != 8) && (strength != 16) && 652 (strength != 24) && (strength != 40))) { 653 dev_err(dev, "ecc size and strength do not match\n"); 654 return -EINVAL; 655 } 656 657 chip->ecc.size = size; 658 chip->ecc.strength = strength; 659 660 chip->ecc.read_page = hisi_nand_read_page_hwecc; 661 chip->ecc.read_oob = hisi_nand_read_oob; 662 chip->ecc.write_page = hisi_nand_write_page_hwecc; 663 664 switch (chip->ecc.strength) { 665 case 16: 666 ecc_bits = 6; 667 if (mtd->writesize == 2048) 668 mtd_set_ooblayout(mtd, &hisi_ooblayout_ops); 669 670 /* TODO: add more page size support */ 671 break; 672 673 /* TODO: add more ecc strength support */ 674 default: 675 dev_err(dev, "not support strength: %d\n", chip->ecc.strength); 676 return -EINVAL; 677 } 678 679 flag = hinfc_read(host, HINFC504_CON); 680 /* add ecc type configure */ 681 flag |= ((ecc_bits & HINFC504_CON_ECCTYPE_MASK) 682 << HINFC504_CON_ECCTYPE_SHIFT); 683 hinfc_write(host, flag, HINFC504_CON); 684 685 /* enable ecc irq */ 686 flag = hinfc_read(host, HINFC504_INTEN) & 0xfff; 687 hinfc_write(host, flag | HINFC504_INTEN_UE | HINFC504_INTEN_CE, 688 HINFC504_INTEN); 689 690 return 0; 691 } 692 693 static int hisi_nfc_attach_chip(struct nand_chip *chip) 694 { 695 struct mtd_info *mtd = nand_to_mtd(chip); 696 struct hinfc_host *host = nand_get_controller_data(chip); 697 int flag; 698 699 host->buffer = dmam_alloc_coherent(host->dev, 700 mtd->writesize + mtd->oobsize, 701 &host->dma_buffer, GFP_KERNEL); 702 if (!host->buffer) 703 return -ENOMEM; 704 705 host->dma_oob = host->dma_buffer + mtd->writesize; 706 memset(host->buffer, 0xff, mtd->writesize + mtd->oobsize); 707 708 flag = hinfc_read(host, HINFC504_CON); 709 flag &= ~(HINFC504_CON_PAGESIZE_MASK << HINFC504_CON_PAGEISZE_SHIFT); 710 switch (mtd->writesize) { 711 case 2048: 712 flag |= (0x001 << HINFC504_CON_PAGEISZE_SHIFT); 713 break; 714 /* 715 * TODO: add more pagesize support, 716 * default pagesize has been set in hisi_nfc_host_init 717 */ 718 default: 719 dev_err(host->dev, "NON-2KB page size nand flash\n"); 720 return -EINVAL; 721 } 722 hinfc_write(host, flag, HINFC504_CON); 723 724 if (chip->ecc.mode == NAND_ECC_HW) 725 hisi_nfc_ecc_probe(host); 726 727 return 0; 728 } 729 730 static const struct nand_controller_ops hisi_nfc_controller_ops = { 731 .attach_chip = hisi_nfc_attach_chip, 732 }; 733 734 static int hisi_nfc_probe(struct platform_device *pdev) 735 { 736 int ret = 0, irq, max_chips = HINFC504_MAX_CHIP; 737 struct device *dev = &pdev->dev; 738 struct hinfc_host *host; 739 struct nand_chip *chip; 740 struct mtd_info *mtd; 741 struct resource *res; 742 struct device_node *np = dev->of_node; 743 744 host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); 745 if (!host) 746 return -ENOMEM; 747 host->dev = dev; 748 749 platform_set_drvdata(pdev, host); 750 chip = &host->chip; 751 mtd = nand_to_mtd(chip); 752 753 irq = platform_get_irq(pdev, 0); 754 if (irq < 0) 755 return -ENXIO; 756 757 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 758 host->iobase = devm_ioremap_resource(dev, res); 759 if (IS_ERR(host->iobase)) 760 return PTR_ERR(host->iobase); 761 762 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 763 host->mmio = devm_ioremap_resource(dev, res); 764 if (IS_ERR(host->mmio)) { 765 dev_err(dev, "devm_ioremap_resource[1] fail\n"); 766 return PTR_ERR(host->mmio); 767 } 768 769 mtd->name = "hisi_nand"; 770 mtd->dev.parent = &pdev->dev; 771 772 nand_set_controller_data(chip, host); 773 nand_set_flash_node(chip, np); 774 chip->legacy.cmdfunc = hisi_nfc_cmdfunc; 775 chip->legacy.select_chip = hisi_nfc_select_chip; 776 chip->legacy.read_byte = hisi_nfc_read_byte; 777 chip->legacy.write_buf = hisi_nfc_write_buf; 778 chip->legacy.read_buf = hisi_nfc_read_buf; 779 chip->legacy.chip_delay = HINFC504_CHIP_DELAY; 780 chip->legacy.set_features = nand_get_set_features_notsupp; 781 chip->legacy.get_features = nand_get_set_features_notsupp; 782 783 hisi_nfc_host_init(host); 784 785 ret = devm_request_irq(dev, irq, hinfc_irq_handle, 0x0, "nandc", host); 786 if (ret) { 787 dev_err(dev, "failed to request IRQ\n"); 788 return ret; 789 } 790 791 chip->legacy.dummy_controller.ops = &hisi_nfc_controller_ops; 792 ret = nand_scan(chip, max_chips); 793 if (ret) 794 return ret; 795 796 ret = mtd_device_register(mtd, NULL, 0); 797 if (ret) { 798 dev_err(dev, "Err MTD partition=%d\n", ret); 799 nand_cleanup(chip); 800 return ret; 801 } 802 803 return 0; 804 } 805 806 static int hisi_nfc_remove(struct platform_device *pdev) 807 { 808 struct hinfc_host *host = platform_get_drvdata(pdev); 809 struct nand_chip *chip = &host->chip; 810 int ret; 811 812 ret = mtd_device_unregister(nand_to_mtd(chip)); 813 WARN_ON(ret); 814 nand_cleanup(chip); 815 816 return 0; 817 } 818 819 #ifdef CONFIG_PM_SLEEP 820 static int hisi_nfc_suspend(struct device *dev) 821 { 822 struct hinfc_host *host = dev_get_drvdata(dev); 823 unsigned long timeout = jiffies + HINFC504_NFC_PM_TIMEOUT; 824 825 while (time_before(jiffies, timeout)) { 826 if (((hinfc_read(host, HINFC504_STATUS) & 0x1) == 0x0) && 827 (hinfc_read(host, HINFC504_DMA_CTRL) & 828 HINFC504_DMA_CTRL_DMA_START)) { 829 cond_resched(); 830 return 0; 831 } 832 } 833 834 dev_err(host->dev, "nand controller suspend timeout.\n"); 835 836 return -EAGAIN; 837 } 838 839 static int hisi_nfc_resume(struct device *dev) 840 { 841 int cs; 842 struct hinfc_host *host = dev_get_drvdata(dev); 843 struct nand_chip *chip = &host->chip; 844 845 for (cs = 0; cs < nanddev_ntargets(&chip->base); cs++) 846 hisi_nfc_send_cmd_reset(host, cs); 847 hinfc_write(host, SET_HINFC504_PWIDTH(HINFC504_W_LATCH, 848 HINFC504_R_LATCH, HINFC504_RW_LATCH), HINFC504_PWIDTH); 849 850 return 0; 851 } 852 #endif 853 static SIMPLE_DEV_PM_OPS(hisi_nfc_pm_ops, hisi_nfc_suspend, hisi_nfc_resume); 854 855 static const struct of_device_id nfc_id_table[] = { 856 { .compatible = "hisilicon,504-nfc" }, 857 {} 858 }; 859 MODULE_DEVICE_TABLE(of, nfc_id_table); 860 861 static struct platform_driver hisi_nfc_driver = { 862 .driver = { 863 .name = "hisi_nand", 864 .of_match_table = nfc_id_table, 865 .pm = &hisi_nfc_pm_ops, 866 }, 867 .probe = hisi_nfc_probe, 868 .remove = hisi_nfc_remove, 869 }; 870 871 module_platform_driver(hisi_nfc_driver); 872 873 MODULE_LICENSE("GPL"); 874 MODULE_AUTHOR("Zhou Wang"); 875 MODULE_AUTHOR("Zhiyong Cai"); 876 MODULE_DESCRIPTION("Hisilicon Nand Flash Controller Driver"); 877