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
763fa37f0SShreeya Patel #define DRV_NAME "r852"
863fa37f0SShreeya Patel #define pr_fmt(fmt) DRV_NAME ": " fmt
963fa37f0SShreeya Patel
1093db446aSBoris Brezillon #include <linux/kernel.h>
1193db446aSBoris Brezillon #include <linux/module.h>
1293db446aSBoris Brezillon #include <linux/jiffies.h>
1393db446aSBoris Brezillon #include <linux/workqueue.h>
1493db446aSBoris Brezillon #include <linux/interrupt.h>
1593db446aSBoris Brezillon #include <linux/pci.h>
1693db446aSBoris Brezillon #include <linux/pci_ids.h>
1793db446aSBoris Brezillon #include <linux/delay.h>
1893db446aSBoris Brezillon #include <linux/slab.h>
1993db446aSBoris Brezillon #include <asm/byteorder.h>
2093db446aSBoris Brezillon #include <linux/sched.h>
2193db446aSBoris Brezillon #include "sm_common.h"
2293db446aSBoris Brezillon #include "r852.h"
2393db446aSBoris Brezillon
2493db446aSBoris Brezillon
2593db446aSBoris Brezillon static bool r852_enable_dma = 1;
2693db446aSBoris Brezillon module_param(r852_enable_dma, bool, S_IRUGO);
2793db446aSBoris Brezillon MODULE_PARM_DESC(r852_enable_dma, "Enable usage of the DMA (default)");
2893db446aSBoris Brezillon
2993db446aSBoris Brezillon static int debug;
3093db446aSBoris Brezillon module_param(debug, int, S_IRUGO | S_IWUSR);
3193db446aSBoris Brezillon MODULE_PARM_DESC(debug, "Debug level (0-2)");
3293db446aSBoris Brezillon
3393db446aSBoris Brezillon /* read register */
r852_read_reg(struct r852_device * dev,int address)3493db446aSBoris Brezillon static inline uint8_t r852_read_reg(struct r852_device *dev, int address)
3593db446aSBoris Brezillon {
3693db446aSBoris Brezillon uint8_t reg = readb(dev->mmio + address);
3793db446aSBoris Brezillon return reg;
3893db446aSBoris Brezillon }
3993db446aSBoris Brezillon
4093db446aSBoris Brezillon /* write register */
r852_write_reg(struct r852_device * dev,int address,uint8_t value)4193db446aSBoris Brezillon static inline void r852_write_reg(struct r852_device *dev,
4293db446aSBoris Brezillon int address, uint8_t value)
4393db446aSBoris Brezillon {
4493db446aSBoris Brezillon writeb(value, dev->mmio + address);
4593db446aSBoris Brezillon }
4693db446aSBoris Brezillon
4793db446aSBoris Brezillon
4893db446aSBoris Brezillon /* read dword sized register */
r852_read_reg_dword(struct r852_device * dev,int address)4993db446aSBoris Brezillon static inline uint32_t r852_read_reg_dword(struct r852_device *dev, int address)
5093db446aSBoris Brezillon {
5193db446aSBoris Brezillon uint32_t reg = le32_to_cpu(readl(dev->mmio + address));
5293db446aSBoris Brezillon return reg;
5393db446aSBoris Brezillon }
5493db446aSBoris Brezillon
5593db446aSBoris Brezillon /* write dword sized register */
r852_write_reg_dword(struct r852_device * dev,int address,uint32_t value)5693db446aSBoris Brezillon static inline void r852_write_reg_dword(struct r852_device *dev,
5793db446aSBoris Brezillon int address, uint32_t value)
5893db446aSBoris Brezillon {
5993db446aSBoris Brezillon writel(cpu_to_le32(value), dev->mmio + address);
6093db446aSBoris Brezillon }
6193db446aSBoris Brezillon
6293db446aSBoris Brezillon /* returns pointer to our private structure */
r852_get_dev(struct mtd_info * mtd)6393db446aSBoris Brezillon static inline struct r852_device *r852_get_dev(struct mtd_info *mtd)
6493db446aSBoris Brezillon {
6593db446aSBoris Brezillon struct nand_chip *chip = mtd_to_nand(mtd);
6693db446aSBoris Brezillon return nand_get_controller_data(chip);
6793db446aSBoris Brezillon }
6893db446aSBoris Brezillon
6993db446aSBoris Brezillon
7093db446aSBoris Brezillon /* check if controller supports dma */
r852_dma_test(struct r852_device * dev)7193db446aSBoris Brezillon static void r852_dma_test(struct r852_device *dev)
7293db446aSBoris Brezillon {
7393db446aSBoris Brezillon dev->dma_usable = (r852_read_reg(dev, R852_DMA_CAP) &
7493db446aSBoris Brezillon (R852_DMA1 | R852_DMA2)) == (R852_DMA1 | R852_DMA2);
7593db446aSBoris Brezillon
7693db446aSBoris Brezillon if (!dev->dma_usable)
7793db446aSBoris Brezillon message("Non dma capable device detected, dma disabled");
7893db446aSBoris Brezillon
7993db446aSBoris Brezillon if (!r852_enable_dma) {
8093db446aSBoris Brezillon message("disabling dma on user request");
8193db446aSBoris Brezillon dev->dma_usable = 0;
8293db446aSBoris Brezillon }
8393db446aSBoris Brezillon }
8493db446aSBoris Brezillon
8593db446aSBoris Brezillon /*
8693db446aSBoris Brezillon * Enable dma. Enables ether first or second stage of the DMA,
8793db446aSBoris Brezillon * Expects dev->dma_dir and dev->dma_state be set
8893db446aSBoris Brezillon */
r852_dma_enable(struct r852_device * dev)8993db446aSBoris Brezillon static void r852_dma_enable(struct r852_device *dev)
9093db446aSBoris Brezillon {
9193db446aSBoris Brezillon uint8_t dma_reg, dma_irq_reg;
9293db446aSBoris Brezillon
9393db446aSBoris Brezillon /* Set up dma settings */
9493db446aSBoris Brezillon dma_reg = r852_read_reg_dword(dev, R852_DMA_SETTINGS);
9593db446aSBoris Brezillon dma_reg &= ~(R852_DMA_READ | R852_DMA_INTERNAL | R852_DMA_MEMORY);
9693db446aSBoris Brezillon
9793db446aSBoris Brezillon if (dev->dma_dir)
9893db446aSBoris Brezillon dma_reg |= R852_DMA_READ;
9993db446aSBoris Brezillon
10093db446aSBoris Brezillon if (dev->dma_state == DMA_INTERNAL) {
10193db446aSBoris Brezillon dma_reg |= R852_DMA_INTERNAL;
10293db446aSBoris Brezillon /* Precaution to make sure HW doesn't write */
10393db446aSBoris Brezillon /* to random kernel memory */
10493db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_ADDR,
10593db446aSBoris Brezillon cpu_to_le32(dev->phys_bounce_buffer));
10693db446aSBoris Brezillon } else {
10793db446aSBoris Brezillon dma_reg |= R852_DMA_MEMORY;
10893db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_ADDR,
10993db446aSBoris Brezillon cpu_to_le32(dev->phys_dma_addr));
11093db446aSBoris Brezillon }
11193db446aSBoris Brezillon
11293db446aSBoris Brezillon /* Precaution: make sure write reached the device */
11393db446aSBoris Brezillon r852_read_reg_dword(dev, R852_DMA_ADDR);
11493db446aSBoris Brezillon
11593db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_SETTINGS, dma_reg);
11693db446aSBoris Brezillon
11793db446aSBoris Brezillon /* Set dma irq */
11893db446aSBoris Brezillon dma_irq_reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE);
11993db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE,
12093db446aSBoris Brezillon dma_irq_reg |
12193db446aSBoris Brezillon R852_DMA_IRQ_INTERNAL |
12293db446aSBoris Brezillon R852_DMA_IRQ_ERROR |
12393db446aSBoris Brezillon R852_DMA_IRQ_MEMORY);
12493db446aSBoris Brezillon }
12593db446aSBoris Brezillon
12693db446aSBoris Brezillon /*
12793db446aSBoris Brezillon * Disable dma, called from the interrupt handler, which specifies
12893db446aSBoris Brezillon * success of the operation via 'error' argument
12993db446aSBoris Brezillon */
r852_dma_done(struct r852_device * dev,int error)13093db446aSBoris Brezillon static void r852_dma_done(struct r852_device *dev, int error)
13193db446aSBoris Brezillon {
13293db446aSBoris Brezillon WARN_ON(dev->dma_stage == 0);
13393db446aSBoris Brezillon
13493db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_STA,
13593db446aSBoris Brezillon r852_read_reg_dword(dev, R852_DMA_IRQ_STA));
13693db446aSBoris Brezillon
13793db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_SETTINGS, 0);
13893db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, 0);
13993db446aSBoris Brezillon
14093db446aSBoris Brezillon /* Precaution to make sure HW doesn't write to random kernel memory */
14193db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_ADDR,
14293db446aSBoris Brezillon cpu_to_le32(dev->phys_bounce_buffer));
14393db446aSBoris Brezillon r852_read_reg_dword(dev, R852_DMA_ADDR);
14493db446aSBoris Brezillon
14593db446aSBoris Brezillon dev->dma_error = error;
14693db446aSBoris Brezillon dev->dma_stage = 0;
14793db446aSBoris Brezillon
14893db446aSBoris Brezillon if (dev->phys_dma_addr && dev->phys_dma_addr != dev->phys_bounce_buffer)
1490282fefbSChristoph Hellwig dma_unmap_single(&dev->pci_dev->dev, dev->phys_dma_addr,
1500282fefbSChristoph Hellwig R852_DMA_LEN,
1510282fefbSChristoph Hellwig dev->dma_dir ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
15293db446aSBoris Brezillon }
15393db446aSBoris Brezillon
15493db446aSBoris Brezillon /*
15593db446aSBoris Brezillon * Wait, till dma is done, which includes both phases of it
15693db446aSBoris Brezillon */
r852_dma_wait(struct r852_device * dev)15793db446aSBoris Brezillon static int r852_dma_wait(struct r852_device *dev)
15893db446aSBoris Brezillon {
15993db446aSBoris Brezillon long timeout = wait_for_completion_timeout(&dev->dma_done,
16093db446aSBoris Brezillon msecs_to_jiffies(1000));
16193db446aSBoris Brezillon if (!timeout) {
16293db446aSBoris Brezillon dbg("timeout waiting for DMA interrupt");
16393db446aSBoris Brezillon return -ETIMEDOUT;
16493db446aSBoris Brezillon }
16593db446aSBoris Brezillon
16693db446aSBoris Brezillon return 0;
16793db446aSBoris Brezillon }
16893db446aSBoris Brezillon
16993db446aSBoris Brezillon /*
17093db446aSBoris Brezillon * Read/Write one page using dma. Only pages can be read (512 bytes)
17193db446aSBoris Brezillon */
r852_do_dma(struct r852_device * dev,uint8_t * buf,int do_read)17293db446aSBoris Brezillon static void r852_do_dma(struct r852_device *dev, uint8_t *buf, int do_read)
17393db446aSBoris Brezillon {
17493db446aSBoris Brezillon int bounce = 0;
17593db446aSBoris Brezillon unsigned long flags;
17693db446aSBoris Brezillon int error;
17793db446aSBoris Brezillon
17893db446aSBoris Brezillon dev->dma_error = 0;
17993db446aSBoris Brezillon
18093db446aSBoris Brezillon /* Set dma direction */
18193db446aSBoris Brezillon dev->dma_dir = do_read;
18293db446aSBoris Brezillon dev->dma_stage = 1;
18393db446aSBoris Brezillon reinit_completion(&dev->dma_done);
18493db446aSBoris Brezillon
18593db446aSBoris Brezillon dbg_verbose("doing dma %s ", do_read ? "read" : "write");
18693db446aSBoris Brezillon
18793db446aSBoris Brezillon /* Set initial dma state: for reading first fill on board buffer,
18893db446aSBoris Brezillon from device, for writes first fill the buffer from memory*/
18993db446aSBoris Brezillon dev->dma_state = do_read ? DMA_INTERNAL : DMA_MEMORY;
19093db446aSBoris Brezillon
19193db446aSBoris Brezillon /* if incoming buffer is not page aligned, we should do bounce */
19293db446aSBoris Brezillon if ((unsigned long)buf & (R852_DMA_LEN-1))
19393db446aSBoris Brezillon bounce = 1;
19493db446aSBoris Brezillon
19593db446aSBoris Brezillon if (!bounce) {
1960282fefbSChristoph Hellwig dev->phys_dma_addr = dma_map_single(&dev->pci_dev->dev, buf,
19793db446aSBoris Brezillon R852_DMA_LEN,
1980282fefbSChristoph Hellwig do_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
1990282fefbSChristoph Hellwig if (dma_mapping_error(&dev->pci_dev->dev, dev->phys_dma_addr))
20093db446aSBoris Brezillon bounce = 1;
20193db446aSBoris Brezillon }
20293db446aSBoris Brezillon
20393db446aSBoris Brezillon if (bounce) {
20493db446aSBoris Brezillon dbg_verbose("dma: using bounce buffer");
20593db446aSBoris Brezillon dev->phys_dma_addr = dev->phys_bounce_buffer;
20693db446aSBoris Brezillon if (!do_read)
20793db446aSBoris Brezillon memcpy(dev->bounce_buffer, buf, R852_DMA_LEN);
20893db446aSBoris Brezillon }
20993db446aSBoris Brezillon
21093db446aSBoris Brezillon /* Enable DMA */
21193db446aSBoris Brezillon spin_lock_irqsave(&dev->irqlock, flags);
21293db446aSBoris Brezillon r852_dma_enable(dev);
21393db446aSBoris Brezillon spin_unlock_irqrestore(&dev->irqlock, flags);
21493db446aSBoris Brezillon
21593db446aSBoris Brezillon /* Wait till complete */
21693db446aSBoris Brezillon error = r852_dma_wait(dev);
21793db446aSBoris Brezillon
21893db446aSBoris Brezillon if (error) {
21993db446aSBoris Brezillon r852_dma_done(dev, error);
22093db446aSBoris Brezillon return;
22193db446aSBoris Brezillon }
22293db446aSBoris Brezillon
22393db446aSBoris Brezillon if (do_read && bounce)
22493db446aSBoris Brezillon memcpy((void *)buf, dev->bounce_buffer, R852_DMA_LEN);
22593db446aSBoris Brezillon }
22693db446aSBoris Brezillon
22793db446aSBoris Brezillon /*
22893db446aSBoris Brezillon * Program data lines of the nand chip to send data to it
22993db446aSBoris Brezillon */
r852_write_buf(struct nand_chip * chip,const uint8_t * buf,int len)230c0739d85SBoris Brezillon static void r852_write_buf(struct nand_chip *chip, const uint8_t *buf, int len)
23193db446aSBoris Brezillon {
232c0739d85SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
23393db446aSBoris Brezillon uint32_t reg;
23493db446aSBoris Brezillon
23593db446aSBoris Brezillon /* Don't allow any access to hardware if we suspect card removal */
23693db446aSBoris Brezillon if (dev->card_unstable)
23793db446aSBoris Brezillon return;
23893db446aSBoris Brezillon
23993db446aSBoris Brezillon /* Special case for whole sector read */
24093db446aSBoris Brezillon if (len == R852_DMA_LEN && dev->dma_usable) {
24193db446aSBoris Brezillon r852_do_dma(dev, (uint8_t *)buf, 0);
24293db446aSBoris Brezillon return;
24393db446aSBoris Brezillon }
24493db446aSBoris Brezillon
24593db446aSBoris Brezillon /* write DWORD chinks - faster */
24693db446aSBoris Brezillon while (len >= 4) {
24793db446aSBoris Brezillon reg = buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24;
24893db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DATALINE, reg);
24993db446aSBoris Brezillon buf += 4;
25093db446aSBoris Brezillon len -= 4;
25193db446aSBoris Brezillon
25293db446aSBoris Brezillon }
25393db446aSBoris Brezillon
25493db446aSBoris Brezillon /* write rest */
25593db446aSBoris Brezillon while (len > 0) {
25693db446aSBoris Brezillon r852_write_reg(dev, R852_DATALINE, *buf++);
25793db446aSBoris Brezillon len--;
25893db446aSBoris Brezillon }
25993db446aSBoris Brezillon }
26093db446aSBoris Brezillon
26193db446aSBoris Brezillon /*
26293db446aSBoris Brezillon * Read data lines of the nand chip to retrieve data
26393db446aSBoris Brezillon */
r852_read_buf(struct nand_chip * chip,uint8_t * buf,int len)2647e534323SBoris Brezillon static void r852_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
26593db446aSBoris Brezillon {
2667e534323SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
26793db446aSBoris Brezillon uint32_t reg;
26893db446aSBoris Brezillon
26993db446aSBoris Brezillon if (dev->card_unstable) {
27093db446aSBoris Brezillon /* since we can't signal error here, at least, return
27193db446aSBoris Brezillon predictable buffer */
27293db446aSBoris Brezillon memset(buf, 0, len);
27393db446aSBoris Brezillon return;
27493db446aSBoris Brezillon }
27593db446aSBoris Brezillon
27693db446aSBoris Brezillon /* special case for whole sector read */
27793db446aSBoris Brezillon if (len == R852_DMA_LEN && dev->dma_usable) {
27893db446aSBoris Brezillon r852_do_dma(dev, buf, 1);
27993db446aSBoris Brezillon return;
28093db446aSBoris Brezillon }
28193db446aSBoris Brezillon
28293db446aSBoris Brezillon /* read in dword sized chunks */
28393db446aSBoris Brezillon while (len >= 4) {
28493db446aSBoris Brezillon
28593db446aSBoris Brezillon reg = r852_read_reg_dword(dev, R852_DATALINE);
28693db446aSBoris Brezillon *buf++ = reg & 0xFF;
28793db446aSBoris Brezillon *buf++ = (reg >> 8) & 0xFF;
28893db446aSBoris Brezillon *buf++ = (reg >> 16) & 0xFF;
28993db446aSBoris Brezillon *buf++ = (reg >> 24) & 0xFF;
29093db446aSBoris Brezillon len -= 4;
29193db446aSBoris Brezillon }
29293db446aSBoris Brezillon
29393db446aSBoris Brezillon /* read the reset by bytes */
29493db446aSBoris Brezillon while (len--)
29593db446aSBoris Brezillon *buf++ = r852_read_reg(dev, R852_DATALINE);
29693db446aSBoris Brezillon }
29793db446aSBoris Brezillon
29893db446aSBoris Brezillon /*
29993db446aSBoris Brezillon * Read one byte from nand chip
30093db446aSBoris Brezillon */
r852_read_byte(struct nand_chip * chip)3017e534323SBoris Brezillon static uint8_t r852_read_byte(struct nand_chip *chip)
30293db446aSBoris Brezillon {
3037e534323SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
30493db446aSBoris Brezillon
30593db446aSBoris Brezillon /* Same problem as in r852_read_buf.... */
30693db446aSBoris Brezillon if (dev->card_unstable)
30793db446aSBoris Brezillon return 0;
30893db446aSBoris Brezillon
30993db446aSBoris Brezillon return r852_read_reg(dev, R852_DATALINE);
31093db446aSBoris Brezillon }
31193db446aSBoris Brezillon
31293db446aSBoris Brezillon /*
31393db446aSBoris Brezillon * Control several chip lines & send commands
31493db446aSBoris Brezillon */
r852_cmdctl(struct nand_chip * chip,int dat,unsigned int ctrl)3150f808c16SBoris Brezillon static void r852_cmdctl(struct nand_chip *chip, int dat, unsigned int ctrl)
31693db446aSBoris Brezillon {
3170f808c16SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
31893db446aSBoris Brezillon
31993db446aSBoris Brezillon if (dev->card_unstable)
32093db446aSBoris Brezillon return;
32193db446aSBoris Brezillon
32293db446aSBoris Brezillon if (ctrl & NAND_CTRL_CHANGE) {
32393db446aSBoris Brezillon
32493db446aSBoris Brezillon dev->ctlreg &= ~(R852_CTL_DATA | R852_CTL_COMMAND |
32593db446aSBoris Brezillon R852_CTL_ON | R852_CTL_CARDENABLE);
32693db446aSBoris Brezillon
32793db446aSBoris Brezillon if (ctrl & NAND_ALE)
32893db446aSBoris Brezillon dev->ctlreg |= R852_CTL_DATA;
32993db446aSBoris Brezillon
33093db446aSBoris Brezillon if (ctrl & NAND_CLE)
33193db446aSBoris Brezillon dev->ctlreg |= R852_CTL_COMMAND;
33293db446aSBoris Brezillon
33393db446aSBoris Brezillon if (ctrl & NAND_NCE)
33493db446aSBoris Brezillon dev->ctlreg |= (R852_CTL_CARDENABLE | R852_CTL_ON);
33593db446aSBoris Brezillon else
33693db446aSBoris Brezillon dev->ctlreg &= ~R852_CTL_WRITE;
33793db446aSBoris Brezillon
33893db446aSBoris Brezillon /* when write is stareted, enable write access */
33993db446aSBoris Brezillon if (dat == NAND_CMD_ERASE1)
34093db446aSBoris Brezillon dev->ctlreg |= R852_CTL_WRITE;
34193db446aSBoris Brezillon
34293db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
34393db446aSBoris Brezillon }
34493db446aSBoris Brezillon
34593db446aSBoris Brezillon /* HACK: NAND_CMD_SEQIN is called without NAND_CTRL_CHANGE, but we need
34693db446aSBoris Brezillon to set write mode */
34793db446aSBoris Brezillon if (dat == NAND_CMD_SEQIN && (dev->ctlreg & R852_CTL_COMMAND)) {
34893db446aSBoris Brezillon dev->ctlreg |= R852_CTL_WRITE;
34993db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
35093db446aSBoris Brezillon }
35193db446aSBoris Brezillon
35293db446aSBoris Brezillon if (dat != NAND_CMD_NONE)
35393db446aSBoris Brezillon r852_write_reg(dev, R852_DATALINE, dat);
35493db446aSBoris Brezillon }
35593db446aSBoris Brezillon
35693db446aSBoris Brezillon /*
35793db446aSBoris Brezillon * Wait till card is ready.
35893db446aSBoris Brezillon * based on nand_wait, but returns errors on DMA error
35993db446aSBoris Brezillon */
r852_wait(struct nand_chip * chip)360f1d46942SBoris Brezillon static int r852_wait(struct nand_chip *chip)
36193db446aSBoris Brezillon {
36293db446aSBoris Brezillon struct r852_device *dev = nand_get_controller_data(chip);
36393db446aSBoris Brezillon
36493db446aSBoris Brezillon unsigned long timeout;
36593db446aSBoris Brezillon u8 status;
36693db446aSBoris Brezillon
367661803b2SBoris Brezillon timeout = jiffies + msecs_to_jiffies(400);
36893db446aSBoris Brezillon
36993db446aSBoris Brezillon while (time_before(jiffies, timeout))
3708395b753SBoris Brezillon if (chip->legacy.dev_ready(chip))
37193db446aSBoris Brezillon break;
37293db446aSBoris Brezillon
37393db446aSBoris Brezillon nand_status_op(chip, &status);
37493db446aSBoris Brezillon
37593db446aSBoris Brezillon /* Unfortunelly, no way to send detailed error status... */
37693db446aSBoris Brezillon if (dev->dma_error) {
37793db446aSBoris Brezillon status |= NAND_STATUS_FAIL;
37893db446aSBoris Brezillon dev->dma_error = 0;
37993db446aSBoris Brezillon }
38093db446aSBoris Brezillon return status;
38193db446aSBoris Brezillon }
38293db446aSBoris Brezillon
38393db446aSBoris Brezillon /*
38493db446aSBoris Brezillon * Check if card is ready
38593db446aSBoris Brezillon */
38693db446aSBoris Brezillon
r852_ready(struct nand_chip * chip)38750a487e7SBoris Brezillon static int r852_ready(struct nand_chip *chip)
38893db446aSBoris Brezillon {
38950a487e7SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
39093db446aSBoris Brezillon return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY);
39193db446aSBoris Brezillon }
39293db446aSBoris Brezillon
39393db446aSBoris Brezillon
39493db446aSBoris Brezillon /*
39593db446aSBoris Brezillon * Set ECC engine mode
39693db446aSBoris Brezillon */
39793db446aSBoris Brezillon
r852_ecc_hwctl(struct nand_chip * chip,int mode)398ec47636cSBoris Brezillon static void r852_ecc_hwctl(struct nand_chip *chip, int mode)
39993db446aSBoris Brezillon {
400ec47636cSBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
40193db446aSBoris Brezillon
40293db446aSBoris Brezillon if (dev->card_unstable)
40393db446aSBoris Brezillon return;
40493db446aSBoris Brezillon
40593db446aSBoris Brezillon switch (mode) {
40693db446aSBoris Brezillon case NAND_ECC_READ:
40793db446aSBoris Brezillon case NAND_ECC_WRITE:
40893db446aSBoris Brezillon /* enable ecc generation/check*/
40993db446aSBoris Brezillon dev->ctlreg |= R852_CTL_ECC_ENABLE;
41093db446aSBoris Brezillon
41193db446aSBoris Brezillon /* flush ecc buffer */
41293db446aSBoris Brezillon r852_write_reg(dev, R852_CTL,
41393db446aSBoris Brezillon dev->ctlreg | R852_CTL_ECC_ACCESS);
41493db446aSBoris Brezillon
41593db446aSBoris Brezillon r852_read_reg_dword(dev, R852_DATALINE);
41693db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
41793db446aSBoris Brezillon return;
41893db446aSBoris Brezillon
41993db446aSBoris Brezillon case NAND_ECC_READSYN:
42093db446aSBoris Brezillon /* disable ecc generation */
42193db446aSBoris Brezillon dev->ctlreg &= ~R852_CTL_ECC_ENABLE;
42293db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
42393db446aSBoris Brezillon }
42493db446aSBoris Brezillon }
42593db446aSBoris Brezillon
42693db446aSBoris Brezillon /*
42793db446aSBoris Brezillon * Calculate ECC, only used for writes
42893db446aSBoris Brezillon */
42993db446aSBoris Brezillon
r852_ecc_calculate(struct nand_chip * chip,const uint8_t * dat,uint8_t * ecc_code)430af37d2c3SBoris Brezillon static int r852_ecc_calculate(struct nand_chip *chip, const uint8_t *dat,
43193db446aSBoris Brezillon uint8_t *ecc_code)
43293db446aSBoris Brezillon {
433af37d2c3SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
43493db446aSBoris Brezillon struct sm_oob *oob = (struct sm_oob *)ecc_code;
43593db446aSBoris Brezillon uint32_t ecc1, ecc2;
43693db446aSBoris Brezillon
43793db446aSBoris Brezillon if (dev->card_unstable)
43893db446aSBoris Brezillon return 0;
43993db446aSBoris Brezillon
44093db446aSBoris Brezillon dev->ctlreg &= ~R852_CTL_ECC_ENABLE;
44193db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS);
44293db446aSBoris Brezillon
44393db446aSBoris Brezillon ecc1 = r852_read_reg_dword(dev, R852_DATALINE);
44493db446aSBoris Brezillon ecc2 = r852_read_reg_dword(dev, R852_DATALINE);
44593db446aSBoris Brezillon
44693db446aSBoris Brezillon oob->ecc1[0] = (ecc1) & 0xFF;
44793db446aSBoris Brezillon oob->ecc1[1] = (ecc1 >> 8) & 0xFF;
44893db446aSBoris Brezillon oob->ecc1[2] = (ecc1 >> 16) & 0xFF;
44993db446aSBoris Brezillon
45093db446aSBoris Brezillon oob->ecc2[0] = (ecc2) & 0xFF;
45193db446aSBoris Brezillon oob->ecc2[1] = (ecc2 >> 8) & 0xFF;
45293db446aSBoris Brezillon oob->ecc2[2] = (ecc2 >> 16) & 0xFF;
45393db446aSBoris Brezillon
45493db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
45593db446aSBoris Brezillon return 0;
45693db446aSBoris Brezillon }
45793db446aSBoris Brezillon
45893db446aSBoris Brezillon /*
45993db446aSBoris Brezillon * Correct the data using ECC, hw did almost everything for us
46093db446aSBoris Brezillon */
46193db446aSBoris Brezillon
r852_ecc_correct(struct nand_chip * chip,uint8_t * dat,uint8_t * read_ecc,uint8_t * calc_ecc)46200da2ea9SBoris Brezillon static int r852_ecc_correct(struct nand_chip *chip, uint8_t *dat,
46393db446aSBoris Brezillon uint8_t *read_ecc, uint8_t *calc_ecc)
46493db446aSBoris Brezillon {
46593db446aSBoris Brezillon uint32_t ecc_reg;
46693db446aSBoris Brezillon uint8_t ecc_status, err_byte;
46793db446aSBoris Brezillon int i, error = 0;
46893db446aSBoris Brezillon
46900da2ea9SBoris Brezillon struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
47093db446aSBoris Brezillon
47193db446aSBoris Brezillon if (dev->card_unstable)
47293db446aSBoris Brezillon return 0;
47393db446aSBoris Brezillon
47493db446aSBoris Brezillon if (dev->dma_error) {
47593db446aSBoris Brezillon dev->dma_error = 0;
47693db446aSBoris Brezillon return -EIO;
47793db446aSBoris Brezillon }
47893db446aSBoris Brezillon
47993db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS);
48093db446aSBoris Brezillon ecc_reg = r852_read_reg_dword(dev, R852_DATALINE);
48193db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, dev->ctlreg);
48293db446aSBoris Brezillon
48393db446aSBoris Brezillon for (i = 0 ; i <= 1 ; i++) {
48493db446aSBoris Brezillon
48593db446aSBoris Brezillon ecc_status = (ecc_reg >> 8) & 0xFF;
48693db446aSBoris Brezillon
48793db446aSBoris Brezillon /* ecc uncorrectable error */
48893db446aSBoris Brezillon if (ecc_status & R852_ECC_FAIL) {
48993db446aSBoris Brezillon dbg("ecc: unrecoverable error, in half %d", i);
49093db446aSBoris Brezillon error = -EBADMSG;
49193db446aSBoris Brezillon goto exit;
49293db446aSBoris Brezillon }
49393db446aSBoris Brezillon
49493db446aSBoris Brezillon /* correctable error */
49593db446aSBoris Brezillon if (ecc_status & R852_ECC_CORRECTABLE) {
49693db446aSBoris Brezillon
49793db446aSBoris Brezillon err_byte = ecc_reg & 0xFF;
49893db446aSBoris Brezillon dbg("ecc: recoverable error, "
49993db446aSBoris Brezillon "in half %d, byte %d, bit %d", i,
50093db446aSBoris Brezillon err_byte, ecc_status & R852_ECC_ERR_BIT_MSK);
50193db446aSBoris Brezillon
50293db446aSBoris Brezillon dat[err_byte] ^=
50393db446aSBoris Brezillon 1 << (ecc_status & R852_ECC_ERR_BIT_MSK);
50493db446aSBoris Brezillon error++;
50593db446aSBoris Brezillon }
50693db446aSBoris Brezillon
50793db446aSBoris Brezillon dat += 256;
50893db446aSBoris Brezillon ecc_reg >>= 16;
50993db446aSBoris Brezillon }
51093db446aSBoris Brezillon exit:
51193db446aSBoris Brezillon return error;
51293db446aSBoris Brezillon }
51393db446aSBoris Brezillon
51493db446aSBoris Brezillon /*
51593db446aSBoris Brezillon * This is copy of nand_read_oob_std
51693db446aSBoris Brezillon * nand_read_oob_syndrome assumes we can send column address - we can't
51793db446aSBoris Brezillon */
r852_read_oob(struct nand_chip * chip,int page)518b9761687SBoris Brezillon static int r852_read_oob(struct nand_chip *chip, int page)
51993db446aSBoris Brezillon {
520b9761687SBoris Brezillon struct mtd_info *mtd = nand_to_mtd(chip);
521b9761687SBoris Brezillon
52293db446aSBoris Brezillon return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
52393db446aSBoris Brezillon }
52493db446aSBoris Brezillon
52593db446aSBoris Brezillon /*
52693db446aSBoris Brezillon * Start the nand engine
52793db446aSBoris Brezillon */
52893db446aSBoris Brezillon
r852_engine_enable(struct r852_device * dev)52993db446aSBoris Brezillon static void r852_engine_enable(struct r852_device *dev)
53093db446aSBoris Brezillon {
53193db446aSBoris Brezillon if (r852_read_reg_dword(dev, R852_HW) & R852_HW_UNKNOWN) {
53293db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON);
53393db446aSBoris Brezillon r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED);
53493db446aSBoris Brezillon } else {
53593db446aSBoris Brezillon r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED);
53693db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON);
53793db446aSBoris Brezillon }
53893db446aSBoris Brezillon msleep(300);
53993db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, 0);
54093db446aSBoris Brezillon }
54193db446aSBoris Brezillon
54293db446aSBoris Brezillon
54393db446aSBoris Brezillon /*
54493db446aSBoris Brezillon * Stop the nand engine
54593db446aSBoris Brezillon */
54693db446aSBoris Brezillon
r852_engine_disable(struct r852_device * dev)54793db446aSBoris Brezillon static void r852_engine_disable(struct r852_device *dev)
54893db446aSBoris Brezillon {
54993db446aSBoris Brezillon r852_write_reg_dword(dev, R852_HW, 0);
55093db446aSBoris Brezillon r852_write_reg(dev, R852_CTL, R852_CTL_RESET);
55193db446aSBoris Brezillon }
55293db446aSBoris Brezillon
55393db446aSBoris Brezillon /*
55493db446aSBoris Brezillon * Test if card is present
55593db446aSBoris Brezillon */
55693db446aSBoris Brezillon
r852_card_update_present(struct r852_device * dev)55793db446aSBoris Brezillon static void r852_card_update_present(struct r852_device *dev)
55893db446aSBoris Brezillon {
55993db446aSBoris Brezillon unsigned long flags;
56093db446aSBoris Brezillon uint8_t reg;
56193db446aSBoris Brezillon
56293db446aSBoris Brezillon spin_lock_irqsave(&dev->irqlock, flags);
56393db446aSBoris Brezillon reg = r852_read_reg(dev, R852_CARD_STA);
56493db446aSBoris Brezillon dev->card_detected = !!(reg & R852_CARD_STA_PRESENT);
56593db446aSBoris Brezillon spin_unlock_irqrestore(&dev->irqlock, flags);
56693db446aSBoris Brezillon }
56793db446aSBoris Brezillon
56893db446aSBoris Brezillon /*
56993db446aSBoris Brezillon * Update card detection IRQ state according to current card state
57093db446aSBoris Brezillon * which is read in r852_card_update_present
57193db446aSBoris Brezillon */
r852_update_card_detect(struct r852_device * dev)57293db446aSBoris Brezillon static void r852_update_card_detect(struct r852_device *dev)
57393db446aSBoris Brezillon {
57493db446aSBoris Brezillon int card_detect_reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE);
57593db446aSBoris Brezillon dev->card_unstable = 0;
57693db446aSBoris Brezillon
57793db446aSBoris Brezillon card_detect_reg &= ~(R852_CARD_IRQ_REMOVE | R852_CARD_IRQ_INSERT);
57893db446aSBoris Brezillon card_detect_reg |= R852_CARD_IRQ_GENABLE;
57993db446aSBoris Brezillon
58093db446aSBoris Brezillon card_detect_reg |= dev->card_detected ?
58193db446aSBoris Brezillon R852_CARD_IRQ_REMOVE : R852_CARD_IRQ_INSERT;
58293db446aSBoris Brezillon
58393db446aSBoris Brezillon r852_write_reg(dev, R852_CARD_IRQ_ENABLE, card_detect_reg);
58493db446aSBoris Brezillon }
58593db446aSBoris Brezillon
media_type_show(struct device * sys_dev,struct device_attribute * attr,char * buf)586*21db4f47SZhen Lei static ssize_t media_type_show(struct device *sys_dev,
58793db446aSBoris Brezillon struct device_attribute *attr, char *buf)
58893db446aSBoris Brezillon {
58993db446aSBoris Brezillon struct mtd_info *mtd = container_of(sys_dev, struct mtd_info, dev);
59093db446aSBoris Brezillon struct r852_device *dev = r852_get_dev(mtd);
59193db446aSBoris Brezillon char *data = dev->sm ? "smartmedia" : "xd";
59293db446aSBoris Brezillon
59393db446aSBoris Brezillon strcpy(buf, data);
59493db446aSBoris Brezillon return strlen(data);
59593db446aSBoris Brezillon }
596*21db4f47SZhen Lei static DEVICE_ATTR_RO(media_type);
59793db446aSBoris Brezillon
59893db446aSBoris Brezillon
59993db446aSBoris Brezillon /* Detect properties of card in slot */
r852_update_media_status(struct r852_device * dev)60093db446aSBoris Brezillon static void r852_update_media_status(struct r852_device *dev)
60193db446aSBoris Brezillon {
60293db446aSBoris Brezillon uint8_t reg;
60393db446aSBoris Brezillon unsigned long flags;
60493db446aSBoris Brezillon int readonly;
60593db446aSBoris Brezillon
60693db446aSBoris Brezillon spin_lock_irqsave(&dev->irqlock, flags);
60793db446aSBoris Brezillon if (!dev->card_detected) {
60893db446aSBoris Brezillon message("card removed");
60993db446aSBoris Brezillon spin_unlock_irqrestore(&dev->irqlock, flags);
61093db446aSBoris Brezillon return ;
61193db446aSBoris Brezillon }
61293db446aSBoris Brezillon
61393db446aSBoris Brezillon readonly = r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_RO;
61493db446aSBoris Brezillon reg = r852_read_reg(dev, R852_DMA_CAP);
61593db446aSBoris Brezillon dev->sm = (reg & (R852_DMA1 | R852_DMA2)) && (reg & R852_SMBIT);
61693db446aSBoris Brezillon
61793db446aSBoris Brezillon message("detected %s %s card in slot",
61893db446aSBoris Brezillon dev->sm ? "SmartMedia" : "xD",
61993db446aSBoris Brezillon readonly ? "readonly" : "writeable");
62093db446aSBoris Brezillon
62193db446aSBoris Brezillon dev->readonly = readonly;
62293db446aSBoris Brezillon spin_unlock_irqrestore(&dev->irqlock, flags);
62393db446aSBoris Brezillon }
62493db446aSBoris Brezillon
62593db446aSBoris Brezillon /*
62693db446aSBoris Brezillon * Register the nand device
62793db446aSBoris Brezillon * Called when the card is detected
62893db446aSBoris Brezillon */
r852_register_nand_device(struct r852_device * dev)62993db446aSBoris Brezillon static int r852_register_nand_device(struct r852_device *dev)
63093db446aSBoris Brezillon {
63193db446aSBoris Brezillon struct mtd_info *mtd = nand_to_mtd(dev->chip);
63293db446aSBoris Brezillon
633ed8f0b23SColin Ian King WARN_ON(dev->card_registered);
63493db446aSBoris Brezillon
63593db446aSBoris Brezillon mtd->dev.parent = &dev->pci_dev->dev;
63693db446aSBoris Brezillon
63793db446aSBoris Brezillon if (dev->readonly)
63893db446aSBoris Brezillon dev->chip->options |= NAND_ROM;
63993db446aSBoris Brezillon
64093db446aSBoris Brezillon r852_engine_enable(dev);
64193db446aSBoris Brezillon
64293db446aSBoris Brezillon if (sm_register_device(mtd, dev->sm))
64393db446aSBoris Brezillon goto error1;
64493db446aSBoris Brezillon
64593db446aSBoris Brezillon if (device_create_file(&mtd->dev, &dev_attr_media_type)) {
64693db446aSBoris Brezillon message("can't create media type sysfs attribute");
64793db446aSBoris Brezillon goto error3;
64893db446aSBoris Brezillon }
64993db446aSBoris Brezillon
650ed8f0b23SColin Ian King dev->card_registered = 1;
65193db446aSBoris Brezillon return 0;
65293db446aSBoris Brezillon error3:
65310b87750SMiquel Raynal WARN_ON(mtd_device_unregister(nand_to_mtd(dev->chip)));
65410b87750SMiquel Raynal nand_cleanup(dev->chip);
65593db446aSBoris Brezillon error1:
65693db446aSBoris Brezillon /* Force card redetect */
65793db446aSBoris Brezillon dev->card_detected = 0;
65893db446aSBoris Brezillon return -1;
65993db446aSBoris Brezillon }
66093db446aSBoris Brezillon
66193db446aSBoris Brezillon /*
66293db446aSBoris Brezillon * Unregister the card
66393db446aSBoris Brezillon */
66493db446aSBoris Brezillon
r852_unregister_nand_device(struct r852_device * dev)66593db446aSBoris Brezillon static void r852_unregister_nand_device(struct r852_device *dev)
66693db446aSBoris Brezillon {
66793db446aSBoris Brezillon struct mtd_info *mtd = nand_to_mtd(dev->chip);
66893db446aSBoris Brezillon
669ed8f0b23SColin Ian King if (!dev->card_registered)
67093db446aSBoris Brezillon return;
67193db446aSBoris Brezillon
67293db446aSBoris Brezillon device_remove_file(&mtd->dev, &dev_attr_media_type);
67310b87750SMiquel Raynal WARN_ON(mtd_device_unregister(mtd));
67410b87750SMiquel Raynal nand_cleanup(dev->chip);
67593db446aSBoris Brezillon r852_engine_disable(dev);
676ed8f0b23SColin Ian King dev->card_registered = 0;
67793db446aSBoris Brezillon }
67893db446aSBoris Brezillon
67993db446aSBoris Brezillon /* Card state updater */
r852_card_detect_work(struct work_struct * work)68093db446aSBoris Brezillon static void r852_card_detect_work(struct work_struct *work)
68193db446aSBoris Brezillon {
68293db446aSBoris Brezillon struct r852_device *dev =
68393db446aSBoris Brezillon container_of(work, struct r852_device, card_detect_work.work);
68493db446aSBoris Brezillon
68593db446aSBoris Brezillon r852_card_update_present(dev);
68693db446aSBoris Brezillon r852_update_card_detect(dev);
68793db446aSBoris Brezillon dev->card_unstable = 0;
68893db446aSBoris Brezillon
68993db446aSBoris Brezillon /* False alarm */
690ed8f0b23SColin Ian King if (dev->card_detected == dev->card_registered)
69193db446aSBoris Brezillon goto exit;
69293db446aSBoris Brezillon
69393db446aSBoris Brezillon /* Read media properties */
69493db446aSBoris Brezillon r852_update_media_status(dev);
69593db446aSBoris Brezillon
69693db446aSBoris Brezillon /* Register the card */
69793db446aSBoris Brezillon if (dev->card_detected)
69893db446aSBoris Brezillon r852_register_nand_device(dev);
69993db446aSBoris Brezillon else
70093db446aSBoris Brezillon r852_unregister_nand_device(dev);
70193db446aSBoris Brezillon exit:
70293db446aSBoris Brezillon r852_update_card_detect(dev);
70393db446aSBoris Brezillon }
70493db446aSBoris Brezillon
70593db446aSBoris Brezillon /* Ack + disable IRQ generation */
r852_disable_irqs(struct r852_device * dev)70693db446aSBoris Brezillon static void r852_disable_irqs(struct r852_device *dev)
70793db446aSBoris Brezillon {
70893db446aSBoris Brezillon uint8_t reg;
70993db446aSBoris Brezillon reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE);
71093db446aSBoris Brezillon r852_write_reg(dev, R852_CARD_IRQ_ENABLE, reg & ~R852_CARD_IRQ_MASK);
71193db446aSBoris Brezillon
71293db446aSBoris Brezillon reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE);
71393db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE,
71493db446aSBoris Brezillon reg & ~R852_DMA_IRQ_MASK);
71593db446aSBoris Brezillon
71693db446aSBoris Brezillon r852_write_reg(dev, R852_CARD_IRQ_STA, R852_CARD_IRQ_MASK);
71793db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_STA, R852_DMA_IRQ_MASK);
71893db446aSBoris Brezillon }
71993db446aSBoris Brezillon
72093db446aSBoris Brezillon /* Interrupt handler */
r852_irq(int irq,void * data)72193db446aSBoris Brezillon static irqreturn_t r852_irq(int irq, void *data)
72293db446aSBoris Brezillon {
72393db446aSBoris Brezillon struct r852_device *dev = (struct r852_device *)data;
72493db446aSBoris Brezillon
72593db446aSBoris Brezillon uint8_t card_status, dma_status;
72693db446aSBoris Brezillon irqreturn_t ret = IRQ_NONE;
72793db446aSBoris Brezillon
7284682dd19STian Tao spin_lock(&dev->irqlock);
72993db446aSBoris Brezillon
73093db446aSBoris Brezillon /* handle card detection interrupts first */
73193db446aSBoris Brezillon card_status = r852_read_reg(dev, R852_CARD_IRQ_STA);
73293db446aSBoris Brezillon r852_write_reg(dev, R852_CARD_IRQ_STA, card_status);
73393db446aSBoris Brezillon
73493db446aSBoris Brezillon if (card_status & (R852_CARD_IRQ_INSERT|R852_CARD_IRQ_REMOVE)) {
73593db446aSBoris Brezillon
73693db446aSBoris Brezillon ret = IRQ_HANDLED;
73793db446aSBoris Brezillon dev->card_detected = !!(card_status & R852_CARD_IRQ_INSERT);
73893db446aSBoris Brezillon
73993db446aSBoris Brezillon /* we shouldn't receive any interrupts if we wait for card
74093db446aSBoris Brezillon to settle */
74193db446aSBoris Brezillon WARN_ON(dev->card_unstable);
74293db446aSBoris Brezillon
74393db446aSBoris Brezillon /* disable irqs while card is unstable */
74493db446aSBoris Brezillon /* this will timeout DMA if active, but better that garbage */
74593db446aSBoris Brezillon r852_disable_irqs(dev);
74693db446aSBoris Brezillon
74793db446aSBoris Brezillon if (dev->card_unstable)
74893db446aSBoris Brezillon goto out;
74993db446aSBoris Brezillon
75093db446aSBoris Brezillon /* let, card state to settle a bit, and then do the work */
75193db446aSBoris Brezillon dev->card_unstable = 1;
75293db446aSBoris Brezillon queue_delayed_work(dev->card_workqueue,
75393db446aSBoris Brezillon &dev->card_detect_work, msecs_to_jiffies(100));
75493db446aSBoris Brezillon goto out;
75593db446aSBoris Brezillon }
75693db446aSBoris Brezillon
75793db446aSBoris Brezillon
75893db446aSBoris Brezillon /* Handle dma interrupts */
75993db446aSBoris Brezillon dma_status = r852_read_reg_dword(dev, R852_DMA_IRQ_STA);
76093db446aSBoris Brezillon r852_write_reg_dword(dev, R852_DMA_IRQ_STA, dma_status);
76193db446aSBoris Brezillon
76293db446aSBoris Brezillon if (dma_status & R852_DMA_IRQ_MASK) {
76393db446aSBoris Brezillon
76493db446aSBoris Brezillon ret = IRQ_HANDLED;
76593db446aSBoris Brezillon
76693db446aSBoris Brezillon if (dma_status & R852_DMA_IRQ_ERROR) {
76793db446aSBoris Brezillon dbg("received dma error IRQ");
76893db446aSBoris Brezillon r852_dma_done(dev, -EIO);
76993db446aSBoris Brezillon complete(&dev->dma_done);
77093db446aSBoris Brezillon goto out;
77193db446aSBoris Brezillon }
77293db446aSBoris Brezillon
77393db446aSBoris Brezillon /* received DMA interrupt out of nowhere? */
77493db446aSBoris Brezillon WARN_ON_ONCE(dev->dma_stage == 0);
77593db446aSBoris Brezillon
77693db446aSBoris Brezillon if (dev->dma_stage == 0)
77793db446aSBoris Brezillon goto out;
77893db446aSBoris Brezillon
77993db446aSBoris Brezillon /* done device access */
78093db446aSBoris Brezillon if (dev->dma_state == DMA_INTERNAL &&
78193db446aSBoris Brezillon (dma_status & R852_DMA_IRQ_INTERNAL)) {
78293db446aSBoris Brezillon
78393db446aSBoris Brezillon dev->dma_state = DMA_MEMORY;
78493db446aSBoris Brezillon dev->dma_stage++;
78593db446aSBoris Brezillon }
78693db446aSBoris Brezillon
78793db446aSBoris Brezillon /* done memory DMA */
78893db446aSBoris Brezillon if (dev->dma_state == DMA_MEMORY &&
78993db446aSBoris Brezillon (dma_status & R852_DMA_IRQ_MEMORY)) {
79093db446aSBoris Brezillon dev->dma_state = DMA_INTERNAL;
79193db446aSBoris Brezillon dev->dma_stage++;
79293db446aSBoris Brezillon }
79393db446aSBoris Brezillon
79493db446aSBoris Brezillon /* Enable 2nd half of dma dance */
79593db446aSBoris Brezillon if (dev->dma_stage == 2)
79693db446aSBoris Brezillon r852_dma_enable(dev);
79793db446aSBoris Brezillon
79893db446aSBoris Brezillon /* Operation done */
79993db446aSBoris Brezillon if (dev->dma_stage == 3) {
80093db446aSBoris Brezillon r852_dma_done(dev, 0);
80193db446aSBoris Brezillon complete(&dev->dma_done);
80293db446aSBoris Brezillon }
80393db446aSBoris Brezillon goto out;
80493db446aSBoris Brezillon }
80593db446aSBoris Brezillon
80693db446aSBoris Brezillon /* Handle unknown interrupts */
80793db446aSBoris Brezillon if (dma_status)
80893db446aSBoris Brezillon dbg("bad dma IRQ status = %x", dma_status);
80993db446aSBoris Brezillon
81093db446aSBoris Brezillon if (card_status & ~R852_CARD_STA_CD)
81193db446aSBoris Brezillon dbg("strange card status = %x", card_status);
81293db446aSBoris Brezillon
81393db446aSBoris Brezillon out:
8144682dd19STian Tao spin_unlock(&dev->irqlock);
81593db446aSBoris Brezillon return ret;
81693db446aSBoris Brezillon }
81793db446aSBoris Brezillon
r852_attach_chip(struct nand_chip * chip)8187ef969a0SMiquel Raynal static int r852_attach_chip(struct nand_chip *chip)
8197ef969a0SMiquel Raynal {
8207ef969a0SMiquel Raynal if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
8217ef969a0SMiquel Raynal return 0;
8227ef969a0SMiquel Raynal
8237ef969a0SMiquel Raynal chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
8247ef969a0SMiquel Raynal chip->ecc.size = R852_DMA_LEN;
8257ef969a0SMiquel Raynal chip->ecc.bytes = SM_OOB_SIZE;
8267ef969a0SMiquel Raynal chip->ecc.strength = 2;
8277ef969a0SMiquel Raynal chip->ecc.hwctl = r852_ecc_hwctl;
8287ef969a0SMiquel Raynal chip->ecc.calculate = r852_ecc_calculate;
8297ef969a0SMiquel Raynal chip->ecc.correct = r852_ecc_correct;
8307ef969a0SMiquel Raynal
8317ef969a0SMiquel Raynal /* TODO: hack */
8327ef969a0SMiquel Raynal chip->ecc.read_oob = r852_read_oob;
8337ef969a0SMiquel Raynal
8347ef969a0SMiquel Raynal return 0;
8357ef969a0SMiquel Raynal }
8367ef969a0SMiquel Raynal
8377ef969a0SMiquel Raynal static const struct nand_controller_ops r852_ops = {
8387ef969a0SMiquel Raynal .attach_chip = r852_attach_chip,
8397ef969a0SMiquel Raynal };
8407ef969a0SMiquel Raynal
r852_probe(struct pci_dev * pci_dev,const struct pci_device_id * id)84193db446aSBoris Brezillon static int r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
84293db446aSBoris Brezillon {
84393db446aSBoris Brezillon int error;
84493db446aSBoris Brezillon struct nand_chip *chip;
84593db446aSBoris Brezillon struct r852_device *dev;
84693db446aSBoris Brezillon
84793db446aSBoris Brezillon /* pci initialization */
84893db446aSBoris Brezillon error = pci_enable_device(pci_dev);
84993db446aSBoris Brezillon
85093db446aSBoris Brezillon if (error)
85193db446aSBoris Brezillon goto error1;
85293db446aSBoris Brezillon
85393db446aSBoris Brezillon pci_set_master(pci_dev);
85493db446aSBoris Brezillon
8550282fefbSChristoph Hellwig error = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32));
85693db446aSBoris Brezillon if (error)
85793db446aSBoris Brezillon goto error2;
85893db446aSBoris Brezillon
85993db446aSBoris Brezillon error = pci_request_regions(pci_dev, DRV_NAME);
86093db446aSBoris Brezillon
86193db446aSBoris Brezillon if (error)
86293db446aSBoris Brezillon goto error3;
86393db446aSBoris Brezillon
86493db446aSBoris Brezillon error = -ENOMEM;
86593db446aSBoris Brezillon
86693db446aSBoris Brezillon /* init nand chip, but register it only on card insert */
86793db446aSBoris Brezillon chip = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);
86893db446aSBoris Brezillon
86993db446aSBoris Brezillon if (!chip)
87093db446aSBoris Brezillon goto error4;
87193db446aSBoris Brezillon
87293db446aSBoris Brezillon /* commands */
873bf6065c6SBoris Brezillon chip->legacy.cmd_ctrl = r852_cmdctl;
8748395b753SBoris Brezillon chip->legacy.waitfunc = r852_wait;
8758395b753SBoris Brezillon chip->legacy.dev_ready = r852_ready;
87693db446aSBoris Brezillon
87793db446aSBoris Brezillon /* I/O */
878716bbbabSBoris Brezillon chip->legacy.read_byte = r852_read_byte;
879716bbbabSBoris Brezillon chip->legacy.read_buf = r852_read_buf;
880716bbbabSBoris Brezillon chip->legacy.write_buf = r852_write_buf;
88193db446aSBoris Brezillon
88293db446aSBoris Brezillon /* init our device structure */
88393db446aSBoris Brezillon dev = kzalloc(sizeof(struct r852_device), GFP_KERNEL);
88493db446aSBoris Brezillon
88593db446aSBoris Brezillon if (!dev)
88693db446aSBoris Brezillon goto error5;
88793db446aSBoris Brezillon
88893db446aSBoris Brezillon nand_set_controller_data(chip, dev);
88993db446aSBoris Brezillon dev->chip = chip;
89093db446aSBoris Brezillon dev->pci_dev = pci_dev;
89193db446aSBoris Brezillon pci_set_drvdata(pci_dev, dev);
89293db446aSBoris Brezillon
8937ef969a0SMiquel Raynal nand_controller_init(&dev->controller);
8947ef969a0SMiquel Raynal dev->controller.ops = &r852_ops;
8957ef969a0SMiquel Raynal chip->controller = &dev->controller;
8967ef969a0SMiquel Raynal
8970282fefbSChristoph Hellwig dev->bounce_buffer = dma_alloc_coherent(&pci_dev->dev, R852_DMA_LEN,
8980282fefbSChristoph Hellwig &dev->phys_bounce_buffer, GFP_KERNEL);
89993db446aSBoris Brezillon
90093db446aSBoris Brezillon if (!dev->bounce_buffer)
90193db446aSBoris Brezillon goto error6;
90293db446aSBoris Brezillon
90393db446aSBoris Brezillon
90493db446aSBoris Brezillon error = -ENODEV;
90593db446aSBoris Brezillon dev->mmio = pci_ioremap_bar(pci_dev, 0);
90693db446aSBoris Brezillon
90793db446aSBoris Brezillon if (!dev->mmio)
90893db446aSBoris Brezillon goto error7;
90993db446aSBoris Brezillon
91093db446aSBoris Brezillon error = -ENOMEM;
91193db446aSBoris Brezillon dev->tmp_buffer = kzalloc(SM_SECTOR_SIZE, GFP_KERNEL);
91293db446aSBoris Brezillon
91393db446aSBoris Brezillon if (!dev->tmp_buffer)
91493db446aSBoris Brezillon goto error8;
91593db446aSBoris Brezillon
91693db446aSBoris Brezillon init_completion(&dev->dma_done);
91793db446aSBoris Brezillon
91893db446aSBoris Brezillon dev->card_workqueue = create_freezable_workqueue(DRV_NAME);
91993db446aSBoris Brezillon
92093db446aSBoris Brezillon if (!dev->card_workqueue)
92193db446aSBoris Brezillon goto error9;
92293db446aSBoris Brezillon
92393db446aSBoris Brezillon INIT_DELAYED_WORK(&dev->card_detect_work, r852_card_detect_work);
92493db446aSBoris Brezillon
92593db446aSBoris Brezillon /* shutdown everything - precation */
92693db446aSBoris Brezillon r852_engine_disable(dev);
92793db446aSBoris Brezillon r852_disable_irqs(dev);
92893db446aSBoris Brezillon
92993db446aSBoris Brezillon r852_dma_test(dev);
93093db446aSBoris Brezillon
93193db446aSBoris Brezillon dev->irq = pci_dev->irq;
93293db446aSBoris Brezillon spin_lock_init(&dev->irqlock);
93393db446aSBoris Brezillon
93493db446aSBoris Brezillon dev->card_detected = 0;
93593db446aSBoris Brezillon r852_card_update_present(dev);
93693db446aSBoris Brezillon
93793db446aSBoris Brezillon /*register irq handler*/
93893db446aSBoris Brezillon error = -ENODEV;
93993db446aSBoris Brezillon if (request_irq(pci_dev->irq, &r852_irq, IRQF_SHARED,
94093db446aSBoris Brezillon DRV_NAME, dev))
94193db446aSBoris Brezillon goto error10;
94293db446aSBoris Brezillon
94393db446aSBoris Brezillon /* kick initial present test */
94493db446aSBoris Brezillon queue_delayed_work(dev->card_workqueue,
94593db446aSBoris Brezillon &dev->card_detect_work, 0);
94693db446aSBoris Brezillon
94793db446aSBoris Brezillon
94863fa37f0SShreeya Patel pr_notice("driver loaded successfully\n");
94993db446aSBoris Brezillon return 0;
95093db446aSBoris Brezillon
95193db446aSBoris Brezillon error10:
95293db446aSBoris Brezillon destroy_workqueue(dev->card_workqueue);
95393db446aSBoris Brezillon error9:
95493db446aSBoris Brezillon kfree(dev->tmp_buffer);
95593db446aSBoris Brezillon error8:
95693db446aSBoris Brezillon pci_iounmap(pci_dev, dev->mmio);
95793db446aSBoris Brezillon error7:
9580282fefbSChristoph Hellwig dma_free_coherent(&pci_dev->dev, R852_DMA_LEN, dev->bounce_buffer,
9590282fefbSChristoph Hellwig dev->phys_bounce_buffer);
96093db446aSBoris Brezillon error6:
96193db446aSBoris Brezillon kfree(dev);
96293db446aSBoris Brezillon error5:
96393db446aSBoris Brezillon kfree(chip);
96493db446aSBoris Brezillon error4:
96593db446aSBoris Brezillon pci_release_regions(pci_dev);
96693db446aSBoris Brezillon error3:
96793db446aSBoris Brezillon error2:
96893db446aSBoris Brezillon pci_disable_device(pci_dev);
96993db446aSBoris Brezillon error1:
97093db446aSBoris Brezillon return error;
97193db446aSBoris Brezillon }
97293db446aSBoris Brezillon
r852_remove(struct pci_dev * pci_dev)97393db446aSBoris Brezillon static void r852_remove(struct pci_dev *pci_dev)
97493db446aSBoris Brezillon {
97593db446aSBoris Brezillon struct r852_device *dev = pci_get_drvdata(pci_dev);
97693db446aSBoris Brezillon
97793db446aSBoris Brezillon /* Stop detect workqueue -
97893db446aSBoris Brezillon we are going to unregister the device anyway*/
97993db446aSBoris Brezillon cancel_delayed_work_sync(&dev->card_detect_work);
98093db446aSBoris Brezillon destroy_workqueue(dev->card_workqueue);
98193db446aSBoris Brezillon
98293db446aSBoris Brezillon /* Unregister the device, this might make more IO */
98393db446aSBoris Brezillon r852_unregister_nand_device(dev);
98493db446aSBoris Brezillon
98593db446aSBoris Brezillon /* Stop interrupts */
98693db446aSBoris Brezillon r852_disable_irqs(dev);
98793db446aSBoris Brezillon free_irq(dev->irq, dev);
98893db446aSBoris Brezillon
98993db446aSBoris Brezillon /* Cleanup */
99093db446aSBoris Brezillon kfree(dev->tmp_buffer);
99193db446aSBoris Brezillon pci_iounmap(pci_dev, dev->mmio);
9920282fefbSChristoph Hellwig dma_free_coherent(&pci_dev->dev, R852_DMA_LEN, dev->bounce_buffer,
9930282fefbSChristoph Hellwig dev->phys_bounce_buffer);
99493db446aSBoris Brezillon
99593db446aSBoris Brezillon kfree(dev->chip);
99693db446aSBoris Brezillon kfree(dev);
99793db446aSBoris Brezillon
99893db446aSBoris Brezillon /* Shutdown the PCI device */
99993db446aSBoris Brezillon pci_release_regions(pci_dev);
100093db446aSBoris Brezillon pci_disable_device(pci_dev);
100193db446aSBoris Brezillon }
100293db446aSBoris Brezillon
r852_shutdown(struct pci_dev * pci_dev)100393db446aSBoris Brezillon static void r852_shutdown(struct pci_dev *pci_dev)
100493db446aSBoris Brezillon {
100593db446aSBoris Brezillon struct r852_device *dev = pci_get_drvdata(pci_dev);
100693db446aSBoris Brezillon
100793db446aSBoris Brezillon cancel_delayed_work_sync(&dev->card_detect_work);
100893db446aSBoris Brezillon r852_disable_irqs(dev);
100993db446aSBoris Brezillon synchronize_irq(dev->irq);
101093db446aSBoris Brezillon pci_disable_device(pci_dev);
101193db446aSBoris Brezillon }
101293db446aSBoris Brezillon
101393db446aSBoris Brezillon #ifdef CONFIG_PM_SLEEP
r852_suspend(struct device * device)101493db446aSBoris Brezillon static int r852_suspend(struct device *device)
101593db446aSBoris Brezillon {
101675de0eb2SChuhong Yuan struct r852_device *dev = dev_get_drvdata(device);
101793db446aSBoris Brezillon
101893db446aSBoris Brezillon if (dev->ctlreg & R852_CTL_CARDENABLE)
101993db446aSBoris Brezillon return -EBUSY;
102093db446aSBoris Brezillon
102193db446aSBoris Brezillon /* First make sure the detect work is gone */
102293db446aSBoris Brezillon cancel_delayed_work_sync(&dev->card_detect_work);
102393db446aSBoris Brezillon
102493db446aSBoris Brezillon /* Turn off the interrupts and stop the device */
102593db446aSBoris Brezillon r852_disable_irqs(dev);
102693db446aSBoris Brezillon r852_engine_disable(dev);
102793db446aSBoris Brezillon
102893db446aSBoris Brezillon /* If card was pulled off just during the suspend, which is very
102993db446aSBoris Brezillon unlikely, we will remove it on resume, it too late now
103093db446aSBoris Brezillon anyway... */
103193db446aSBoris Brezillon dev->card_unstable = 0;
103293db446aSBoris Brezillon return 0;
103393db446aSBoris Brezillon }
103493db446aSBoris Brezillon
r852_resume(struct device * device)103593db446aSBoris Brezillon static int r852_resume(struct device *device)
103693db446aSBoris Brezillon {
103775de0eb2SChuhong Yuan struct r852_device *dev = dev_get_drvdata(device);
103893db446aSBoris Brezillon
103993db446aSBoris Brezillon r852_disable_irqs(dev);
104093db446aSBoris Brezillon r852_card_update_present(dev);
104193db446aSBoris Brezillon r852_engine_disable(dev);
104293db446aSBoris Brezillon
104393db446aSBoris Brezillon
104493db446aSBoris Brezillon /* If card status changed, just do the work */
1045ed8f0b23SColin Ian King if (dev->card_detected != dev->card_registered) {
104693db446aSBoris Brezillon dbg("card was %s during low power state",
104793db446aSBoris Brezillon dev->card_detected ? "added" : "removed");
104893db446aSBoris Brezillon
104993db446aSBoris Brezillon queue_delayed_work(dev->card_workqueue,
105093db446aSBoris Brezillon &dev->card_detect_work, msecs_to_jiffies(1000));
105193db446aSBoris Brezillon return 0;
105293db446aSBoris Brezillon }
105393db446aSBoris Brezillon
105493db446aSBoris Brezillon /* Otherwise, initialize the card */
1055ed8f0b23SColin Ian King if (dev->card_registered) {
105693db446aSBoris Brezillon r852_engine_enable(dev);
10571d017859SBoris Brezillon nand_select_target(dev->chip, 0);
105893db446aSBoris Brezillon nand_reset_op(dev->chip);
10591d017859SBoris Brezillon nand_deselect_target(dev->chip);
106093db446aSBoris Brezillon }
106193db446aSBoris Brezillon
106293db446aSBoris Brezillon /* Program card detection IRQ */
106393db446aSBoris Brezillon r852_update_card_detect(dev);
106493db446aSBoris Brezillon return 0;
106593db446aSBoris Brezillon }
106693db446aSBoris Brezillon #endif
106793db446aSBoris Brezillon
106893db446aSBoris Brezillon static const struct pci_device_id r852_pci_id_tbl[] = {
106993db446aSBoris Brezillon
107093db446aSBoris Brezillon { PCI_VDEVICE(RICOH, 0x0852), },
107193db446aSBoris Brezillon { },
107293db446aSBoris Brezillon };
107393db446aSBoris Brezillon
107493db446aSBoris Brezillon MODULE_DEVICE_TABLE(pci, r852_pci_id_tbl);
107593db446aSBoris Brezillon
107693db446aSBoris Brezillon static SIMPLE_DEV_PM_OPS(r852_pm_ops, r852_suspend, r852_resume);
107793db446aSBoris Brezillon
107893db446aSBoris Brezillon static struct pci_driver r852_pci_driver = {
107993db446aSBoris Brezillon .name = DRV_NAME,
108093db446aSBoris Brezillon .id_table = r852_pci_id_tbl,
108193db446aSBoris Brezillon .probe = r852_probe,
108293db446aSBoris Brezillon .remove = r852_remove,
108393db446aSBoris Brezillon .shutdown = r852_shutdown,
108493db446aSBoris Brezillon .driver.pm = &r852_pm_ops,
108593db446aSBoris Brezillon };
108693db446aSBoris Brezillon
108793db446aSBoris Brezillon module_pci_driver(r852_pci_driver);
108893db446aSBoris Brezillon
108993db446aSBoris Brezillon MODULE_LICENSE("GPL");
109093db446aSBoris Brezillon MODULE_AUTHOR("Maxim Levitsky <maximlevitsky@gmail.com>");
109193db446aSBoris Brezillon MODULE_DESCRIPTION("Ricoh 85xx xD/smartmedia card reader driver");
1092