Blame view

kernel/linux-imx6_3.14.28/arch/mips/mti-sead3/sead3-display.c 2.04 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  /*
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
   * Copyright (C) 2012 MIPS Technologies, Inc.  All rights reserved.
   */
  #include <linux/timer.h>
  #include <linux/io.h>
  #include <asm/mips-boards/generic.h>
  
  static unsigned int display_count;
  static unsigned int max_display_count;
  
  #define LCD_DISPLAY_POS_BASE		0x1f000400
  #define DISPLAY_LCDINSTRUCTION		(0*2)
  #define DISPLAY_LCDDATA			(1*2)
  #define DISPLAY_CPLDSTATUS		(2*2)
  #define DISPLAY_CPLDDATA		(3*2)
  #define LCD_SETDDRAM			0x80
  #define LCD_IR_BF			0x80
  
  const char display_string[] = "		      LINUX ON SEAD3		   ";
  
  static void scroll_display_message(unsigned long data);
  static DEFINE_TIMER(mips_scroll_timer, scroll_display_message, HZ, 0);
  
  static void lcd_wait(unsigned int __iomem *display)
  {
  	/* Wait for CPLD state machine to become idle. */
  	do { } while (__raw_readl(display + DISPLAY_CPLDSTATUS) & 1);
  
  	do {
  		__raw_readl(display + DISPLAY_LCDINSTRUCTION);
  
  		/* Wait for CPLD state machine to become idle. */
  		do { } while (__raw_readl(display + DISPLAY_CPLDSTATUS) & 1);
  	} while (__raw_readl(display + DISPLAY_CPLDDATA) & LCD_IR_BF);
  }
  
  void mips_display_message(const char *str)
  {
  	static unsigned int __iomem *display;
  	char ch;
  	int i;
  
  	if (unlikely(display == NULL))
  		display = ioremap_nocache(LCD_DISPLAY_POS_BASE,
  			(8 * sizeof(int)));
  
  	for (i = 0; i < 16; i++) {
  		if (*str)
  			ch = *str++;
  		else
  			ch = ' ';
  		lcd_wait(display);
  		__raw_writel((LCD_SETDDRAM | i),
  			(display + DISPLAY_LCDINSTRUCTION));
  		lcd_wait(display);
  		__raw_writel(ch, display + DISPLAY_LCDDATA);
  	}
  }
  
  static void scroll_display_message(unsigned long data)
  {
  	mips_display_message(&display_string[display_count++]);
  	if (display_count == max_display_count)
  		display_count = 0;
  	mod_timer(&mips_scroll_timer, jiffies + HZ);
  }
  
  void mips_scroll_message(void)
  {
  	del_timer_sync(&mips_scroll_timer);
  	max_display_count = strlen(display_string) + 1 - 16;
  	mod_timer(&mips_scroll_timer, jiffies + 1);
  }