blob: 70435eb5a3a55d37f178bb6a4feb9bdf1c5a4dde [file] [log] [blame]
Prafulla Wadaskar09569072009-04-06 21:24:43 +05301/*
2 * Copyright 2009(C) Marvell International Ltd. and its affiliates
3 * Prafulla Wadaskar <prafulla@marvell.com>
4 *
5 * Based on drivers/mtd/spi/stmicro.c
6 *
7 * Copyright 2008, Network Appliance Inc.
8 * Jason McMullan <mcmullan@netapp.com>
9 *
10 * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
11 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
12 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +020013 * SPDX-License-Identifier: GPL-2.0+
Prafulla Wadaskar09569072009-04-06 21:24:43 +053014 */
15
16#include <common.h>
17#include <malloc.h>
18#include <spi_flash.h>
19
20#include "spi_flash_internal.h"
21
Prafulla Wadaskar09569072009-04-06 21:24:43 +053022struct macronix_spi_flash_params {
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053023 u16 idcode;
Prafulla Wadaskar09569072009-04-06 21:24:43 +053024 u16 nr_blocks;
25 const char *name;
26};
27
Prafulla Wadaskar09569072009-04-06 21:24:43 +053028static const struct macronix_spi_flash_params macronix_spi_flash_table[] = {
29 {
Macpaul Lin479404e2011-04-20 16:51:39 +000030 .idcode = 0x2013,
Macpaul Lin479404e2011-04-20 16:51:39 +000031 .nr_blocks = 8,
32 .name = "MX25L4005",
33 },
34 {
35 .idcode = 0x2014,
Macpaul Lin479404e2011-04-20 16:51:39 +000036 .nr_blocks = 16,
37 .name = "MX25L8005",
38 },
39 {
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053040 .idcode = 0x2015,
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053041 .nr_blocks = 32,
42 .name = "MX25L1605D",
43 },
44 {
45 .idcode = 0x2016,
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053046 .nr_blocks = 64,
47 .name = "MX25L3205D",
48 },
49 {
50 .idcode = 0x2017,
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053051 .nr_blocks = 128,
52 .name = "MX25L6405D",
53 },
54 {
55 .idcode = 0x2018,
Prafulla Wadaskar09569072009-04-06 21:24:43 +053056 .nr_blocks = 256,
57 .name = "MX25L12805D",
58 },
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053059 {
60 .idcode = 0x2618,
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053061 .nr_blocks = 256,
62 .name = "MX25L12855E",
63 },
Prafulla Wadaskar09569072009-04-06 21:24:43 +053064};
65
Prafulla Wadaskar09569072009-04-06 21:24:43 +053066struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
67{
68 const struct macronix_spi_flash_params *params;
Mike Frysingerce7cc042011-06-28 07:38:10 +000069 struct spi_flash *flash;
Prafulla Wadaskar09569072009-04-06 21:24:43 +053070 unsigned int i;
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053071 u16 id = idcode[2] | idcode[1] << 8;
Prafulla Wadaskar09569072009-04-06 21:24:43 +053072
73 for (i = 0; i < ARRAY_SIZE(macronix_spi_flash_table); i++) {
74 params = &macronix_spi_flash_table[i];
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053075 if (params->idcode == id)
Prafulla Wadaskar09569072009-04-06 21:24:43 +053076 break;
77 }
78
79 if (i == ARRAY_SIZE(macronix_spi_flash_table)) {
Prafulla Wadaskar5af0c232009-07-06 20:29:15 +053080 debug("SF: Unsupported Macronix ID %04x\n", id);
Prafulla Wadaskar09569072009-04-06 21:24:43 +053081 return NULL;
82 }
83
Simon Glassf7e55f22013-03-11 06:08:03 +000084 flash = spi_flash_alloc_base(spi, params->name);
Mike Frysingerce7cc042011-06-28 07:38:10 +000085 if (!flash) {
Prafulla Wadaskar09569072009-04-06 21:24:43 +053086 debug("SF: Failed to allocate memory\n");
87 return NULL;
88 }
89
Mike Frysingera4940782012-03-04 22:56:52 -050090 flash->page_size = 256;
91 flash->sector_size = 256 * 16 * 16;
Mike Frysingerce7cc042011-06-28 07:38:10 +000092 flash->size = flash->sector_size * params->nr_blocks;
Prafulla Wadaskar09569072009-04-06 21:24:43 +053093
Simon Guinotcfd72b62011-05-02 11:01:38 +000094 /* Clear BP# bits for read-only flash */
Mike Frysinger6fe6d0d2012-03-04 23:18:17 -050095 spi_flash_cmd_write_status(flash, 0);
Simon Guinotcfd72b62011-05-02 11:01:38 +000096
Mike Frysingerce7cc042011-06-28 07:38:10 +000097 return flash;
Prafulla Wadaskar09569072009-04-06 21:24:43 +053098}