mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-17 12:08:43 +00:00
mtd: rawnand: diskonchip: Get rid of the legacy interface implementation
Now that exec_op() has been implemented we can get rid of the legacy interface implementation. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20200501143917.1388957-6-boris.brezillon@collabora.com
This commit is contained in:
parent
f46eb7affb
commit
d8ef2b73a4
1 changed files with 0 additions and 292 deletions
|
@ -86,10 +86,6 @@ static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
|
||||||
#define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
|
#define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
|
||||||
#define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
|
#define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
|
||||||
|
|
||||||
static void doc200x_hwcontrol(struct nand_chip *this, int cmd,
|
|
||||||
unsigned int bitmask);
|
|
||||||
static void doc200x_select_chip(struct nand_chip *this, int chip);
|
|
||||||
|
|
||||||
static int debug = 0;
|
static int debug = 0;
|
||||||
module_param(debug, int, 0);
|
module_param(debug, int, 0);
|
||||||
|
|
||||||
|
@ -304,20 +300,6 @@ static void doc2000_write_byte(struct nand_chip *this, u_char datum)
|
||||||
WriteDOC(datum, docptr, 2k_CDSN_IO);
|
WriteDOC(datum, docptr, 2k_CDSN_IO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u_char doc2000_read_byte(struct nand_chip *this)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
u_char ret;
|
|
||||||
|
|
||||||
ReadDOC(docptr, CDSNSlowIO);
|
|
||||||
DoC_Delay(doc, 2);
|
|
||||||
ret = ReadDOC(docptr, 2k_CDSN_IO);
|
|
||||||
if (debug)
|
|
||||||
printk("read_byte returns %02x\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc2000_writebuf(struct nand_chip *this, const u_char *buf,
|
static void doc2000_writebuf(struct nand_chip *this, const u_char *buf,
|
||||||
int len)
|
int len)
|
||||||
{
|
{
|
||||||
|
@ -430,20 +412,6 @@ static void __init doc2000_count_chips(struct mtd_info *mtd)
|
||||||
pr_debug("Detected %d chips per floor.\n", i);
|
pr_debug("Detected %d chips per floor.\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int doc200x_wait(struct nand_chip *this)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
|
|
||||||
int status;
|
|
||||||
|
|
||||||
DoC_WaitReady(doc);
|
|
||||||
nand_status_op(this, NULL);
|
|
||||||
DoC_WaitReady(doc);
|
|
||||||
status = (int)this->legacy.read_byte(this);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc2001_write_byte(struct nand_chip *this, u_char datum)
|
static void doc2001_write_byte(struct nand_chip *this, u_char datum)
|
||||||
{
|
{
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
@ -454,19 +422,6 @@ static void doc2001_write_byte(struct nand_chip *this, u_char datum)
|
||||||
WriteDOC(datum, docptr, WritePipeTerm);
|
WriteDOC(datum, docptr, WritePipeTerm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u_char doc2001_read_byte(struct nand_chip *this)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
|
|
||||||
//ReadDOC(docptr, CDSNSlowIO);
|
|
||||||
/* 11.4.5 -- delay twice to allow extended length cycle */
|
|
||||||
DoC_Delay(doc, 2);
|
|
||||||
ReadDOC(docptr, ReadPipeInit);
|
|
||||||
//return ReadDOC(docptr, Mil_CDSN_IO);
|
|
||||||
return ReadDOC(docptr, LastDataRead);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc2001_writebuf(struct nand_chip *this, const u_char *buf, int len)
|
static void doc2001_writebuf(struct nand_chip *this, const u_char *buf, int len)
|
||||||
{
|
{
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
@ -495,20 +450,6 @@ static void doc2001_readbuf(struct nand_chip *this, u_char *buf, int len)
|
||||||
buf[i] = ReadDOC(docptr, LastDataRead);
|
buf[i] = ReadDOC(docptr, LastDataRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u_char doc2001plus_read_byte(struct nand_chip *this)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
u_char ret;
|
|
||||||
|
|
||||||
ReadDOC(docptr, Mplus_ReadPipeInit);
|
|
||||||
ReadDOC(docptr, Mplus_ReadPipeInit);
|
|
||||||
ret = ReadDOC(docptr, Mplus_LastDataRead);
|
|
||||||
if (debug)
|
|
||||||
printk("read_byte returns %02x\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc2001plus_writebuf(struct nand_chip *this, const u_char *buf, int len)
|
static void doc2001plus_writebuf(struct nand_chip *this, const u_char *buf, int len)
|
||||||
{
|
{
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
@ -559,84 +500,6 @@ static void doc2001plus_readbuf(struct nand_chip *this, u_char *buf, int len)
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doc2001plus_select_chip(struct nand_chip *this, int chip)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
int floor = 0;
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
printk("select chip (%d)\n", chip);
|
|
||||||
|
|
||||||
if (chip == -1) {
|
|
||||||
/* Disable flash internally */
|
|
||||||
WriteDOC(0, docptr, Mplus_FlashSelect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
floor = chip / doc->chips_per_floor;
|
|
||||||
chip -= (floor * doc->chips_per_floor);
|
|
||||||
|
|
||||||
/* Assert ChipEnable and deassert WriteProtect */
|
|
||||||
WriteDOC((DOC_FLASH_CE), docptr, Mplus_FlashSelect);
|
|
||||||
nand_reset_op(this);
|
|
||||||
|
|
||||||
doc->curchip = chip;
|
|
||||||
doc->curfloor = floor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc200x_select_chip(struct nand_chip *this, int chip)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
int floor = 0;
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
printk("select chip (%d)\n", chip);
|
|
||||||
|
|
||||||
if (chip == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
floor = chip / doc->chips_per_floor;
|
|
||||||
chip -= (floor * doc->chips_per_floor);
|
|
||||||
|
|
||||||
/* 11.4.4 -- deassert CE before changing chip */
|
|
||||||
doc200x_hwcontrol(this, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
|
|
||||||
|
|
||||||
WriteDOC(floor, docptr, FloorSelect);
|
|
||||||
WriteDOC(chip, docptr, CDSNDeviceSelect);
|
|
||||||
|
|
||||||
doc200x_hwcontrol(this, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
|
|
||||||
|
|
||||||
doc->curchip = chip;
|
|
||||||
doc->curfloor = floor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
|
|
||||||
|
|
||||||
static void doc200x_hwcontrol(struct nand_chip *this, int cmd,
|
|
||||||
unsigned int ctrl)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
|
|
||||||
if (ctrl & NAND_CTRL_CHANGE) {
|
|
||||||
doc->CDSNControl &= ~CDSN_CTRL_MSK;
|
|
||||||
doc->CDSNControl |= ctrl & CDSN_CTRL_MSK;
|
|
||||||
if (debug)
|
|
||||||
printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl);
|
|
||||||
WriteDOC(doc->CDSNControl, docptr, CDSNControl);
|
|
||||||
/* 11.4.3 -- 4 NOPs after CSDNControl write */
|
|
||||||
DoC_Delay(doc, 4);
|
|
||||||
}
|
|
||||||
if (cmd != NAND_CMD_NONE) {
|
|
||||||
if (DoC_is_2000(doc))
|
|
||||||
doc2000_write_byte(this, cmd);
|
|
||||||
else
|
|
||||||
doc2001_write_byte(this, cmd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc200x_write_control(struct doc_priv *doc, u8 value)
|
static void doc200x_write_control(struct doc_priv *doc, u8 value)
|
||||||
{
|
{
|
||||||
WriteDOC(value, doc->virtadr, CDSNControl);
|
WriteDOC(value, doc->virtadr, CDSNControl);
|
||||||
|
@ -797,144 +660,6 @@ static int doc2001plus_exec_op(struct nand_chip *this,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doc2001plus_command(struct nand_chip *this, unsigned command,
|
|
||||||
int column, int page_addr)
|
|
||||||
{
|
|
||||||
struct mtd_info *mtd = nand_to_mtd(this);
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must terminate write pipeline before sending any commands
|
|
||||||
* to the device.
|
|
||||||
*/
|
|
||||||
if (command == NAND_CMD_PAGEPROG) {
|
|
||||||
WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
|
|
||||||
WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write out the command to the device.
|
|
||||||
*/
|
|
||||||
if (command == NAND_CMD_SEQIN) {
|
|
||||||
int readcmd;
|
|
||||||
|
|
||||||
if (column >= mtd->writesize) {
|
|
||||||
/* OOB area */
|
|
||||||
column -= mtd->writesize;
|
|
||||||
readcmd = NAND_CMD_READOOB;
|
|
||||||
} else if (column < 256) {
|
|
||||||
/* First 256 bytes --> READ0 */
|
|
||||||
readcmd = NAND_CMD_READ0;
|
|
||||||
} else {
|
|
||||||
column -= 256;
|
|
||||||
readcmd = NAND_CMD_READ1;
|
|
||||||
}
|
|
||||||
WriteDOC(readcmd, docptr, Mplus_FlashCmd);
|
|
||||||
}
|
|
||||||
WriteDOC(command, docptr, Mplus_FlashCmd);
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
|
|
||||||
if (column != -1 || page_addr != -1) {
|
|
||||||
/* Serially input address */
|
|
||||||
if (column != -1) {
|
|
||||||
/* Adjust columns for 16 bit buswidth */
|
|
||||||
if (this->options & NAND_BUSWIDTH_16 &&
|
|
||||||
!nand_opcode_8bits(command))
|
|
||||||
column >>= 1;
|
|
||||||
WriteDOC(column, docptr, Mplus_FlashAddress);
|
|
||||||
}
|
|
||||||
if (page_addr != -1) {
|
|
||||||
WriteDOC((unsigned char)(page_addr & 0xff), docptr, Mplus_FlashAddress);
|
|
||||||
WriteDOC((unsigned char)((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress);
|
|
||||||
if (this->options & NAND_ROW_ADDR_3) {
|
|
||||||
WriteDOC((unsigned char)((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress);
|
|
||||||
printk("high density\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
/* deassert ALE */
|
|
||||||
if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 ||
|
|
||||||
command == NAND_CMD_READOOB || command == NAND_CMD_READID)
|
|
||||||
WriteDOC(0, docptr, Mplus_FlashControl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* program and erase have their own busy handlers
|
|
||||||
* status and sequential in needs no delay
|
|
||||||
*/
|
|
||||||
switch (command) {
|
|
||||||
|
|
||||||
case NAND_CMD_PAGEPROG:
|
|
||||||
case NAND_CMD_ERASE1:
|
|
||||||
case NAND_CMD_ERASE2:
|
|
||||||
case NAND_CMD_SEQIN:
|
|
||||||
case NAND_CMD_STATUS:
|
|
||||||
return;
|
|
||||||
|
|
||||||
case NAND_CMD_RESET:
|
|
||||||
if (this->legacy.dev_ready)
|
|
||||||
break;
|
|
||||||
udelay(this->legacy.chip_delay);
|
|
||||||
WriteDOC(NAND_CMD_STATUS, docptr, Mplus_FlashCmd);
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
WriteDOC(0, docptr, Mplus_WritePipeTerm);
|
|
||||||
while (!(this->legacy.read_byte(this) & 0x40)) ;
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* This applies to read commands */
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
* If we don't have access to the busy pin, we apply the given
|
|
||||||
* command delay
|
|
||||||
*/
|
|
||||||
if (!this->legacy.dev_ready) {
|
|
||||||
udelay(this->legacy.chip_delay);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apply this short delay always to ensure that we do wait tWB in
|
|
||||||
* any case on any machine. */
|
|
||||||
ndelay(100);
|
|
||||||
/* wait until command is processed */
|
|
||||||
while (!this->legacy.dev_ready(this)) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int doc200x_dev_ready(struct nand_chip *this)
|
|
||||||
{
|
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
|
||||||
void __iomem *docptr = doc->virtadr;
|
|
||||||
|
|
||||||
if (DoC_is_MillenniumPlus(doc)) {
|
|
||||||
/* 11.4.2 -- must NOP four times before checking FR/B# */
|
|
||||||
DoC_Delay(doc, 4);
|
|
||||||
if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) {
|
|
||||||
if (debug)
|
|
||||||
printk("not ready\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (debug)
|
|
||||||
printk("was ready\n");
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
/* 11.4.2 -- must NOP four times before checking FR/B# */
|
|
||||||
DoC_Delay(doc, 4);
|
|
||||||
if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {
|
|
||||||
if (debug)
|
|
||||||
printk("not ready\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* 11.4.2 -- Must NOP twice if it's ready */
|
|
||||||
DoC_Delay(doc, 2);
|
|
||||||
if (debug)
|
|
||||||
printk("was ready\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doc200x_enable_hwecc(struct nand_chip *this, int mode)
|
static void doc200x_enable_hwecc(struct nand_chip *this, int mode)
|
||||||
{
|
{
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
@ -1496,9 +1221,6 @@ static inline int __init doc2000_init(struct mtd_info *mtd)
|
||||||
struct nand_chip *this = mtd_to_nand(mtd);
|
struct nand_chip *this = mtd_to_nand(mtd);
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
|
||||||
this->legacy.read_byte = doc2000_read_byte;
|
|
||||||
this->legacy.write_buf = doc2000_writebuf;
|
|
||||||
this->legacy.read_buf = doc2000_readbuf;
|
|
||||||
doc->late_init = nftl_scan_bbt;
|
doc->late_init = nftl_scan_bbt;
|
||||||
|
|
||||||
doc->CDSNControl = CDSN_CTRL_FLASH_IO | CDSN_CTRL_ECC_IO;
|
doc->CDSNControl = CDSN_CTRL_FLASH_IO | CDSN_CTRL_ECC_IO;
|
||||||
|
@ -1512,10 +1234,6 @@ static inline int __init doc2001_init(struct mtd_info *mtd)
|
||||||
struct nand_chip *this = mtd_to_nand(mtd);
|
struct nand_chip *this = mtd_to_nand(mtd);
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
|
||||||
this->legacy.read_byte = doc2001_read_byte;
|
|
||||||
this->legacy.write_buf = doc2001_writebuf;
|
|
||||||
this->legacy.read_buf = doc2001_readbuf;
|
|
||||||
|
|
||||||
ReadDOC(doc->virtadr, ChipID);
|
ReadDOC(doc->virtadr, ChipID);
|
||||||
ReadDOC(doc->virtadr, ChipID);
|
ReadDOC(doc->virtadr, ChipID);
|
||||||
ReadDOC(doc->virtadr, ChipID);
|
ReadDOC(doc->virtadr, ChipID);
|
||||||
|
@ -1542,13 +1260,7 @@ static inline int __init doc2001plus_init(struct mtd_info *mtd)
|
||||||
struct nand_chip *this = mtd_to_nand(mtd);
|
struct nand_chip *this = mtd_to_nand(mtd);
|
||||||
struct doc_priv *doc = nand_get_controller_data(this);
|
struct doc_priv *doc = nand_get_controller_data(this);
|
||||||
|
|
||||||
this->legacy.read_byte = doc2001plus_read_byte;
|
|
||||||
this->legacy.write_buf = doc2001plus_writebuf;
|
|
||||||
this->legacy.read_buf = doc2001plus_readbuf;
|
|
||||||
doc->late_init = inftl_scan_bbt;
|
doc->late_init = inftl_scan_bbt;
|
||||||
this->legacy.cmd_ctrl = NULL;
|
|
||||||
this->legacy.select_chip = doc2001plus_select_chip;
|
|
||||||
this->legacy.cmdfunc = doc2001plus_command;
|
|
||||||
this->ecc.hwctl = doc2001plus_enable_hwecc;
|
this->ecc.hwctl = doc2001plus_enable_hwecc;
|
||||||
|
|
||||||
doc->chips_per_floor = 1;
|
doc->chips_per_floor = 1;
|
||||||
|
@ -1740,10 +1452,6 @@ static int __init doc_probe(unsigned long physadr)
|
||||||
|
|
||||||
nand->controller = &doc->base;
|
nand->controller = &doc->base;
|
||||||
nand_set_controller_data(nand, doc);
|
nand_set_controller_data(nand, doc);
|
||||||
nand->legacy.select_chip = doc200x_select_chip;
|
|
||||||
nand->legacy.cmd_ctrl = doc200x_hwcontrol;
|
|
||||||
nand->legacy.dev_ready = doc200x_dev_ready;
|
|
||||||
nand->legacy.waitfunc = doc200x_wait;
|
|
||||||
nand->ecc.hwctl = doc200x_enable_hwecc;
|
nand->ecc.hwctl = doc200x_enable_hwecc;
|
||||||
nand->ecc.calculate = doc200x_calculate_ecc;
|
nand->ecc.calculate = doc200x_calculate_ecc;
|
||||||
nand->ecc.correct = doc200x_correct_data;
|
nand->ecc.correct = doc200x_correct_data;
|
||||||
|
|
Loading…
Add table
Reference in a new issue