mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	Add driver for atmel pmecc. This implementation is ported from Linux. The reference taken is linux-5.4-at91. Signed-off-by: Balamanikandan Gunasundar <balamanikandan.gunasundar@microchip.com>
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
/*
 | 
						|
 * © Copyright 2016 ATMEL
 | 
						|
 * © Copyright 2016 Free Electrons
 | 
						|
 *
 | 
						|
 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
 | 
						|
 *
 | 
						|
 * Derived from the atmel_nand.c driver which contained the following
 | 
						|
 * copyrights:
 | 
						|
 *
 | 
						|
 *    Copyright © 2003 Rick Bronson
 | 
						|
 *
 | 
						|
 *    Derived from drivers/mtd/nand/autcpu12.c (removed in v3.8)
 | 
						|
 *        Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
 | 
						|
 *
 | 
						|
 *    Derived from drivers/mtd/spia.c (removed in v3.8)
 | 
						|
 *        Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *    Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
 | 
						|
 *        Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
 | 
						|
 *
 | 
						|
 *        Derived from Das U-Boot source code
 | 
						|
 *              (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
 | 
						|
 *        © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
 | 
						|
 *
 | 
						|
 *    Add Programmable Multibit ECC support for various AT91 SoC
 | 
						|
 *        © Copyright 2012 ATMEL, Hong Xu
 | 
						|
 *
 | 
						|
 *    Add Nand Flash Controller support for SAMA5 SoC
 | 
						|
 *        © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef ATMEL_PMECC_H
 | 
						|
#define ATMEL_PMECC_H
 | 
						|
 | 
						|
#define ATMEL_PMECC_MAXIMIZE_ECC_STRENGTH	0
 | 
						|
#define ATMEL_PMECC_SECTOR_SIZE_AUTO		0
 | 
						|
#define ATMEL_PMECC_OOBOFFSET_AUTO		-1
 | 
						|
 | 
						|
struct atmel_pmecc_user_req {
 | 
						|
	int pagesize;
 | 
						|
	int oobsize;
 | 
						|
	struct {
 | 
						|
		int strength;
 | 
						|
		int bytes;
 | 
						|
		int sectorsize;
 | 
						|
		int nsectors;
 | 
						|
		int ooboffset;
 | 
						|
	} ecc;
 | 
						|
};
 | 
						|
 | 
						|
struct atmel_pmecc_suspend_ctx {
 | 
						|
	u32 setup;
 | 
						|
	u32 pulse;
 | 
						|
	u32 cycle;
 | 
						|
	u32 timings;
 | 
						|
	u32 mode;
 | 
						|
};
 | 
						|
 | 
						|
struct atmel_pmecc {
 | 
						|
	struct udevice *dev;
 | 
						|
	const struct atmel_pmecc_caps *caps;
 | 
						|
 | 
						|
	struct {
 | 
						|
		void __iomem *base;
 | 
						|
		void __iomem *errloc;
 | 
						|
		void __iomem *timing;
 | 
						|
	} regs;
 | 
						|
 | 
						|
	/* Mutex used for pmecc enable/disable */
 | 
						|
	struct mutex lock;
 | 
						|
 | 
						|
	struct atmel_pmecc_suspend_ctx suspend;
 | 
						|
};
 | 
						|
 | 
						|
struct atmel_pmecc *devm_atmel_pmecc_get(struct udevice *dev);
 | 
						|
 | 
						|
struct atmel_pmecc_user *
 | 
						|
atmel_pmecc_create_user(struct atmel_pmecc *pmecc,
 | 
						|
			struct atmel_pmecc_user_req *req);
 | 
						|
void atmel_pmecc_destroy_user(struct atmel_pmecc_user *user);
 | 
						|
 | 
						|
void atmel_pmecc_reset(struct atmel_pmecc *pmecc);
 | 
						|
int atmel_pmecc_enable(struct atmel_pmecc_user *user, int op);
 | 
						|
void atmel_pmecc_disable(struct atmel_pmecc_user *user);
 | 
						|
int atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user);
 | 
						|
int atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector,
 | 
						|
			       void *data, void *ecc);
 | 
						|
bool atmel_pmecc_correct_erased_chunks(struct atmel_pmecc_user *user);
 | 
						|
void atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user,
 | 
						|
					int sector, void *ecc);
 | 
						|
 | 
						|
#endif /* ATMEL_PMECC_H */
 |