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