The page size is a flash dependent property and the driver was using a macro in
place of page size. This patch uses the proper page size wrt the flash device
connected on board

Signed-off-by: Vipin Kumar <vipin.ku...@st.com>
---
 drivers/mtd/st_smi.c       | 41 +++++++++++++++++++++++++++++++++--------
 include/linux/mtd/st_smi.h |  1 -
 2 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/st_smi.c b/drivers/mtd/st_smi.c
index 998bacb..0e529a4 100644
--- a/drivers/mtd/st_smi.c
+++ b/drivers/mtd/st_smi.c
@@ -96,6 +96,25 @@ static struct flash_device flash_devices[] = {
 };
 
 /*
+ * get_flash_device - Return flash_device pointer for a particular device id
+ * @id:         Device id
+ *
+ * Return flash_device pointer for a particular device id
+ */
+static struct flash_device *get_flash_device(u32 id)
+{
+       struct flash_device *flash_dev_p = &flash_devices[0];
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(flash_devices); i++, flash_dev_p++) {
+               if (flash_dev_p->device_id == id)
+                       return flash_dev_p;
+       }
+
+       return NULL;
+}
+
+/*
  * smi_wait_xfer_finish - Wait until TFF is set in status register
  * @timeout:    timeout in milliseconds
  *
@@ -361,20 +380,27 @@ static int smi_sector_erase(flash_info_t *info, unsigned 
int sector)
 
 /*
  * smi_write - Write to SMI flash
+ * @info:       flash info structure
  * @src_addr:   source buffer
  * @dst_addr:   destination buffer
  * @length:     length to write in bytes
- * @bank:       bank base address
  *
  * Write to SMI flash
  */
-static int smi_write(unsigned char *src_addr, unsigned char *dst_addr,
-                    unsigned int length, ulong bank_addr)
+static int smi_write(flash_info_t *info, unsigned char *src_addr,
+               unsigned char *dst_addr, unsigned int length)
 {
+       struct flash_device *flash_device_p = get_flash_device(info->flash_id);
+       u32 page_size;
        int banknum;
        int issue_we;
 
-       switch (bank_addr) {
+       if (!flash_device_p)
+               return -EIO;
+
+       page_size = flash_device_p->pagesize;
+
+       switch (info->start[0]) {
        case SMIBANK0_BASE:
                banknum = BANK0;
                break;
@@ -400,9 +426,9 @@ static int smi_write(unsigned char *src_addr, unsigned char 
*dst_addr,
        /* Perform the write command */
        while (length) {
                int k;
-               unsigned int wlen = min(SFLASH_PAGE_SIZE, length);
+               unsigned int wlen = min(page_size, length);
 
-               if (issue_we || (((ulong)(dst_addr) % SFLASH_PAGE_SIZE) == 0)) {
+               if (issue_we || (((ulong)(dst_addr) % page_size) == 0)) {
                        issue_we = 0;
 
                        if (smi_wait_till_ready(banknum,
@@ -444,8 +470,7 @@ static int smi_write(unsigned char *src_addr, unsigned char 
*dst_addr,
  */
 int write_buff(flash_info_t *info, uchar *src, ulong dest_addr, ulong length)
 {
-       return smi_write(src, (unsigned char *)dest_addr, length,
-                       info->start[0]);
+       return smi_write(info, src, (unsigned char *)dest_addr, length);
 }
 
 /*
diff --git a/include/linux/mtd/st_smi.h b/include/linux/mtd/st_smi.h
index 04f81ea..5837493 100644
--- a/include/linux/mtd/st_smi.h
+++ b/include/linux/mtd/st_smi.h
@@ -108,7 +108,6 @@ struct flash_dev {
        ushort sector_count;
 };
 
-#define SFLASH_PAGE_SIZE       0x100   /* flash page size */
 #define XFER_FINISH_TOUT       15      /* xfer finish timeout(in ms) */
 #define WMODE_TOUT             15      /* write enable timeout(in ms) */
 
-- 
1.8.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to