2  * SMI (Serial Memory Controller) device driver for Serial NOR Flash on
 
   4  * The serial nor interface is largely based on m25p80.c, however the SPI
 
   5  * interface has been replaced by SMI.
 
   7  * Copyright © 2010 STMicroelectronics.
 
   9  * Shiraz Hashim <shiraz.linux.kernel@gmail.com>
 
  11  * This file is licensed under the terms of the GNU General Public
 
  12  * License version 2. This program is licensed "as is" without any
 
  13  * warranty of any kind, whether express or implied.
 
  16 #include <linux/clk.h>
 
  17 #include <linux/delay.h>
 
  18 #include <linux/device.h>
 
  19 #include <linux/err.h>
 
  20 #include <linux/errno.h>
 
  21 #include <linux/interrupt.h>
 
  23 #include <linux/ioport.h>
 
  24 #include <linux/jiffies.h>
 
  25 #include <linux/kernel.h>
 
  26 #include <linux/module.h>
 
  27 #include <linux/param.h>
 
  28 #include <linux/platform_device.h>
 
  30 #include <linux/mtd/mtd.h>
 
  31 #include <linux/mtd/partitions.h>
 
  32 #include <linux/mtd/spear_smi.h>
 
  33 #include <linux/mutex.h>
 
  34 #include <linux/sched.h>
 
  35 #include <linux/slab.h>
 
  36 #include <linux/wait.h>
 
  38 #include <linux/of_address.h>
 
  41 #define SMI_MAX_CLOCK_FREQ      50000000 /* 50 MHz */
 
  43 /* MAX time out to safely come out of a erase or write busy conditions */
 
  44 #define SMI_PROBE_TIMEOUT       (HZ / 10)
 
  45 #define SMI_MAX_TIME_OUT        (3 * HZ)
 
  47 /* timeout for command completion */
 
  48 #define SMI_CMD_TIMEOUT         (HZ / 10)
 
  50 /* registers of smi */
 
  51 #define SMI_CR1         0x0     /* SMI control register 1 */
 
  52 #define SMI_CR2         0x4     /* SMI control register 2 */
 
  53 #define SMI_SR          0x8     /* SMI status register */
 
  54 #define SMI_TR          0xC     /* SMI transmit register */
 
  55 #define SMI_RR          0x10    /* SMI receive register */
 
  57 /* defines for control_reg 1 */
 
  58 #define BANK_EN         (0xF << 0)      /* enables all banks */
 
  59 #define DSEL_TIME       (0x6 << 4)      /* Deselect time 6 + 1 SMI_CK periods */
 
  60 #define SW_MODE         (0x1 << 28)     /* enables SW Mode */
 
  61 #define WB_MODE         (0x1 << 29)     /* Write Burst Mode */
 
  62 #define FAST_MODE       (0x1 << 15)     /* Fast Mode */
 
  63 #define HOLD1           (0x1 << 16)     /* Clock Hold period selection */
 
  65 /* defines for control_reg 2 */
 
  66 #define SEND            (0x1 << 7)      /* Send data */
 
  67 #define TFIE            (0x1 << 8)      /* Transmission Flag Interrupt Enable */
 
  68 #define WCIE            (0x1 << 9)      /* Write Complete Interrupt Enable */
 
  69 #define RD_STATUS_REG   (0x1 << 10)     /* reads status reg */
 
  70 #define WE              (0x1 << 11)     /* Write Enable */
 
  72 #define TX_LEN_SHIFT    0
 
  73 #define RX_LEN_SHIFT    4
 
  76 /* defines for status register */
 
  77 #define SR_WIP          0x1     /* Write in progress */
 
  78 #define SR_WEL          0x2     /* Write enable latch */
 
  79 #define SR_BP0          0x4     /* Block protect 0 */
 
  80 #define SR_BP1          0x8     /* Block protect 1 */
 
  81 #define SR_BP2          0x10    /* Block protect 2 */
 
  82 #define SR_SRWD         0x80    /* SR write protect */
 
  83 #define TFF             0x100   /* Transfer Finished Flag */
 
  84 #define WCF             0x200   /* Transfer Finished Flag */
 
  85 #define ERF1            0x400   /* Forbidden Write Request */
 
  86 #define ERF2            0x800   /* Forbidden Access */
 
  91 #define OPCODE_RDID     0x9f    /* Read JEDEC ID */
 
  93 /* Flash Device Ids maintenance section */
 
  95 /* data structure to maintain flash ids from different vendors */
 
 101         unsigned long sectorsize;
 
 102         unsigned long size_in_bytes;
 
 105 #define FLASH_ID(n, es, id, psize, ssize, size) \
 
 111         .sectorsize = ssize,    \
 
 112         .size_in_bytes = size   \
 
 115 static struct flash_device flash_devices[] = {
 
 116         FLASH_ID("st m25p16"     , 0xd8, 0x00152020, 0x100, 0x10000, 0x200000),
 
 117         FLASH_ID("st m25p32"     , 0xd8, 0x00162020, 0x100, 0x10000, 0x400000),
 
 118         FLASH_ID("st m25p64"     , 0xd8, 0x00172020, 0x100, 0x10000, 0x800000),
 
 119         FLASH_ID("st m25p128"    , 0xd8, 0x00182020, 0x100, 0x40000, 0x1000000),
 
 120         FLASH_ID("st m25p05"     , 0xd8, 0x00102020, 0x80 , 0x8000 , 0x10000),
 
 121         FLASH_ID("st m25p10"     , 0xd8, 0x00112020, 0x80 , 0x8000 , 0x20000),
 
 122         FLASH_ID("st m25p20"     , 0xd8, 0x00122020, 0x100, 0x10000, 0x40000),
 
 123         FLASH_ID("st m25p40"     , 0xd8, 0x00132020, 0x100, 0x10000, 0x80000),
 
 124         FLASH_ID("st m25p80"     , 0xd8, 0x00142020, 0x100, 0x10000, 0x100000),
 
 125         FLASH_ID("st m45pe10"    , 0xd8, 0x00114020, 0x100, 0x10000, 0x20000),
 
 126         FLASH_ID("st m45pe20"    , 0xd8, 0x00124020, 0x100, 0x10000, 0x40000),
 
 127         FLASH_ID("st m45pe40"    , 0xd8, 0x00134020, 0x100, 0x10000, 0x80000),
 
 128         FLASH_ID("st m45pe80"    , 0xd8, 0x00144020, 0x100, 0x10000, 0x100000),
 
 129         FLASH_ID("sp s25fl004"   , 0xd8, 0x00120201, 0x100, 0x10000, 0x80000),
 
 130         FLASH_ID("sp s25fl008"   , 0xd8, 0x00130201, 0x100, 0x10000, 0x100000),
 
 131         FLASH_ID("sp s25fl016"   , 0xd8, 0x00140201, 0x100, 0x10000, 0x200000),
 
 132         FLASH_ID("sp s25fl032"   , 0xd8, 0x00150201, 0x100, 0x10000, 0x400000),
 
 133         FLASH_ID("sp s25fl064"   , 0xd8, 0x00160201, 0x100, 0x10000, 0x800000),
 
 134         FLASH_ID("atmel 25f512"  , 0x52, 0x0065001F, 0x80 , 0x8000 , 0x10000),
 
 135         FLASH_ID("atmel 25f1024" , 0x52, 0x0060001F, 0x100, 0x8000 , 0x20000),
 
 136         FLASH_ID("atmel 25f2048" , 0x52, 0x0063001F, 0x100, 0x10000, 0x40000),
 
 137         FLASH_ID("atmel 25f4096" , 0x52, 0x0064001F, 0x100, 0x10000, 0x80000),
 
 138         FLASH_ID("atmel 25fs040" , 0xd7, 0x0004661F, 0x100, 0x10000, 0x80000),
 
 139         FLASH_ID("mac 25l512"    , 0xd8, 0x001020C2, 0x010, 0x10000, 0x10000),
 
 140         FLASH_ID("mac 25l1005"   , 0xd8, 0x001120C2, 0x010, 0x10000, 0x20000),
 
 141         FLASH_ID("mac 25l2005"   , 0xd8, 0x001220C2, 0x010, 0x10000, 0x40000),
 
 142         FLASH_ID("mac 25l4005"   , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
 
 143         FLASH_ID("mac 25l4005a"  , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
 
 144         FLASH_ID("mac 25l8005"   , 0xd8, 0x001420C2, 0x010, 0x10000, 0x100000),
 
 145         FLASH_ID("mac 25l1605"   , 0xd8, 0x001520C2, 0x100, 0x10000, 0x200000),
 
 146         FLASH_ID("mac 25l1605a"  , 0xd8, 0x001520C2, 0x010, 0x10000, 0x200000),
 
 147         FLASH_ID("mac 25l3205"   , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
 
 148         FLASH_ID("mac 25l3205a"  , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
 
 149         FLASH_ID("mac 25l6405"   , 0xd8, 0x001720C2, 0x100, 0x10000, 0x800000),
 
 152 /* Define spear specific structures */
 
 154 struct spear_snor_flash;
 
 157  * struct spear_smi - Structure for SMI Device
 
 159  * @clk: functional clock
 
 160  * @status: current status register of SMI.
 
 161  * @clk_rate: functional clock rate of SMI (default: SMI_MAX_CLOCK_FREQ)
 
 162  * @lock: lock to prevent parallel access of SMI.
 
 163  * @io_base: base address for registers of SMI.
 
 164  * @pdev: platform device
 
 165  * @cmd_complete: queue to wait for command completion of NOR-flash.
 
 166  * @num_flashes: number of flashes actually present on board.
 
 167  * @flash: separate structure for each Serial NOR-flash attached to SMI.
 
 172         unsigned long clk_rate;
 
 174         void __iomem *io_base;
 
 175         struct platform_device *pdev;
 
 176         wait_queue_head_t cmd_complete;
 
 178         struct spear_snor_flash *flash[MAX_NUM_FLASH_CHIP];
 
 182  * struct spear_snor_flash - Structure for Serial NOR Flash
 
 184  * @bank: Bank number(0, 1, 2, 3) for each NOR-flash.
 
 185  * @dev_id: Device ID of NOR-flash.
 
 186  * @lock: lock to manage flash read, write and erase operations
 
 187  * @mtd: MTD info for each NOR-flash.
 
 188  * @num_parts: Total number of partition in each bank of NOR-flash.
 
 189  * @parts: Partition info for each bank of NOR-flash.
 
 190  * @page_size: Page size of NOR-flash.
 
 191  * @base_addr: Base address of NOR-flash.
 
 192  * @erase_cmd: erase command may vary on different flash types
 
 193  * @fast_mode: flash supports read in fast mode
 
 195 struct spear_snor_flash {
 
 201         struct mtd_partition *parts;
 
 203         void __iomem *base_addr;
 
 208 static inline struct spear_snor_flash *get_flash_data(struct mtd_info *mtd)
 
 210         return container_of(mtd, struct spear_snor_flash, mtd);
 
 214  * spear_smi_read_sr - Read status register of flash through SMI
 
 215  * @dev: structure of SMI information.
 
 216  * @bank: bank to which flash is connected
 
 218  * This routine will return the status register of the flash chip present at the
 
 221 static int spear_smi_read_sr(struct spear_smi *dev, u32 bank)
 
 226         mutex_lock(&dev->lock);
 
 227         dev->status = 0; /* Will be set in interrupt handler */
 
 229         ctrlreg1 = readl(dev->io_base + SMI_CR1);
 
 230         /* program smi in hw mode */
 
 231         writel(ctrlreg1 & ~(SW_MODE | WB_MODE), dev->io_base + SMI_CR1);
 
 233         /* performing a rsr instruction in hw mode */
 
 234         writel((bank << BANK_SHIFT) | RD_STATUS_REG | TFIE,
 
 235                         dev->io_base + SMI_CR2);
 
 238         ret = wait_event_interruptible_timeout(dev->cmd_complete,
 
 239                         dev->status & TFF, SMI_CMD_TIMEOUT);
 
 241         /* copy dev->status (lower 16 bits) in order to release lock */
 
 243                 ret = dev->status & 0xffff;
 
 247         /* restore the ctrl regs state */
 
 248         writel(ctrlreg1, dev->io_base + SMI_CR1);
 
 249         writel(0, dev->io_base + SMI_CR2);
 
 250         mutex_unlock(&dev->lock);
 
 256  * spear_smi_wait_till_ready - wait till flash is ready
 
 257  * @dev: structure of SMI information.
 
 258  * @bank: flash corresponding to this bank
 
 259  * @timeout: timeout for busy wait condition
 
 261  * This routine checks for WIP (write in progress) bit in Status register
 
 262  * If successful the routine returns 0 else -EBUSY
 
 264 static int spear_smi_wait_till_ready(struct spear_smi *dev, u32 bank,
 
 265                 unsigned long timeout)
 
 267         unsigned long finish;
 
 270         finish = jiffies + timeout;
 
 272                 status = spear_smi_read_sr(dev, bank);
 
 274                         if (status == -ETIMEDOUT)
 
 275                                 continue; /* try till finish */
 
 277                 } else if (!(status & SR_WIP)) {
 
 282         } while (!time_after_eq(jiffies, finish));
 
 284         dev_err(&dev->pdev->dev, "smi controller is busy, timeout\n");
 
 289  * spear_smi_int_handler - SMI Interrupt Handler.
 
 291  * @dev_id: structure of SMI device, embedded in dev_id.
 
 293  * The handler clears all interrupt conditions and records the status in
 
 294  * dev->status which is used by the driver later.
 
 296 static irqreturn_t spear_smi_int_handler(int irq, void *dev_id)
 
 299         struct spear_smi *dev = dev_id;
 
 301         status = readl(dev->io_base + SMI_SR);
 
 303         if (unlikely(!status))
 
 306         /* clear all interrupt conditions */
 
 307         writel(0, dev->io_base + SMI_SR);
 
 309         /* copy the status register in dev->status */
 
 310         dev->status |= status;
 
 312         /* send the completion */
 
 313         wake_up_interruptible(&dev->cmd_complete);
 
 319  * spear_smi_hw_init - initializes the smi controller.
 
 320  * @dev: structure of smi device
 
 322  * this routine initializes the smi controller wit the default values
 
 324 static void spear_smi_hw_init(struct spear_smi *dev)
 
 326         unsigned long rate = 0;
 
 330         rate = clk_get_rate(dev->clk);
 
 332         /* functional clock of smi */
 
 333         prescale = DIV_ROUND_UP(rate, dev->clk_rate);
 
 336          * setting the standard values, fast mode, prescaler for
 
 337          * SMI_MAX_CLOCK_FREQ (50MHz) operation and bank enable
 
 339         val = HOLD1 | BANK_EN | DSEL_TIME | (prescale << 8);
 
 341         mutex_lock(&dev->lock);
 
 342         /* clear all interrupt conditions */
 
 343         writel(0, dev->io_base + SMI_SR);
 
 345         writel(val, dev->io_base + SMI_CR1);
 
 346         mutex_unlock(&dev->lock);
 
 350  * get_flash_index - match chip id from a flash list.
 
 351  * @flash_id: a valid nor flash chip id obtained from board.
 
 353  * try to validate the chip id by matching from a list, if not found then simply
 
 354  * returns negative. In case of success returns index in to the flash devices
 
 357 static int get_flash_index(u32 flash_id)
 
 361         /* Matches chip-id to entire list of 'serial-nor flash' ids */
 
 362         for (index = 0; index < ARRAY_SIZE(flash_devices); index++) {
 
 363                 if (flash_devices[index].device_id == flash_id)
 
 367         /* Memory chip is not listed and not supported */
 
 372  * spear_smi_write_enable - Enable the flash to do write operation
 
 373  * @dev: structure of SMI device
 
 374  * @bank: enable write for flash connected to this bank
 
 376  * Set write enable latch with Write Enable command.
 
 377  * Returns 0 on success.
 
 379 static int spear_smi_write_enable(struct spear_smi *dev, u32 bank)
 
 384         mutex_lock(&dev->lock);
 
 385         dev->status = 0; /* Will be set in interrupt handler */
 
 387         ctrlreg1 = readl(dev->io_base + SMI_CR1);
 
 388         /* program smi in h/w mode */
 
 389         writel(ctrlreg1 & ~SW_MODE, dev->io_base + SMI_CR1);
 
 391         /* give the flash, write enable command */
 
 392         writel((bank << BANK_SHIFT) | WE | TFIE, dev->io_base + SMI_CR2);
 
 394         ret = wait_event_interruptible_timeout(dev->cmd_complete,
 
 395                         dev->status & TFF, SMI_CMD_TIMEOUT);
 
 397         /* restore the ctrl regs state */
 
 398         writel(ctrlreg1, dev->io_base + SMI_CR1);
 
 399         writel(0, dev->io_base + SMI_CR2);
 
 403                 dev_err(&dev->pdev->dev,
 
 404                         "smi controller failed on write enable\n");
 
 405         } else if (ret > 0) {
 
 406                 /* check whether write mode status is set for required bank */
 
 407                 if (dev->status & (1 << (bank + WM_SHIFT)))
 
 410                         dev_err(&dev->pdev->dev, "couldn't enable write\n");
 
 415         mutex_unlock(&dev->lock);
 
 420 get_sector_erase_cmd(struct spear_snor_flash *flash, u32 offset)
 
 425         x[0] = flash->erase_cmd;
 
 434  * spear_smi_erase_sector - erase one sector of flash
 
 435  * @dev: structure of SMI information
 
 436  * @command: erase command to be send
 
 437  * @bank: bank to which this command needs to be send
 
 438  * @bytes: size of command
 
 440  * Erase one sector of flash memory at offset ``offset'' which is any
 
 441  * address within the sector which should be erased.
 
 442  * Returns 0 if successful, non-zero otherwise.
 
 444 static int spear_smi_erase_sector(struct spear_smi *dev,
 
 445                 u32 bank, u32 command, u32 bytes)
 
 450         ret = spear_smi_wait_till_ready(dev, bank, SMI_MAX_TIME_OUT);
 
 454         ret = spear_smi_write_enable(dev, bank);
 
 458         mutex_lock(&dev->lock);
 
 460         ctrlreg1 = readl(dev->io_base + SMI_CR1);
 
 461         writel((ctrlreg1 | SW_MODE) & ~WB_MODE, dev->io_base + SMI_CR1);
 
 463         /* send command in sw mode */
 
 464         writel(command, dev->io_base + SMI_TR);
 
 466         writel((bank << BANK_SHIFT) | SEND | TFIE | (bytes << TX_LEN_SHIFT),
 
 467                         dev->io_base + SMI_CR2);
 
 469         ret = wait_event_interruptible_timeout(dev->cmd_complete,
 
 470                         dev->status & TFF, SMI_CMD_TIMEOUT);
 
 474                 dev_err(&dev->pdev->dev, "sector erase failed\n");
 
 476                 ret = 0; /* success */
 
 478         /* restore ctrl regs */
 
 479         writel(ctrlreg1, dev->io_base + SMI_CR1);
 
 480         writel(0, dev->io_base + SMI_CR2);
 
 482         mutex_unlock(&dev->lock);
 
 487  * spear_mtd_erase - perform flash erase operation as requested by user
 
 488  * @mtd: Provides the memory characteristics
 
 489  * @e_info: Provides the erase information
 
 491  * Erase an address range on the flash chip. The address range may extend
 
 492  * one or more erase sectors. Return an error is there is a problem erasing.
 
 494 static int spear_mtd_erase(struct mtd_info *mtd, struct erase_info *e_info)
 
 496         struct spear_snor_flash *flash = get_flash_data(mtd);
 
 497         struct spear_smi *dev = mtd->priv;
 
 498         u32 addr, command, bank;
 
 505         if (bank > dev->num_flashes - 1) {
 
 506                 dev_err(&dev->pdev->dev, "Invalid Bank Num");
 
 513         mutex_lock(&flash->lock);
 
 515         /* now erase sectors in loop */
 
 517                 command = get_sector_erase_cmd(flash, addr);
 
 518                 /* preparing the command for flash */
 
 519                 ret = spear_smi_erase_sector(dev, bank, command, 4);
 
 521                         mutex_unlock(&flash->lock);
 
 524                 addr += mtd->erasesize;
 
 525                 len -= mtd->erasesize;
 
 528         mutex_unlock(&flash->lock);
 
 534  * spear_mtd_read - performs flash read operation as requested by the user
 
 535  * @mtd: MTD information of the memory bank
 
 536  * @from: Address from which to start read
 
 537  * @len: Number of bytes to be read
 
 538  * @retlen: Fills the Number of bytes actually read
 
 539  * @buf: Fills this after reading
 
 541  * Read an address range from the flash chip. The address range
 
 542  * may be any size provided it is within the physical boundaries.
 
 543  * Returns 0 on success, non zero otherwise
 
 545 static int spear_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
 
 546                 size_t *retlen, u8 *buf)
 
 548         struct spear_snor_flash *flash = get_flash_data(mtd);
 
 549         struct spear_smi *dev = mtd->priv;
 
 557         if (flash->bank > dev->num_flashes - 1) {
 
 558                 dev_err(&dev->pdev->dev, "Invalid Bank Num");
 
 562         /* select address as per bank number */
 
 563         src = flash->base_addr + from;
 
 565         mutex_lock(&flash->lock);
 
 567         /* wait till previous write/erase is done. */
 
 568         ret = spear_smi_wait_till_ready(dev, flash->bank, SMI_MAX_TIME_OUT);
 
 570                 mutex_unlock(&flash->lock);
 
 574         mutex_lock(&dev->lock);
 
 575         /* put smi in hw mode not wbt mode */
 
 576         ctrlreg1 = val = readl(dev->io_base + SMI_CR1);
 
 577         val &= ~(SW_MODE | WB_MODE);
 
 578         if (flash->fast_mode)
 
 581         writel(val, dev->io_base + SMI_CR1);
 
 583         memcpy_fromio(buf, src, len);
 
 585         /* restore ctrl reg1 */
 
 586         writel(ctrlreg1, dev->io_base + SMI_CR1);
 
 587         mutex_unlock(&dev->lock);
 
 590         mutex_unlock(&flash->lock);
 
 596  * The purpose of this function is to ensure a memcpy_toio() with byte writes
 
 597  * only. Its structure is inspired from the ARM implementation of _memcpy_toio()
 
 598  * which also does single byte writes but cannot be used here as this is just an
 
 599  * implementation detail and not part of the API. Not mentioning the comment
 
 600  * stating that _memcpy_toio() should be optimized.
 
 602 static void spear_smi_memcpy_toio_b(volatile void __iomem *dest,
 
 603                                     const void *src, size_t len)
 
 605         const unsigned char *from = src;
 
 615 static inline int spear_smi_cpy_toio(struct spear_smi *dev, u32 bank,
 
 616                 void __iomem *dest, const void *src, size_t len)
 
 621         /* wait until finished previous write command. */
 
 622         ret = spear_smi_wait_till_ready(dev, bank, SMI_MAX_TIME_OUT);
 
 626         /* put smi in write enable */
 
 627         ret = spear_smi_write_enable(dev, bank);
 
 631         /* put smi in hw, write burst mode */
 
 632         mutex_lock(&dev->lock);
 
 634         ctrlreg1 = readl(dev->io_base + SMI_CR1);
 
 635         writel((ctrlreg1 | WB_MODE) & ~SW_MODE, dev->io_base + SMI_CR1);
 
 638          * In Write Burst mode (WB_MODE), the specs states that writes must be:
 
 641          * The ARM implementation of memcpy_toio() will optimize the number of
 
 642          * I/O by using as much 4-byte writes as possible, surrounded by
 
 643          * 2-byte/1-byte access if:
 
 644          * - the destination is not 4-byte aligned
 
 645          * - the length is not a multiple of 4-byte.
 
 646          * Avoid this alternance of write access size by using our own 'byte
 
 647          * access' helper if at least one of the two conditions above is true.
 
 649         if (IS_ALIGNED(len, sizeof(u32)) &&
 
 650             IS_ALIGNED((uintptr_t)dest, sizeof(u32)))
 
 651                 memcpy_toio(dest, src, len);
 
 653                 spear_smi_memcpy_toio_b(dest, src, len);
 
 655         writel(ctrlreg1, dev->io_base + SMI_CR1);
 
 657         mutex_unlock(&dev->lock);
 
 662  * spear_mtd_write - performs write operation as requested by the user.
 
 663  * @mtd: MTD information of the memory bank.
 
 664  * @to: Address to write.
 
 665  * @len: Number of bytes to be written.
 
 666  * @retlen: Number of bytes actually wrote.
 
 667  * @buf: Buffer from which the data to be taken.
 
 669  * Write an address range to the flash chip. Data must be written in
 
 670  * flash_page_size chunks. The address range may be any size provided
 
 671  * it is within the physical boundaries.
 
 672  * Returns 0 on success, non zero otherwise
 
 674 static int spear_mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
 
 675                 size_t *retlen, const u8 *buf)
 
 677         struct spear_snor_flash *flash = get_flash_data(mtd);
 
 678         struct spear_smi *dev = mtd->priv;
 
 680         u32 page_offset, page_size;
 
 686         if (flash->bank > dev->num_flashes - 1) {
 
 687                 dev_err(&dev->pdev->dev, "Invalid Bank Num");
 
 691         /* select address as per bank number */
 
 692         dest = flash->base_addr + to;
 
 693         mutex_lock(&flash->lock);
 
 695         page_offset = (u32)to % flash->page_size;
 
 697         /* do if all the bytes fit onto one page */
 
 698         if (page_offset + len <= flash->page_size) {
 
 699                 ret = spear_smi_cpy_toio(dev, flash->bank, dest, buf, len);
 
 705                 /* the size of data remaining on the first page */
 
 706                 page_size = flash->page_size - page_offset;
 
 708                 ret = spear_smi_cpy_toio(dev, flash->bank, dest, buf,
 
 713                         *retlen += page_size;
 
 715                 /* write everything in pagesize chunks */
 
 716                 for (i = page_size; i < len; i += page_size) {
 
 718                         if (page_size > flash->page_size)
 
 719                                 page_size = flash->page_size;
 
 721                         ret = spear_smi_cpy_toio(dev, flash->bank, dest + i,
 
 726                                 *retlen += page_size;
 
 731         mutex_unlock(&flash->lock);
 
 737  * spear_smi_probe_flash - Detects the NOR Flash chip.
 
 738  * @dev: structure of SMI information.
 
 739  * @bank: bank on which flash must be probed
 
 741  * This routine will check whether there exists a flash chip on a given memory
 
 743  * Return index of the probed flash in flash devices structure
 
 745 static int spear_smi_probe_flash(struct spear_smi *dev, u32 bank)
 
 750         ret = spear_smi_wait_till_ready(dev, bank, SMI_PROBE_TIMEOUT);
 
 754         mutex_lock(&dev->lock);
 
 756         dev->status = 0; /* Will be set in interrupt handler */
 
 757         /* put smi in sw mode */
 
 758         val = readl(dev->io_base + SMI_CR1);
 
 759         writel(val | SW_MODE, dev->io_base + SMI_CR1);
 
 761         /* send readid command in sw mode */
 
 762         writel(OPCODE_RDID, dev->io_base + SMI_TR);
 
 764         val = (bank << BANK_SHIFT) | SEND | (1 << TX_LEN_SHIFT) |
 
 765                 (3 << RX_LEN_SHIFT) | TFIE;
 
 766         writel(val, dev->io_base + SMI_CR2);
 
 769         ret = wait_event_interruptible_timeout(dev->cmd_complete,
 
 770                         dev->status & TFF, SMI_CMD_TIMEOUT);
 
 776         /* get memory chip id */
 
 777         val = readl(dev->io_base + SMI_RR);
 
 779         ret = get_flash_index(val);
 
 783         val = readl(dev->io_base + SMI_CR1);
 
 784         writel(val & ~SW_MODE, dev->io_base + SMI_CR1);
 
 786         mutex_unlock(&dev->lock);
 
 792 static int spear_smi_probe_config_dt(struct platform_device *pdev,
 
 793                                      struct device_node *np)
 
 795         struct spear_smi_plat_data *pdata = dev_get_platdata(&pdev->dev);
 
 796         struct device_node *pp;
 
 805         of_property_read_u32(np, "clock-rate", &val);
 
 806         pdata->clk_rate = val;
 
 808         pdata->board_flash_info = devm_kzalloc(&pdev->dev,
 
 809                                                sizeof(*pdata->board_flash_info),
 
 811         if (!pdata->board_flash_info)
 
 814         /* Fill structs for each subnode (flash device) */
 
 815         for_each_child_of_node(np, pp) {
 
 818                 /* Read base-addr and size from DT */
 
 819                 addr = of_get_property(pp, "reg", &len);
 
 820                 pdata->board_flash_info->mem_base = be32_to_cpup(&addr[0]);
 
 821                 pdata->board_flash_info->size = be32_to_cpup(&addr[1]);
 
 823                 if (of_get_property(pp, "st,smi-fast-mode", NULL))
 
 824                         pdata->board_flash_info->fast_mode = 1;
 
 829         pdata->num_flashes = i;
 
 834 static int spear_smi_probe_config_dt(struct platform_device *pdev,
 
 835                                      struct device_node *np)
 
 841 static int spear_smi_setup_banks(struct platform_device *pdev,
 
 842                                  u32 bank, struct device_node *np)
 
 844         struct spear_smi *dev = platform_get_drvdata(pdev);
 
 845         struct spear_smi_flash_info *flash_info;
 
 846         struct spear_smi_plat_data *pdata;
 
 847         struct spear_snor_flash *flash;
 
 848         struct mtd_partition *parts = NULL;
 
 853         pdata = dev_get_platdata(&pdev->dev);
 
 854         if (bank > pdata->num_flashes - 1)
 
 857         flash_info = &pdata->board_flash_info[bank];
 
 861         flash = devm_kzalloc(&pdev->dev, sizeof(*flash), GFP_ATOMIC);
 
 865         flash->fast_mode = flash_info->fast_mode ? 1 : 0;
 
 866         mutex_init(&flash->lock);
 
 868         /* verify whether nor flash is really present on board */
 
 869         flash_index = spear_smi_probe_flash(dev, bank);
 
 870         if (flash_index < 0) {
 
 871                 dev_info(&dev->pdev->dev, "smi-nor%d not found\n", bank);
 
 874         /* map the memory for nor flash chip */
 
 875         flash->base_addr = devm_ioremap(&pdev->dev, flash_info->mem_base,
 
 877         if (!flash->base_addr)
 
 880         dev->flash[bank] = flash;
 
 881         flash->mtd.priv = dev;
 
 883         if (flash_info->name)
 
 884                 flash->mtd.name = flash_info->name;
 
 886                 flash->mtd.name = flash_devices[flash_index].name;
 
 888         flash->mtd.dev.parent = &pdev->dev;
 
 889         mtd_set_of_node(&flash->mtd, np);
 
 890         flash->mtd.type = MTD_NORFLASH;
 
 891         flash->mtd.writesize = 1;
 
 892         flash->mtd.flags = MTD_CAP_NORFLASH;
 
 893         flash->mtd.size = flash_info->size;
 
 894         flash->mtd.erasesize = flash_devices[flash_index].sectorsize;
 
 895         flash->page_size = flash_devices[flash_index].pagesize;
 
 896         flash->mtd.writebufsize = flash->page_size;
 
 897         flash->erase_cmd = flash_devices[flash_index].erase_cmd;
 
 898         flash->mtd._erase = spear_mtd_erase;
 
 899         flash->mtd._read = spear_mtd_read;
 
 900         flash->mtd._write = spear_mtd_write;
 
 901         flash->dev_id = flash_devices[flash_index].device_id;
 
 903         dev_info(&dev->pdev->dev, "mtd .name=%s .size=%llx(%lluM)\n",
 
 904                         flash->mtd.name, flash->mtd.size,
 
 905                         flash->mtd.size / (1024 * 1024));
 
 907         dev_info(&dev->pdev->dev, ".erasesize = 0x%x(%uK)\n",
 
 908                         flash->mtd.erasesize, flash->mtd.erasesize / 1024);
 
 911         if (flash_info->partitions) {
 
 912                 parts = flash_info->partitions;
 
 913                 count = flash_info->nr_partitions;
 
 917         ret = mtd_device_register(&flash->mtd, parts, count);
 
 919                 dev_err(&dev->pdev->dev, "Err MTD partition=%d\n", ret);
 
 927  * spear_smi_probe - Entry routine
 
 928  * @pdev: platform device structure
 
 930  * This is the first routine which gets invoked during booting and does all
 
 931  * initialization/allocation work. The routine looks for available memory banks,
 
 932  * and do proper init for any found one.
 
 933  * Returns 0 on success, non zero otherwise
 
 935 static int spear_smi_probe(struct platform_device *pdev)
 
 937         struct device_node *np = pdev->dev.of_node;
 
 938         struct spear_smi_plat_data *pdata = NULL;
 
 939         struct spear_smi *dev;
 
 940         struct resource *smi_base;
 
 945                 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
 
 950                 pdev->dev.platform_data = pdata;
 
 951                 ret = spear_smi_probe_config_dt(pdev, np);
 
 954                         dev_err(&pdev->dev, "no platform data\n");
 
 958                 pdata = dev_get_platdata(&pdev->dev);
 
 961                         dev_err(&pdev->dev, "no platform data\n");
 
 966         irq = platform_get_irq(pdev, 0);
 
 972         dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
 
 978         smi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
 980         dev->io_base = devm_ioremap_resource(&pdev->dev, smi_base);
 
 981         if (IS_ERR(dev->io_base)) {
 
 982                 ret = PTR_ERR(dev->io_base);
 
 987         dev->clk_rate = pdata->clk_rate;
 
 989         if (dev->clk_rate > SMI_MAX_CLOCK_FREQ)
 
 990                 dev->clk_rate = SMI_MAX_CLOCK_FREQ;
 
 992         dev->num_flashes = pdata->num_flashes;
 
 994         if (dev->num_flashes > MAX_NUM_FLASH_CHIP) {
 
 995                 dev_err(&pdev->dev, "exceeding max number of flashes\n");
 
 996                 dev->num_flashes = MAX_NUM_FLASH_CHIP;
 
 999         dev->clk = devm_clk_get(&pdev->dev, NULL);
 
1000         if (IS_ERR(dev->clk)) {
 
1001                 ret = PTR_ERR(dev->clk);
 
1005         ret = clk_prepare_enable(dev->clk);
 
1009         ret = devm_request_irq(&pdev->dev, irq, spear_smi_int_handler, 0,
 
1012                 dev_err(&dev->pdev->dev, "SMI IRQ allocation failed\n");
 
1016         mutex_init(&dev->lock);
 
1017         init_waitqueue_head(&dev->cmd_complete);
 
1018         spear_smi_hw_init(dev);
 
1019         platform_set_drvdata(pdev, dev);
 
1021         /* loop for each serial nor-flash which is connected to smi */
 
1022         for (i = 0; i < dev->num_flashes; i++) {
 
1023                 ret = spear_smi_setup_banks(pdev, i, pdata->np[i]);
 
1025                         dev_err(&dev->pdev->dev, "bank setup failed\n");
 
1033         clk_disable_unprepare(dev->clk);
 
1039  * spear_smi_remove - Exit routine
 
1040  * @pdev: platform device structure
 
1042  * free all allocations and delete the partitions.
 
1044 static int spear_smi_remove(struct platform_device *pdev)
 
1046         struct spear_smi *dev;
 
1047         struct spear_snor_flash *flash;
 
1050         dev = platform_get_drvdata(pdev);
 
1052                 dev_err(&pdev->dev, "dev is null\n");
 
1056         /* clean up for all nor flash */
 
1057         for (i = 0; i < dev->num_flashes; i++) {
 
1058                 flash = dev->flash[i];
 
1062                 /* clean up mtd stuff */
 
1063                 ret = mtd_device_unregister(&flash->mtd);
 
1065                         dev_err(&pdev->dev, "error removing mtd\n");
 
1068         clk_disable_unprepare(dev->clk);
 
1073 #ifdef CONFIG_PM_SLEEP
 
1074 static int spear_smi_suspend(struct device *dev)
 
1076         struct spear_smi *sdev = dev_get_drvdata(dev);
 
1078         if (sdev && sdev->clk)
 
1079                 clk_disable_unprepare(sdev->clk);
 
1084 static int spear_smi_resume(struct device *dev)
 
1086         struct spear_smi *sdev = dev_get_drvdata(dev);
 
1089         if (sdev && sdev->clk)
 
1090                 ret = clk_prepare_enable(sdev->clk);
 
1093                 spear_smi_hw_init(sdev);
 
1098 static SIMPLE_DEV_PM_OPS(spear_smi_pm_ops, spear_smi_suspend, spear_smi_resume);
 
1101 static const struct of_device_id spear_smi_id_table[] = {
 
1102         { .compatible = "st,spear600-smi" },
 
1105 MODULE_DEVICE_TABLE(of, spear_smi_id_table);
 
1108 static struct platform_driver spear_smi_driver = {
 
1111                 .bus = &platform_bus_type,
 
1112                 .of_match_table = of_match_ptr(spear_smi_id_table),
 
1113                 .pm = &spear_smi_pm_ops,
 
1115         .probe = spear_smi_probe,
 
1116         .remove = spear_smi_remove,
 
1118 module_platform_driver(spear_smi_driver);
 
1120 MODULE_LICENSE("GPL");
 
1121 MODULE_AUTHOR("Ashish Priyadarshi, Shiraz Hashim <shiraz.linux.kernel@gmail.com>");
 
1122 MODULE_DESCRIPTION("MTD SMI driver for serial nor flash chips");