]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/mtd/spi/winbond.c
Merge branch 'master' of git://git.denx.de/u-boot-microblaze
[karo-tx-uboot.git] / drivers / mtd / spi / winbond.c
1 /*
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
13 struct winbond_spi_flash_params {
14         uint16_t        id;
15         uint16_t        nr_blocks;
16         const char      *name;
17 };
18
19 static const struct winbond_spi_flash_params winbond_spi_flash_table[] = {
20         {
21                 .id                     = 0x3013,
22                 .nr_blocks              = 8,
23                 .name                   = "W25X40",
24         },
25         {
26                 .id                     = 0x3015,
27                 .nr_blocks              = 32,
28                 .name                   = "W25X16",
29         },
30         {
31                 .id                     = 0x3016,
32                 .nr_blocks              = 64,
33                 .name                   = "W25X32",
34         },
35         {
36                 .id                     = 0x3017,
37                 .nr_blocks              = 128,
38                 .name                   = "W25X64",
39         },
40         {
41                 .id                     = 0x4014,
42                 .nr_blocks              = 16,
43                 .name                   = "W25Q80BL",
44         },
45         {
46                 .id                     = 0x4015,
47                 .nr_blocks              = 32,
48                 .name                   = "W25Q16",
49         },
50         {
51                 .id                     = 0x4016,
52                 .nr_blocks              = 64,
53                 .name                   = "W25Q32",
54         },
55         {
56                 .id                     = 0x4017,
57                 .nr_blocks              = 128,
58                 .name                   = "W25Q64",
59         },
60         {
61                 .id                     = 0x4018,
62                 .nr_blocks              = 256,
63                 .name                   = "W25Q128",
64         },
65 };
66
67 struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
68 {
69         const struct winbond_spi_flash_params *params;
70         struct spi_flash *flash;
71         unsigned int i;
72
73         for (i = 0; i < ARRAY_SIZE(winbond_spi_flash_table); i++) {
74                 params = &winbond_spi_flash_table[i];
75                 if (params->id == ((idcode[1] << 8) | idcode[2]))
76                         break;
77         }
78
79         if (i == ARRAY_SIZE(winbond_spi_flash_table)) {
80                 debug("SF: Unsupported Winbond ID %02x%02x\n",
81                                 idcode[1], idcode[2]);
82                 return NULL;
83         }
84
85         flash = malloc(sizeof(*flash));
86         if (!flash) {
87                 debug("SF: Failed to allocate memory\n");
88                 return NULL;
89         }
90
91         flash->spi = spi;
92         flash->name = params->name;
93
94         flash->write = spi_flash_cmd_write_multi;
95         flash->erase = spi_flash_cmd_erase;
96         flash->read = spi_flash_cmd_read_fast;
97         flash->page_size = 4096;
98         flash->sector_size = 4096;
99         flash->size = 4096 * 16 * params->nr_blocks;
100
101         return flash;
102 }