18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * © Copyright 2016 ATMEL
48c2ecf20Sopenharmony_ci * © Copyright 2016 Free Electrons
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Derived from the atmel_nand.c driver which contained the following
98c2ecf20Sopenharmony_ci * copyrights:
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci *    Copyright © 2003 Rick Bronson
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci *    Derived from drivers/mtd/nand/autcpu12.c (removed in v3.8)
148c2ecf20Sopenharmony_ci *        Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
158c2ecf20Sopenharmony_ci *
168c2ecf20Sopenharmony_ci *    Derived from drivers/mtd/spia.c (removed in v3.8)
178c2ecf20Sopenharmony_ci *        Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci *
208c2ecf20Sopenharmony_ci *    Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
218c2ecf20Sopenharmony_ci *        Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
228c2ecf20Sopenharmony_ci *
238c2ecf20Sopenharmony_ci *        Derived from Das U-Boot source code
248c2ecf20Sopenharmony_ci *              (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
258c2ecf20Sopenharmony_ci *        © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
268c2ecf20Sopenharmony_ci *
278c2ecf20Sopenharmony_ci *    Add Programmable Multibit ECC support for various AT91 SoC
288c2ecf20Sopenharmony_ci *        © Copyright 2012 ATMEL, Hong Xu
298c2ecf20Sopenharmony_ci *
308c2ecf20Sopenharmony_ci *    Add Nand Flash Controller support for SAMA5 SoC
318c2ecf20Sopenharmony_ci *        © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
328c2ecf20Sopenharmony_ci */
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#ifndef ATMEL_PMECC_H
358c2ecf20Sopenharmony_ci#define ATMEL_PMECC_H
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define ATMEL_PMECC_MAXIMIZE_ECC_STRENGTH	0
388c2ecf20Sopenharmony_ci#define ATMEL_PMECC_SECTOR_SIZE_AUTO		0
398c2ecf20Sopenharmony_ci#define ATMEL_PMECC_OOBOFFSET_AUTO		-1
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistruct atmel_pmecc_user_req {
428c2ecf20Sopenharmony_ci	int pagesize;
438c2ecf20Sopenharmony_ci	int oobsize;
448c2ecf20Sopenharmony_ci	struct {
458c2ecf20Sopenharmony_ci		int strength;
468c2ecf20Sopenharmony_ci		int bytes;
478c2ecf20Sopenharmony_ci		int sectorsize;
488c2ecf20Sopenharmony_ci		int nsectors;
498c2ecf20Sopenharmony_ci		int ooboffset;
508c2ecf20Sopenharmony_ci	} ecc;
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistruct atmel_pmecc *devm_atmel_pmecc_get(struct device *dev);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistruct atmel_pmecc_user *
568c2ecf20Sopenharmony_ciatmel_pmecc_create_user(struct atmel_pmecc *pmecc,
578c2ecf20Sopenharmony_ci			struct atmel_pmecc_user_req *req);
588c2ecf20Sopenharmony_civoid atmel_pmecc_destroy_user(struct atmel_pmecc_user *user);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_civoid atmel_pmecc_reset(struct atmel_pmecc *pmecc);
618c2ecf20Sopenharmony_ciint atmel_pmecc_enable(struct atmel_pmecc_user *user, int op);
628c2ecf20Sopenharmony_civoid atmel_pmecc_disable(struct atmel_pmecc_user *user);
638c2ecf20Sopenharmony_ciint atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user);
648c2ecf20Sopenharmony_ciint atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector,
658c2ecf20Sopenharmony_ci			       void *data, void *ecc);
668c2ecf20Sopenharmony_cibool atmel_pmecc_correct_erased_chunks(struct atmel_pmecc_user *user);
678c2ecf20Sopenharmony_civoid atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user,
688c2ecf20Sopenharmony_ci					int sector, void *ecc);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif /* ATMEL_PMECC_H */
71