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