blob: f6aab3d32f459d82d0a9e606f4382fe67981160f [file] [log] [blame]
Jason McMullan64e5f3a2009-10-09 17:12:23 -04001/*
2 * Copyright 2008, Network Appliance Inc.
3 * Author: Jason McMullan <mcmullan <at> netapp.com>
4 * Licensed under the GPL-2 or later.
5 */
6
7#include <common.h>
8#include <malloc.h>
9#include <spi_flash.h>
10
11#include "spi_flash_internal.h"
12
Jason McMullan64e5f3a2009-10-09 17:12:23 -040013struct winbond_spi_flash_params {
14 uint16_t id;
Wojtek Skulskib1637e52010-12-07 01:07:45 -050015 uint16_t nr_blocks;
Jason McMullan64e5f3a2009-10-09 17:12:23 -040016 const char *name;
17};
18
Jason McMullan64e5f3a2009-10-09 17:12:23 -040019static const struct winbond_spi_flash_params winbond_spi_flash_table[] = {
20 {
James Le Cuirot7e921dc2011-07-15 06:12:51 +000021 .id = 0x3013,
James Le Cuirot7e921dc2011-07-15 06:12:51 +000022 .nr_blocks = 8,
23 .name = "W25X40",
24 },
25 {
Wojtek Skulskib1637e52010-12-07 01:07:45 -050026 .id = 0x3015,
Jason McMullan64e5f3a2009-10-09 17:12:23 -040027 .nr_blocks = 32,
28 .name = "W25X16",
29 },
30 {
Wojtek Skulskib1637e52010-12-07 01:07:45 -050031 .id = 0x3016,
Jason McMullan64e5f3a2009-10-09 17:12:23 -040032 .nr_blocks = 64,
33 .name = "W25X32",
34 },
35 {
Wojtek Skulskib1637e52010-12-07 01:07:45 -050036 .id = 0x3017,
Jason McMullan64e5f3a2009-10-09 17:12:23 -040037 .nr_blocks = 128,
38 .name = "W25X64",
39 },
Graeme Smechera448bce2010-07-29 09:00:02 -040040 {
Stephen Warren5f963642012-05-24 11:38:34 +000041 .id = 0x4014,
Stephen Warren5f963642012-05-24 11:38:34 +000042 .nr_blocks = 16,
43 .name = "W25Q80BL",
44 },
45 {
Wojtek Skulskib1637e52010-12-07 01:07:45 -050046 .id = 0x4015,
Wojtek Skulskib1637e52010-12-07 01:07:45 -050047 .nr_blocks = 32,
48 .name = "W25Q16",
49 },
50 {
51 .id = 0x4016,
Wojtek Skulskib1637e52010-12-07 01:07:45 -050052 .nr_blocks = 64,
53 .name = "W25Q32",
54 },
55 {
56 .id = 0x4017,
Graeme Smechera448bce2010-07-29 09:00:02 -040057 .nr_blocks = 128,
58 .name = "W25Q64",
59 },
Wojtek Skulskib1637e52010-12-07 01:07:45 -050060 {
61 .id = 0x4018,
Wojtek Skulskib1637e52010-12-07 01:07:45 -050062 .nr_blocks = 256,
63 .name = "W25Q128",
64 },
Rajeshwari Shinde703b1c32012-08-02 12:55:05 +053065 {
66 .id = 0x5014,
67 .nr_blocks = 128,
68 .name = "W25Q80",
69 },
Jason McMullan64e5f3a2009-10-09 17:12:23 -040070};
71
Jason McMullan64e5f3a2009-10-09 17:12:23 -040072struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
73{
74 const struct winbond_spi_flash_params *params;
Mike Frysingerce7cc042011-06-28 07:38:10 +000075 struct spi_flash *flash;
Jason McMullan64e5f3a2009-10-09 17:12:23 -040076 unsigned int i;
77
78 for (i = 0; i < ARRAY_SIZE(winbond_spi_flash_table); i++) {
79 params = &winbond_spi_flash_table[i];
80 if (params->id == ((idcode[1] << 8) | idcode[2]))
81 break;
82 }
83
84 if (i == ARRAY_SIZE(winbond_spi_flash_table)) {
85 debug("SF: Unsupported Winbond ID %02x%02x\n",
86 idcode[1], idcode[2]);
87 return NULL;
88 }
89
Mike Frysingerce7cc042011-06-28 07:38:10 +000090 flash = malloc(sizeof(*flash));
91 if (!flash) {
Jason McMullan64e5f3a2009-10-09 17:12:23 -040092 debug("SF: Failed to allocate memory\n");
93 return NULL;
94 }
95
Mike Frysingerce7cc042011-06-28 07:38:10 +000096 flash->spi = spi;
97 flash->name = params->name;
Jason McMullan64e5f3a2009-10-09 17:12:23 -040098
Mike Frysingerce7cc042011-06-28 07:38:10 +000099 flash->write = spi_flash_cmd_write_multi;
Mike Frysinger41477982012-03-04 22:35:50 -0500100 flash->erase = spi_flash_cmd_erase;
Mike Frysingerce7cc042011-06-28 07:38:10 +0000101 flash->read = spi_flash_cmd_read_fast;
Stephen Warrence8670c2012-08-13 16:46:21 -0600102 flash->page_size = 256;
Mike Frysingera4940782012-03-04 22:56:52 -0500103 flash->sector_size = 4096;
104 flash->size = 4096 * 16 * params->nr_blocks;
Jason McMullan64e5f3a2009-10-09 17:12:23 -0400105
Mike Frysingerce7cc042011-06-28 07:38:10 +0000106 return flash;
Jason McMullan64e5f3a2009-10-09 17:12:23 -0400107}