|
@@ -37,17 +37,61 @@ static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] =
|
|
CONFIG_SYS_FLASH_ADDR_BASE;
|
|
CONFIG_SYS_FLASH_ADDR_BASE;
|
|
flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
|
|
flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
|
|
|
|
|
|
-static struct flash_dev flash_ids[] = {
|
|
|
|
- {0x10, 0x10000, 2}, /* 64K Byte */
|
|
|
|
- {0x11, 0x20000, 4}, /* 128K Byte */
|
|
|
|
- {0x12, 0x40000, 4}, /* 256K Byte */
|
|
|
|
- {0x13, 0x80000, 8}, /* 512K Byte */
|
|
|
|
- {0x14, 0x100000, 16}, /* 1M Byte */
|
|
|
|
- {0x15, 0x200000, 32}, /* 2M Byte */
|
|
|
|
- {0x16, 0x400000, 64}, /* 4M Byte */
|
|
|
|
- {0x17, 0x800000, 128}, /* 8M Byte */
|
|
|
|
- {0x18, 0x1000000, 64}, /* 16M Byte */
|
|
|
|
- {0x00,}
|
|
|
|
|
|
+/* data structure to maintain flash ids from different vendors */
|
|
|
|
+struct flash_device {
|
|
|
|
+ char *name;
|
|
|
|
+ u8 erase_cmd;
|
|
|
|
+ u32 device_id;
|
|
|
|
+ u32 pagesize;
|
|
|
|
+ unsigned long sectorsize;
|
|
|
|
+ unsigned long size_in_bytes;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define FLASH_ID(n, es, id, psize, ssize, size) \
|
|
|
|
+{ \
|
|
|
|
+ .name = n, \
|
|
|
|
+ .erase_cmd = es, \
|
|
|
|
+ .device_id = id, \
|
|
|
|
+ .pagesize = psize, \
|
|
|
|
+ .sectorsize = ssize, \
|
|
|
|
+ .size_in_bytes = size \
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * List of supported flash devices.
|
|
|
|
+ * Currently the erase_cmd field is not used in this driver.
|
|
|
|
+ */
|
|
|
|
+static struct flash_device flash_devices[] = {
|
|
|
|
+ FLASH_ID("st m25p16" , 0xd8, 0x00152020, 0x100, 0x10000, 0x200000),
|
|
|
|
+ FLASH_ID("st m25p32" , 0xd8, 0x00162020, 0x100, 0x10000, 0x400000),
|
|
|
|
+ FLASH_ID("st m25p64" , 0xd8, 0x00172020, 0x100, 0x10000, 0x800000),
|
|
|
|
+ FLASH_ID("st m25p128" , 0xd8, 0x00182020, 0x100, 0x40000, 0x1000000),
|
|
|
|
+ FLASH_ID("st m25p05" , 0xd8, 0x00102020, 0x80 , 0x8000 , 0x10000),
|
|
|
|
+ FLASH_ID("st m25p10" , 0xd8, 0x00112020, 0x80 , 0x8000 , 0x20000),
|
|
|
|
+ FLASH_ID("st m25p20" , 0xd8, 0x00122020, 0x100, 0x10000, 0x40000),
|
|
|
|
+ FLASH_ID("st m25p40" , 0xd8, 0x00132020, 0x100, 0x10000, 0x80000),
|
|
|
|
+ FLASH_ID("st m25p80" , 0xd8, 0x00142020, 0x100, 0x10000, 0x100000),
|
|
|
|
+ FLASH_ID("st m45pe10" , 0xd8, 0x00114020, 0x100, 0x10000, 0x20000),
|
|
|
|
+ FLASH_ID("st m45pe20" , 0xd8, 0x00124020, 0x100, 0x10000, 0x40000),
|
|
|
|
+ FLASH_ID("st m45pe40" , 0xd8, 0x00134020, 0x100, 0x10000, 0x80000),
|
|
|
|
+ FLASH_ID("st m45pe80" , 0xd8, 0x00144020, 0x100, 0x10000, 0x100000),
|
|
|
|
+ FLASH_ID("sp s25fl004" , 0xd8, 0x00120201, 0x100, 0x10000, 0x80000),
|
|
|
|
+ FLASH_ID("sp s25fl008" , 0xd8, 0x00130201, 0x100, 0x10000, 0x100000),
|
|
|
|
+ FLASH_ID("sp s25fl016" , 0xd8, 0x00140201, 0x100, 0x10000, 0x200000),
|
|
|
|
+ FLASH_ID("sp s25fl032" , 0xd8, 0x00150201, 0x100, 0x10000, 0x400000),
|
|
|
|
+ FLASH_ID("sp s25fl064" , 0xd8, 0x00160201, 0x100, 0x10000, 0x800000),
|
|
|
|
+ FLASH_ID("mac 25l512" , 0xd8, 0x001020C2, 0x010, 0x10000, 0x10000),
|
|
|
|
+ FLASH_ID("mac 25l1005" , 0xd8, 0x001120C2, 0x010, 0x10000, 0x20000),
|
|
|
|
+ FLASH_ID("mac 25l2005" , 0xd8, 0x001220C2, 0x010, 0x10000, 0x40000),
|
|
|
|
+ FLASH_ID("mac 25l4005" , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
|
|
|
|
+ FLASH_ID("mac 25l4005a" , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
|
|
|
|
+ FLASH_ID("mac 25l8005" , 0xd8, 0x001420C2, 0x010, 0x10000, 0x100000),
|
|
|
|
+ FLASH_ID("mac 25l1605" , 0xd8, 0x001520C2, 0x100, 0x10000, 0x200000),
|
|
|
|
+ FLASH_ID("mac 25l1605a" , 0xd8, 0x001520C2, 0x010, 0x10000, 0x200000),
|
|
|
|
+ FLASH_ID("mac 25l3205" , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
|
|
|
|
+ FLASH_ID("mac 25l3205a" , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
|
|
|
|
+ FLASH_ID("mac 25l6405" , 0xd8, 0x001720C2, 0x100, 0x10000, 0x800000),
|
|
|
|
+ FLASH_ID("wbd w25q128" , 0xd8, 0x001840EF, 0x1000, 0x10000, 0x1000000),
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -105,9 +149,7 @@ static unsigned int smi_read_id(flash_info_t *info, int banknum)
|
|
static ulong flash_get_size(ulong base, int banknum)
|
|
static ulong flash_get_size(ulong base, int banknum)
|
|
{
|
|
{
|
|
flash_info_t *info = &flash_info[banknum];
|
|
flash_info_t *info = &flash_info[banknum];
|
|
- struct flash_dev *dev;
|
|
|
|
int value;
|
|
int value;
|
|
- unsigned int density;
|
|
|
|
int i;
|
|
int i;
|
|
|
|
|
|
value = smi_read_id(info, banknum);
|
|
value = smi_read_id(info, banknum);
|
|
@@ -117,24 +159,20 @@ static ulong flash_get_size(ulong base, int banknum)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
- density = (value >> 16) & 0xff;
|
|
|
|
|
|
+ /* Matches chip-id to entire list of 'serial-nor flash' ids */
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(flash_devices); i++) {
|
|
|
|
+ if (flash_devices[i].device_id == value) {
|
|
|
|
+ info->size = flash_devices[i].size_in_bytes;
|
|
|
|
+ info->flash_id = value;
|
|
|
|
+ info->start[0] = base;
|
|
|
|
+ info->sector_count =
|
|
|
|
+ info->size/flash_devices[i].sectorsize;
|
|
|
|
|
|
- for (i = 0, dev = &flash_ids[0]; dev->density != 0x0;
|
|
|
|
- i++, dev = &flash_ids[i]) {
|
|
|
|
- if (dev->density == density) {
|
|
|
|
- info->size = dev->size;
|
|
|
|
- info->sector_count = dev->sector_count;
|
|
|
|
- break;
|
|
|
|
|
|
+ return info->size;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (dev->density == 0x0)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- info->flash_id = value & 0xffff;
|
|
|
|
- info->start[0] = base;
|
|
|
|
-
|
|
|
|
- return info->size;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|