1ba0501acSDingqiang Lin /* 2ba0501acSDingqiang Lin * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3ba0501acSDingqiang Lin * 4ba0501acSDingqiang Lin * SPDX-License-Identifier: GPL-2.0 5ba0501acSDingqiang Lin */ 6ba0501acSDingqiang Lin 7ba0501acSDingqiang Lin #ifndef __FLASH_H 8ba0501acSDingqiang Lin #define __FLASH_H 9ba0501acSDingqiang Lin 10ba0501acSDingqiang Lin #ifndef BIT 11ba0501acSDingqiang Lin #define BIT(nr) (1 << (nr)) 12ba0501acSDingqiang Lin #endif 13ba0501acSDingqiang Lin 14ba0501acSDingqiang Lin #define MAX_FLASH_NUM 2 15ba0501acSDingqiang Lin #define MAX_IDB_RESERVED_BLOCK 12 16ba0501acSDingqiang Lin 17ba0501acSDingqiang Lin #define NAND_CACHE_READ_EN BIT(0) 18ba0501acSDingqiang Lin #define NAND_CACHE_RANDOM_READ_EN BIT(1) 19ba0501acSDingqiang Lin #define NAND_CACHE_PROG_EN BIT(2) 20ba0501acSDingqiang Lin #define NAND_MULTI_READ_EN BIT(3) 21ba0501acSDingqiang Lin 22ba0501acSDingqiang Lin #define NAND_MULTI_PROG_EN BIT(4) 23ba0501acSDingqiang Lin #define NAND_INTERLEAVE_EN BIT(5) 24ba0501acSDingqiang Lin #define NAND_READ_RETRY_EN BIT(6) 25ba0501acSDingqiang Lin #define NAND_RANDOMIZER_EN BIT(7) 26ba0501acSDingqiang Lin 27ba0501acSDingqiang Lin #define NAND_INTER_MODE_OFFSET (0x8) 28ba0501acSDingqiang Lin #define NAND_INTER_MODE_MARK (0x07) 29ba0501acSDingqiang Lin #define NAND_INTER_SDR_EN BIT(0) 30ba0501acSDingqiang Lin #define NAND_INTER_ONFI_EN BIT(1) 31ba0501acSDingqiang Lin #define NAND_INTER_TOGGLE_EN BIT(2) 32ba0501acSDingqiang Lin 33ba0501acSDingqiang Lin #define NAND_SDR_EN BIT(8) 34ba0501acSDingqiang Lin #define NAND_ONFI_EN BIT(9) 35ba0501acSDingqiang Lin #define NAND_TOGGLE_EN BIT(10) 36ba0501acSDingqiang Lin #define NAND_UNIQUE_ID_EN BIT(11) 37ba0501acSDingqiang Lin 38ba0501acSDingqiang Lin #define RESET_CMD 0xff 39ba0501acSDingqiang Lin #define READ_ID_CMD 0x90 40ba0501acSDingqiang Lin #define READ_STATUS_CMD 0x70 41ba0501acSDingqiang Lin #define PAGE_PROG_CMD 0x8010 42ba0501acSDingqiang Lin #define BLOCK_ERASE_CMD 0x60d0 43ba0501acSDingqiang Lin #define READ_CMD 0x0030 44ba0501acSDingqiang Lin #define READ_DP_OUT_CMD 0x05E0 45*6f226dcaSJon Lin #define READ_ECC_STATUS_CMD 0x7A 46ba0501acSDingqiang Lin 47ba0501acSDingqiang Lin #define SAMSUNG 0x00 /* SAMSUNG */ 48ba0501acSDingqiang Lin #define TOSHIBA 0x01 /* TOSHIBA */ 49ba0501acSDingqiang Lin #define HYNIX 0x02 /* HYNIX */ 50ba0501acSDingqiang Lin #define INFINEON 0x03 /* INFINEON */ 51ba0501acSDingqiang Lin #define MICRON 0x04 /* MICRON */ 52ba0501acSDingqiang Lin #define RENESAS 0x05 /* RENESAS */ 53ba0501acSDingqiang Lin #define ST 0x06 /* ST */ 54ba0501acSDingqiang Lin #define INTEL 0x07 /* intel */ 55ba0501acSDingqiang Lin #define Sandisk 0x08 /* Sandisk */ 56ba0501acSDingqiang Lin 57ba0501acSDingqiang Lin #define RR_NONE 0x00 58ba0501acSDingqiang Lin #define RR_HY_1 0x01 /* hynix H27UCG8T2M */ 59ba0501acSDingqiang Lin #define RR_HY_2 0x02 /* hynix H27UBG08U0B */ 60ba0501acSDingqiang Lin #define RR_HY_3 0x03 /* hynix H27UCG08U0B H27UBG08U0C */ 61ba0501acSDingqiang Lin #define RR_HY_4 0x04 /* hynix H27UCG8T2A */ 62ba0501acSDingqiang Lin #define RR_HY_5 0x05 /* hynix H27UCG8T2E */ 63ba0501acSDingqiang Lin #define RR_HY_6 0x06 /* hynix H27QCG8T2F5R-BCG */ 64ba0501acSDingqiang Lin #define RR_MT_1 0x11 /* micron */ 65ba0501acSDingqiang Lin #define RR_MT_2 0x12 /* micron L94C L95B */ 66ba0501acSDingqiang Lin #define RR_TH_1 0x21 /* toshiba */ 67ba0501acSDingqiang Lin #define RR_TH_2 0x22 /* toshiba */ 68ba0501acSDingqiang Lin #define RR_TH_3 0x23 /* toshiba */ 69ba0501acSDingqiang Lin #define RR_SS_1 0x31 /* samsung */ 70ba0501acSDingqiang Lin #define RR_SD_1 0x41 /* Sandisk */ 71ba0501acSDingqiang Lin #define RR_SD_2 0x42 /* Sandisk */ 72ba0501acSDingqiang Lin #define RR_SD_3 0x43 /* Sandisk */ 73ba0501acSDingqiang Lin #define RR_SD_4 0x44 /* Sandisk */ 74ba0501acSDingqiang Lin 75ba0501acSDingqiang Lin /* 0 1 2 3 4 5 6 7 8 9 slc */ 76ba0501acSDingqiang Lin #define LSB_0 0 77ba0501acSDingqiang Lin /* 0 1 2 3 6 7 A B E F hynix, micron 74A */ 78ba0501acSDingqiang Lin #define LSB_1 1 79ba0501acSDingqiang Lin /* 0 1 3 5 7 9 B D toshiba samsung sandisk */ 80ba0501acSDingqiang Lin #define LSB_2 2 81ba0501acSDingqiang Lin /* 0 1 2 3 4 5 8 9 C D 10 11 micron 84A */ 82ba0501acSDingqiang Lin #define LSB_3 3 83ba0501acSDingqiang Lin /* 0 1 2 3 4 5 7 8 A B E F micron L95B */ 84ba0501acSDingqiang Lin #define LSB_4 4 85ba0501acSDingqiang Lin /* 0 1 2 3 4 5 8 9 14 15 20 21 26 27 micron B74A TLC */ 86ba0501acSDingqiang Lin #define LSB_6 6 87ba0501acSDingqiang Lin /* 0 3 6 9 C F 12 15 18 15 1B 1E 21 24 K9ABGD8U0C TLC */ 88ba0501acSDingqiang Lin #define LSB_7 7 89ba0501acSDingqiang Lin 90ba0501acSDingqiang Lin /* BadBlockFlagMode */ 91ba0501acSDingqiang Lin /* first spare @ first page of each blocks */ 92ba0501acSDingqiang Lin #define BBF_1 1 93ba0501acSDingqiang Lin /* first spare @ last page of each blocks */ 94ba0501acSDingqiang Lin #define BBF_2 2 95ba0501acSDingqiang Lin /* first spare @ first and last page of each blocks */ 96ba0501acSDingqiang Lin #define BBF_11 3 97ba0501acSDingqiang Lin /* sandisk 15nm flash prog first page without data and check status */ 98ba0501acSDingqiang Lin #define BBF_3 4 99ba0501acSDingqiang Lin 100ba0501acSDingqiang Lin #define MPM_0 0 /* block 0 ~ 1 */ 101ba0501acSDingqiang Lin #define MPM_1 1 /* block 0 ~ 2048... */ 102ba0501acSDingqiang Lin 103ba0501acSDingqiang Lin struct NAND_PARA_INFO_T { 104ba0501acSDingqiang Lin u8 id_bytes; 105ba0501acSDingqiang Lin u8 nand_id[6]; 106ba0501acSDingqiang Lin u8 vendor; 107ba0501acSDingqiang Lin u8 die_per_chip; 108ba0501acSDingqiang Lin u8 sec_per_page; 109ba0501acSDingqiang Lin u16 page_per_blk; 110ba0501acSDingqiang Lin u8 cell; /* 1 slc , 2 mlc , 3 tlc */ 111ba0501acSDingqiang Lin u8 plane_per_die; 112ba0501acSDingqiang Lin u16 blk_per_plane; 113ba0501acSDingqiang Lin u16 operation_opt; 114ba0501acSDingqiang Lin u8 lsb_mode; 115ba0501acSDingqiang Lin u8 read_retry_mode; 116ba0501acSDingqiang Lin u8 ecc_bits; 117ba0501acSDingqiang Lin u8 access_freq; 118ba0501acSDingqiang Lin u8 opt_mode; 119ba0501acSDingqiang Lin u8 die_gap; 120ba0501acSDingqiang Lin u8 bad_block_mode; 121ba0501acSDingqiang Lin u8 multi_plane_mode; 122ba0501acSDingqiang Lin u8 reversd2[6]; /* 32 bytes */ 123ba0501acSDingqiang Lin }; 124ba0501acSDingqiang Lin 125ba0501acSDingqiang Lin extern struct nand_phy_info g_nand_phy_info; 126ba0501acSDingqiang Lin extern struct nand_ops g_nand_ops; 127ba0501acSDingqiang Lin extern void __iomem *nandc_base; 128ba0501acSDingqiang Lin 129ba0501acSDingqiang Lin void nandc_flash_get_id(u8 cs, void *buf); 130ba0501acSDingqiang Lin void nandc_flash_reset(u8 chip_sel); 131ba0501acSDingqiang Lin u32 nandc_flash_init(void __iomem *nandc_addr); 132ba0501acSDingqiang Lin u32 nandc_flash_deinit(void); 133ba0501acSDingqiang Lin 134ba0501acSDingqiang Lin #endif 135