mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			284 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/drivers/mtd/nand/nfc_gen.h	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ linux-4.9.y/drivers/mtd/nand/nfc_gen.h	2021-06-07 13:01:33.000000000 +0300
 | |
| @@ -0,0 +1,280 @@
 | |
| +/*
 | |
| + * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
 | |
| + */
 | |
| +
 | |
| +#ifndef __NFC_GEN_H__
 | |
| +#define __NFC_GEN_H__
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +#include <linux/mtd/mtd.h>
 | |
| +#include <linux/mtd/nand.h>
 | |
| +#include <linux/string_helpers.h>
 | |
| +#include <asm/setup.h>
 | |
| +#include <linux/module.h>
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +#define NFC_VER_300                   (0x300)
 | |
| +#define NFC_VER_301                   (0x301)
 | |
| +#define NFC_VER_310                   (0x310)
 | |
| +#define NFC_VER_504                   (0x504)
 | |
| +#define NFC_VER_505                   (0x505)
 | |
| +#define NFC_VER_600                   (0x600)
 | |
| +#define NFC_VER_610                   (0x610)
 | |
| +#define NFC_VER_620                   (0x620)
 | |
| +
 | |
| +#define SNFC_VER_100                  (0x400)
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +#define NAND_PAGE_512B                   0
 | |
| +#define NAND_PAGE_1K                     1
 | |
| +#define NAND_PAGE_2K                     2
 | |
| +#define NAND_PAGE_4K                     3
 | |
| +#define NAND_PAGE_8K                     4
 | |
| +#define NAND_PAGE_16K                    5
 | |
| +#define NAND_PAGE_32K                    6
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +#define NAND_ECC_NONE                    0
 | |
| +#define NAND_ECC_0BIT                    0
 | |
| +#define NAND_ECC_1BIT                    1
 | |
| +#define NAND_ECC_1BIT_512                1
 | |
| +#define NAND_ECC_4BIT                    2
 | |
| +#define NAND_ECC_4BIT_512                2
 | |
| +#define NAND_ECC_4BYTE                   2
 | |
| +#define NAND_ECC_8BIT                    2
 | |
| +#define NAND_ECC_8BIT_512                3
 | |
| +#define NAND_ECC_8BYTE                   3
 | |
| +#define NAND_ECC_13BIT                   4
 | |
| +#define NAND_ECC_16BIT                   5
 | |
| +#define NAND_ECC_18BIT                   6
 | |
| +#define NAND_ECC_24BIT                   7
 | |
| +#define NAND_ECC_27BIT                   8
 | |
| +#define NAND_ECC_28BIT                   9
 | |
| +#define NAND_ECC_32BIT                   10
 | |
| +#define NAND_ECC_40BIT                   11
 | |
| +#define NAND_ECC_41BIT                   12
 | |
| +#define NAND_ECC_42BIT                   13
 | |
| +#define NAND_ECC_48BIT                   14
 | |
| +#define NAND_ECC_60BIT                   15
 | |
| +#define NAND_ECC_64BIT                   16
 | |
| +#define NAND_ECC_72BIT                   17
 | |
| +#define NAND_ECC_80BIT                   18
 | |
| +
 | |
| +enum ecc_type {
 | |
| +	et_ecc_none    = 0x00,
 | |
| +	et_ecc_1bit    = 0x01,
 | |
| +	et_ecc_4bit    = 0x02,
 | |
| +	et_ecc_8bit    = 0x03,
 | |
| +	et_ecc_24bit1k = 0x04,
 | |
| +	et_ecc_40bit1k = 0x05,
 | |
| +	et_ecc_64bit1k = 0x06,
 | |
| +};
 | |
| +
 | |
| +enum page_type {
 | |
| +	pt_pagesize_512   = 0x00,
 | |
| +	pt_pagesize_2K    = 0x01,
 | |
| +	pt_pagesize_4K    = 0x02,
 | |
| +	pt_pagesize_8K    = 0x03,
 | |
| +	pt_pagesize_16K   = 0x04,
 | |
| +};
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +struct nand_config_info {
 | |
| +	unsigned int pagetype;
 | |
| +	unsigned int ecctype;
 | |
| +	unsigned int ecc_strength;
 | |
| +	unsigned int oobsize;
 | |
| +	struct mtd_ooblayout_ops *ooblayout_ops;
 | |
| +};
 | |
| +
 | |
| +struct nfc_host;
 | |
| +
 | |
| +struct nand_sync {
 | |
| +
 | |
| +#define SET_NAND_SYNC_TYPE(_mfr, _onfi, _version) \
 | |
| +	((((_mfr) & 0xFF) << 16) | (((_version) & 0xFF) << 8) \
 | |
| +	 | ((_onfi) & 0xFF))
 | |
| +
 | |
| +#define GET_NAND_SYNC_TYPE_MFR(_type) (((_type) >> 16) & 0xFF)
 | |
| +#define GET_NAND_SYNC_TYPE_VER(_type) (((_type) >> 8) & 0xFF)
 | |
| +#define GET_NAND_SYNC_TYPE_INF(_type) ((_type) & 0xFF)
 | |
| +
 | |
| +#define NAND_TYPE_ONFI_23_MICRON    \
 | |
| +	SET_NAND_SYNC_TYPE(NAND_MFR_MICRON, NAND_IS_ONFI, 0x23)
 | |
| +#define NAND_TYPE_ONFI_30_MICRON    \
 | |
| +	SET_NAND_SYNC_TYPE(NAND_MFR_MICRON, NAND_IS_ONFI, 0x30)
 | |
| +#define NAND_TYPE_TOGGLE_TOSHIBA    \
 | |
| +	SET_NAND_SYNC_TYPE(NAND_MFR_TOSHIBA, 0, 0)
 | |
| +#define NAND_TYPE_TOGGLE_SAMSUNG    \
 | |
| +	SET_NAND_SYNC_TYPE(NAND_MFR_SAMSUNG, 0, 0)
 | |
| +
 | |
| +#define NAND_TYPE_TOGGLE_10         SET_NAND_SYNC_TYPE(0, 0, 0x10)
 | |
| +#define NAND_TYPE_ONFI_30           SET_NAND_SYNC_TYPE(0, NAND_IS_ONFI, 0x30)
 | |
| +#define NAND_TYPE_ONFI_23           SET_NAND_SYNC_TYPE(0, NAND_IS_ONFI, 0x23)
 | |
| +
 | |
| +	int type;
 | |
| +	int (*enable)(struct nand_chip *chip);
 | |
| +	int (*disable)(struct nand_chip *chip);
 | |
| +};
 | |
| +
 | |
| +struct read_retry_t {
 | |
| +	int type;
 | |
| +	int count;
 | |
| +	int (*set_rr_param)(struct nfc_host *host, int param);
 | |
| +	int (*get_rr_param)(struct nfc_host *host);
 | |
| +	int (*reset_rr_param)(struct nfc_host *host);
 | |
| +};
 | |
| +
 | |
| +struct ecc_info_t {
 | |
| +	int pagesize;
 | |
| +	int ecctype;
 | |
| +	int threshold;
 | |
| +	int section;
 | |
| +	void (*dump)(struct nfc_host *host, unsigned char ecc[],
 | |
| +		     int *max_bitsflag);
 | |
| +};
 | |
| +
 | |
| +struct nand_dev_t {
 | |
| +	struct nand_flash_dev flash_dev;
 | |
| +
 | |
| +	char *start_type;
 | |
| +	unsigned char ids[8];
 | |
| +	int oobsize;
 | |
| +	int ecctype;
 | |
| +
 | |
| +	/* (Controller) support ecc/page detect, driver don't need detect */
 | |
| +#define NANDC_HW_AUTO                         0x01
 | |
| +	/* (Controller) support ecc/page detect,
 | |
| +	 * and current ecc/page config finish */
 | |
| +#define NANDC_CONFIG_DONE                     0x02
 | |
| +	/* (Controller) is sync, default is async */
 | |
| +#define NANDC_IS_SYNC_BOOT                    0x04
 | |
| +
 | |
| +	/* (NAND) need randomizer */
 | |
| +#define NAND_RANDOMIZER                       0x10
 | |
| +	/* (NAND) is ONFI interface, combine with sync/async symble */
 | |
| +#define NAND_IS_ONFI                          0x20
 | |
| +	/* (NAND) support async and sync, such micron onfi, toshiba toggle 1.0 */
 | |
| +#define NAND_MODE_SYNC_ASYNC                  0x40
 | |
| +	/* (NAND) support only sync, such samsung sync. */
 | |
| +#define NAND_MODE_ONLY_SYNC                   0x80
 | |
| +
 | |
| +#define NAND_CHIP_MICRON   (NAND_MODE_SYNC_ASYNC | NAND_IS_ONFI)
 | |
| +	/* This NAND is async, or sync/async, default is async mode,
 | |
| +	 * toggle1.0 interface */
 | |
| +#define NAND_CHIP_TOSHIBA_TOGGLE_10  (NAND_MODE_SYNC_ASYNC)
 | |
| +	/* This NAND is only sync mode, toggle2.0 interface */
 | |
| +#define NAND_CHIP_TOSHIBA_TOGGLE_20   (NAND_MODE_ONLY_SYNC)
 | |
| +	/* This NAND is only sync mode */
 | |
| +#define NAND_CHIP_SAMSUNG  (NAND_MODE_ONLY_SYNC)
 | |
| +
 | |
| +	unsigned int flags;
 | |
| +
 | |
| +#define NAND_RR_NONE                   0x00
 | |
| +#define NAND_RR_HYNIX_BG_BDIE          0x10
 | |
| +#define NAND_RR_HYNIX_BG_CDIE          0x11
 | |
| +#define NAND_RR_HYNIX_CG_ADIE          0x12
 | |
| +#define NAND_RR_MICRON                 0x20
 | |
| +#define NAND_RR_SAMSUNG                0x30
 | |
| +#define NAND_RR_TOSHIBA_24nm           0x40
 | |
| +#define NAND_RR_TOSHIBA_19nm           0x41
 | |
| +	int read_retry_type;
 | |
| +};
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +
 | |
| +#define IS_NANDC_HW_AUTO(_host)         ((_host)->flags & NANDC_HW_AUTO)
 | |
| +#define IS_NANDC_CONFIG_DONE(_host)     ((_host)->flags & NANDC_CONFIG_DONE)
 | |
| +#define IS_NANDC_SYNC_BOOT(_host)       ((_host)->flags & NANDC_IS_SYNC_BOOT)
 | |
| +
 | |
| +#define IS_NAND_RANDOM(_dev)         ((_dev)->flags & NAND_RANDOMIZER)
 | |
| +#define IS_NAND_ONLY_SYNC(_dev)      ((_dev)->flags & NAND_MODE_ONLY_SYNC)
 | |
| +#define IS_NAND_SYNC_ASYNC(_dev)     ((_dev)->flags & NAND_MODE_SYNC_ASYNC)
 | |
| +#define IS_NAND_ONFI(_dev)           ((_dev)->flags & NAND_IS_ONFI)
 | |
| +
 | |
| +#define ERSTR_HARDWARE  "Hardware configuration error. "
 | |
| +#define ERSTR_DRIVER    "Driver does not support. "
 | |
| +
 | |
| +#define ENABLE                    1
 | |
| +#define DISABLE                   0
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +
 | |
| +char *get_ecctype_str(enum ecc_type ecctype);
 | |
| +
 | |
| +char *get_pagesize_str(enum page_type pagetype);
 | |
| +
 | |
| +unsigned int get_pagesize(enum page_type pagetype);
 | |
| +
 | |
| +const char *nand_ecc_name(int type);
 | |
| +
 | |
| +const char *nand_page_name(int type);
 | |
| +
 | |
| +int nandpage_size2type(int size);
 | |
| +
 | |
| +int nandpage_type2size(int size);
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +extern int (*nfc_param_adjust)(struct mtd_info *mtd, struct nand_chip *chip,
 | |
| +				 struct nand_dev_t *nand_dev);
 | |
| +
 | |
| +extern struct nand_flash_dev *(*nand_get_flash_type_func)(struct mtd_info *mtd,
 | |
| +		struct nand_chip *chip, struct nand_dev_t *spinand_dev_t);
 | |
| +
 | |
| +extern struct nand_flash_dev *(*get_spi_nand_flash_type_hook)
 | |
| +(struct mtd_info *mtd, unsigned char *id);
 | |
| +
 | |
| +extern int (*nfc_param_adjust)(struct mtd_info *,
 | |
| +				 struct nand_chip *, struct nand_dev_t *);
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +struct nand_flash_dev *nfc_get_flash_type(struct mtd_info *mtd,
 | |
| +		struct nand_chip *chip, u8 *id_data, int *busw);
 | |
| +
 | |
| +extern struct nand_flash_dev *(*get_spi_nand_flash_type_hook)
 | |
| +(struct mtd_info *mtd, unsigned char *id);
 | |
| +
 | |
| +void nfc_nand_param_adjust(struct mtd_info *mtd, struct nand_chip *chip);
 | |
| +
 | |
| +void nfc_show_info(struct mtd_info *mtd, char *goke, char *chipname);
 | |
| +
 | |
| +void nfc_show_chipsize(struct nand_chip *chip);
 | |
| +
 | |
| +int get_bits(unsigned int n);
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +#define nfc_pr_msg(_fmt, arg...) printk(_fmt, ##arg)
 | |
| +
 | |
| +#define nfc_pr_bug(fmt, args...) do { \
 | |
| +	printk("%s(%d): bug " fmt, __FILE__, __LINE__, ##args); \
 | |
| +	while (1) \
 | |
| +		; \
 | |
| +} while (0)
 | |
| +
 | |
| +#define PR_MSG(_fmt, arg...) \
 | |
| +	    printk(_fmt, ##arg)
 | |
| +
 | |
| +extern char *nand_dbgfs_options;
 | |
| +/*****************************************************************************/
 | |
| +extern unsigned char match_page_reg_to_type(unsigned char reg);
 | |
| +
 | |
| +extern unsigned char match_page_type_to_reg(unsigned char type);
 | |
| +
 | |
| +extern const char *match_page_type_to_str(unsigned char type);
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +extern unsigned char match_ecc_reg_to_type(unsigned char reg);
 | |
| +
 | |
| +extern unsigned char match_ecc_type_to_reg(unsigned char type);
 | |
| +
 | |
| +extern const char *match_ecc_type_to_str(unsigned char type);
 | |
| +
 | |
| +/*****************************************************************************/
 | |
| +extern unsigned char match_page_size_to_type(unsigned int size);
 | |
| +
 | |
| +extern unsigned int match_page_type_to_size(unsigned char type);
 | |
| +
 | |
| +const char *nand_ecc_name(int type);
 | |
| +/*****************************************************************************/
 | |
| +
 | |
| +#endif /* End of __NFC_GEN_H__ */
 |