162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * © Copyright 2016 ATMEL
462306a36Sopenharmony_ci * © Copyright 2016 Free Electrons
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Derived from the atmel_nand.c driver which contained the following
962306a36Sopenharmony_ci * copyrights:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci *    Copyright © 2003 Rick Bronson
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci *    Derived from drivers/mtd/nand/autcpu12.c (removed in v3.8)
1462306a36Sopenharmony_ci *        Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci *    Derived from drivers/mtd/spia.c (removed in v3.8)
1762306a36Sopenharmony_ci *        Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci *    Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
2162306a36Sopenharmony_ci *        Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci *        Derived from Das U-Boot source code
2462306a36Sopenharmony_ci *              (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
2562306a36Sopenharmony_ci *        © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci *    Add Programmable Multibit ECC support for various AT91 SoC
2862306a36Sopenharmony_ci *        © Copyright 2012 ATMEL, Hong Xu
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci *    Add Nand Flash Controller support for SAMA5 SoC
3162306a36Sopenharmony_ci *        © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#ifndef ATMEL_PMECC_H
3562306a36Sopenharmony_ci#define ATMEL_PMECC_H
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define ATMEL_PMECC_MAXIMIZE_ECC_STRENGTH	0
3862306a36Sopenharmony_ci#define ATMEL_PMECC_SECTOR_SIZE_AUTO		0
3962306a36Sopenharmony_ci#define ATMEL_PMECC_OOBOFFSET_AUTO		-1
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct atmel_pmecc_user_req {
4262306a36Sopenharmony_ci	int pagesize;
4362306a36Sopenharmony_ci	int oobsize;
4462306a36Sopenharmony_ci	struct {
4562306a36Sopenharmony_ci		int strength;
4662306a36Sopenharmony_ci		int bytes;
4762306a36Sopenharmony_ci		int sectorsize;
4862306a36Sopenharmony_ci		int nsectors;
4962306a36Sopenharmony_ci		int ooboffset;
5062306a36Sopenharmony_ci	} ecc;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct atmel_pmecc *devm_atmel_pmecc_get(struct device *dev);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct atmel_pmecc_user *
5662306a36Sopenharmony_ciatmel_pmecc_create_user(struct atmel_pmecc *pmecc,
5762306a36Sopenharmony_ci			struct atmel_pmecc_user_req *req);
5862306a36Sopenharmony_civoid atmel_pmecc_destroy_user(struct atmel_pmecc_user *user);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_civoid atmel_pmecc_reset(struct atmel_pmecc *pmecc);
6162306a36Sopenharmony_ciint atmel_pmecc_enable(struct atmel_pmecc_user *user, int op);
6262306a36Sopenharmony_civoid atmel_pmecc_disable(struct atmel_pmecc_user *user);
6362306a36Sopenharmony_ciint atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user);
6462306a36Sopenharmony_ciint atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector,
6562306a36Sopenharmony_ci			       void *data, void *ecc);
6662306a36Sopenharmony_cibool atmel_pmecc_correct_erased_chunks(struct atmel_pmecc_user *user);
6762306a36Sopenharmony_civoid atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user,
6862306a36Sopenharmony_ci					int sector, void *ecc);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#endif /* ATMEL_PMECC_H */
71