Lines Matching refs:nfc

204 static inline u32 vf610_nfc_read(struct vf610_nfc *nfc, uint reg)  in vf610_nfc_read()  argument
206 return readl(nfc->regs + reg); in vf610_nfc_read()
209 static inline void vf610_nfc_write(struct vf610_nfc *nfc, uint reg, u32 val) in vf610_nfc_write() argument
211 writel(val, nfc->regs + reg); in vf610_nfc_write()
214 static inline void vf610_nfc_set(struct vf610_nfc *nfc, uint reg, u32 bits) in vf610_nfc_set() argument
216 vf610_nfc_write(nfc, reg, vf610_nfc_read(nfc, reg) | bits); in vf610_nfc_set()
219 static inline void vf610_nfc_clear(struct vf610_nfc *nfc, uint reg, u32 bits) in vf610_nfc_clear() argument
221 vf610_nfc_write(nfc, reg, vf610_nfc_read(nfc, reg) & ~bits); in vf610_nfc_clear()
224 static inline void vf610_nfc_set_field(struct vf610_nfc *nfc, u32 reg, in vf610_nfc_set_field() argument
227 vf610_nfc_write(nfc, reg, in vf610_nfc_set_field()
228 (vf610_nfc_read(nfc, reg) & (~mask)) | val << shift); in vf610_nfc_set_field()
246 static inline void vf610_nfc_clear_status(struct vf610_nfc *nfc) in vf610_nfc_clear_status() argument
248 u32 tmp = vf610_nfc_read(nfc, NFC_IRQ_STATUS); in vf610_nfc_clear_status()
251 vf610_nfc_write(nfc, NFC_IRQ_STATUS, tmp); in vf610_nfc_clear_status()
254 static void vf610_nfc_done(struct vf610_nfc *nfc) in vf610_nfc_done() argument
265 vf610_nfc_set(nfc, NFC_IRQ_STATUS, IDLE_EN_BIT); in vf610_nfc_done()
266 vf610_nfc_set(nfc, NFC_FLASH_CMD2, START_BIT); in vf610_nfc_done()
268 if (!wait_for_completion_timeout(&nfc->cmd_done, timeout)) in vf610_nfc_done()
269 dev_warn(nfc->dev, "Timeout while waiting for BUSY.\n"); in vf610_nfc_done()
271 vf610_nfc_clear_status(nfc); in vf610_nfc_done()
274 static u8 vf610_nfc_get_id(struct vf610_nfc *nfc, int col) in vf610_nfc_get_id() argument
279 flash_id = vf610_nfc_read(nfc, NFC_FLASH_STATUS1); in vf610_nfc_get_id()
282 flash_id = vf610_nfc_read(nfc, NFC_FLASH_STATUS2); in vf610_nfc_get_id()
289 static u8 vf610_nfc_get_status(struct vf610_nfc *nfc) in vf610_nfc_get_status() argument
291 return vf610_nfc_read(nfc, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK; in vf610_nfc_get_status()
294 static void vf610_nfc_send_command(struct vf610_nfc *nfc, u32 cmd_byte1, in vf610_nfc_send_command() argument
299 vf610_nfc_clear_status(nfc); in vf610_nfc_send_command()
301 tmp = vf610_nfc_read(nfc, NFC_FLASH_CMD2); in vf610_nfc_send_command()
305 vf610_nfc_write(nfc, NFC_FLASH_CMD2, tmp); in vf610_nfc_send_command()
308 static void vf610_nfc_send_commands(struct vf610_nfc *nfc, u32 cmd_byte1, in vf610_nfc_send_commands() argument
313 vf610_nfc_send_command(nfc, cmd_byte1, cmd_code); in vf610_nfc_send_commands()
315 tmp = vf610_nfc_read(nfc, NFC_FLASH_CMD1); in vf610_nfc_send_commands()
318 vf610_nfc_write(nfc, NFC_FLASH_CMD1, tmp); in vf610_nfc_send_commands()
324 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_irq() local
326 vf610_nfc_clear(nfc, NFC_IRQ_STATUS, IDLE_EN_BIT); in vf610_nfc_irq()
327 complete(&nfc->cmd_done); in vf610_nfc_irq()
332 static void vf610_nfc_addr_cycle(struct vf610_nfc *nfc, int column, int page) in vf610_nfc_addr_cycle() argument
335 if (nfc->chip.options & NAND_BUSWIDTH_16) in vf610_nfc_addr_cycle()
337 vf610_nfc_set_field(nfc, NFC_COL_ADDR, COL_ADDR_MASK, in vf610_nfc_addr_cycle()
341 vf610_nfc_set_field(nfc, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_addr_cycle()
345 static inline void vf610_nfc_ecc_mode(struct vf610_nfc *nfc, int ecc_mode) in vf610_nfc_ecc_mode() argument
347 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG, in vf610_nfc_ecc_mode()
352 static inline void vf610_nfc_transfer_size(struct vf610_nfc *nfc, int size) in vf610_nfc_transfer_size() argument
354 vf610_nfc_write(nfc, NFC_SECTOR_SIZE, size); in vf610_nfc_transfer_size()
360 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_command() local
361 int trfr_sz = nfc->chip.options & NAND_BUSWIDTH_16 ? 1 : 0; in vf610_nfc_command()
363 nfc->buf_offset = max(column, 0); in vf610_nfc_command()
364 nfc->alt_buf = ALT_BUF_DATA; in vf610_nfc_command()
369 vf610_nfc_addr_cycle(nfc, column, page); in vf610_nfc_command()
370 nfc->buf_offset = 0; in vf610_nfc_command()
378 trfr_sz += nfc->write_sz; in vf610_nfc_command()
379 vf610_nfc_transfer_size(nfc, trfr_sz); in vf610_nfc_command()
380 vf610_nfc_send_commands(nfc, NAND_CMD_SEQIN, in vf610_nfc_command()
382 if (nfc->use_hw_ecc) in vf610_nfc_command()
383 vf610_nfc_ecc_mode(nfc, nfc->ecc_mode); in vf610_nfc_command()
385 vf610_nfc_ecc_mode(nfc, ECC_BYPASS); in vf610_nfc_command()
389 vf610_nfc_transfer_size(nfc, 0); in vf610_nfc_command()
390 vf610_nfc_send_command(nfc, command, RESET_CMD_CODE); in vf610_nfc_command()
396 vf610_nfc_transfer_size(nfc, trfr_sz); in vf610_nfc_command()
397 vf610_nfc_send_commands(nfc, NAND_CMD_READ0, in vf610_nfc_command()
399 vf610_nfc_addr_cycle(nfc, column, page); in vf610_nfc_command()
400 vf610_nfc_ecc_mode(nfc, ECC_BYPASS); in vf610_nfc_command()
405 vf610_nfc_transfer_size(nfc, trfr_sz); in vf610_nfc_command()
406 vf610_nfc_send_commands(nfc, NAND_CMD_READ0, in vf610_nfc_command()
408 vf610_nfc_addr_cycle(nfc, column, page); in vf610_nfc_command()
409 vf610_nfc_ecc_mode(nfc, nfc->ecc_mode); in vf610_nfc_command()
413 nfc->alt_buf = ALT_BUF_ONFI; in vf610_nfc_command()
415 vf610_nfc_transfer_size(nfc, trfr_sz); in vf610_nfc_command()
416 vf610_nfc_send_command(nfc, command, READ_ONFI_PARAM_CMD_CODE); in vf610_nfc_command()
417 vf610_nfc_addr_cycle(nfc, -1, column); in vf610_nfc_command()
418 vf610_nfc_ecc_mode(nfc, ECC_BYPASS); in vf610_nfc_command()
422 vf610_nfc_transfer_size(nfc, 0); in vf610_nfc_command()
423 vf610_nfc_send_commands(nfc, command, in vf610_nfc_command()
425 vf610_nfc_addr_cycle(nfc, column, page); in vf610_nfc_command()
429 nfc->alt_buf = ALT_BUF_ID; in vf610_nfc_command()
430 nfc->buf_offset = 0; in vf610_nfc_command()
431 vf610_nfc_transfer_size(nfc, 0); in vf610_nfc_command()
432 vf610_nfc_send_command(nfc, command, READ_ID_CMD_CODE); in vf610_nfc_command()
433 vf610_nfc_addr_cycle(nfc, -1, column); in vf610_nfc_command()
437 nfc->alt_buf = ALT_BUF_STAT; in vf610_nfc_command()
438 vf610_nfc_transfer_size(nfc, 0); in vf610_nfc_command()
439 vf610_nfc_send_command(nfc, command, STATUS_READ_CMD_CODE); in vf610_nfc_command()
445 vf610_nfc_done(nfc); in vf610_nfc_command()
447 nfc->use_hw_ecc = false; in vf610_nfc_command()
448 nfc->write_sz = 0; in vf610_nfc_command()
453 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_buf() local
454 uint c = nfc->buf_offset; in vf610_nfc_read_buf()
457 WARN_ON(nfc->alt_buf); in vf610_nfc_read_buf()
459 vf610_nfc_memcpy(buf, nfc->regs + NFC_MAIN_AREA(0) + c, len); in vf610_nfc_read_buf()
461 nfc->buf_offset += len; in vf610_nfc_read_buf()
467 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_buf() local
468 uint c = nfc->buf_offset; in vf610_nfc_write_buf()
472 vf610_nfc_memcpy(nfc->regs + NFC_MAIN_AREA(0) + c, buf, l); in vf610_nfc_write_buf()
474 nfc->write_sz += l; in vf610_nfc_write_buf()
475 nfc->buf_offset += l; in vf610_nfc_write_buf()
480 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_byte() local
482 uint c = nfc->buf_offset; in vf610_nfc_read_byte()
484 switch (nfc->alt_buf) { in vf610_nfc_read_byte()
486 tmp = vf610_nfc_get_id(nfc, c); in vf610_nfc_read_byte()
489 tmp = vf610_nfc_get_status(nfc); in vf610_nfc_read_byte()
494 c = nfc->buf_offset ^ 0x3; in vf610_nfc_read_byte()
498 tmp = *((u8 *)(nfc->regs + NFC_MAIN_AREA(0) + c)); in vf610_nfc_read_byte()
501 nfc->buf_offset++; in vf610_nfc_read_byte()
525 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_select_chip() local
526 u32 tmp = vf610_nfc_read(nfc, NFC_ROW_ADDR); in vf610_nfc_select_chip()
529 if (nfc->variant != NFC_VFC610) in vf610_nfc_select_chip()
539 vf610_nfc_write(nfc, NFC_ROW_ADDR, tmp); in vf610_nfc_select_chip()
560 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_correct_data() local
564 int flips_threshold = nfc->chip.ecc.strength / 2; in vf610_nfc_correct_data()
566 ecc_status = vf610_nfc_read(nfc, ecc_status_off) & 0xff; in vf610_nfc_correct_data()
580 return nand_check_erased_ecc_chunk(dat, nfc->chip.ecc.size, oob, in vf610_nfc_correct_data()
609 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_page() local
616 nfc->use_hw_ecc = true; in vf610_nfc_write_page()
617 nfc->write_sz = mtd->writesize + mtd->oobsize; in vf610_nfc_write_page()
628 static void vf610_nfc_preinit_controller(struct vf610_nfc *nfc) in vf610_nfc_preinit_controller() argument
630 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_preinit_controller()
631 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT); in vf610_nfc_preinit_controller()
632 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT); in vf610_nfc_preinit_controller()
633 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT); in vf610_nfc_preinit_controller()
634 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT); in vf610_nfc_preinit_controller()
635 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT); in vf610_nfc_preinit_controller()
638 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK, in vf610_nfc_preinit_controller()
642 static void vf610_nfc_init_controller(struct vf610_nfc *nfc) in vf610_nfc_init_controller() argument
644 if (nfc->chip.options & NAND_BUSWIDTH_16) in vf610_nfc_init_controller()
645 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_init_controller()
647 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_init_controller()
649 if (nfc->chip.ecc.mode == NAND_ECC_HW) { in vf610_nfc_init_controller()
651 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG, in vf610_nfc_init_controller()
657 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT); in vf610_nfc_init_controller()
663 struct vf610_nfc *nfc; in vf610_nfc_probe() local
672 nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL); in vf610_nfc_probe()
673 if (!nfc) in vf610_nfc_probe()
676 nfc->dev = &pdev->dev; in vf610_nfc_probe()
677 mtd = &nfc->mtd; in vf610_nfc_probe()
678 chip = &nfc->chip; in vf610_nfc_probe()
682 mtd->dev.parent = nfc->dev; in vf610_nfc_probe()
690 nfc->regs = devm_ioremap_resource(nfc->dev, res); in vf610_nfc_probe()
691 if (IS_ERR(nfc->regs)) in vf610_nfc_probe()
692 return PTR_ERR(nfc->regs); in vf610_nfc_probe()
694 nfc->clk = devm_clk_get(&pdev->dev, NULL); in vf610_nfc_probe()
695 if (IS_ERR(nfc->clk)) in vf610_nfc_probe()
696 return PTR_ERR(nfc->clk); in vf610_nfc_probe()
698 err = clk_prepare_enable(nfc->clk); in vf610_nfc_probe()
700 dev_err(nfc->dev, "Unable to enable clock!\n"); in vf610_nfc_probe()
705 nfc->variant = (enum vf610_nfc_variant)of_id->data; in vf610_nfc_probe()
707 for_each_available_child_of_node(nfc->dev->of_node, child) { in vf610_nfc_probe()
711 dev_err(nfc->dev, in vf610_nfc_probe()
722 dev_err(nfc->dev, "NAND chip sub-node missing!\n"); in vf610_nfc_probe()
737 init_completion(&nfc->cmd_done); in vf610_nfc_probe()
739 err = devm_request_irq(nfc->dev, irq, vf610_nfc_irq, 0, DRV_NAME, mtd); in vf610_nfc_probe()
741 dev_err(nfc->dev, "Error requesting IRQ!\n"); in vf610_nfc_probe()
745 vf610_nfc_preinit_controller(nfc); in vf610_nfc_probe()
753 vf610_nfc_init_controller(nfc); in vf610_nfc_probe()
761 dev_err(nfc->dev, "Unsupported flash page size\n"); in vf610_nfc_probe()
768 dev_err(nfc->dev, "Unsupported flash with hwecc\n"); in vf610_nfc_probe()
774 dev_err(nfc->dev, "Step size needs to be page size\n"); in vf610_nfc_probe()
784 nfc->ecc_mode = ECC_60_BYTE; in vf610_nfc_probe()
788 nfc->ecc_mode = ECC_45_BYTE; in vf610_nfc_probe()
792 dev_err(nfc->dev, "Unsupported ECC strength\n"); in vf610_nfc_probe()
823 clk_disable_unprepare(nfc->clk); in vf610_nfc_probe()
830 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_remove() local
833 clk_disable_unprepare(nfc->clk); in vf610_nfc_remove()
841 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_suspend() local
843 clk_disable_unprepare(nfc->clk); in vf610_nfc_suspend()
850 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_resume() local
854 clk_prepare_enable(nfc->clk); in vf610_nfc_resume()
856 vf610_nfc_preinit_controller(nfc); in vf610_nfc_resume()
857 vf610_nfc_init_controller(nfc); in vf610_nfc_resume()