diff options
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index d92d94bb7166..1cfad9ac3f2f 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -2935,29 +2935,34 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, | |||
2935 | int i; | 2935 | int i; |
2936 | int val; | 2936 | int val; |
2937 | 2937 | ||
2938 | /* ONFI need to be probed in 8 bits mode, and 16 bits should be selected with NAND_BUSWIDTH_AUTO */ | ||
2939 | if (chip->options & NAND_BUSWIDTH_16) { | ||
2940 | pr_err("Trying ONFI probe in 16 bits mode, aborting !\n"); | ||
2941 | return 0; | ||
2942 | } | ||
2943 | /* Try ONFI for unknown chip or LP */ | 2938 | /* Try ONFI for unknown chip or LP */ |
2944 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); | 2939 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); |
2945 | if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || | 2940 | if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || |
2946 | chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I') | 2941 | chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I') |
2947 | return 0; | 2942 | return 0; |
2948 | 2943 | ||
2944 | /* | ||
2945 | * ONFI must be probed in 8-bit mode or with NAND_BUSWIDTH_AUTO, not | ||
2946 | * with NAND_BUSWIDTH_16 | ||
2947 | */ | ||
2948 | if (chip->options & NAND_BUSWIDTH_16) { | ||
2949 | pr_err("ONFI cannot be probed in 16-bit mode; aborting\n"); | ||
2950 | return 0; | ||
2951 | } | ||
2952 | |||
2949 | chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); | 2953 | chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); |
2950 | for (i = 0; i < 3; i++) { | 2954 | for (i = 0; i < 3; i++) { |
2951 | chip->read_buf(mtd, (uint8_t *)p, sizeof(*p)); | 2955 | chip->read_buf(mtd, (uint8_t *)p, sizeof(*p)); |
2952 | if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) == | 2956 | if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) == |
2953 | le16_to_cpu(p->crc)) { | 2957 | le16_to_cpu(p->crc)) { |
2954 | pr_info("ONFI param page %d valid\n", i); | ||
2955 | break; | 2958 | break; |
2956 | } | 2959 | } |
2957 | } | 2960 | } |
2958 | 2961 | ||
2959 | if (i == 3) | 2962 | if (i == 3) { |
2963 | pr_err("Could not find valid ONFI parameter page; aborting\n"); | ||
2960 | return 0; | 2964 | return 0; |
2965 | } | ||
2961 | 2966 | ||
2962 | /* Check version */ | 2967 | /* Check version */ |
2963 | val = le16_to_cpu(p->revision); | 2968 | val = le16_to_cpu(p->revision); |
@@ -3020,10 +3025,11 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, | |||
3020 | 3025 | ||
3021 | /* The Extended Parameter Page is supported since ONFI 2.1. */ | 3026 | /* The Extended Parameter Page is supported since ONFI 2.1. */ |
3022 | if (nand_flash_detect_ext_param_page(mtd, chip, p)) | 3027 | if (nand_flash_detect_ext_param_page(mtd, chip, p)) |
3023 | pr_info("Failed to detect the extended param page.\n"); | 3028 | pr_warn("Failed to detect ONFI extended param page\n"); |
3029 | } else { | ||
3030 | pr_warn("Could not retrieve ONFI ECC requirements\n"); | ||
3024 | } | 3031 | } |
3025 | 3032 | ||
3026 | pr_info("ONFI flash detected\n"); | ||
3027 | return 1; | 3033 | return 1; |
3028 | } | 3034 | } |
3029 | 3035 | ||