xref: /openbmc/linux/drivers/mtd/nand/raw/r852.h (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
293db446aSBoris Brezillon /*
393db446aSBoris Brezillon  * Copyright © 2009 - Maxim Levitsky
493db446aSBoris Brezillon  * driver for Ricoh xD readers
593db446aSBoris Brezillon  */
693db446aSBoris Brezillon 
793db446aSBoris Brezillon #include <linux/pci.h>
893db446aSBoris Brezillon #include <linux/completion.h>
993db446aSBoris Brezillon #include <linux/workqueue.h>
1093db446aSBoris Brezillon #include <linux/mtd/rawnand.h>
1193db446aSBoris Brezillon #include <linux/spinlock.h>
1293db446aSBoris Brezillon 
1393db446aSBoris Brezillon 
1493db446aSBoris Brezillon /* nand interface + ecc
1593db446aSBoris Brezillon    byte write/read does one cycle on nand data lines.
1693db446aSBoris Brezillon    dword write/read does 4 cycles
1793db446aSBoris Brezillon    if R852_CTL_ECC_ACCESS is set in R852_CTL, then dword read reads
1893db446aSBoris Brezillon    results of ecc correction, if DMA read was done before.
1993db446aSBoris Brezillon    If write was done two dword reads read generated ecc checksums
2093db446aSBoris Brezillon */
2193db446aSBoris Brezillon #define	R852_DATALINE		0x00
2293db446aSBoris Brezillon 
2393db446aSBoris Brezillon /* control register */
2493db446aSBoris Brezillon #define R852_CTL		0x04
2593db446aSBoris Brezillon #define R852_CTL_COMMAND 	0x01	/* send command (#CLE)*/
2693db446aSBoris Brezillon #define R852_CTL_DATA		0x02	/* read/write data (#ALE)*/
2793db446aSBoris Brezillon #define R852_CTL_ON		0x04	/* only seem to controls the hd led, */
2893db446aSBoris Brezillon 					/* but has to be set on start...*/
2993db446aSBoris Brezillon #define R852_CTL_RESET		0x08	/* unknown, set only on start once*/
3093db446aSBoris Brezillon #define R852_CTL_CARDENABLE	0x10	/* probably (#CE) - always set*/
3193db446aSBoris Brezillon #define R852_CTL_ECC_ENABLE	0x20	/* enable ecc engine */
3293db446aSBoris Brezillon #define R852_CTL_ECC_ACCESS	0x40	/* read/write ecc via reg #0*/
3393db446aSBoris Brezillon #define R852_CTL_WRITE		0x80	/* set when performing writes (#WP) */
3493db446aSBoris Brezillon 
3593db446aSBoris Brezillon /* card detection status */
3693db446aSBoris Brezillon #define R852_CARD_STA		0x05
3793db446aSBoris Brezillon 
3893db446aSBoris Brezillon #define R852_CARD_STA_CD	0x01	/* state of #CD line, same as 0x04 */
3993db446aSBoris Brezillon #define R852_CARD_STA_RO	0x02	/* card is readonly */
4093db446aSBoris Brezillon #define R852_CARD_STA_PRESENT	0x04	/* card is present (#CD) */
4193db446aSBoris Brezillon #define R852_CARD_STA_ABSENT	0x08	/* card is absent */
4293db446aSBoris Brezillon #define R852_CARD_STA_BUSY	0x80	/* card is busy - (#R/B) */
4393db446aSBoris Brezillon 
4493db446aSBoris Brezillon /* card detection irq status & enable*/
4593db446aSBoris Brezillon #define R852_CARD_IRQ_STA	0x06	/* IRQ status */
4693db446aSBoris Brezillon #define R852_CARD_IRQ_ENABLE	0x07	/* IRQ enable */
4793db446aSBoris Brezillon 
4893db446aSBoris Brezillon #define R852_CARD_IRQ_CD	0x01	/* fire when #CD lights, same as 0x04*/
4993db446aSBoris Brezillon #define R852_CARD_IRQ_REMOVE	0x04	/* detect card removal */
5093db446aSBoris Brezillon #define R852_CARD_IRQ_INSERT	0x08	/* detect card insert */
5193db446aSBoris Brezillon #define R852_CARD_IRQ_UNK1	0x10	/* unknown */
5293db446aSBoris Brezillon #define R852_CARD_IRQ_GENABLE	0x80	/* general enable */
5393db446aSBoris Brezillon #define R852_CARD_IRQ_MASK	0x1D
5493db446aSBoris Brezillon 
5593db446aSBoris Brezillon 
5693db446aSBoris Brezillon 
5793db446aSBoris Brezillon /* hardware enable */
5893db446aSBoris Brezillon #define R852_HW			0x08
5993db446aSBoris Brezillon #define R852_HW_ENABLED		0x01	/* hw enabled */
6093db446aSBoris Brezillon #define R852_HW_UNKNOWN		0x80
6193db446aSBoris Brezillon 
6293db446aSBoris Brezillon 
6393db446aSBoris Brezillon /* dma capabilities */
6493db446aSBoris Brezillon #define R852_DMA_CAP		0x09
6593db446aSBoris Brezillon #define R852_SMBIT		0x20	/* if set with bit #6 or bit #7, then */
6693db446aSBoris Brezillon 					/* hw is smartmedia */
6793db446aSBoris Brezillon #define R852_DMA1		0x40	/* if set w/bit #7, dma is supported */
6893db446aSBoris Brezillon #define R852_DMA2		0x80	/* if set w/bit #6, dma is supported */
6993db446aSBoris Brezillon 
7093db446aSBoris Brezillon 
7193db446aSBoris Brezillon /* physical DMA address - 32 bit value*/
7293db446aSBoris Brezillon #define R852_DMA_ADDR		0x0C
7393db446aSBoris Brezillon 
7493db446aSBoris Brezillon 
7593db446aSBoris Brezillon /* dma settings */
7693db446aSBoris Brezillon #define R852_DMA_SETTINGS	0x10
7793db446aSBoris Brezillon #define R852_DMA_MEMORY		0x01	/* (memory <-> internal hw buffer) */
7893db446aSBoris Brezillon #define R852_DMA_READ		0x02	/* 0 = write, 1 = read */
7993db446aSBoris Brezillon #define R852_DMA_INTERNAL	0x04	/* (internal hw buffer <-> card) */
8093db446aSBoris Brezillon 
8193db446aSBoris Brezillon /* dma IRQ status */
8293db446aSBoris Brezillon #define R852_DMA_IRQ_STA		0x14
8393db446aSBoris Brezillon 
8493db446aSBoris Brezillon /* dma IRQ enable */
8593db446aSBoris Brezillon #define R852_DMA_IRQ_ENABLE	0x18
8693db446aSBoris Brezillon 
8793db446aSBoris Brezillon #define R852_DMA_IRQ_MEMORY	0x01	/* (memory <-> internal hw buffer) */
8893db446aSBoris Brezillon #define R852_DMA_IRQ_ERROR	0x02	/* error did happen */
8993db446aSBoris Brezillon #define R852_DMA_IRQ_INTERNAL	0x04	/* (internal hw buffer <-> card) */
9093db446aSBoris Brezillon #define R852_DMA_IRQ_MASK	0x07	/* mask of all IRQ bits */
9193db446aSBoris Brezillon 
9293db446aSBoris Brezillon 
9393db446aSBoris Brezillon /* ECC syndrome format - read from reg #0 will return two copies of these for
9493db446aSBoris Brezillon    each half of the page.
9593db446aSBoris Brezillon    first byte is error byte location, and second, bit location + flags */
9693db446aSBoris Brezillon #define R852_ECC_ERR_BIT_MSK	0x07	/* error bit location */
9793db446aSBoris Brezillon #define R852_ECC_CORRECT		0x10	/* no errors - (guessed) */
9893db446aSBoris Brezillon #define R852_ECC_CORRECTABLE	0x20	/* correctable error exist */
9993db446aSBoris Brezillon #define R852_ECC_FAIL		0x40	/* non correctable error detected */
10093db446aSBoris Brezillon 
10193db446aSBoris Brezillon #define R852_DMA_LEN		512
10293db446aSBoris Brezillon 
10393db446aSBoris Brezillon #define DMA_INTERNAL	0
10493db446aSBoris Brezillon #define DMA_MEMORY	1
10593db446aSBoris Brezillon 
10693db446aSBoris Brezillon struct r852_device {
107*7ef969a0SMiquel Raynal 	struct nand_controller		controller;
10893db446aSBoris Brezillon 	void __iomem *mmio;		/* mmio */
10993db446aSBoris Brezillon 	struct nand_chip *chip;		/* nand chip backpointer */
11093db446aSBoris Brezillon 	struct pci_dev *pci_dev;	/* pci backpointer */
11193db446aSBoris Brezillon 
11293db446aSBoris Brezillon 	/* dma area */
11393db446aSBoris Brezillon 	dma_addr_t phys_dma_addr;	/* bus address of buffer*/
11493db446aSBoris Brezillon 	struct completion dma_done;	/* data transfer done */
11593db446aSBoris Brezillon 
11693db446aSBoris Brezillon 	dma_addr_t phys_bounce_buffer;	/* bus address of bounce buffer */
11793db446aSBoris Brezillon 	uint8_t *bounce_buffer;		/* virtual address of bounce buffer */
11893db446aSBoris Brezillon 
11993db446aSBoris Brezillon 	int dma_dir;			/* 1 = read, 0 = write */
12093db446aSBoris Brezillon 	int dma_stage;			/* 0 - idle, 1 - first step,
12193db446aSBoris Brezillon 					   2 - second step */
12293db446aSBoris Brezillon 
12393db446aSBoris Brezillon 	int dma_state;			/* 0 = internal, 1 = memory */
12493db446aSBoris Brezillon 	int dma_error;			/* dma errors */
12593db446aSBoris Brezillon 	int dma_usable;			/* is it possible to use dma */
12693db446aSBoris Brezillon 
12793db446aSBoris Brezillon 	/* card status area */
12893db446aSBoris Brezillon 	struct delayed_work card_detect_work;
12993db446aSBoris Brezillon 	struct workqueue_struct *card_workqueue;
130ed8f0b23SColin Ian King 	int card_registered;		/* card registered with mtd */
13193db446aSBoris Brezillon 	int card_detected;		/* card detected in slot */
13293db446aSBoris Brezillon 	int card_unstable;		/* whenever the card is inserted,
13393db446aSBoris Brezillon 					   is not known yet */
13493db446aSBoris Brezillon 	int readonly;			/* card is readonly */
13593db446aSBoris Brezillon 	int sm;				/* Is card smartmedia */
13693db446aSBoris Brezillon 
13793db446aSBoris Brezillon 	/* interrupt handling */
13893db446aSBoris Brezillon 	spinlock_t irqlock;		/* IRQ protecting lock */
13993db446aSBoris Brezillon 	int irq;			/* irq num */
14093db446aSBoris Brezillon 	/* misc */
14193db446aSBoris Brezillon 	void *tmp_buffer;		/* temporary buffer */
14293db446aSBoris Brezillon 	uint8_t ctlreg;			/* cached contents of control reg */
14393db446aSBoris Brezillon };
14493db446aSBoris Brezillon 
14593db446aSBoris Brezillon #define dbg(format, ...) \
14693db446aSBoris Brezillon 	if (debug) \
14763fa37f0SShreeya Patel 		pr_debug(format "\n", ## __VA_ARGS__)
14893db446aSBoris Brezillon 
14993db446aSBoris Brezillon #define dbg_verbose(format, ...) \
15093db446aSBoris Brezillon 	if (debug > 1) \
15163fa37f0SShreeya Patel 		pr_debug(format "\n", ## __VA_ARGS__)
15293db446aSBoris Brezillon 
15393db446aSBoris Brezillon 
15493db446aSBoris Brezillon #define message(format, ...) \
15563fa37f0SShreeya Patel 	pr_info(format "\n", ## __VA_ARGS__)
156