xref: /linux/drivers/mtd/nand/raw/atmel/pmecc.h (revision c13aca79ff3c4af5fd31a5b2743a90eba6e36a26)
1 /*
2  * © Copyright 2016 ATMEL
3  * © Copyright 2016 Free Electrons
4  *
5  * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
6  *
7  * Derived from the atmel_nand.c driver which contained the following
8  * copyrights:
9  *
10  *    Copyright © 2003 Rick Bronson
11  *
12  *    Derived from drivers/mtd/nand/autcpu12.c (removed in v3.8)
13  *        Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
14  *
15  *    Derived from drivers/mtd/spia.c (removed in v3.8)
16  *        Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
17  *
18  *
19  *    Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
20  *        Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
21  *
22  *        Derived from Das U-Boot source code
23  *              (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
24  *        © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
25  *
26  *    Add Programmable Multibit ECC support for various AT91 SoC
27  *        © Copyright 2012 ATMEL, Hong Xu
28  *
29  *    Add Nand Flash Controller support for SAMA5 SoC
30  *        © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
31  *
32  * This program is free software; you can redistribute it and/or modify
33  * it under the terms of the GNU General Public License version 2 as
34  * published by the Free Software Foundation.
35  *
36  */
37 
38 #ifndef ATMEL_PMECC_H
39 #define ATMEL_PMECC_H
40 
41 #define ATMEL_PMECC_MAXIMIZE_ECC_STRENGTH	0
42 #define ATMEL_PMECC_SECTOR_SIZE_AUTO		0
43 #define ATMEL_PMECC_OOBOFFSET_AUTO		-1
44 
45 struct atmel_pmecc_user_req {
46 	int pagesize;
47 	int oobsize;
48 	struct {
49 		int strength;
50 		int bytes;
51 		int sectorsize;
52 		int nsectors;
53 		int ooboffset;
54 	} ecc;
55 };
56 
57 struct atmel_pmecc *devm_atmel_pmecc_get(struct device *dev);
58 
59 struct atmel_pmecc_user *
60 atmel_pmecc_create_user(struct atmel_pmecc *pmecc,
61 			struct atmel_pmecc_user_req *req);
62 void atmel_pmecc_destroy_user(struct atmel_pmecc_user *user);
63 
64 void atmel_pmecc_reset(struct atmel_pmecc *pmecc);
65 int atmel_pmecc_enable(struct atmel_pmecc_user *user, int op);
66 void atmel_pmecc_disable(struct atmel_pmecc_user *user);
67 int atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user);
68 int atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector,
69 			       void *data, void *ecc);
70 bool atmel_pmecc_correct_erased_chunks(struct atmel_pmecc_user *user);
71 void atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user,
72 					int sector, void *ecc);
73 
74 #endif /* ATMEL_PMECC_H */
75