Lines Matching +full:nand +full:- +full:int +full:- +full:base

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
20 * struct hynix_read_retry - read-retry data
21 * @nregs: number of register to set when applying a new read-retry mode
22 * @regs: register offsets (NAND chip dependent)
27 int nregs;
33 * struct hynix_nand - private Hynix NAND struct
34 * @read_retry: read-retry information
41 * struct hynix_read_retry_otp - structure describing how the read-retry OTP
47 * @page: the address to pass to the READ_PAGE command. Depends on the NAND
49 * @size: size of the read-retry OTP section
52 int nregs;
55 int page;
56 int size;
62 int ret; in hynix_nand_has_valid_jedecid()
71 static int hynix_nand_cmd_op(struct nand_chip *chip, u8 cmd) in hynix_nand_cmd_op()
77 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs); in hynix_nand_cmd_op()
82 chip->legacy.cmdfunc(chip, cmd, -1, -1); in hynix_nand_cmd_op()
87 static int hynix_nand_reg_write_op(struct nand_chip *chip, u8 addr, u8 val) in hynix_nand_reg_write_op()
96 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs); in hynix_nand_reg_write_op()
101 chip->legacy.cmdfunc(chip, NAND_CMD_NONE, column, -1); in hynix_nand_reg_write_op()
102 chip->legacy.write_byte(chip, val); in hynix_nand_reg_write_op()
107 static int hynix_nand_setup_read_retry(struct nand_chip *chip, int retry_mode) in hynix_nand_setup_read_retry()
111 int i, ret; in hynix_nand_setup_read_retry()
113 values = hynix->read_retry->values + in hynix_nand_setup_read_retry()
114 (retry_mode * hynix->read_retry->nregs); in hynix_nand_setup_read_retry()
122 * Configure the NAND in the requested read-retry mode. in hynix_nand_setup_read_retry()
123 * This is done by setting pre-defined values in internal NAND in hynix_nand_setup_read_retry()
126 * The set of registers is NAND specific, and the values are either in hynix_nand_setup_read_retry()
127 * predefined or extracted from an OTP area on the NAND (values are in hynix_nand_setup_read_retry()
130 for (i = 0; i < hynix->read_retry->nregs; i++) { in hynix_nand_setup_read_retry()
131 ret = hynix_nand_reg_write_op(chip, hynix->read_retry->regs[i], in hynix_nand_setup_read_retry()
142 * hynix_get_majority - get the value that is occurring the most in a given
150 * the read-retry parameters.
155 * Let's hope this dummy algorithm prevents us from losing the read-retry
158 static int hynix_get_majority(const u8 *in, int repeat, u8 *out) in hynix_get_majority()
160 int i, j, half = repeat / 2; in hynix_get_majority()
171 int cnt = 0; in hynix_get_majority()
187 return -EIO; in hynix_get_majority()
190 static int hynix_read_rr_otp(struct nand_chip *chip, in hynix_read_rr_otp()
194 int i, ret; in hynix_read_rr_otp()
204 for (i = 0; i < info->nregs; i++) { in hynix_read_rr_otp()
205 ret = hynix_nand_reg_write_op(chip, info->regs[i], in hynix_read_rr_otp()
206 info->values[i]); in hynix_read_rr_otp()
229 ret = nand_read_page_op(chip, info->page, 0, buf, info->size); in hynix_read_rr_otp()
258 static int hynix_mlc_1xnm_rr_value(const u8 *buf, int nmodes, int nregs, in hynix_mlc_1xnm_rr_value()
259 int mode, int reg, bool inv, u8 *val) in hynix_mlc_1xnm_rr_value()
262 int val_offs = (mode * nregs) + reg; in hynix_mlc_1xnm_rr_value()
263 int set_size = nmodes * nregs; in hynix_mlc_1xnm_rr_value()
264 int i, ret; in hynix_mlc_1xnm_rr_value()
267 int set_offs = NAND_HYNIX_1XNM_RR_SET_OFFS(i, set_size, inv); in hynix_mlc_1xnm_rr_value()
286 static int hynix_mlc_1xnm_rr_init(struct nand_chip *chip, in hynix_mlc_1xnm_rr_init()
291 int ret, i, j; in hynix_mlc_1xnm_rr_init()
295 buf = kmalloc(info->size, GFP_KERNEL); in hynix_mlc_1xnm_rr_init()
297 return -ENOMEM; in hynix_mlc_1xnm_rr_init()
316 ret = -ENOMEM; in hynix_mlc_1xnm_rr_init()
322 u8 *val = rr->values + (i * nregs); in hynix_mlc_1xnm_rr_init()
336 rr->nregs = nregs; in hynix_mlc_1xnm_rr_init()
337 rr->regs = hynix_1xnm_mlc_read_retry_regs; in hynix_mlc_1xnm_rr_init()
338 hynix->read_retry = rr; in hynix_mlc_1xnm_rr_init()
339 chip->ops.setup_read_retry = hynix_nand_setup_read_retry; in hynix_mlc_1xnm_rr_init()
340 chip->read_retries = nmodes; in hynix_mlc_1xnm_rr_init()
371 static int hynix_nand_rr_init(struct nand_chip *chip) in hynix_nand_rr_init()
373 int i, ret = 0; in hynix_nand_rr_init()
379 * We only support read-retry for 1xnm NANDs, and those NANDs all in hynix_nand_rr_init()
383 u8 nand_tech = chip->id.data[5] >> 4; in hynix_nand_rr_init()
391 * read-retry OTP area into a normal page. in hynix_nand_rr_init()
402 pr_warn("failed to initialize read-retry infrastructure"); in hynix_nand_rr_init()
414 memorg = nanddev_get_memorg(&chip->base); in hynix_nand_extract_oobsize()
416 oobsize = ((chip->id.data[3] >> 2) & 0x3) | in hynix_nand_extract_oobsize()
417 ((chip->id.data[3] >> 4) & 0x4); in hynix_nand_extract_oobsize()
422 memorg->oobsize = 2048; in hynix_nand_extract_oobsize()
425 memorg->oobsize = 1664; in hynix_nand_extract_oobsize()
428 memorg->oobsize = 1024; in hynix_nand_extract_oobsize()
431 memorg->oobsize = 640; in hynix_nand_extract_oobsize()
446 memorg->oobsize = 128; in hynix_nand_extract_oobsize()
449 memorg->oobsize = 224; in hynix_nand_extract_oobsize()
452 memorg->oobsize = 448; in hynix_nand_extract_oobsize()
455 memorg->oobsize = 64; in hynix_nand_extract_oobsize()
458 memorg->oobsize = 32; in hynix_nand_extract_oobsize()
461 memorg->oobsize = 16; in hynix_nand_extract_oobsize()
464 memorg->oobsize = 640; in hynix_nand_extract_oobsize()
487 if (chip->id.data[1] == 0xde) in hynix_nand_extract_oobsize()
488 memorg->oobsize *= memorg->pagesize / SZ_8K; in hynix_nand_extract_oobsize()
491 mtd->oobsize = memorg->oobsize; in hynix_nand_extract_oobsize()
497 struct nand_device *base = &chip->base; in hynix_nand_extract_ecc_requirements() local
499 u8 ecc_level = (chip->id.data[4] >> 4) & 0x7; in hynix_nand_extract_ecc_requirements()
540 * NAND technology. in hynix_nand_extract_ecc_requirements()
542 u8 nand_tech = chip->id.data[5] & 0x7; in hynix_nand_extract_ecc_requirements()
571 requirements.strength = 1 << (ecc_level - 1); in hynix_nand_extract_ecc_requirements()
575 (8 * (ecc_level - 5)); in hynix_nand_extract_ecc_requirements()
580 nanddev_set_ecc_requirements(base, &requirements); in hynix_nand_extract_ecc_requirements()
589 if (nanddev_bits_per_cell(&chip->base) > 2) in hynix_nand_extract_scrambling_requirements()
590 chip->options |= NAND_NEED_SCRAMBLING; in hynix_nand_extract_scrambling_requirements()
592 /* And on MLC NANDs with sub-3xnm process */ in hynix_nand_extract_scrambling_requirements()
594 nand_tech = chip->id.data[5] >> 4; in hynix_nand_extract_scrambling_requirements()
598 chip->options |= NAND_NEED_SCRAMBLING; in hynix_nand_extract_scrambling_requirements()
600 nand_tech = chip->id.data[5] & 0x7; in hynix_nand_extract_scrambling_requirements()
604 chip->options |= NAND_NEED_SCRAMBLING; in hynix_nand_extract_scrambling_requirements()
615 memorg = nanddev_get_memorg(&chip->base); in hynix_nand_decode_id()
624 if (chip->id.len < 6 || nand_is_slc(chip)) { in hynix_nand_decode_id()
630 memorg->pagesize = 2048 << (chip->id.data[3] & 0x03); in hynix_nand_decode_id()
631 mtd->writesize = memorg->pagesize; in hynix_nand_decode_id()
633 tmp = (chip->id.data[3] >> 4) & 0x3; in hynix_nand_decode_id()
641 if (chip->id.data[3] & 0x80) { in hynix_nand_decode_id()
642 memorg->pages_per_eraseblock = (SZ_1M << tmp) / in hynix_nand_decode_id()
643 memorg->pagesize; in hynix_nand_decode_id()
644 mtd->erasesize = SZ_1M << tmp; in hynix_nand_decode_id()
646 memorg->pages_per_eraseblock = (SZ_512K + SZ_256K) / in hynix_nand_decode_id()
647 memorg->pagesize; in hynix_nand_decode_id()
648 mtd->erasesize = SZ_512K + SZ_256K; in hynix_nand_decode_id()
650 memorg->pages_per_eraseblock = (SZ_128K << tmp) / in hynix_nand_decode_id()
651 memorg->pagesize; in hynix_nand_decode_id()
652 mtd->erasesize = SZ_128K << tmp; in hynix_nand_decode_id()
658 * These NANDs use a different NAND ID scheme. in hynix_nand_decode_id()
674 kfree(hynix->read_retry); in hynix_nand_cleanup()
679 static int
688 static int h27ucg8t2etrbc_init(struct nand_chip *chip) in h27ucg8t2etrbc_init()
692 chip->options |= NAND_NEED_SCRAMBLING; in h27ucg8t2etrbc_init()
698 static int hynix_nand_init(struct nand_chip *chip) in hynix_nand_init()
701 int ret; in hynix_nand_init()
704 chip->options |= NAND_BBM_LASTPAGE; in hynix_nand_init()
706 chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; in hynix_nand_init()
710 return -ENOMEM; in hynix_nand_init()
714 if (!strncmp("H27UCG8T2ATR-BC", chip->parameters.model, in hynix_nand_init()
715 sizeof("H27UCG8T2ATR-BC") - 1)) in hynix_nand_init()
716 chip->ops.choose_interface_config = in hynix_nand_init()
719 if (!strncmp("H27UCG8T2ETR-BC", chip->parameters.model, in hynix_nand_init()
720 sizeof("H27UCG8T2ETR-BC") - 1)) in hynix_nand_init()
735 * (bytes 129-130). This has been seen on H27U4G8F2GDA-BI. in hynix_fixup_onfi_param_page()
739 p->sdr_timing_modes |= cpu_to_le16(BIT(0)); in hynix_fixup_onfi_param_page()