/*
 * nand_dev.h for  SUNXI NAND .
 *
 * Copyright (C) 2016 Allwinner.
 *
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */
#ifndef __NAND_DEV_H__
#define __NAND_DEV_H__

extern unsigned int do_static_wear_leveling(void *zone);
extern unsigned int static_wear_leveling(void *zone);
extern unsigned short nftl_get_zone_write_cache_nums(void *_zone);
extern unsigned int garbage_collect(void *zone);
extern unsigned int do_prio_gc(void *zone);
uint32 shutdown_on_gc(void *zone);

extern struct nand_blk_ops mytr;
extern struct kobj_type ktype;

extern struct _nand_partition *build_nand_partition(struct _nand_phy_partition
							*phy_partition);
extern void add_nftl_blk_list(struct _nftl_blk *head,
			      struct _nftl_blk *nftl_blk);
extern struct _nftl_blk *del_last_nftl_blk(struct _nftl_blk *head);
extern int add_nand_blktrans_dev(struct nand_blk_dev *dev);
extern int add_nand_blktrans_dev_for_dragonboard(struct nand_blk_dev *dev);
extern int del_nand_blktrans_dev(struct nand_blk_dev *dev);
extern struct _nand_disk *get_disk_from_phy_partition(struct _nand_phy_partition
							  *phy_partition);
extern uint16 get_partitionNO(struct _nand_phy_partition *phy_partition);
extern int nftl_exit(struct _nftl_blk *nftl_blk);
extern int nand_print_dbg(const char *fmt, ...);
extern struct _nftl_blk *get_nftl_need_read_claim(struct _nftl_blk *start_blk);
extern int read_reclaim(struct _nftl_blk *start_blk, struct _nftl_blk *nftl_blk,
			uchar *buf);

int _dev_nand_read(struct _nand_dev *nand_dev, __u32 start_sector, __u32 len,
		   unsigned char *buf);
int _dev_nand_write(struct _nand_dev *nand_dev, __u32 start_sector, __u32 len,
		    unsigned char *buf);
int _dev_nand_discard(struct _nand_dev *nand_dev, __u32 start_sector,
		      __u32 len);
int _dev_flush_write_cache(struct _nand_dev *nand_dev, __u32 num);
int _dev_flush_sector_write_cache(struct _nand_dev *nand_dev, __u32 num);
int dev_initialize(struct _nand_dev *nand_dev, struct _nftl_blk *nftl_blk,
		   __u32 offset, __u32 size);
int nand_flush(struct nand_blk_dev *dev);
int add_nand(struct nand_blk_ops *tr,
	     struct _nand_phy_partition *phy_partition);
int remove_nand(struct nand_blk_ops *tr);
unsigned int nand_read_reclaim(struct _nftl_blk *nftl_blk, unsigned char *buf);

extern uint32 gc_all(void *zone, uint16 invalid_page_count);
extern uint32 gc_all_enhance(void *zone);
extern uint32 gc_all_base_on_free_blks(void *zone);
extern uint32 gc_one(void *zone, uint16 invalid_page_count);
extern uint32 prio_gc_one(void *zone, uint16 block, uint32 flag);
extern void print_nftl_zone(void *zone);
extern void print_free_list(void *zone);
extern void print_smart(void *zone);
extern void print_block_invalid_list(void *zone);
extern void print_logic_page_map(void *_zone, uint32 num);
extern uint32 nftl_set_zone_test(void *_zone, uint32 num);
extern int nand_dbg_phy_read(unsigned short nDieNum, unsigned short nBlkNum,
			     unsigned short nPage);
extern int nand_dbg_zone_phy_read(void *zone, uint16 block, uint16 page);
extern int nand_dbg_zone_erase(void *zone, uint16 block, uint16 erase_num);
extern int nand_dbg_zone_phy_write(void *zone, uint16 block, uint16 page);
extern int nand_dbg_phy_write(unsigned short nDieNum, unsigned short nBlkNum,
			      unsigned short nPage);
extern int nand_dbg_phy_erase(unsigned short nDieNum, unsigned short nBlkNum);
extern int nand_dbg_single_phy_erase(unsigned short nDieNum,
				     unsigned short nBlkNum);
extern int _dev_nand_read2(char *name, __u32 start_sector, __u32 len,
			   unsigned char *buf);

extern void nand_phy_test(void);
extern int nand_check_table(void *zone);

extern void udisk_test_start(struct _nftl_blk *nftl_blk);
extern void udisk_test_stop(void);

#endif
