xref: /linux/drivers/mtd/nand/raw/r852.c (revision 353b7a55dcaf5fb8758e09ebe2ddf5f3adbac7c5)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
267e054e9SMaxim Levitsky /*
367e054e9SMaxim Levitsky  * Copyright © 2009 - Maxim Levitsky
467e054e9SMaxim Levitsky  * driver for Ricoh xD readers
567e054e9SMaxim Levitsky  */
667e054e9SMaxim Levitsky 
763fa37f0SShreeya Patel #define DRV_NAME "r852"
863fa37f0SShreeya Patel #define pr_fmt(fmt)  DRV_NAME ": " fmt
963fa37f0SShreeya Patel 
1067e054e9SMaxim Levitsky #include <linux/kernel.h>
1167e054e9SMaxim Levitsky #include <linux/module.h>
1267e054e9SMaxim Levitsky #include <linux/jiffies.h>
1367e054e9SMaxim Levitsky #include <linux/workqueue.h>
1467e054e9SMaxim Levitsky #include <linux/interrupt.h>
15f696aa43SRandy Dunlap #include <linux/pci.h>
1667e054e9SMaxim Levitsky #include <linux/pci_ids.h>
17ada49657SStephen Rothwell #include <linux/delay.h>
1805d71b46STejun Heo #include <linux/slab.h>
1967e054e9SMaxim Levitsky #include <asm/byteorder.h>
2067e054e9SMaxim Levitsky #include <linux/sched.h>
2167e054e9SMaxim Levitsky #include "sm_common.h"
2267e054e9SMaxim Levitsky #include "r852.h"
2367e054e9SMaxim Levitsky 
2467e054e9SMaxim Levitsky 
2590ab5ee9SRusty Russell static bool r852_enable_dma = 1;
26ada49657SStephen Rothwell module_param(r852_enable_dma, bool, S_IRUGO);
27ada49657SStephen Rothwell MODULE_PARM_DESC(r852_enable_dma, "Enable usage of the DMA (default)");
2867e054e9SMaxim Levitsky 
2967e054e9SMaxim Levitsky static int debug;
3067e054e9SMaxim Levitsky module_param(debug, int, S_IRUGO | S_IWUSR);
3167e054e9SMaxim Levitsky MODULE_PARM_DESC(debug, "Debug level (0-2)");
3267e054e9SMaxim Levitsky 
3367e054e9SMaxim Levitsky /* read register */
3467e054e9SMaxim Levitsky static inline uint8_t r852_read_reg(struct r852_device *dev, int address)
3567e054e9SMaxim Levitsky {
3667e054e9SMaxim Levitsky 	uint8_t reg = readb(dev->mmio + address);
3767e054e9SMaxim Levitsky 	return reg;
3867e054e9SMaxim Levitsky }
3967e054e9SMaxim Levitsky 
4067e054e9SMaxim Levitsky /* write register */
4167e054e9SMaxim Levitsky static inline void r852_write_reg(struct r852_device *dev,
4267e054e9SMaxim Levitsky 						int address, uint8_t value)
4367e054e9SMaxim Levitsky {
4467e054e9SMaxim Levitsky 	writeb(value, dev->mmio + address);
4567e054e9SMaxim Levitsky }
4667e054e9SMaxim Levitsky 
4767e054e9SMaxim Levitsky 
4867e054e9SMaxim Levitsky /* read dword sized register */
4967e054e9SMaxim Levitsky static inline uint32_t r852_read_reg_dword(struct r852_device *dev, int address)
5067e054e9SMaxim Levitsky {
5167e054e9SMaxim Levitsky 	uint32_t reg = le32_to_cpu(readl(dev->mmio + address));
5267e054e9SMaxim Levitsky 	return reg;
5367e054e9SMaxim Levitsky }
5467e054e9SMaxim Levitsky 
5567e054e9SMaxim Levitsky /* write dword sized register */
5667e054e9SMaxim Levitsky static inline void r852_write_reg_dword(struct r852_device *dev,
5767e054e9SMaxim Levitsky 							int address, uint32_t value)
5867e054e9SMaxim Levitsky {
5967e054e9SMaxim Levitsky 	writel(cpu_to_le32(value), dev->mmio + address);
6067e054e9SMaxim Levitsky }
6167e054e9SMaxim Levitsky 
6267e054e9SMaxim Levitsky /* returns pointer to our private structure */
6367e054e9SMaxim Levitsky static inline struct r852_device *r852_get_dev(struct mtd_info *mtd)
6467e054e9SMaxim Levitsky {
654bd4ebccSBoris BREZILLON 	struct nand_chip *chip = mtd_to_nand(mtd);
66d699ed25SBoris BREZILLON 	return nand_get_controller_data(chip);
6767e054e9SMaxim Levitsky }
6867e054e9SMaxim Levitsky 
6967e054e9SMaxim Levitsky 
7067e054e9SMaxim Levitsky /* check if controller supports dma */
7167e054e9SMaxim Levitsky static void r852_dma_test(struct r852_device *dev)
7267e054e9SMaxim Levitsky {
7367e054e9SMaxim Levitsky 	dev->dma_usable = (r852_read_reg(dev, R852_DMA_CAP) &
7467e054e9SMaxim Levitsky 		(R852_DMA1 | R852_DMA2)) == (R852_DMA1 | R852_DMA2);
7567e054e9SMaxim Levitsky 
7667e054e9SMaxim Levitsky 	if (!dev->dma_usable)
7767e054e9SMaxim Levitsky 		message("Non dma capable device detected, dma disabled");
7867e054e9SMaxim Levitsky 
79ada49657SStephen Rothwell 	if (!r852_enable_dma) {
8067e054e9SMaxim Levitsky 		message("disabling dma on user request");
8167e054e9SMaxim Levitsky 		dev->dma_usable = 0;
8267e054e9SMaxim Levitsky 	}
8367e054e9SMaxim Levitsky }
8467e054e9SMaxim Levitsky 
8567e054e9SMaxim Levitsky /*
8667e054e9SMaxim Levitsky  * Enable dma. Enables ether first or second stage of the DMA,
8767e054e9SMaxim Levitsky  * Expects dev->dma_dir and dev->dma_state be set
8867e054e9SMaxim Levitsky  */
8967e054e9SMaxim Levitsky static void r852_dma_enable(struct r852_device *dev)
9067e054e9SMaxim Levitsky {
9167e054e9SMaxim Levitsky 	uint8_t dma_reg, dma_irq_reg;
9267e054e9SMaxim Levitsky 
9367e054e9SMaxim Levitsky 	/* Set up dma settings */
9467e054e9SMaxim Levitsky 	dma_reg = r852_read_reg_dword(dev, R852_DMA_SETTINGS);
9567e054e9SMaxim Levitsky 	dma_reg &= ~(R852_DMA_READ | R852_DMA_INTERNAL | R852_DMA_MEMORY);
9667e054e9SMaxim Levitsky 
9767e054e9SMaxim Levitsky 	if (dev->dma_dir)
9867e054e9SMaxim Levitsky 		dma_reg |= R852_DMA_READ;
9967e054e9SMaxim Levitsky 
100fb45d323SMaxim Levitsky 	if (dev->dma_state == DMA_INTERNAL) {
10167e054e9SMaxim Levitsky 		dma_reg |= R852_DMA_INTERNAL;
102fb45d323SMaxim Levitsky 		/* Precaution to make sure HW doesn't write */
103fb45d323SMaxim Levitsky 			/* to random kernel memory */
104fb45d323SMaxim Levitsky 		r852_write_reg_dword(dev, R852_DMA_ADDR,
105fb45d323SMaxim Levitsky 			cpu_to_le32(dev->phys_bounce_buffer));
106fb45d323SMaxim Levitsky 	} else {
10767e054e9SMaxim Levitsky 		dma_reg |= R852_DMA_MEMORY;
10867e054e9SMaxim Levitsky 		r852_write_reg_dword(dev, R852_DMA_ADDR,
10967e054e9SMaxim Levitsky 			cpu_to_le32(dev->phys_dma_addr));
11067e054e9SMaxim Levitsky 	}
11167e054e9SMaxim Levitsky 
112fb45d323SMaxim Levitsky 	/* Precaution: make sure write reached the device */
113fb45d323SMaxim Levitsky 	r852_read_reg_dword(dev, R852_DMA_ADDR);
114fb45d323SMaxim Levitsky 
11567e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_SETTINGS, dma_reg);
11667e054e9SMaxim Levitsky 
11767e054e9SMaxim Levitsky 	/* Set dma irq */
11867e054e9SMaxim Levitsky 	dma_irq_reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE);
11967e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE,
12067e054e9SMaxim Levitsky 		dma_irq_reg |
12167e054e9SMaxim Levitsky 		R852_DMA_IRQ_INTERNAL |
12267e054e9SMaxim Levitsky 		R852_DMA_IRQ_ERROR |
12367e054e9SMaxim Levitsky 		R852_DMA_IRQ_MEMORY);
12467e054e9SMaxim Levitsky }
12567e054e9SMaxim Levitsky 
12667e054e9SMaxim Levitsky /*
12767e054e9SMaxim Levitsky  * Disable dma, called from the interrupt handler, which specifies
12867e054e9SMaxim Levitsky  * success of the operation via 'error' argument
12967e054e9SMaxim Levitsky  */
13067e054e9SMaxim Levitsky static void r852_dma_done(struct r852_device *dev, int error)
13167e054e9SMaxim Levitsky {
13267e054e9SMaxim Levitsky 	WARN_ON(dev->dma_stage == 0);
13367e054e9SMaxim Levitsky 
13467e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_STA,
13567e054e9SMaxim Levitsky 			r852_read_reg_dword(dev, R852_DMA_IRQ_STA));
13667e054e9SMaxim Levitsky 
13767e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_SETTINGS, 0);
13867e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, 0);
13967e054e9SMaxim Levitsky 
140fb45d323SMaxim Levitsky 	/* Precaution to make sure HW doesn't write to random kernel memory */
141fb45d323SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_ADDR,
142fb45d323SMaxim Levitsky 		cpu_to_le32(dev->phys_bounce_buffer));
143fb45d323SMaxim Levitsky 	r852_read_reg_dword(dev, R852_DMA_ADDR);
144fb45d323SMaxim Levitsky 
14567e054e9SMaxim Levitsky 	dev->dma_error = error;
14667e054e9SMaxim Levitsky 	dev->dma_stage = 0;
14767e054e9SMaxim Levitsky 
14867e054e9SMaxim Levitsky 	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);
15267e054e9SMaxim Levitsky }
15367e054e9SMaxim Levitsky 
15467e054e9SMaxim Levitsky /*
15567e054e9SMaxim Levitsky  * Wait, till dma is done, which includes both phases of it
15667e054e9SMaxim Levitsky  */
15767e054e9SMaxim Levitsky static int r852_dma_wait(struct r852_device *dev)
15867e054e9SMaxim Levitsky {
15967e054e9SMaxim Levitsky 	long timeout = wait_for_completion_timeout(&dev->dma_done,
16067e054e9SMaxim Levitsky 				msecs_to_jiffies(1000));
16167e054e9SMaxim Levitsky 	if (!timeout) {
16267e054e9SMaxim Levitsky 		dbg("timeout waiting for DMA interrupt");
16367e054e9SMaxim Levitsky 		return -ETIMEDOUT;
16467e054e9SMaxim Levitsky 	}
16567e054e9SMaxim Levitsky 
16667e054e9SMaxim Levitsky 	return 0;
16767e054e9SMaxim Levitsky }
16867e054e9SMaxim Levitsky 
16967e054e9SMaxim Levitsky /*
17067e054e9SMaxim Levitsky  * Read/Write one page using dma. Only pages can be read (512 bytes)
17167e054e9SMaxim Levitsky */
17267e054e9SMaxim Levitsky static void r852_do_dma(struct r852_device *dev, uint8_t *buf, int do_read)
17367e054e9SMaxim Levitsky {
17467e054e9SMaxim Levitsky 	int bounce = 0;
17567e054e9SMaxim Levitsky 	unsigned long flags;
17667e054e9SMaxim Levitsky 	int error;
17767e054e9SMaxim Levitsky 
17867e054e9SMaxim Levitsky 	dev->dma_error = 0;
17967e054e9SMaxim Levitsky 
18067e054e9SMaxim Levitsky 	/* Set dma direction */
18167e054e9SMaxim Levitsky 	dev->dma_dir = do_read;
18267e054e9SMaxim Levitsky 	dev->dma_stage = 1;
18316735d02SWolfram Sang 	reinit_completion(&dev->dma_done);
18467e054e9SMaxim Levitsky 
18567e054e9SMaxim Levitsky 	dbg_verbose("doing dma %s ", do_read ? "read" : "write");
18667e054e9SMaxim Levitsky 
18725985edcSLucas De Marchi 	/* Set initial dma state: for reading first fill on board buffer,
18867e054e9SMaxim Levitsky 	  from device, for writes first fill the buffer  from memory*/
18967e054e9SMaxim Levitsky 	dev->dma_state = do_read ? DMA_INTERNAL : DMA_MEMORY;
19067e054e9SMaxim Levitsky 
19167e054e9SMaxim Levitsky 	/* if incoming buffer is not page aligned, we should do bounce */
19267e054e9SMaxim Levitsky 	if ((unsigned long)buf & (R852_DMA_LEN-1))
19367e054e9SMaxim Levitsky 		bounce = 1;
19467e054e9SMaxim Levitsky 
19567e054e9SMaxim Levitsky 	if (!bounce) {
1960282fefbSChristoph Hellwig 		dev->phys_dma_addr = dma_map_single(&dev->pci_dev->dev, buf,
19767e054e9SMaxim Levitsky 			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))
20067e054e9SMaxim Levitsky 			bounce = 1;
20167e054e9SMaxim Levitsky 	}
20267e054e9SMaxim Levitsky 
20367e054e9SMaxim Levitsky 	if (bounce) {
20467e054e9SMaxim Levitsky 		dbg_verbose("dma: using bounce buffer");
20567e054e9SMaxim Levitsky 		dev->phys_dma_addr = dev->phys_bounce_buffer;
20667e054e9SMaxim Levitsky 		if (!do_read)
20767e054e9SMaxim Levitsky 			memcpy(dev->bounce_buffer, buf, R852_DMA_LEN);
20867e054e9SMaxim Levitsky 	}
20967e054e9SMaxim Levitsky 
21067e054e9SMaxim Levitsky 	/* Enable DMA */
21167e054e9SMaxim Levitsky 	spin_lock_irqsave(&dev->irqlock, flags);
21267e054e9SMaxim Levitsky 	r852_dma_enable(dev);
21367e054e9SMaxim Levitsky 	spin_unlock_irqrestore(&dev->irqlock, flags);
21467e054e9SMaxim Levitsky 
21567e054e9SMaxim Levitsky 	/* Wait till complete */
21667e054e9SMaxim Levitsky 	error = r852_dma_wait(dev);
21767e054e9SMaxim Levitsky 
21867e054e9SMaxim Levitsky 	if (error) {
21967e054e9SMaxim Levitsky 		r852_dma_done(dev, error);
22067e054e9SMaxim Levitsky 		return;
22167e054e9SMaxim Levitsky 	}
22267e054e9SMaxim Levitsky 
22367e054e9SMaxim Levitsky 	if (do_read && bounce)
22467e054e9SMaxim Levitsky 		memcpy((void *)buf, dev->bounce_buffer, R852_DMA_LEN);
22567e054e9SMaxim Levitsky }
22667e054e9SMaxim Levitsky 
22767e054e9SMaxim Levitsky /*
22867e054e9SMaxim Levitsky  * Program data lines of the nand chip to send data to it
22967e054e9SMaxim Levitsky  */
230c0739d85SBoris Brezillon static void r852_write_buf(struct nand_chip *chip, const uint8_t *buf, int len)
23167e054e9SMaxim Levitsky {
232c0739d85SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
23367e054e9SMaxim Levitsky 	uint32_t reg;
23467e054e9SMaxim Levitsky 
23567e054e9SMaxim Levitsky 	/* Don't allow any access to hardware if we suspect card removal */
23667e054e9SMaxim Levitsky 	if (dev->card_unstable)
23767e054e9SMaxim Levitsky 		return;
23867e054e9SMaxim Levitsky 
23967e054e9SMaxim Levitsky 	/* Special case for whole sector read */
24067e054e9SMaxim Levitsky 	if (len == R852_DMA_LEN && dev->dma_usable) {
24167e054e9SMaxim Levitsky 		r852_do_dma(dev, (uint8_t *)buf, 0);
24267e054e9SMaxim Levitsky 		return;
24367e054e9SMaxim Levitsky 	}
24467e054e9SMaxim Levitsky 
24567e054e9SMaxim Levitsky 	/* write DWORD chinks - faster */
246ab7f6fceSBrian Norris 	while (len >= 4) {
24767e054e9SMaxim Levitsky 		reg = buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24;
24867e054e9SMaxim Levitsky 		r852_write_reg_dword(dev, R852_DATALINE, reg);
24967e054e9SMaxim Levitsky 		buf += 4;
25067e054e9SMaxim Levitsky 		len -= 4;
25167e054e9SMaxim Levitsky 
25267e054e9SMaxim Levitsky 	}
25367e054e9SMaxim Levitsky 
25467e054e9SMaxim Levitsky 	/* write rest */
255ab7f6fceSBrian Norris 	while (len > 0) {
25667e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_DATALINE, *buf++);
257ab7f6fceSBrian Norris 		len--;
258ab7f6fceSBrian Norris 	}
25967e054e9SMaxim Levitsky }
26067e054e9SMaxim Levitsky 
26167e054e9SMaxim Levitsky /*
26267e054e9SMaxim Levitsky  * Read data lines of the nand chip to retrieve data
26367e054e9SMaxim Levitsky  */
2647e534323SBoris Brezillon static void r852_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
26567e054e9SMaxim Levitsky {
2667e534323SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
26767e054e9SMaxim Levitsky 	uint32_t reg;
26867e054e9SMaxim Levitsky 
26967e054e9SMaxim Levitsky 	if (dev->card_unstable) {
27067e054e9SMaxim Levitsky 		/* since we can't signal error here, at least, return
27167e054e9SMaxim Levitsky 			predictable buffer */
27267e054e9SMaxim Levitsky 		memset(buf, 0, len);
27367e054e9SMaxim Levitsky 		return;
27467e054e9SMaxim Levitsky 	}
27567e054e9SMaxim Levitsky 
27667e054e9SMaxim Levitsky 	/* special case for whole sector read */
27767e054e9SMaxim Levitsky 	if (len == R852_DMA_LEN && dev->dma_usable) {
27867e054e9SMaxim Levitsky 		r852_do_dma(dev, buf, 1);
27967e054e9SMaxim Levitsky 		return;
28067e054e9SMaxim Levitsky 	}
28167e054e9SMaxim Levitsky 
28267e054e9SMaxim Levitsky 	/* read in dword sized chunks */
28367e054e9SMaxim Levitsky 	while (len >= 4) {
28467e054e9SMaxim Levitsky 
28567e054e9SMaxim Levitsky 		reg = r852_read_reg_dword(dev, R852_DATALINE);
28667e054e9SMaxim Levitsky 		*buf++ = reg & 0xFF;
28767e054e9SMaxim Levitsky 		*buf++ = (reg >> 8) & 0xFF;
28867e054e9SMaxim Levitsky 		*buf++ = (reg >> 16) & 0xFF;
28967e054e9SMaxim Levitsky 		*buf++ = (reg >> 24) & 0xFF;
29067e054e9SMaxim Levitsky 		len -= 4;
29167e054e9SMaxim Levitsky 	}
29267e054e9SMaxim Levitsky 
29367e054e9SMaxim Levitsky 	/* read the reset by bytes */
29467e054e9SMaxim Levitsky 	while (len--)
29567e054e9SMaxim Levitsky 		*buf++ = r852_read_reg(dev, R852_DATALINE);
29667e054e9SMaxim Levitsky }
29767e054e9SMaxim Levitsky 
29867e054e9SMaxim Levitsky /*
29967e054e9SMaxim Levitsky  * Read one byte from nand chip
30067e054e9SMaxim Levitsky  */
3017e534323SBoris Brezillon static uint8_t r852_read_byte(struct nand_chip *chip)
30267e054e9SMaxim Levitsky {
3037e534323SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
30467e054e9SMaxim Levitsky 
30567e054e9SMaxim Levitsky 	/* Same problem as in r852_read_buf.... */
30667e054e9SMaxim Levitsky 	if (dev->card_unstable)
30767e054e9SMaxim Levitsky 		return 0;
30867e054e9SMaxim Levitsky 
30967e054e9SMaxim Levitsky 	return r852_read_reg(dev, R852_DATALINE);
31067e054e9SMaxim Levitsky }
31167e054e9SMaxim Levitsky 
31267e054e9SMaxim Levitsky /*
31367e054e9SMaxim Levitsky  * Control several chip lines & send commands
31467e054e9SMaxim Levitsky  */
3150f808c16SBoris Brezillon static void r852_cmdctl(struct nand_chip *chip, int dat, unsigned int ctrl)
31667e054e9SMaxim Levitsky {
3170f808c16SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
31867e054e9SMaxim Levitsky 
31967e054e9SMaxim Levitsky 	if (dev->card_unstable)
32067e054e9SMaxim Levitsky 		return;
32167e054e9SMaxim Levitsky 
32267e054e9SMaxim Levitsky 	if (ctrl & NAND_CTRL_CHANGE) {
32367e054e9SMaxim Levitsky 
32467e054e9SMaxim Levitsky 		dev->ctlreg &= ~(R852_CTL_DATA | R852_CTL_COMMAND |
32567e054e9SMaxim Levitsky 				 R852_CTL_ON | R852_CTL_CARDENABLE);
32667e054e9SMaxim Levitsky 
32767e054e9SMaxim Levitsky 		if (ctrl & NAND_ALE)
32867e054e9SMaxim Levitsky 			dev->ctlreg |= R852_CTL_DATA;
32967e054e9SMaxim Levitsky 
33067e054e9SMaxim Levitsky 		if (ctrl & NAND_CLE)
33167e054e9SMaxim Levitsky 			dev->ctlreg |= R852_CTL_COMMAND;
33267e054e9SMaxim Levitsky 
33367e054e9SMaxim Levitsky 		if (ctrl & NAND_NCE)
33467e054e9SMaxim Levitsky 			dev->ctlreg |= (R852_CTL_CARDENABLE | R852_CTL_ON);
33567e054e9SMaxim Levitsky 		else
33667e054e9SMaxim Levitsky 			dev->ctlreg &= ~R852_CTL_WRITE;
33767e054e9SMaxim Levitsky 
33867e054e9SMaxim Levitsky 		/* when write is stareted, enable write access */
33967e054e9SMaxim Levitsky 		if (dat == NAND_CMD_ERASE1)
34067e054e9SMaxim Levitsky 			dev->ctlreg |= R852_CTL_WRITE;
34167e054e9SMaxim Levitsky 
34267e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, dev->ctlreg);
34367e054e9SMaxim Levitsky 	}
34467e054e9SMaxim Levitsky 
34567e054e9SMaxim Levitsky 	 /* HACK: NAND_CMD_SEQIN is called without NAND_CTRL_CHANGE, but we need
34667e054e9SMaxim Levitsky 		to set write mode */
34767e054e9SMaxim Levitsky 	if (dat == NAND_CMD_SEQIN && (dev->ctlreg & R852_CTL_COMMAND)) {
34867e054e9SMaxim Levitsky 		dev->ctlreg |= R852_CTL_WRITE;
34967e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, dev->ctlreg);
35067e054e9SMaxim Levitsky 	}
35167e054e9SMaxim Levitsky 
35267e054e9SMaxim Levitsky 	if (dat != NAND_CMD_NONE)
35367e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_DATALINE, dat);
35467e054e9SMaxim Levitsky }
35567e054e9SMaxim Levitsky 
35667e054e9SMaxim Levitsky /*
35767e054e9SMaxim Levitsky  * Wait till card is ready.
35867e054e9SMaxim Levitsky  * based on nand_wait, but returns errors on DMA error
35967e054e9SMaxim Levitsky  */
360f1d46942SBoris Brezillon static int r852_wait(struct nand_chip *chip)
36167e054e9SMaxim Levitsky {
362d699ed25SBoris BREZILLON 	struct r852_device *dev = nand_get_controller_data(chip);
36367e054e9SMaxim Levitsky 
36467e054e9SMaxim Levitsky 	unsigned long timeout;
36597d90da8SBoris Brezillon 	u8 status;
36667e054e9SMaxim Levitsky 
367661803b2SBoris Brezillon 	timeout = jiffies + msecs_to_jiffies(400);
36867e054e9SMaxim Levitsky 
36967e054e9SMaxim Levitsky 	while (time_before(jiffies, timeout))
3708395b753SBoris Brezillon 		if (chip->legacy.dev_ready(chip))
37167e054e9SMaxim Levitsky 			break;
37267e054e9SMaxim Levitsky 
37397d90da8SBoris Brezillon 	nand_status_op(chip, &status);
37467e054e9SMaxim Levitsky 
37567e054e9SMaxim Levitsky 	/* Unfortunelly, no way to send detailed error status... */
37667e054e9SMaxim Levitsky 	if (dev->dma_error) {
37767e054e9SMaxim Levitsky 		status |= NAND_STATUS_FAIL;
37867e054e9SMaxim Levitsky 		dev->dma_error = 0;
37967e054e9SMaxim Levitsky 	}
38067e054e9SMaxim Levitsky 	return status;
38167e054e9SMaxim Levitsky }
38267e054e9SMaxim Levitsky 
38367e054e9SMaxim Levitsky /*
38467e054e9SMaxim Levitsky  * Check if card is ready
38567e054e9SMaxim Levitsky  */
38667e054e9SMaxim Levitsky 
38750a487e7SBoris Brezillon static int r852_ready(struct nand_chip *chip)
38867e054e9SMaxim Levitsky {
38950a487e7SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
39067e054e9SMaxim Levitsky 	return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY);
39167e054e9SMaxim Levitsky }
39267e054e9SMaxim Levitsky 
39367e054e9SMaxim Levitsky 
39467e054e9SMaxim Levitsky /*
39567e054e9SMaxim Levitsky  * Set ECC engine mode
39667e054e9SMaxim Levitsky */
39767e054e9SMaxim Levitsky 
398ec47636cSBoris Brezillon static void r852_ecc_hwctl(struct nand_chip *chip, int mode)
39967e054e9SMaxim Levitsky {
400ec47636cSBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
40167e054e9SMaxim Levitsky 
40267e054e9SMaxim Levitsky 	if (dev->card_unstable)
40367e054e9SMaxim Levitsky 		return;
40467e054e9SMaxim Levitsky 
40567e054e9SMaxim Levitsky 	switch (mode) {
40667e054e9SMaxim Levitsky 	case NAND_ECC_READ:
40767e054e9SMaxim Levitsky 	case NAND_ECC_WRITE:
40867e054e9SMaxim Levitsky 		/* enable ecc generation/check*/
40967e054e9SMaxim Levitsky 		dev->ctlreg |= R852_CTL_ECC_ENABLE;
41067e054e9SMaxim Levitsky 
41167e054e9SMaxim Levitsky 		/* flush ecc buffer */
41267e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL,
41367e054e9SMaxim Levitsky 			dev->ctlreg | R852_CTL_ECC_ACCESS);
41467e054e9SMaxim Levitsky 
41567e054e9SMaxim Levitsky 		r852_read_reg_dword(dev, R852_DATALINE);
41667e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, dev->ctlreg);
41767e054e9SMaxim Levitsky 		return;
41867e054e9SMaxim Levitsky 
41967e054e9SMaxim Levitsky 	case NAND_ECC_READSYN:
42067e054e9SMaxim Levitsky 		/* disable ecc generation */
42167e054e9SMaxim Levitsky 		dev->ctlreg &= ~R852_CTL_ECC_ENABLE;
42267e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, dev->ctlreg);
42367e054e9SMaxim Levitsky 	}
42467e054e9SMaxim Levitsky }
42567e054e9SMaxim Levitsky 
42667e054e9SMaxim Levitsky /*
42767e054e9SMaxim Levitsky  * Calculate ECC, only used for writes
42867e054e9SMaxim Levitsky  */
42967e054e9SMaxim Levitsky 
430af37d2c3SBoris Brezillon static int r852_ecc_calculate(struct nand_chip *chip, const uint8_t *dat,
43167e054e9SMaxim Levitsky 			      uint8_t *ecc_code)
43267e054e9SMaxim Levitsky {
433af37d2c3SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
43467e054e9SMaxim Levitsky 	struct sm_oob *oob = (struct sm_oob *)ecc_code;
43567e054e9SMaxim Levitsky 	uint32_t ecc1, ecc2;
43667e054e9SMaxim Levitsky 
43767e054e9SMaxim Levitsky 	if (dev->card_unstable)
43867e054e9SMaxim Levitsky 		return 0;
43967e054e9SMaxim Levitsky 
44067e054e9SMaxim Levitsky 	dev->ctlreg &= ~R852_CTL_ECC_ENABLE;
44167e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS);
44267e054e9SMaxim Levitsky 
44367e054e9SMaxim Levitsky 	ecc1 = r852_read_reg_dword(dev, R852_DATALINE);
44467e054e9SMaxim Levitsky 	ecc2 = r852_read_reg_dword(dev, R852_DATALINE);
44567e054e9SMaxim Levitsky 
44667e054e9SMaxim Levitsky 	oob->ecc1[0] = (ecc1) & 0xFF;
44767e054e9SMaxim Levitsky 	oob->ecc1[1] = (ecc1 >> 8) & 0xFF;
44867e054e9SMaxim Levitsky 	oob->ecc1[2] = (ecc1 >> 16) & 0xFF;
44967e054e9SMaxim Levitsky 
45067e054e9SMaxim Levitsky 	oob->ecc2[0] = (ecc2) & 0xFF;
45167e054e9SMaxim Levitsky 	oob->ecc2[1] = (ecc2 >> 8) & 0xFF;
45267e054e9SMaxim Levitsky 	oob->ecc2[2] = (ecc2 >> 16) & 0xFF;
45367e054e9SMaxim Levitsky 
45467e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, dev->ctlreg);
45567e054e9SMaxim Levitsky 	return 0;
45667e054e9SMaxim Levitsky }
45767e054e9SMaxim Levitsky 
45867e054e9SMaxim Levitsky /*
45967e054e9SMaxim Levitsky  * Correct the data using ECC, hw did almost everything for us
46067e054e9SMaxim Levitsky  */
46167e054e9SMaxim Levitsky 
46200da2ea9SBoris Brezillon static int r852_ecc_correct(struct nand_chip *chip, uint8_t *dat,
46367e054e9SMaxim Levitsky 			    uint8_t *read_ecc, uint8_t *calc_ecc)
46467e054e9SMaxim Levitsky {
465cef1ed9cSNicolas Iooss 	uint32_t ecc_reg;
46667e054e9SMaxim Levitsky 	uint8_t ecc_status, err_byte;
46767e054e9SMaxim Levitsky 	int i, error = 0;
46867e054e9SMaxim Levitsky 
46900da2ea9SBoris Brezillon 	struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
47067e054e9SMaxim Levitsky 
47167e054e9SMaxim Levitsky 	if (dev->card_unstable)
47267e054e9SMaxim Levitsky 		return 0;
47367e054e9SMaxim Levitsky 
4749489be8cSMaxim Levitsky 	if (dev->dma_error) {
4759489be8cSMaxim Levitsky 		dev->dma_error = 0;
4766e941192SBoris BREZILLON 		return -EIO;
4779489be8cSMaxim Levitsky 	}
4789489be8cSMaxim Levitsky 
47967e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS);
48067e054e9SMaxim Levitsky 	ecc_reg = r852_read_reg_dword(dev, R852_DATALINE);
48167e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, dev->ctlreg);
48267e054e9SMaxim Levitsky 
48367e054e9SMaxim Levitsky 	for (i = 0 ; i <= 1 ; i++) {
48467e054e9SMaxim Levitsky 
48567e054e9SMaxim Levitsky 		ecc_status = (ecc_reg >> 8) & 0xFF;
48667e054e9SMaxim Levitsky 
48767e054e9SMaxim Levitsky 		/* ecc uncorrectable error */
48867e054e9SMaxim Levitsky 		if (ecc_status & R852_ECC_FAIL) {
48967e054e9SMaxim Levitsky 			dbg("ecc: unrecoverable error, in half %d", i);
4906e941192SBoris BREZILLON 			error = -EBADMSG;
49167e054e9SMaxim Levitsky 			goto exit;
49267e054e9SMaxim Levitsky 		}
49367e054e9SMaxim Levitsky 
49467e054e9SMaxim Levitsky 		/* correctable error */
49567e054e9SMaxim Levitsky 		if (ecc_status & R852_ECC_CORRECTABLE) {
49667e054e9SMaxim Levitsky 
49767e054e9SMaxim Levitsky 			err_byte = ecc_reg & 0xFF;
49867e054e9SMaxim Levitsky 			dbg("ecc: recoverable error, "
49967e054e9SMaxim Levitsky 				"in half %d, byte %d, bit %d", i,
50067e054e9SMaxim Levitsky 				err_byte, ecc_status & R852_ECC_ERR_BIT_MSK);
50167e054e9SMaxim Levitsky 
50267e054e9SMaxim Levitsky 			dat[err_byte] ^=
50367e054e9SMaxim Levitsky 				1 << (ecc_status & R852_ECC_ERR_BIT_MSK);
50467e054e9SMaxim Levitsky 			error++;
50567e054e9SMaxim Levitsky 		}
50667e054e9SMaxim Levitsky 
50767e054e9SMaxim Levitsky 		dat += 256;
50867e054e9SMaxim Levitsky 		ecc_reg >>= 16;
50967e054e9SMaxim Levitsky 	}
51067e054e9SMaxim Levitsky exit:
51167e054e9SMaxim Levitsky 	return error;
51267e054e9SMaxim Levitsky }
51367e054e9SMaxim Levitsky 
51467e054e9SMaxim Levitsky /*
51567e054e9SMaxim Levitsky  * This is copy of nand_read_oob_std
51667e054e9SMaxim Levitsky  * nand_read_oob_syndrome assumes we can send column address - we can't
51767e054e9SMaxim Levitsky  */
518b9761687SBoris Brezillon static int r852_read_oob(struct nand_chip *chip, int page)
51967e054e9SMaxim Levitsky {
520b9761687SBoris Brezillon 	struct mtd_info *mtd = nand_to_mtd(chip);
521b9761687SBoris Brezillon 
52297d90da8SBoris Brezillon 	return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
52367e054e9SMaxim Levitsky }
52467e054e9SMaxim Levitsky 
52567e054e9SMaxim Levitsky /*
52667e054e9SMaxim Levitsky  * Start the nand engine
52767e054e9SMaxim Levitsky  */
52867e054e9SMaxim Levitsky 
5292fffc798SJingoo Han static void r852_engine_enable(struct r852_device *dev)
53067e054e9SMaxim Levitsky {
53167e054e9SMaxim Levitsky 	if (r852_read_reg_dword(dev, R852_HW) & R852_HW_UNKNOWN) {
53267e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON);
53367e054e9SMaxim Levitsky 		r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED);
53467e054e9SMaxim Levitsky 	} else {
53567e054e9SMaxim Levitsky 		r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED);
53667e054e9SMaxim Levitsky 		r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON);
53767e054e9SMaxim Levitsky 	}
53867e054e9SMaxim Levitsky 	msleep(300);
53967e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, 0);
54067e054e9SMaxim Levitsky }
54167e054e9SMaxim Levitsky 
54267e054e9SMaxim Levitsky 
54367e054e9SMaxim Levitsky /*
54467e054e9SMaxim Levitsky  * Stop the nand engine
54567e054e9SMaxim Levitsky  */
54667e054e9SMaxim Levitsky 
5472fffc798SJingoo Han static void r852_engine_disable(struct r852_device *dev)
54867e054e9SMaxim Levitsky {
54967e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_HW, 0);
55067e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CTL, R852_CTL_RESET);
55167e054e9SMaxim Levitsky }
55267e054e9SMaxim Levitsky 
55367e054e9SMaxim Levitsky /*
55467e054e9SMaxim Levitsky  * Test if card is present
55567e054e9SMaxim Levitsky  */
55667e054e9SMaxim Levitsky 
5572fffc798SJingoo Han static void r852_card_update_present(struct r852_device *dev)
55867e054e9SMaxim Levitsky {
55967e054e9SMaxim Levitsky 	unsigned long flags;
56067e054e9SMaxim Levitsky 	uint8_t reg;
56167e054e9SMaxim Levitsky 
56267e054e9SMaxim Levitsky 	spin_lock_irqsave(&dev->irqlock, flags);
56367e054e9SMaxim Levitsky 	reg = r852_read_reg(dev, R852_CARD_STA);
56467e054e9SMaxim Levitsky 	dev->card_detected = !!(reg & R852_CARD_STA_PRESENT);
56567e054e9SMaxim Levitsky 	spin_unlock_irqrestore(&dev->irqlock, flags);
56667e054e9SMaxim Levitsky }
56767e054e9SMaxim Levitsky 
56867e054e9SMaxim Levitsky /*
56967e054e9SMaxim Levitsky  * Update card detection IRQ state according to current card state
57067e054e9SMaxim Levitsky  * which is read in r852_card_update_present
57167e054e9SMaxim Levitsky  */
5722fffc798SJingoo Han static void r852_update_card_detect(struct r852_device *dev)
57367e054e9SMaxim Levitsky {
57467e054e9SMaxim Levitsky 	int card_detect_reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE);
575fb45d323SMaxim Levitsky 	dev->card_unstable = 0;
57667e054e9SMaxim Levitsky 
57767e054e9SMaxim Levitsky 	card_detect_reg &= ~(R852_CARD_IRQ_REMOVE | R852_CARD_IRQ_INSERT);
57867e054e9SMaxim Levitsky 	card_detect_reg |= R852_CARD_IRQ_GENABLE;
57967e054e9SMaxim Levitsky 
58067e054e9SMaxim Levitsky 	card_detect_reg |= dev->card_detected ?
58167e054e9SMaxim Levitsky 		R852_CARD_IRQ_REMOVE : R852_CARD_IRQ_INSERT;
58267e054e9SMaxim Levitsky 
58367e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CARD_IRQ_ENABLE, card_detect_reg);
58467e054e9SMaxim Levitsky }
58567e054e9SMaxim Levitsky 
586*21db4f47SZhen Lei static ssize_t media_type_show(struct device *sys_dev,
58767e054e9SMaxim Levitsky 			       struct device_attribute *attr, char *buf)
58867e054e9SMaxim Levitsky {
58967e054e9SMaxim Levitsky 	struct mtd_info *mtd = container_of(sys_dev, struct mtd_info, dev);
59067e054e9SMaxim Levitsky 	struct r852_device *dev = r852_get_dev(mtd);
59167e054e9SMaxim Levitsky 	char *data = dev->sm ? "smartmedia" : "xd";
59267e054e9SMaxim Levitsky 
59367e054e9SMaxim Levitsky 	strcpy(buf, data);
59467e054e9SMaxim Levitsky 	return strlen(data);
59567e054e9SMaxim Levitsky }
596*21db4f47SZhen Lei static DEVICE_ATTR_RO(media_type);
59767e054e9SMaxim Levitsky 
59867e054e9SMaxim Levitsky 
59967e054e9SMaxim Levitsky /* Detect properties of card in slot */
6002fffc798SJingoo Han static void r852_update_media_status(struct r852_device *dev)
60167e054e9SMaxim Levitsky {
60267e054e9SMaxim Levitsky 	uint8_t reg;
60367e054e9SMaxim Levitsky 	unsigned long flags;
60467e054e9SMaxim Levitsky 	int readonly;
60567e054e9SMaxim Levitsky 
60667e054e9SMaxim Levitsky 	spin_lock_irqsave(&dev->irqlock, flags);
60767e054e9SMaxim Levitsky 	if (!dev->card_detected) {
60867e054e9SMaxim Levitsky 		message("card removed");
60967e054e9SMaxim Levitsky 		spin_unlock_irqrestore(&dev->irqlock, flags);
61067e054e9SMaxim Levitsky 		return ;
61167e054e9SMaxim Levitsky 	}
61267e054e9SMaxim Levitsky 
61367e054e9SMaxim Levitsky 	readonly  = r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_RO;
61467e054e9SMaxim Levitsky 	reg = r852_read_reg(dev, R852_DMA_CAP);
61567e054e9SMaxim Levitsky 	dev->sm = (reg & (R852_DMA1 | R852_DMA2)) && (reg & R852_SMBIT);
61667e054e9SMaxim Levitsky 
61767e054e9SMaxim Levitsky 	message("detected %s %s card in slot",
61867e054e9SMaxim Levitsky 		dev->sm ? "SmartMedia" : "xD",
61967e054e9SMaxim Levitsky 		readonly ? "readonly" : "writeable");
62067e054e9SMaxim Levitsky 
62167e054e9SMaxim Levitsky 	dev->readonly = readonly;
62267e054e9SMaxim Levitsky 	spin_unlock_irqrestore(&dev->irqlock, flags);
62367e054e9SMaxim Levitsky }
62467e054e9SMaxim Levitsky 
62567e054e9SMaxim Levitsky /*
62667e054e9SMaxim Levitsky  * Register the nand device
62767e054e9SMaxim Levitsky  * Called when the card is detected
62867e054e9SMaxim Levitsky  */
6292fffc798SJingoo Han static int r852_register_nand_device(struct r852_device *dev)
63067e054e9SMaxim Levitsky {
631de9f56f9SBoris BREZILLON 	struct mtd_info *mtd = nand_to_mtd(dev->chip);
63267e054e9SMaxim Levitsky 
633ed8f0b23SColin Ian King 	WARN_ON(dev->card_registered);
63467e054e9SMaxim Levitsky 
635de9f56f9SBoris BREZILLON 	mtd->dev.parent = &dev->pci_dev->dev;
63667e054e9SMaxim Levitsky 
63767e054e9SMaxim Levitsky 	if (dev->readonly)
63867e054e9SMaxim Levitsky 		dev->chip->options |= NAND_ROM;
63967e054e9SMaxim Levitsky 
64067e054e9SMaxim Levitsky 	r852_engine_enable(dev);
64167e054e9SMaxim Levitsky 
642de9f56f9SBoris BREZILLON 	if (sm_register_device(mtd, dev->sm))
643de9f56f9SBoris BREZILLON 		goto error1;
64467e054e9SMaxim Levitsky 
645de9f56f9SBoris BREZILLON 	if (device_create_file(&mtd->dev, &dev_attr_media_type)) {
646133fa8c7SMaxim Levitsky 		message("can't create media type sysfs attribute");
647905cce7fSRichard Weinberger 		goto error3;
648905cce7fSRichard Weinberger 	}
649133fa8c7SMaxim Levitsky 
650ed8f0b23SColin Ian King 	dev->card_registered = 1;
65167e054e9SMaxim Levitsky 	return 0;
652905cce7fSRichard Weinberger error3:
65310b87750SMiquel Raynal 	WARN_ON(mtd_device_unregister(nand_to_mtd(dev->chip)));
65410b87750SMiquel Raynal 	nand_cleanup(dev->chip);
65567e054e9SMaxim Levitsky error1:
65667e054e9SMaxim Levitsky 	/* Force card redetect */
65767e054e9SMaxim Levitsky 	dev->card_detected = 0;
65867e054e9SMaxim Levitsky 	return -1;
65967e054e9SMaxim Levitsky }
66067e054e9SMaxim Levitsky 
66167e054e9SMaxim Levitsky /*
66267e054e9SMaxim Levitsky  * Unregister the card
66367e054e9SMaxim Levitsky  */
66467e054e9SMaxim Levitsky 
6652fffc798SJingoo Han static void r852_unregister_nand_device(struct r852_device *dev)
66667e054e9SMaxim Levitsky {
667de9f56f9SBoris BREZILLON 	struct mtd_info *mtd = nand_to_mtd(dev->chip);
668de9f56f9SBoris BREZILLON 
669ed8f0b23SColin Ian King 	if (!dev->card_registered)
67067e054e9SMaxim Levitsky 		return;
67167e054e9SMaxim Levitsky 
672de9f56f9SBoris BREZILLON 	device_remove_file(&mtd->dev, &dev_attr_media_type);
67310b87750SMiquel Raynal 	WARN_ON(mtd_device_unregister(mtd));
67410b87750SMiquel Raynal 	nand_cleanup(dev->chip);
67567e054e9SMaxim Levitsky 	r852_engine_disable(dev);
676ed8f0b23SColin Ian King 	dev->card_registered = 0;
67767e054e9SMaxim Levitsky }
67867e054e9SMaxim Levitsky 
67967e054e9SMaxim Levitsky /* Card state updater */
6802fffc798SJingoo Han static void r852_card_detect_work(struct work_struct *work)
68167e054e9SMaxim Levitsky {
68267e054e9SMaxim Levitsky 	struct r852_device *dev =
68367e054e9SMaxim Levitsky 		container_of(work, struct r852_device, card_detect_work.work);
68467e054e9SMaxim Levitsky 
685fb45d323SMaxim Levitsky 	r852_card_update_present(dev);
686ac373f7eSMaxim Levitsky 	r852_update_card_detect(dev);
68767e054e9SMaxim Levitsky 	dev->card_unstable = 0;
68867e054e9SMaxim Levitsky 
689fb45d323SMaxim Levitsky 	/* False alarm */
690ed8f0b23SColin Ian King 	if (dev->card_detected == dev->card_registered)
69167e054e9SMaxim Levitsky 		goto exit;
69267e054e9SMaxim Levitsky 
69367e054e9SMaxim Levitsky 	/* Read media properties */
69467e054e9SMaxim Levitsky 	r852_update_media_status(dev);
69567e054e9SMaxim Levitsky 
69667e054e9SMaxim Levitsky 	/* Register the card */
69767e054e9SMaxim Levitsky 	if (dev->card_detected)
69867e054e9SMaxim Levitsky 		r852_register_nand_device(dev);
69967e054e9SMaxim Levitsky 	else
70067e054e9SMaxim Levitsky 		r852_unregister_nand_device(dev);
70167e054e9SMaxim Levitsky exit:
70267e054e9SMaxim Levitsky 	r852_update_card_detect(dev);
70367e054e9SMaxim Levitsky }
70467e054e9SMaxim Levitsky 
70567e054e9SMaxim Levitsky /* Ack + disable IRQ generation */
70667e054e9SMaxim Levitsky static void r852_disable_irqs(struct r852_device *dev)
70767e054e9SMaxim Levitsky {
70867e054e9SMaxim Levitsky 	uint8_t reg;
70967e054e9SMaxim Levitsky 	reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE);
71067e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CARD_IRQ_ENABLE, reg & ~R852_CARD_IRQ_MASK);
71167e054e9SMaxim Levitsky 
71267e054e9SMaxim Levitsky 	reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE);
71367e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE,
71467e054e9SMaxim Levitsky 					reg & ~R852_DMA_IRQ_MASK);
71567e054e9SMaxim Levitsky 
71667e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CARD_IRQ_STA, R852_CARD_IRQ_MASK);
71767e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_STA, R852_DMA_IRQ_MASK);
71867e054e9SMaxim Levitsky }
71967e054e9SMaxim Levitsky 
72067e054e9SMaxim Levitsky /* Interrupt handler */
72167e054e9SMaxim Levitsky static irqreturn_t r852_irq(int irq, void *data)
72267e054e9SMaxim Levitsky {
72367e054e9SMaxim Levitsky 	struct r852_device *dev = (struct r852_device *)data;
72467e054e9SMaxim Levitsky 
72567e054e9SMaxim Levitsky 	uint8_t card_status, dma_status;
72667e054e9SMaxim Levitsky 	irqreturn_t ret = IRQ_NONE;
72767e054e9SMaxim Levitsky 
7284682dd19STian Tao 	spin_lock(&dev->irqlock);
72967e054e9SMaxim Levitsky 
73067e054e9SMaxim Levitsky 	/* handle card detection interrupts first */
73167e054e9SMaxim Levitsky 	card_status = r852_read_reg(dev, R852_CARD_IRQ_STA);
73267e054e9SMaxim Levitsky 	r852_write_reg(dev, R852_CARD_IRQ_STA, card_status);
73367e054e9SMaxim Levitsky 
73467e054e9SMaxim Levitsky 	if (card_status & (R852_CARD_IRQ_INSERT|R852_CARD_IRQ_REMOVE)) {
73567e054e9SMaxim Levitsky 
73667e054e9SMaxim Levitsky 		ret = IRQ_HANDLED;
73767e054e9SMaxim Levitsky 		dev->card_detected = !!(card_status & R852_CARD_IRQ_INSERT);
73867e054e9SMaxim Levitsky 
73925985edcSLucas De Marchi 		/* we shouldn't receive any interrupts if we wait for card
74067e054e9SMaxim Levitsky 			to settle */
74167e054e9SMaxim Levitsky 		WARN_ON(dev->card_unstable);
74267e054e9SMaxim Levitsky 
74367e054e9SMaxim Levitsky 		/* disable irqs while card is unstable */
74467e054e9SMaxim Levitsky 		/* this will timeout DMA if active, but better that garbage */
74567e054e9SMaxim Levitsky 		r852_disable_irqs(dev);
74667e054e9SMaxim Levitsky 
74767e054e9SMaxim Levitsky 		if (dev->card_unstable)
74867e054e9SMaxim Levitsky 			goto out;
74967e054e9SMaxim Levitsky 
75067e054e9SMaxim Levitsky 		/* let, card state to settle a bit, and then do the work */
75167e054e9SMaxim Levitsky 		dev->card_unstable = 1;
75267e054e9SMaxim Levitsky 		queue_delayed_work(dev->card_workqueue,
75367e054e9SMaxim Levitsky 			&dev->card_detect_work, msecs_to_jiffies(100));
75467e054e9SMaxim Levitsky 		goto out;
75567e054e9SMaxim Levitsky 	}
75667e054e9SMaxim Levitsky 
75767e054e9SMaxim Levitsky 
75867e054e9SMaxim Levitsky 	/* Handle dma interrupts */
75967e054e9SMaxim Levitsky 	dma_status = r852_read_reg_dword(dev, R852_DMA_IRQ_STA);
76067e054e9SMaxim Levitsky 	r852_write_reg_dword(dev, R852_DMA_IRQ_STA, dma_status);
76167e054e9SMaxim Levitsky 
76267e054e9SMaxim Levitsky 	if (dma_status & R852_DMA_IRQ_MASK) {
76367e054e9SMaxim Levitsky 
76467e054e9SMaxim Levitsky 		ret = IRQ_HANDLED;
76567e054e9SMaxim Levitsky 
76667e054e9SMaxim Levitsky 		if (dma_status & R852_DMA_IRQ_ERROR) {
76725985edcSLucas De Marchi 			dbg("received dma error IRQ");
76867e054e9SMaxim Levitsky 			r852_dma_done(dev, -EIO);
7699489be8cSMaxim Levitsky 			complete(&dev->dma_done);
77067e054e9SMaxim Levitsky 			goto out;
77167e054e9SMaxim Levitsky 		}
77267e054e9SMaxim Levitsky 
77325985edcSLucas De Marchi 		/* received DMA interrupt out of nowhere? */
77467e054e9SMaxim Levitsky 		WARN_ON_ONCE(dev->dma_stage == 0);
77567e054e9SMaxim Levitsky 
77667e054e9SMaxim Levitsky 		if (dev->dma_stage == 0)
77767e054e9SMaxim Levitsky 			goto out;
77867e054e9SMaxim Levitsky 
77967e054e9SMaxim Levitsky 		/* done device access */
78067e054e9SMaxim Levitsky 		if (dev->dma_state == DMA_INTERNAL &&
78167e054e9SMaxim Levitsky 				(dma_status & R852_DMA_IRQ_INTERNAL)) {
78267e054e9SMaxim Levitsky 
78367e054e9SMaxim Levitsky 			dev->dma_state = DMA_MEMORY;
78467e054e9SMaxim Levitsky 			dev->dma_stage++;
78567e054e9SMaxim Levitsky 		}
78667e054e9SMaxim Levitsky 
78767e054e9SMaxim Levitsky 		/* done memory DMA */
78867e054e9SMaxim Levitsky 		if (dev->dma_state == DMA_MEMORY &&
78967e054e9SMaxim Levitsky 				(dma_status & R852_DMA_IRQ_MEMORY)) {
79067e054e9SMaxim Levitsky 			dev->dma_state = DMA_INTERNAL;
79167e054e9SMaxim Levitsky 			dev->dma_stage++;
79267e054e9SMaxim Levitsky 		}
79367e054e9SMaxim Levitsky 
79467e054e9SMaxim Levitsky 		/* Enable 2nd half of dma dance */
79567e054e9SMaxim Levitsky 		if (dev->dma_stage == 2)
79667e054e9SMaxim Levitsky 			r852_dma_enable(dev);
79767e054e9SMaxim Levitsky 
79867e054e9SMaxim Levitsky 		/* Operation done */
7999489be8cSMaxim Levitsky 		if (dev->dma_stage == 3) {
80067e054e9SMaxim Levitsky 			r852_dma_done(dev, 0);
8019489be8cSMaxim Levitsky 			complete(&dev->dma_done);
8029489be8cSMaxim Levitsky 		}
80367e054e9SMaxim Levitsky 		goto out;
80467e054e9SMaxim Levitsky 	}
80567e054e9SMaxim Levitsky 
80667e054e9SMaxim Levitsky 	/* Handle unknown interrupts */
80767e054e9SMaxim Levitsky 	if (dma_status)
80867e054e9SMaxim Levitsky 		dbg("bad dma IRQ status = %x", dma_status);
80967e054e9SMaxim Levitsky 
81067e054e9SMaxim Levitsky 	if (card_status & ~R852_CARD_STA_CD)
81167e054e9SMaxim Levitsky 		dbg("strange card status = %x", card_status);
81267e054e9SMaxim Levitsky 
81367e054e9SMaxim Levitsky out:
8144682dd19STian Tao 	spin_unlock(&dev->irqlock);
81567e054e9SMaxim Levitsky 	return ret;
81667e054e9SMaxim Levitsky }
81767e054e9SMaxim Levitsky 
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 
8412fffc798SJingoo Han static int  r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
84267e054e9SMaxim Levitsky {
84367e054e9SMaxim Levitsky 	int error;
84467e054e9SMaxim Levitsky 	struct nand_chip *chip;
84567e054e9SMaxim Levitsky 	struct r852_device *dev;
84667e054e9SMaxim Levitsky 
84767e054e9SMaxim Levitsky 	/* pci initialization */
84867e054e9SMaxim Levitsky 	error = pci_enable_device(pci_dev);
84967e054e9SMaxim Levitsky 
85067e054e9SMaxim Levitsky 	if (error)
85167e054e9SMaxim Levitsky 		goto error1;
85267e054e9SMaxim Levitsky 
85367e054e9SMaxim Levitsky 	pci_set_master(pci_dev);
85467e054e9SMaxim Levitsky 
8550282fefbSChristoph Hellwig 	error = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32));
85667e054e9SMaxim Levitsky 	if (error)
85767e054e9SMaxim Levitsky 		goto error2;
85867e054e9SMaxim Levitsky 
85967e054e9SMaxim Levitsky 	error = pci_request_regions(pci_dev, DRV_NAME);
86067e054e9SMaxim Levitsky 
86167e054e9SMaxim Levitsky 	if (error)
86267e054e9SMaxim Levitsky 		goto error3;
86367e054e9SMaxim Levitsky 
86467e054e9SMaxim Levitsky 	error = -ENOMEM;
86567e054e9SMaxim Levitsky 
86667e054e9SMaxim Levitsky 	/* init nand chip, but register it only on card insert */
86767e054e9SMaxim Levitsky 	chip = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);
86867e054e9SMaxim Levitsky 
86967e054e9SMaxim Levitsky 	if (!chip)
87067e054e9SMaxim Levitsky 		goto error4;
87167e054e9SMaxim Levitsky 
87267e054e9SMaxim Levitsky 	/* commands */
873bf6065c6SBoris Brezillon 	chip->legacy.cmd_ctrl = r852_cmdctl;
8748395b753SBoris Brezillon 	chip->legacy.waitfunc = r852_wait;
8758395b753SBoris Brezillon 	chip->legacy.dev_ready = r852_ready;
87667e054e9SMaxim Levitsky 
87767e054e9SMaxim Levitsky 	/* 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;
88167e054e9SMaxim Levitsky 
88267e054e9SMaxim Levitsky 	/* init our device structure */
88367e054e9SMaxim Levitsky 	dev = kzalloc(sizeof(struct r852_device), GFP_KERNEL);
88467e054e9SMaxim Levitsky 
88567e054e9SMaxim Levitsky 	if (!dev)
88667e054e9SMaxim Levitsky 		goto error5;
88767e054e9SMaxim Levitsky 
888d699ed25SBoris BREZILLON 	nand_set_controller_data(chip, dev);
88967e054e9SMaxim Levitsky 	dev->chip = chip;
89067e054e9SMaxim Levitsky 	dev->pci_dev = pci_dev;
89167e054e9SMaxim Levitsky 	pci_set_drvdata(pci_dev, dev);
89267e054e9SMaxim Levitsky 
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);
89967e054e9SMaxim Levitsky 
90067e054e9SMaxim Levitsky 	if (!dev->bounce_buffer)
90167e054e9SMaxim Levitsky 		goto error6;
90267e054e9SMaxim Levitsky 
90367e054e9SMaxim Levitsky 
90467e054e9SMaxim Levitsky 	error = -ENODEV;
90567e054e9SMaxim Levitsky 	dev->mmio = pci_ioremap_bar(pci_dev, 0);
90667e054e9SMaxim Levitsky 
90767e054e9SMaxim Levitsky 	if (!dev->mmio)
90867e054e9SMaxim Levitsky 		goto error7;
90967e054e9SMaxim Levitsky 
91067e054e9SMaxim Levitsky 	error = -ENOMEM;
91167e054e9SMaxim Levitsky 	dev->tmp_buffer = kzalloc(SM_SECTOR_SIZE, GFP_KERNEL);
91267e054e9SMaxim Levitsky 
91367e054e9SMaxim Levitsky 	if (!dev->tmp_buffer)
91467e054e9SMaxim Levitsky 		goto error8;
91567e054e9SMaxim Levitsky 
91667e054e9SMaxim Levitsky 	init_completion(&dev->dma_done);
91767e054e9SMaxim Levitsky 
91858a69cb4STejun Heo 	dev->card_workqueue = create_freezable_workqueue(DRV_NAME);
91967e054e9SMaxim Levitsky 
92067e054e9SMaxim Levitsky 	if (!dev->card_workqueue)
92167e054e9SMaxim Levitsky 		goto error9;
92267e054e9SMaxim Levitsky 
92367e054e9SMaxim Levitsky 	INIT_DELAYED_WORK(&dev->card_detect_work, r852_card_detect_work);
92467e054e9SMaxim Levitsky 
92567e054e9SMaxim Levitsky 	/* shutdown everything - precation */
92667e054e9SMaxim Levitsky 	r852_engine_disable(dev);
92767e054e9SMaxim Levitsky 	r852_disable_irqs(dev);
92867e054e9SMaxim Levitsky 
92967e054e9SMaxim Levitsky 	r852_dma_test(dev);
93067e054e9SMaxim Levitsky 
931cc1fed00SMaxim Levitsky 	dev->irq = pci_dev->irq;
932cc1fed00SMaxim Levitsky 	spin_lock_init(&dev->irqlock);
933cc1fed00SMaxim Levitsky 
934cc1fed00SMaxim Levitsky 	dev->card_detected = 0;
935cc1fed00SMaxim Levitsky 	r852_card_update_present(dev);
936cc1fed00SMaxim Levitsky 
93767e054e9SMaxim Levitsky 	/*register irq handler*/
93867e054e9SMaxim Levitsky 	error = -ENODEV;
93967e054e9SMaxim Levitsky 	if (request_irq(pci_dev->irq, &r852_irq, IRQF_SHARED,
94067e054e9SMaxim Levitsky 			  DRV_NAME, dev))
94167e054e9SMaxim Levitsky 		goto error10;
94267e054e9SMaxim Levitsky 
94367e054e9SMaxim Levitsky 	/* kick initial present test */
94467e054e9SMaxim Levitsky 	queue_delayed_work(dev->card_workqueue,
94567e054e9SMaxim Levitsky 		&dev->card_detect_work, 0);
94667e054e9SMaxim Levitsky 
94767e054e9SMaxim Levitsky 
94863fa37f0SShreeya Patel 	pr_notice("driver loaded successfully\n");
94967e054e9SMaxim Levitsky 	return 0;
95067e054e9SMaxim Levitsky 
95167e054e9SMaxim Levitsky error10:
95267e054e9SMaxim Levitsky 	destroy_workqueue(dev->card_workqueue);
95367e054e9SMaxim Levitsky error9:
95467e054e9SMaxim Levitsky 	kfree(dev->tmp_buffer);
95567e054e9SMaxim Levitsky error8:
95667e054e9SMaxim Levitsky 	pci_iounmap(pci_dev, dev->mmio);
95767e054e9SMaxim Levitsky error7:
9580282fefbSChristoph Hellwig 	dma_free_coherent(&pci_dev->dev, R852_DMA_LEN, dev->bounce_buffer,
9590282fefbSChristoph Hellwig 			  dev->phys_bounce_buffer);
96067e054e9SMaxim Levitsky error6:
96167e054e9SMaxim Levitsky 	kfree(dev);
96267e054e9SMaxim Levitsky error5:
96367e054e9SMaxim Levitsky 	kfree(chip);
96467e054e9SMaxim Levitsky error4:
96567e054e9SMaxim Levitsky 	pci_release_regions(pci_dev);
96667e054e9SMaxim Levitsky error3:
96767e054e9SMaxim Levitsky error2:
96867e054e9SMaxim Levitsky 	pci_disable_device(pci_dev);
96967e054e9SMaxim Levitsky error1:
97067e054e9SMaxim Levitsky 	return error;
97167e054e9SMaxim Levitsky }
97267e054e9SMaxim Levitsky 
9732fffc798SJingoo Han static void r852_remove(struct pci_dev *pci_dev)
97467e054e9SMaxim Levitsky {
97567e054e9SMaxim Levitsky 	struct r852_device *dev = pci_get_drvdata(pci_dev);
97667e054e9SMaxim Levitsky 
97767e054e9SMaxim Levitsky 	/* Stop detect workqueue -
97867e054e9SMaxim Levitsky 		we are going to unregister the device anyway*/
97967e054e9SMaxim Levitsky 	cancel_delayed_work_sync(&dev->card_detect_work);
98067e054e9SMaxim Levitsky 	destroy_workqueue(dev->card_workqueue);
98167e054e9SMaxim Levitsky 
98267e054e9SMaxim Levitsky 	/* Unregister the device, this might make more IO */
98367e054e9SMaxim Levitsky 	r852_unregister_nand_device(dev);
98467e054e9SMaxim Levitsky 
98567e054e9SMaxim Levitsky 	/* Stop interrupts */
98667e054e9SMaxim Levitsky 	r852_disable_irqs(dev);
98767e054e9SMaxim Levitsky 	free_irq(dev->irq, dev);
98867e054e9SMaxim Levitsky 
98967e054e9SMaxim Levitsky 	/* Cleanup */
99067e054e9SMaxim Levitsky 	kfree(dev->tmp_buffer);
99167e054e9SMaxim Levitsky 	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);
99467e054e9SMaxim Levitsky 
99567e054e9SMaxim Levitsky 	kfree(dev->chip);
99667e054e9SMaxim Levitsky 	kfree(dev);
99767e054e9SMaxim Levitsky 
99867e054e9SMaxim Levitsky 	/* Shutdown the PCI device */
99967e054e9SMaxim Levitsky 	pci_release_regions(pci_dev);
100067e054e9SMaxim Levitsky 	pci_disable_device(pci_dev);
100167e054e9SMaxim Levitsky }
100267e054e9SMaxim Levitsky 
10032fffc798SJingoo Han static void r852_shutdown(struct pci_dev *pci_dev)
100467e054e9SMaxim Levitsky {
100567e054e9SMaxim Levitsky 	struct r852_device *dev = pci_get_drvdata(pci_dev);
100667e054e9SMaxim Levitsky 
100767e054e9SMaxim Levitsky 	cancel_delayed_work_sync(&dev->card_detect_work);
100867e054e9SMaxim Levitsky 	r852_disable_irqs(dev);
100967e054e9SMaxim Levitsky 	synchronize_irq(dev->irq);
101067e054e9SMaxim Levitsky 	pci_disable_device(pci_dev);
101167e054e9SMaxim Levitsky }
101267e054e9SMaxim Levitsky 
1013b87c92c1SJingoo Han #ifdef CONFIG_PM_SLEEP
10141bba688bSAxel Lin static int r852_suspend(struct device *device)
101567e054e9SMaxim Levitsky {
101675de0eb2SChuhong Yuan 	struct r852_device *dev = dev_get_drvdata(device);
101767e054e9SMaxim Levitsky 
101867e054e9SMaxim Levitsky 	if (dev->ctlreg & R852_CTL_CARDENABLE)
101967e054e9SMaxim Levitsky 		return -EBUSY;
102067e054e9SMaxim Levitsky 
102167e054e9SMaxim Levitsky 	/* First make sure the detect work is gone */
102267e054e9SMaxim Levitsky 	cancel_delayed_work_sync(&dev->card_detect_work);
102367e054e9SMaxim Levitsky 
102467e054e9SMaxim Levitsky 	/* Turn off the interrupts and stop the device */
102567e054e9SMaxim Levitsky 	r852_disable_irqs(dev);
102667e054e9SMaxim Levitsky 	r852_engine_disable(dev);
102767e054e9SMaxim Levitsky 
102867e054e9SMaxim Levitsky 	/* If card was pulled off just during the suspend, which is very
102967e054e9SMaxim Levitsky 		unlikely, we will remove it on resume, it too late now
103067e054e9SMaxim Levitsky 		anyway... */
103167e054e9SMaxim Levitsky 	dev->card_unstable = 0;
10329bf70717SMaxim Levitsky 	return 0;
103367e054e9SMaxim Levitsky }
103467e054e9SMaxim Levitsky 
10351bba688bSAxel Lin static int r852_resume(struct device *device)
103667e054e9SMaxim Levitsky {
103775de0eb2SChuhong Yuan 	struct r852_device *dev = dev_get_drvdata(device);
103867e054e9SMaxim Levitsky 
103967e054e9SMaxim Levitsky 	r852_disable_irqs(dev);
104067e054e9SMaxim Levitsky 	r852_card_update_present(dev);
104167e054e9SMaxim Levitsky 	r852_engine_disable(dev);
104267e054e9SMaxim Levitsky 
104367e054e9SMaxim Levitsky 
104467e054e9SMaxim Levitsky 	/* If card status changed, just do the work */
1045ed8f0b23SColin Ian King 	if (dev->card_detected != dev->card_registered) {
104667e054e9SMaxim Levitsky 		dbg("card was %s during low power state",
104767e054e9SMaxim Levitsky 			dev->card_detected ? "added" : "removed");
104867e054e9SMaxim Levitsky 
104967e054e9SMaxim Levitsky 		queue_delayed_work(dev->card_workqueue,
10509489be8cSMaxim Levitsky 		&dev->card_detect_work, msecs_to_jiffies(1000));
105167e054e9SMaxim Levitsky 		return 0;
105267e054e9SMaxim Levitsky 	}
105367e054e9SMaxim Levitsky 
105467e054e9SMaxim Levitsky 	/* Otherwise, initialize the card */
1055ed8f0b23SColin Ian King 	if (dev->card_registered) {
105667e054e9SMaxim Levitsky 		r852_engine_enable(dev);
10571d017859SBoris Brezillon 		nand_select_target(dev->chip, 0);
105897d90da8SBoris Brezillon 		nand_reset_op(dev->chip);
10591d017859SBoris Brezillon 		nand_deselect_target(dev->chip);
106067e054e9SMaxim Levitsky 	}
106167e054e9SMaxim Levitsky 
106267e054e9SMaxim Levitsky 	/* Program card detection IRQ */
106367e054e9SMaxim Levitsky 	r852_update_card_detect(dev);
106467e054e9SMaxim Levitsky 	return 0;
106567e054e9SMaxim Levitsky }
1066b2aaf7a2SRandy Dunlap #endif
106767e054e9SMaxim Levitsky 
106867e054e9SMaxim Levitsky static const struct pci_device_id r852_pci_id_tbl[] = {
106967e054e9SMaxim Levitsky 
1070d4080cb3SMaxim Levitsky 	{ PCI_VDEVICE(RICOH, 0x0852), },
107167e054e9SMaxim Levitsky 	{ },
107267e054e9SMaxim Levitsky };
107367e054e9SMaxim Levitsky 
107467e054e9SMaxim Levitsky MODULE_DEVICE_TABLE(pci, r852_pci_id_tbl);
107567e054e9SMaxim Levitsky 
10761bba688bSAxel Lin static SIMPLE_DEV_PM_OPS(r852_pm_ops, r852_suspend, r852_resume);
107767e054e9SMaxim Levitsky 
107867e054e9SMaxim Levitsky static struct pci_driver r852_pci_driver = {
107967e054e9SMaxim Levitsky 	.name		= DRV_NAME,
108067e054e9SMaxim Levitsky 	.id_table	= r852_pci_id_tbl,
108167e054e9SMaxim Levitsky 	.probe		= r852_probe,
108267e054e9SMaxim Levitsky 	.remove		= r852_remove,
108367e054e9SMaxim Levitsky 	.shutdown	= r852_shutdown,
108467e054e9SMaxim Levitsky 	.driver.pm	= &r852_pm_ops,
108567e054e9SMaxim Levitsky };
108667e054e9SMaxim Levitsky 
10874d16cd65SAxel Lin module_pci_driver(r852_pci_driver);
108867e054e9SMaxim Levitsky 
108967e054e9SMaxim Levitsky MODULE_LICENSE("GPL");
109067e054e9SMaxim Levitsky MODULE_AUTHOR("Maxim Levitsky <maximlevitsky@gmail.com>");
109167e054e9SMaxim Levitsky MODULE_DESCRIPTION("Ricoh 85xx xD/smartmedia card reader driver");
1092