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