source: trunk/target/linux/ar71xx/patches-3.3/406-mtd-m25p80-allow-to-specify-max-read-size.patch @ 30410

Last change on this file since 30410 was 30410, checked in by juhosg, 5 years ago

ar71xx: add preliminary support for 3.3

File size: 2.8 KB
  • drivers/mtd/devices/m25p80.c

    a b struct m25p { 
    100100        u16                     addr_width; 
    101101        u8                      erase_opcode; 
    102102        u8                      *command; 
     103        size_t                  max_read_len; 
    103104}; 
    104105 
    105106static inline struct m25p *mtd_to_m25p(struct mtd_info *mtd) 
    static int m25p80_read(struct mtd_info * 
    352353        struct m25p *flash = mtd_to_m25p(mtd); 
    353354        struct spi_transfer t[2]; 
    354355        struct spi_message m; 
     356        loff_t ofs; 
    355357 
    356358        pr_debug("%s: %s from 0x%08x, len %zd\n", dev_name(&flash->spi->dev), 
    357359                        __func__, (u32)from, len); 
    static int m25p80_read(struct mtd_info * 
    374376        t[0].len = m25p_cmdsz(flash) + FAST_READ_DUMMY_BYTE; 
    375377        spi_message_add_tail(&t[0], &m); 
    376378 
    377         t[1].rx_buf = buf; 
    378         t[1].len = len; 
    379379        spi_message_add_tail(&t[1], &m); 
    380380 
    381381        /* Byte count starts at zero. */ 
    static int m25p80_read(struct mtd_info * 
    383383 
    384384        mutex_lock(&flash->lock); 
    385385 
    386         /* Wait till previous write/erase is done. */ 
    387         if (wait_till_ready(flash)) { 
    388                 /* REVISIT status return?? */ 
    389                 mutex_unlock(&flash->lock); 
    390                 return 1; 
    391         } 
    392  
    393386        /* FIXME switch to OPCODE_FAST_READ.  It's required for higher 
    394387         * clocks; and at this writing, every chip this driver handles 
    395388         * supports that opcode. 
    static int m25p80_read(struct mtd_info * 
    397390 
    398391        /* Set up the write data buffer. */ 
    399392        flash->command[0] = OPCODE_READ; 
    400         m25p_addr2cmd(flash, from, flash->command); 
    401393 
    402         spi_sync(flash->spi, &m); 
     394        ofs = 0; 
     395        while (len) { 
     396                size_t readlen; 
     397                size_t done; 
     398                int ret; 
     399 
     400                ret = wait_till_ready(flash); 
     401                if (ret) { 
     402                        mutex_unlock(&flash->lock); 
     403                        return 1; 
     404                } 
     405 
     406                if (flash->max_read_len > 0 && 
     407                    flash->max_read_len < len) 
     408                        readlen = flash->max_read_len; 
     409                else 
     410                        readlen = len; 
     411 
     412                t[1].rx_buf = buf + ofs; 
     413                t[1].len = readlen; 
     414 
     415                m25p_addr2cmd(flash, from + ofs, flash->command); 
     416 
     417                spi_sync(flash->spi, &m); 
    403418 
    404         *retlen = m.actual_length - m25p_cmdsz(flash) - FAST_READ_DUMMY_BYTE; 
     419                done = m.actual_length - m25p_cmdsz(flash) - 
     420                       FAST_READ_DUMMY_BYTE; 
     421                if (done != readlen) { 
     422                        mutex_unlock(&flash->lock); 
     423                        return 1; 
     424                } 
     425 
     426                ofs += done; 
     427                len -= done; 
     428        } 
     429 
     430        *retlen = ofs; 
    405431 
    406432        mutex_unlock(&flash->lock); 
    407433 
    static int __devinit m25p_probe(struct s 
    924950        flash->mtd.erase = m25p80_erase; 
    925951        flash->mtd.read = m25p80_read; 
    926952 
     953        if (data && data->max_read_len) { 
     954                flash->max_read_len = data->max_read_len; 
     955                dev_warn(&spi->dev, "max_read_len set to %d bytes\n", 
     956                        flash->max_read_len); 
     957        } 
     958 
    927959        /* sst flash chips use AAI word program */ 
    928960        if (JEDEC_MFR(info->jedec_id) == CFI_MFR_SST) 
    929961                flash->mtd.write = sst_write; 
  • include/linux/spi/flash.h

    a b struct flash_platform_data { 
    2525 
    2626        char            *type; 
    2727 
     28        size_t          max_read_len; 
    2829        /* we'll likely add more ... use JEDEC IDs, etc */ 
    2930}; 
    3031 
Note: See TracBrowser for help on using the repository browser.