mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 08:36:27 +07:00
f88fc122cc
This is a complete rewrite of the driver whose main purpose is to support the new DT representation where the NAND controller node is now really visible in the DT and appears under the EBI bus. With this new representation, we can add other devices under the EBI bus without risking pinmuxing conflicts (the NAND controller is under the EBI bus logic and as such, share some of its pins with other devices connected on this bus). Even though the goal of this rework was not necessarily to add new features, the new driver has been designed with this in mind. With a clearer separation between the different blocks and different IP revisions, adding new functionalities should be easier (we already have plans to support SMC timing configuration so that we no longer have to rely on the configuration done by the bootloader/bootstrap). Also note that we no longer have a custom ->cmdfunc() implementation, which means we can now benefit from new features added in the core implementation for free (support for new NAND operations for example). The last thing that we gain with this rework is support for multi-chips and multi-dies chips, thanks to the clean NAND controller <-> NAND devices representation. During this transition we also dropped support for AVR32 SoCs which should soon disappear from mainline (removal of the AVR32 arch is planned for 4.12). This new driver has been tested on several platforms (at91sam9261, at91sam9g45, at91sam9x5, sama5d3 and sama5d4) to make sure it did not introduce regressions, and it's worth mentioning that old bindings are still supported (which partly explain the positive diffstat). Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>
74 lines
2.2 KiB
C
74 lines
2.2 KiB
C
/*
|
|
* © 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
|
|
* Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
|
|
*
|
|
* Derived from drivers/mtd/spia.c
|
|
* 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)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
*/
|
|
|
|
#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 *devm_atmel_pmecc_get(struct device *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);
|
|
|
|
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 */
|