[MTD] chips: make sharps driver usable again

Update the pre-CFI Sharp driver sharps.c so it compiles. map_read32 /
map_write32 no longer exist in the kernel so the driver is totally broken
as it stands. The replacement functions use different parameters resulting
in the other changes.

Change collie to use this driver until someone works out why the cfi driver
fails on that machine.

Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
Tested-by: Pavel Machek <pavel@suse.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by Richard Purdie and committed by Thomas Gleixner ee2d49de 72af3b2c

+66 -57
+66 -57
drivers/mtd/chips/sharp.c
··· 4 * Copyright 2000,2001 David A. Schleef <ds@schleef.org> 5 * 2000,2001 Lineo, Inc. 6 * 7 - * $Id: sharp.c,v 1.16 2005/11/07 11:14:23 gleixner Exp $ 8 * 9 * Devices supported: 10 * LH28F016SCT Symmetrical block flash memory, 2Mx8 ··· 160 return mtd; 161 } 162 163 static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd) 164 { 165 - unsigned long tmp; 166 unsigned long base = 0; 167 - u32 read0, read4; 168 int width = 4; 169 170 - tmp = map_read32(map, base+0); 171 172 - map_write32(map, CMD_READ_ID, base+0); 173 174 - read0=map_read32(map, base+0); 175 - read4=map_read32(map, base+4); 176 - if(read0 == 0x89898989){ 177 printk("Looks like sharp flash\n"); 178 - switch(read4){ 179 case 0xaaaaaaaa: 180 case 0xa0a0a0a0: 181 /* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/ ··· 203 return width; 204 #endif 205 default: 206 - printk("Sort-of looks like sharp flash, 0x%08x 0x%08x\n", 207 - read0,read4); 208 } 209 - }else if((map_read32(map, base+0) == CMD_READ_ID)){ 210 /* RAM, probably */ 211 printk("Looks like RAM\n"); 212 - map_write32(map, tmp, base+0); 213 }else{ 214 - printk("Doesn't look like sharp flash, 0x%08x 0x%08x\n", 215 - read0,read4); 216 } 217 218 return 0; ··· 221 /* This function returns with the chip->mutex lock held. */ 222 static int sharp_wait(struct map_info *map, struct flchip *chip) 223 { 224 - int status, i; 225 unsigned long timeo = jiffies + HZ; 226 DECLARE_WAITQUEUE(wait, current); 227 int adr = 0; ··· 232 233 switch(chip->state){ 234 case FL_READY: 235 - map_write32(map,CMD_READ_STATUS,adr); 236 chip->state = FL_STATUS; 237 case FL_STATUS: 238 for(i=0;i<100;i++){ 239 - status = map_read32(map,adr); 240 - if((status & SR_READY)==SR_READY) 241 break; 242 udelay(1); 243 } ··· 261 goto retry; 262 } 263 264 - map_write32(map,CMD_RESET, adr); 265 266 chip->state = FL_READY; 267 ··· 358 int timeo; 359 int try; 360 int i; 361 - int status = 0; 362 363 ret = sharp_wait(map,chip); 364 365 for(try=0;try<10;try++){ 366 - map_write32(map,CMD_BYTE_WRITE,adr); 367 /* cpu_to_le32 -> hack to fix the writel be->le conversion */ 368 - map_write32(map,cpu_to_le32(datum),adr); 369 370 chip->state = FL_WRITING; 371 372 timeo = jiffies + (HZ/2); 373 374 - map_write32(map,CMD_READ_STATUS,adr); 375 for(i=0;i<100;i++){ 376 - status = map_read32(map,adr); 377 - if((status & SR_READY)==SR_READY) 378 break; 379 } 380 if(i==100){ 381 printk("sharp: timed out writing\n"); 382 } 383 384 - if(!(status&SR_ERRORS)) 385 break; 386 387 - printk("sharp: error writing byte at addr=%08lx status=%08x\n",adr,status); 388 389 - map_write32(map,CMD_CLEAR_STATUS,adr); 390 } 391 - map_write32(map,CMD_RESET,adr); 392 chip->state = FL_READY; 393 394 wake_up(&chip->wq); ··· 443 { 444 int ret; 445 unsigned long timeo; 446 - int status; 447 DECLARE_WAITQUEUE(wait, current); 448 449 - map_write32(map,CMD_READ_STATUS,adr); 450 - status = map_read32(map,adr); 451 452 timeo = jiffies + HZ; 453 454 while(time_before(jiffies, timeo)){ 455 - map_write32(map,CMD_READ_STATUS,adr); 456 - status = map_read32(map,adr); 457 - if((status & SR_READY)==SR_READY){ 458 ret = 0; 459 goto out; 460 } ··· 485 { 486 int ret; 487 //int timeo; 488 - int status; 489 //int i; 490 491 //printk("sharp_erase_oneblock()\n"); ··· 495 sharp_unlock_oneblock(map,chip,adr); 496 #endif 497 498 - map_write32(map,CMD_BLOCK_ERASE_1,adr); 499 - map_write32(map,CMD_BLOCK_ERASE_2,adr); 500 501 chip->state = FL_ERASING; 502 503 ret = sharp_do_wait_for_ready(map,chip,adr); 504 if(ret<0)return ret; 505 506 - map_write32(map,CMD_READ_STATUS,adr); 507 - status = map_read32(map,adr); 508 509 - if(!(status&SR_ERRORS)){ 510 - map_write32(map,CMD_RESET,adr); 511 chip->state = FL_READY; 512 //spin_unlock_bh(chip->mutex); 513 return 0; 514 } 515 516 - printk("sharp: error erasing block at addr=%08lx status=%08x\n",adr,status); 517 - map_write32(map,CMD_CLEAR_STATUS,adr); 518 519 //spin_unlock_bh(chip->mutex); 520 ··· 526 unsigned long adr) 527 { 528 int i; 529 - int status; 530 531 - map_write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr); 532 - map_write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr); 533 534 udelay(100); 535 536 - status = map_read32(map,adr); 537 - printk("status=%08x\n",status); 538 539 for(i=0;i<1000;i++){ 540 - //map_write32(map,CMD_READ_STATUS,adr); 541 - status = map_read32(map,adr); 542 - if((status & SR_READY)==SR_READY) 543 break; 544 udelay(100); 545 } ··· 547 printk("sharp: timed out unlocking block\n"); 548 } 549 550 - if(!(status&SR_ERRORS)){ 551 - map_write32(map,CMD_RESET,adr); 552 chip->state = FL_READY; 553 return; 554 } 555 556 - printk("sharp: error unlocking block at addr=%08lx status=%08x\n",adr,status); 557 - map_write32(map,CMD_CLEAR_STATUS,adr); 558 } 559 #endif 560
··· 4 * Copyright 2000,2001 David A. Schleef <ds@schleef.org> 5 * 2000,2001 Lineo, Inc. 6 * 7 + * $Id: sharp.c,v 1.17 2005/11/29 14:28:28 gleixner Exp $ 8 * 9 * Devices supported: 10 * LH28F016SCT Symmetrical block flash memory, 2Mx8 ··· 160 return mtd; 161 } 162 163 + static inline void sharp_send_cmd(struct map_info *map, unsigned long cmd, unsigned long adr) 164 + { 165 + map_word map_cmd; 166 + map_cmd.x[0] = cmd; 167 + map_write(map, map_cmd, adr); 168 + } 169 + 170 static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd) 171 { 172 + map_word tmp, read0, read4; 173 unsigned long base = 0; 174 int width = 4; 175 176 + tmp = map_read(map, base+0); 177 178 + sharp_send_cmd(map, CMD_READ_ID, base+0); 179 180 + read0 = map_read(map, base+0); 181 + read4 = map_read(map, base+4); 182 + if(read0.x[0] == 0x89898989){ 183 printk("Looks like sharp flash\n"); 184 + switch(read4.x[0]){ 185 case 0xaaaaaaaa: 186 case 0xa0a0a0a0: 187 /* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/ ··· 197 return width; 198 #endif 199 default: 200 + printk("Sort-of looks like sharp flash, 0x%08lx 0x%08lx\n", 201 + read0.x[0], read4.x[0]); 202 } 203 + }else if((map_read(map, base+0).x[0] == CMD_READ_ID)){ 204 /* RAM, probably */ 205 printk("Looks like RAM\n"); 206 + map_write(map, tmp, base+0); 207 }else{ 208 + printk("Doesn't look like sharp flash, 0x%08lx 0x%08lx\n", 209 + read0.x[0], read4.x[0]); 210 } 211 212 return 0; ··· 215 /* This function returns with the chip->mutex lock held. */ 216 static int sharp_wait(struct map_info *map, struct flchip *chip) 217 { 218 + int i; 219 + map_word status; 220 unsigned long timeo = jiffies + HZ; 221 DECLARE_WAITQUEUE(wait, current); 222 int adr = 0; ··· 225 226 switch(chip->state){ 227 case FL_READY: 228 + sharp_send_cmd(map, CMD_READ_STATUS, adr); 229 chip->state = FL_STATUS; 230 case FL_STATUS: 231 for(i=0;i<100;i++){ 232 + status = map_read(map, adr); 233 + if((status.x[0] & SR_READY)==SR_READY) 234 break; 235 udelay(1); 236 } ··· 254 goto retry; 255 } 256 257 + sharp_send_cmd(map, CMD_RESET, adr); 258 259 chip->state = FL_READY; 260 ··· 351 int timeo; 352 int try; 353 int i; 354 + map_word data, status; 355 356 + status.x[0] = 0; 357 ret = sharp_wait(map,chip); 358 359 for(try=0;try<10;try++){ 360 + sharp_send_cmd(map, CMD_BYTE_WRITE, adr); 361 /* cpu_to_le32 -> hack to fix the writel be->le conversion */ 362 + data.x[0] = cpu_to_le32(datum); 363 + map_write(map, data, adr); 364 365 chip->state = FL_WRITING; 366 367 timeo = jiffies + (HZ/2); 368 369 + sharp_send_cmd(map, CMD_READ_STATUS, adr); 370 for(i=0;i<100;i++){ 371 + status = map_read(map, adr); 372 + if((status.x[0] & SR_READY) == SR_READY) 373 break; 374 } 375 if(i==100){ 376 printk("sharp: timed out writing\n"); 377 } 378 379 + if(!(status.x[0] & SR_ERRORS)) 380 break; 381 382 + printk("sharp: error writing byte at addr=%08lx status=%08lx\n", adr, status.x[0]); 383 384 + sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); 385 } 386 + sharp_send_cmd(map, CMD_RESET, adr); 387 chip->state = FL_READY; 388 389 wake_up(&chip->wq); ··· 434 { 435 int ret; 436 unsigned long timeo; 437 + map_word status; 438 DECLARE_WAITQUEUE(wait, current); 439 440 + sharp_send_cmd(map, CMD_READ_STATUS, adr); 441 + status = map_read(map, adr); 442 443 timeo = jiffies + HZ; 444 445 while(time_before(jiffies, timeo)){ 446 + sharp_send_cmd(map, CMD_READ_STATUS, adr); 447 + status = map_read(map, adr); 448 + if((status.x[0] & SR_READY)==SR_READY){ 449 ret = 0; 450 goto out; 451 } ··· 476 { 477 int ret; 478 //int timeo; 479 + map_word status; 480 //int i; 481 482 //printk("sharp_erase_oneblock()\n"); ··· 486 sharp_unlock_oneblock(map,chip,adr); 487 #endif 488 489 + sharp_send_cmd(map, CMD_BLOCK_ERASE_1, adr); 490 + sharp_send_cmd(map, CMD_BLOCK_ERASE_2, adr); 491 492 chip->state = FL_ERASING; 493 494 ret = sharp_do_wait_for_ready(map,chip,adr); 495 if(ret<0)return ret; 496 497 + sharp_send_cmd(map, CMD_READ_STATUS, adr); 498 + status = map_read(map, adr); 499 500 + if(!(status.x[0] & SR_ERRORS)){ 501 + sharp_send_cmd(map, CMD_RESET, adr); 502 chip->state = FL_READY; 503 //spin_unlock_bh(chip->mutex); 504 return 0; 505 } 506 507 + printk("sharp: error erasing block at addr=%08lx status=%08lx\n", adr, status.x[0]); 508 + sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); 509 510 //spin_unlock_bh(chip->mutex); 511 ··· 517 unsigned long adr) 518 { 519 int i; 520 + map_word status; 521 522 + sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_1, adr); 523 + sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_2, adr); 524 525 udelay(100); 526 527 + status = map_read(map, adr); 528 + printk("status=%08lx\n", status.x[0]); 529 530 for(i=0;i<1000;i++){ 531 + //sharp_send_cmd(map, CMD_READ_STATUS, adr); 532 + status = map_read(map, adr); 533 + if((status.x[0] & SR_READY) == SR_READY) 534 break; 535 udelay(100); 536 } ··· 538 printk("sharp: timed out unlocking block\n"); 539 } 540 541 + if(!(status.x[0] & SR_ERRORS)){ 542 + sharp_send_cmd(map, CMD_RESET, adr); 543 chip->state = FL_READY; 544 return; 545 } 546 547 + printk("sharp: error unlocking block at addr=%08lx status=%08lx\n", adr, status.x[0]); 548 + sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); 549 } 550 #endif 551