aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
authorYoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>2007-02-20 00:11:57 -0500
committerRalf Baechle <ralf@linux-mips.org>2007-02-20 12:11:55 -0500
commitc316eb1eee2c803c33b1f826fe744c922d2e354f (patch)
treefe20495759af06890169d2ea2612b19a42eb6086 /drivers/char
parent575d5e72aab57beb6d5fa2a7d66be9fc681a5e00 (diff)
[MIPS] Add MTD device support for Cobalt
This patch has added MTD device support for Cobalt. Moreover, removes old type FlashROM support. Signed-off-by: Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/lcd.c168
-rw-r--r--drivers/char/lcd.h32
2 files changed, 0 insertions, 200 deletions
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c
index d649abbf085..5f4fdcf7c96 100644
--- a/drivers/char/lcd.c
+++ b/drivers/char/lcd.c
@@ -409,138 +409,6 @@ static int lcd_ioctl(struct inode *inode, struct file *file,
409 break; 409 break;
410 } 410 }
411 411
412// Erase the flash
413
414 case FLASH_Erase:{
415
416 int ctr = 0;
417
418 if ( !capable(CAP_SYS_ADMIN) ) return -EPERM;
419
420 pr_info(LCD "Erasing Flash\n");
421
422 // Chip Erase Sequence
423 WRITE_FLASH(kFlash_Addr1, kFlash_Data1);
424 WRITE_FLASH(kFlash_Addr2, kFlash_Data2);
425 WRITE_FLASH(kFlash_Addr1, kFlash_Erase3);
426 WRITE_FLASH(kFlash_Addr1, kFlash_Data1);
427 WRITE_FLASH(kFlash_Addr2, kFlash_Data2);
428 WRITE_FLASH(kFlash_Addr1, kFlash_Erase6);
429
430 while ((!dqpoll(0x00000000, 0xFF))
431 && (!timeout(0x00000000))) {
432 ctr++;
433 }
434
435 if (READ_FLASH(0x07FFF0) == 0xFF) {
436 pr_info(LCD "Erase Successful\n");
437 } else if (timeout) {
438 pr_info(LCD "Erase Timed Out\n");
439 }
440
441 break;
442 }
443
444// burn the flash
445
446 case FLASH_Burn:{
447
448 volatile unsigned long burn_addr;
449 unsigned long flags;
450 unsigned int i, index;
451 unsigned char *rom;
452
453
454 struct lcd_display display;
455
456 if ( !capable(CAP_SYS_ADMIN) ) return -EPERM;
457
458 if (copy_from_user
459 (&display, (struct lcd_display *) arg,
460 sizeof(struct lcd_display)))
461 return -EFAULT;
462 rom = kmalloc((128), GFP_ATOMIC);
463 if (rom == NULL) {
464 printk(KERN_ERR LCD "kmalloc() failed in %s\n",
465 __FUNCTION__);
466 return -ENOMEM;
467 }
468
469 pr_info(LCD "Starting Flash burn\n");
470 for (i = 0; i < FLASH_SIZE; i = i + 128) {
471
472 if (copy_from_user
473 (rom, display.RomImage + i, 128)) {
474 kfree(rom);
475 return -EFAULT;
476 }
477 burn_addr = kFlashBase + i;
478 spin_lock_irqsave(&lcd_lock, flags);
479 for (index = 0; index < (128); index++) {
480
481 WRITE_FLASH(kFlash_Addr1,
482 kFlash_Data1);
483 WRITE_FLASH(kFlash_Addr2,
484 kFlash_Data2);
485 WRITE_FLASH(kFlash_Addr1,
486 kFlash_Prog);
487 *((volatile unsigned char *)burn_addr) =
488 (volatile unsigned char) rom[index];
489
490 while ((!dqpoll (burn_addr,
491 (volatile unsigned char)
492 rom[index])) &&
493 (!timeout(burn_addr))) { }
494 burn_addr++;
495 }
496 spin_unlock_irqrestore(&lcd_lock, flags);
497 if (* ((volatile unsigned char *)
498 (burn_addr - 1)) ==
499 (volatile unsigned char)
500 rom[index - 1]) {
501 } else if (timeout) {
502 pr_info(LCD "Flash burn timed out\n");
503 }
504
505
506 }
507 kfree(rom);
508
509 pr_info(LCD "Flash successfully burned\n");
510
511 break;
512 }
513
514// read the flash all at once
515
516 case FLASH_Read:{
517
518 unsigned char *user_bytes;
519 volatile unsigned long read_addr;
520 unsigned int i;
521
522 user_bytes =
523 &(((struct lcd_display *) arg)->RomImage[0]);
524
525 if (!access_ok
526 (VERIFY_WRITE, user_bytes, FLASH_SIZE))
527 return -EFAULT;
528
529 pr_info(LCD "Reading Flash");
530 for (i = 0; i < FLASH_SIZE; i++) {
531 unsigned char tmp_byte;
532 read_addr = kFlashBase + i;
533 tmp_byte =
534 *((volatile unsigned char *)
535 read_addr);
536 if (__put_user(tmp_byte, &user_bytes[i]))
537 return -EFAULT;
538 }
539
540
541 break;
542 }
543
544 default: 412 default:
545 return -EINVAL; 413 return -EINVAL;
546 414
@@ -644,42 +512,6 @@ static void __exit lcd_exit(void)
644 misc_deregister(&lcd_dev); 512 misc_deregister(&lcd_dev);
645} 513}
646 514
647//
648// Function: dqpoll
649//
650// Description: Polls the data lines to see if the flash is busy
651//
652// In: address, byte data
653//
654// Out: 0 = busy, 1 = write or erase complete
655//
656//
657
658static int dqpoll(volatile unsigned long address, volatile unsigned char data)
659{
660 volatile unsigned char dq7;
661
662 dq7 = data & 0x80;
663
664 return ((READ_FLASH(address) & 0x80) == dq7);
665}
666
667//
668// Function: timeout
669//
670// Description: Checks to see if erase or write has timed out
671// By polling dq5
672//
673// In: address
674//
675//
676// Out: 0 = not timed out, 1 = timed out
677
678static int timeout(volatile unsigned long address)
679{
680 return (READ_FLASH(address) & 0x20) == 0x20;
681}
682
683module_init(lcd_init); 515module_init(lcd_init);
684module_exit(lcd_exit); 516module_exit(lcd_exit);
685 517
diff --git a/drivers/char/lcd.h b/drivers/char/lcd.h
index a8d4ae73715..290b3ff23b0 100644
--- a/drivers/char/lcd.h
+++ b/drivers/char/lcd.h
@@ -14,11 +14,7 @@
14 14
15// function headers 15// function headers
16 16
17static int dqpoll(volatile unsigned long, volatile unsigned char );
18static int timeout(volatile unsigned long);
19
20#define LCD_CHARS_PER_LINE 40 17#define LCD_CHARS_PER_LINE 40
21#define FLASH_SIZE 524288
22#define MAX_IDLE_TIME 120 18#define MAX_IDLE_TIME 120
23 19
24struct lcd_display { 20struct lcd_display {
@@ -54,26 +50,6 @@ struct lcd_display {
54#define LCDTimeoutValue 0xfff 50#define LCDTimeoutValue 0xfff
55 51
56 52
57// Flash definitions AMD 29F040
58#define kFlashBase 0x0FC00000
59
60#define kFlash_Addr1 0x5555
61#define kFlash_Addr2 0x2AAA
62#define kFlash_Data1 0xAA
63#define kFlash_Data2 0x55
64#define kFlash_Prog 0xA0
65#define kFlash_Erase3 0x80
66#define kFlash_Erase6 0x10
67#define kFlash_Read 0xF0
68
69#define kFlash_ID 0x90
70#define kFlash_VenAddr 0x00
71#define kFlash_DevAddr 0x01
72#define kFlash_VenID 0x01
73#define kFlash_DevID 0xA4 // 29F040
74//#define kFlash_DevID 0xAD // 29F016
75
76
77// Macros 53// Macros
78 54
79#define LCDWriteData(x) outl((x << 24), kLCD_DR) 55#define LCDWriteData(x) outl((x << 24), kLCD_DR)
@@ -89,9 +65,6 @@ struct lcd_display {
89#define WRITE_GAL(x,y) outl(y, 0x04000000 | (x)) 65#define WRITE_GAL(x,y) outl(y, 0x04000000 | (x))
90#define BusyCheck() while ((LCDReadInst & 0x80) == 0x80) 66#define BusyCheck() while ((LCDReadInst & 0x80) == 0x80)
91 67
92#define WRITE_FLASH(x,y) outb((char)y, kFlashBase | (x))
93#define READ_FLASH(x) (inb(kFlashBase | (x)))
94
95 68
96 69
97/* 70/*
@@ -124,11 +97,6 @@ struct lcd_display {
124// Button defs 97// Button defs
125#define BUTTON_Read 50 98#define BUTTON_Read 50
126 99
127// Flash command codes
128#define FLASH_Erase 60
129#define FLASH_Burn 61
130#define FLASH_Read 62
131
132 100
133// Ethernet LINK check hackaroo 101// Ethernet LINK check hackaroo
134#define LINK_Check 90 102#define LINK_Check 90