3 * MTD driver for the SPI Flash Memory support.
5 * Copyright (c) 2005-2006 Atheros Communications Inc.
6 * Copyright (C) 2006 FON Technology, SL.
7 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
8 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
10 * This code is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
16 /*===========================================================================
17 ** !!!! VERY IMPORTANT NOTICE !!!! FLASH DATA STORED IN LITTLE ENDIAN FORMAT
19 ** This module contains the Serial Flash access routines for the Atheros SOC.
20 ** The Atheros SOC integrates a SPI flash controller that is used to access
21 ** serial flash parts. The SPI flash controller executes in "Little Endian"
22 ** mode. THEREFORE, all WRITES and READS from the MIPS CPU must be
23 ** BYTESWAPPED! The SPI Flash controller hardware by default performs READ
24 ** ONLY byteswapping when accessed via the SPI Flash Alias memory region
25 ** (Physical Address 0x0800_0000 - 0x0fff_ffff). The data stored in the
26 ** flash sectors is stored in "Little Endian" format.
28 ** The spiflash_write() routine performs byteswapping on all write
30 **===========================================================================*/
32 #include <linux/kernel.h>
33 #include <linux/module.h>
34 #include <linux/types.h>
35 #include <linux/version.h>
36 #include <linux/errno.h>
37 #include <linux/slab.h>
38 #include <linux/mtd/mtd.h>
39 #include <linux/mtd/partitions.h>
40 #include <linux/platform_device.h>
41 #include <linux/squashfs_fs.h>
42 #include <linux/root_dev.h>
43 #include <asm/delay.h>
48 /* #define SPIFLASH_DEBUG */
51 #error This driver currently only works with big endian CPU.
56 static char module_name
[] = "spiflash";
58 #define MIN(a,b) ((a) < (b) ? (a) : (b))
62 #define ROOTFS_NAME "rootfs"
64 static __u32
spiflash_regread32(int reg
);
65 static void spiflash_regwrite32(int reg
, __u32 data
);
66 static __u32
spiflash_sendcmd (int op
);
68 int __init
spiflash_init (void);
69 void __exit
spiflash_exit (void);
70 static int spiflash_probe_chip (void);
71 static int spiflash_erase (struct mtd_info
*mtd
,struct erase_info
*instr
);
72 static int spiflash_read (struct mtd_info
*mtd
, loff_t from
,size_t len
,size_t *retlen
,u_char
*buf
);
73 static int spiflash_write (struct mtd_info
*mtd
,loff_t to
,size_t len
,size_t *retlen
,const u_char
*buf
);
75 /* Flash configuration table */
81 } flashconfig_tbl
[MAX_FLASH
] =
84 { STM_1MB_BYTE_COUNT
, STM_1MB_SECTOR_COUNT
, STM_1MB_SECTOR_SIZE
, 0x0},
85 { STM_2MB_BYTE_COUNT
, STM_2MB_SECTOR_COUNT
, STM_2MB_SECTOR_SIZE
, 0x0},
86 { STM_4MB_BYTE_COUNT
, STM_4MB_SECTOR_COUNT
, STM_4MB_SECTOR_SIZE
, 0x0},
87 { STM_8MB_BYTE_COUNT
, STM_8MB_SECTOR_COUNT
, STM_8MB_SECTOR_SIZE
, 0x0},
88 { STM_16MB_BYTE_COUNT
, STM_16MB_SECTOR_COUNT
, STM_16MB_SECTOR_SIZE
, 0x0}
91 /* Mapping of generic opcodes to STM serial flash opcodes */
97 {STM_OP_WR_ENABLE
, 1, 0},
98 {STM_OP_WR_DISABLE
, 1, 0},
99 {STM_OP_RD_STATUS
, 1, 1},
100 {STM_OP_WR_STATUS
, 1, 0},
101 {STM_OP_RD_DATA
, 4, 4},
102 {STM_OP_FAST_RD_DATA
, 1, 0},
103 {STM_OP_PAGE_PGRM
, 8, 0},
104 {STM_OP_SECTOR_ERASE
, 4, 0},
105 {STM_OP_BULK_ERASE
, 1, 0},
106 {STM_OP_DEEP_PWRDOWN
, 1, 0},
107 {STM_OP_RD_SIG
, 4, 1}
110 /* Driver private data structure */
111 struct spiflash_data
{
112 struct mtd_info
*mtd
;
113 struct mtd_partition
*parsed_parts
; /* parsed partitions */
114 void *spiflash_readaddr
; /* memory mapped data for read */
115 void *spiflash_mmraddr
; /* memory mapped register space */
119 static struct spiflash_data
*spidata
;
121 extern int parse_redboot_partitions(struct mtd_info
*master
, struct mtd_partition
**pparts
);
123 /***************************************************************************************************/
126 spiflash_regread32(int reg
)
128 volatile __u32
*data
= (__u32
*)(spidata
->spiflash_mmraddr
+ reg
);
134 spiflash_regwrite32(int reg
, __u32 data
)
136 volatile __u32
*addr
= (__u32
*)(spidata
->spiflash_mmraddr
+ reg
);
143 spiflash_sendcmd (int op
)
147 struct opcodes
*ptr_opcode
;
149 ptr_opcode
= &stm_opcodes
[op
];
152 reg
= spiflash_regread32(SPI_FLASH_CTL
);
153 } while (reg
& SPI_CTL_BUSY
);
155 spiflash_regwrite32(SPI_FLASH_OPCODE
, ptr_opcode
->code
);
157 reg
= (reg
& ~SPI_CTL_TX_RX_CNT_MASK
) | ptr_opcode
->tx_cnt
|
158 (ptr_opcode
->rx_cnt
<< 4) | SPI_CTL_START
;
160 spiflash_regwrite32(SPI_FLASH_CTL
, reg
);
162 if (ptr_opcode
->rx_cnt
> 0) {
164 reg
= spiflash_regread32(SPI_FLASH_CTL
);
165 } while (reg
& SPI_CTL_BUSY
);
167 reg
= (__u32
) spiflash_regread32(SPI_FLASH_DATA
);
169 switch (ptr_opcode
->rx_cnt
) {
193 /* Probe SPI flash device
194 * Function returns 0 for failure.
195 * and flashconfig_tbl array index for success.
198 spiflash_probe_chip (void)
203 /* Read the signature on the flash device */
204 sig
= spiflash_sendcmd(SPI_RD_SIG
);
207 case STM_8MBIT_SIGNATURE
:
208 flash_size
= FLASH_1MB
;
210 case STM_16MBIT_SIGNATURE
:
211 flash_size
= FLASH_2MB
;
213 case STM_32MBIT_SIGNATURE
:
214 flash_size
= FLASH_4MB
;
216 case STM_64MBIT_SIGNATURE
:
217 flash_size
= FLASH_8MB
;
219 case STM_128MBIT_SIGNATURE
:
220 flash_size
= FLASH_16MB
;
223 printk (KERN_WARNING
"%s: Read of flash device signature failed!\n", module_name
);
232 spiflash_erase (struct mtd_info
*mtd
,struct erase_info
*instr
)
234 struct opcodes
*ptr_opcode
;
236 int finished
= FALSE
;
238 #ifdef SPIFLASH_DEBUG
239 printk (KERN_DEBUG
"%s(addr = 0x%.8x, len = %d)\n",__FUNCTION__
,instr
->addr
,instr
->len
);
243 if (instr
->addr
+ instr
->len
> mtd
->size
) return (-EINVAL
);
245 ptr_opcode
= &stm_opcodes
[SPI_SECTOR_ERASE
];
247 temp
= ((__u32
)instr
->addr
<< 8) | (__u32
)(ptr_opcode
->code
);
248 spin_lock(&spidata
->mutex
);
249 spiflash_sendcmd(SPI_WRITE_ENABLE
);
252 reg
= spiflash_regread32(SPI_FLASH_CTL
);
253 } while (reg
& SPI_CTL_BUSY
);
255 spiflash_regwrite32(SPI_FLASH_OPCODE
, temp
);
257 reg
= (reg
& ~SPI_CTL_TX_RX_CNT_MASK
) | ptr_opcode
->tx_cnt
| SPI_CTL_START
;
258 spiflash_regwrite32(SPI_FLASH_CTL
, reg
);
262 reg
= spiflash_sendcmd(SPI_RD_STATUS
);
263 if (!(reg
& SPI_STATUS_WIP
)) {
267 spin_unlock(&spidata
->mutex
);
269 instr
->state
= MTD_ERASE_DONE
;
270 if (instr
->callback
) instr
->callback (instr
);
272 #ifdef SPIFLASH_DEBUG
273 printk (KERN_DEBUG
"%s return\n",__FUNCTION__
);
279 spiflash_read (struct mtd_info
*mtd
, loff_t from
,size_t len
,size_t *retlen
,u_char
*buf
)
283 #ifdef SPIFLASH_DEBUG
284 printk (KERN_DEBUG
"%s(from = 0x%.8x, len = %d)\n",__FUNCTION__
,(__u32
) from
,(int)len
);
288 if (!len
) return (0);
289 if (from
+ len
> mtd
->size
) return (-EINVAL
);
292 /* we always read len bytes */
295 read_addr
= (u_char
*)(spidata
->spiflash_readaddr
+ from
);
296 spin_lock(&spidata
->mutex
);
297 memcpy(buf
, read_addr
, len
);
298 spin_unlock(&spidata
->mutex
);
304 spiflash_write (struct mtd_info
*mtd
,loff_t to
,size_t len
,size_t *retlen
,const u_char
*buf
)
306 int done
= FALSE
, page_offset
, bytes_left
, finished
;
307 __u32 xact_len
, spi_data
= 0, opcode
, reg
;
309 #ifdef SPIFLASH_DEBUG
310 printk (KERN_DEBUG
"%s(to = 0x%.8x, len = %d)\n",__FUNCTION__
,(__u32
) to
,len
);
316 if (!len
) return (0);
317 if (to
+ len
> mtd
->size
) return (-EINVAL
);
319 opcode
= stm_opcodes
[SPI_PAGE_PROGRAM
].code
;
322 while (done
== FALSE
) {
323 xact_len
= MIN(bytes_left
, sizeof(__u32
));
325 /* 32-bit writes cannot span across a page boundary
326 * (256 bytes). This types of writes require two page
327 * program operations to handle it correctly. The STM part
328 * will write the overflow data to the beginning of the
329 * current page as opposed to the subsequent page.
331 page_offset
= (to
& (STM_PAGE_SIZE
- 1)) + xact_len
;
333 if (page_offset
> STM_PAGE_SIZE
) {
334 xact_len
-= (page_offset
- STM_PAGE_SIZE
);
337 spin_lock(&spidata
->mutex
);
338 spiflash_sendcmd(SPI_WRITE_ENABLE
);
342 reg
= spiflash_regread32(SPI_FLASH_CTL
);
343 } while (reg
& SPI_CTL_BUSY
);
347 spi_data
= (u32
) ((u8
) *buf
);
350 spi_data
= (buf
[1] << 8) | buf
[0];
353 spi_data
= (buf
[2] << 16) | (buf
[1] << 8) | buf
[0];
356 spi_data
= (buf
[3] << 24) | (buf
[2] << 16) |
357 (buf
[1] << 8) | buf
[0];
360 printk("spiflash_write: default case\n");
364 spiflash_regwrite32(SPI_FLASH_DATA
, spi_data
);
365 opcode
= (opcode
& SPI_OPCODE_MASK
) | ((__u32
)to
<< 8);
366 spiflash_regwrite32(SPI_FLASH_OPCODE
, opcode
);
368 reg
= (reg
& ~SPI_CTL_TX_RX_CNT_MASK
) | (xact_len
+ 4) | SPI_CTL_START
;
369 spiflash_regwrite32(SPI_FLASH_CTL
, reg
);
374 reg
= spiflash_sendcmd(SPI_RD_STATUS
);
375 if (!(reg
& SPI_STATUS_WIP
)) {
379 spin_unlock(&spidata
->mutex
);
381 bytes_left
-= xact_len
;
387 if (bytes_left
== 0) {
396 #ifdef CONFIG_MTD_PARTITIONS
397 static const char *part_probe_types
[] = { "cmdlinepart", "RedBoot", NULL
};
401 static int spiflash_probe(struct platform_device
*pdev
)
404 int index
, num_parts
;
405 struct mtd_info
*mtd
;
407 spidata
->spiflash_mmraddr
= ioremap_nocache(SPI_FLASH_MMR
, SPI_FLASH_MMR_SIZE
);
409 if (!spidata
->spiflash_mmraddr
) {
410 printk (KERN_WARNING
"%s: Failed to map flash device\n", module_name
);
415 mtd
= kzalloc(sizeof(struct mtd_info
), GFP_KERNEL
);
421 printk ("MTD driver for SPI flash.\n");
422 printk ("%s: Probing for Serial flash ...\n", module_name
);
423 if (!(index
= spiflash_probe_chip())) {
424 printk (KERN_WARNING
"%s: Found no serial flash device\n", module_name
);
430 printk ("%s: Found SPI serial Flash.\n", module_name
);
432 spidata
->spiflash_readaddr
= ioremap_nocache(SPI_FLASH_READ
, flashconfig_tbl
[index
].byte_cnt
);
433 if (!spidata
->spiflash_readaddr
) {
434 printk (KERN_WARNING
"%s: Failed to map flash device\n", module_name
);
440 mtd
->name
= module_name
;
441 mtd
->type
= MTD_NORFLASH
;
442 mtd
->flags
= (MTD_CAP_NORFLASH
|MTD_WRITEABLE
);
443 mtd
->size
= flashconfig_tbl
[index
].byte_cnt
;
444 mtd
->erasesize
= flashconfig_tbl
[index
].sector_size
;
446 mtd
->numeraseregions
= 0;
447 mtd
->eraseregions
= NULL
;
448 mtd
->erase
= spiflash_erase
;
449 mtd
->read
= spiflash_read
;
450 mtd
->write
= spiflash_write
;
451 mtd
->owner
= THIS_MODULE
;
453 #ifdef SPIFLASH_DEBUG
456 "mtd->size = 0x%.8x (%uM)\n"
457 "mtd->erasesize = 0x%.8x (%uK)\n"
458 "mtd->numeraseregions = %d\n",
460 mtd
->size
, mtd
->size
/ (1024*1024),
461 mtd
->erasesize
, mtd
->erasesize
/ 1024,
462 mtd
->numeraseregions
);
464 if (mtd
->numeraseregions
) {
465 for (result
= 0; result
< mtd
->numeraseregions
; result
++) {
468 "mtd->eraseregions[%d].offset = 0x%.8x\n"
469 "mtd->eraseregions[%d].erasesize = 0x%.8x (%uK)\n"
470 "mtd->eraseregions[%d].numblocks = %d\n",
471 result
,mtd
->eraseregions
[result
].offset
,
472 result
,mtd
->eraseregions
[result
].erasesize
,mtd
->eraseregions
[result
].erasesize
/ 1024,
473 result
,mtd
->eraseregions
[result
].numblocks
);
477 /* parse redboot partitions */
478 num_parts
= parse_mtd_partitions(mtd
, part_probe_types
, &spidata
->parsed_parts
, 0);
480 #ifdef SPIFLASH_DEBUG
481 printk (KERN_DEBUG
"Found %d partitions\n", num_parts
);
484 result
= add_mtd_partitions(mtd
, spidata
->parsed_parts
, num_parts
);
486 #ifdef SPIFLASH_DEBUG
487 printk (KERN_DEBUG
"Did not find any partitions\n");
499 static int spiflash_remove (struct platform_device
*pdev
)
501 del_mtd_partitions (spidata
->mtd
);
507 struct platform_driver spiflash_driver
= {
508 .driver
.name
= "spiflash",
509 .probe
= spiflash_probe
,
510 .remove
= spiflash_remove
,
516 spidata
= kmalloc(sizeof(struct spiflash_data
), GFP_KERNEL
);
520 spin_lock_init(&spidata
->mutex
);
521 platform_driver_register(&spiflash_driver
);
532 module_init (spiflash_init
);
533 module_exit (spiflash_exit
);
535 MODULE_LICENSE("GPL");
536 MODULE_AUTHOR("Atheros Communications Inc");
537 MODULE_DESCRIPTION("MTD driver for SPI Flash on Atheros SOC");