2 * pm49fl004.c: driver for Pm49FL004 flash models.
5 * Copyright 2004 Tyan Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include "pm49fl004.h"
29 static __inline__ int erase_block_49fl004(volatile unsigned char *bios,
30 unsigned long address)
32 volatile unsigned char *Temp;
34 Temp = bios + 0x5555; /* set up address to be C000:5555h */
35 *Temp = 0xAA; /* write data 0xAA to the address */
37 Temp = bios + 0x2AAA; /* set up address to be C000:2AAAh */
38 *Temp = 0x55; /* write data 0x55 to the address */
40 Temp = bios + 0x5555; /* set up address to be C000:5555h */
41 *Temp = 0x80; /* write data 0x80 to the address */
43 Temp = bios + 0x5555; /* set up address to be C000:5555h */
44 *Temp = 0xAA; /* write data 0xAA to the address */
46 Temp = bios + 0x2AAA; /* set up address to be C000:2AAAh */
47 *Temp = 0x55; /* write data 0x55 to the address */
49 Temp = bios + address; /* set up address to be C000:5555h */
50 *Temp = 0x50; /* write data 0x50 to the address */
52 /* wait for Toggle bit ready */
53 toggle_ready_jedec(bios);
58 static __inline__ int write_block_49fl004(volatile char *bios,
60 volatile unsigned char *dst,
61 unsigned int page_size)
66 for (i = 0; i < page_size; i++) {
68 printf("FATAL: dst %p not erased (val 0x%x\n", dst,
72 /* transfer data from source to destination */
75 /* If the data is 0xFF, don't program it */
78 Temp = (bios + 0x5555);
85 toggle_ready_jedec(bios);
87 printf("BAD! dst 0x%lx val 0x%x src 0x%x\n",
88 (unsigned long) dst, *dst, *src);
95 int write_49fl004(struct flashchip *flash, unsigned char *buf)
98 int total_size = flash->total_size * 1024, page_size =
100 volatile char *bios = flash->virt_addr;
102 printf("Programming Page: ");
103 for (i = 0; i < total_size / page_size; i++) {
104 /* erase the page before programming */
105 erase_block_49fl004(bios, i * page_size);
107 /* write to the sector */
108 printf("%04d at address: 0x%08x", i, i * page_size);
109 write_block_49fl004(bios, buf + i * page_size,
110 bios + i * page_size, page_size);
112 ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");