mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2026-03-14 21:10:27 +01:00
Fidelix SPI NAND FM35X2GA has two planes namely plane 0 and plane 1. This change adds the support to calculate the plane bit accordingly and use the same for command formation. Change-Id: I6fb4b652e1c897f248cb9ad8914f67be7a7365f3 Signed-off-by: Kathiravan T <kathirav@codeaurora.org>
117 lines
3.8 KiB
C
117 lines
3.8 KiB
C
/*
|
|
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef SPI_NAND_DEV_H
|
|
#define SPI_NAND_DEV_H
|
|
#define MTD_MAX_OOBFREE_ENTRIES_LARGE 32
|
|
#ifdef MTD_MAX_ECCPOS_ENTRIES_LARGE
|
|
#undef MTD_MAX_ECCPOS_ENTRIES_LARGE
|
|
#define MTD_MAX_ECCPOS_ENTRIES_LARGE 640
|
|
#endif
|
|
#define INT_MAX ((int)(~0U>>1))
|
|
|
|
/* Flash opcodes. */
|
|
#define IPQ40XX_SPINAND_CMD_WREN 0x06 /* Write enable */
|
|
#define IPQ40XX_SPINAND_CMD_WRDI 0x04 /* Write disable */
|
|
#define IPQ40XX_SPINAND_CMD_GETFEA 0x0F /* Get feature */
|
|
#define IPQ40XX_SPINAND_CMD_SETFEA 0x1F /* Set feature */
|
|
#define IPQ40XX_SPINAND_CMD_READ 0x13 /* read data to cache */
|
|
#define IPQ40XX_SPINAND_CMD_NORM_READ 0x03 /* Read data bytes (low frequency) */
|
|
#define IPQ40XX_SPINAND_CMD_FAST_READ 0x0B /* Read data bytes (high frequency) */
|
|
#define IPQ40XX_SPINAND_CMD_PLOAD 0x02 /* Program load */
|
|
#define IPQ40XX_SPINAND_CMD_PROG 0x10 /* Program execute */
|
|
#define IPQ40XX_SPINAND_CMD_ERASE 0xD8 /* Block erase */
|
|
#define IPQ40XX_SPINAND_CMD_RDID 0x9F /* Read JEDEC ID */
|
|
#define IPQ40XX_SPINAND_CMD_RESET 0xFF /* reset nand flash */
|
|
#define IPQ40XX_SPINAND_CMD_DIESELECT 0xC2 /* Die Select */
|
|
|
|
/* Flash Protection register */
|
|
#define IPQ40XX_SPINAND_PROTEC_REG 0xA0
|
|
#define IPQ40XX_SPINAND_PROTEC_BRWD 0x80
|
|
#define IPQ40XX_SPINAND_PROTEC_BP2 0x20
|
|
#define IPQ40XX_SPINAND_PROTEC_BP1 0x10
|
|
#define IPQ40XX_SPINAND_PROTEC_BP0 0x08
|
|
#define IPQ40XX_SPINAND_PROTEC_INV 0x04
|
|
#define IPQ40XX_SPINAND_PROTEC_CMP 0x02
|
|
#define IPQ40XX_SPINAND_PROTEC_BPx 0xC7
|
|
|
|
/* Flash feature register */
|
|
#define IPQ40XX_SPINAND_FEATURE_REG 0xB0
|
|
#define IPQ40XX_SPINAND_FEATURE_OTPPRT 0x80
|
|
#define IPQ40XX_SPINAND_FEATURE_OPTEN 0x40
|
|
#define IPQ40XX_SPINAND_FEATURE_ECC_EN 0x10
|
|
#define IPQ40XX_SPINAND_FEATURE_QE 0x01
|
|
|
|
/* Flash status register. */
|
|
#define IPQ40XX_SPINAND_STATUS_REG 0xC0
|
|
#define IPQ40XX_SPINAND_STATUS_BUSY 0x1
|
|
#define IPQ40XX_SPINAND_STATUS_WREN 0x2
|
|
#define IPQ40XX_SPINAND_STATUS_EFAIL 0x4
|
|
#define IPQ40XX_SPINAND_STATUS_PFAIL 0x8
|
|
#define IPQ40XX_SPINAND_STATUS_ECCMASK 0x30
|
|
#define IPQ40XX_SPINAND_STATUS_ECC(x) (x << 4)
|
|
#define IPQ40XX_SPINAND_STATUS_ECC0 0x0
|
|
#define IPQ40XX_SPINAND_STATUS_ECC1 0x1
|
|
#define IPQ40XX_SPINAND_STATUS_ECC2 0x2
|
|
#define IPQ40XX_SPINAND_STATUS_ECC3 0x3
|
|
|
|
#define SPINAND_VERC_STATUS_ECCMASK 0x70
|
|
#define SPINAND_VERC_STATUS_ERR 0x70
|
|
|
|
#define STATUS_E_FAIL 0x04
|
|
#define STATUS_P_FAIL 0x08
|
|
|
|
struct spi_nand_flash_params {
|
|
u8 id[4];
|
|
u16 page_size;
|
|
u16 pages_per_sector;
|
|
u16 nr_sectors;
|
|
u32 oob_size;
|
|
u32 erase_size;
|
|
u8 no_of_dies;
|
|
int prev_die_id;
|
|
u8 plane_id;
|
|
u8 protec_bpx;
|
|
u64 pages_per_die;
|
|
void (*norm_read_cmd) (u8 *cmd, int column);
|
|
int (*verify_ecc) (int status);
|
|
int (*die_select) (struct mtd_info *mtd,
|
|
struct spi_flash *flash, int die_id);
|
|
const char *name;
|
|
};
|
|
|
|
struct ipq40xx_spinand_info {
|
|
struct nand_hw_control controller;
|
|
struct mtd_info *mtd;
|
|
struct nand_chip *chip;
|
|
struct spi_flash *flash;
|
|
const struct spi_nand_flash_params *params;
|
|
uint8_t *cmd;
|
|
uint8_t chip_ver;
|
|
uint16_t cmd_len;
|
|
uint16_t ob_required;
|
|
uint32_t status;
|
|
};
|
|
|
|
#define ECC_ERR 1
|
|
#define ECC_CORRECTED 2
|
|
|
|
#define SPINAND_3BIT_ECC_MASK 0x70
|
|
#define SPINAND_3BIT_ECC_ERROR 0x70
|
|
#define SPINAND_3BIT_ECC_BF_THRESHOLD 0x40
|
|
|
|
#define SPINAND_2BIT_ECC_MASK 0x30
|
|
#define SPINAND_2BIT_ECC_ERROR 0x20
|
|
#define SPINAND_2BIT_ECC_CORRECTED 0x10
|
|
#define SPINAND_2BIT_ECC_CORRECTED_TOSHIBA 0x30
|
|
#endif
|