blob: defce6f980d26ee098c84744b58b607b557da5e2 [file] [log] [blame]
/*
* 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