malta-display.c 1.5 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3 4
 * 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.
L
Linus Torvalds 已提交
5 6
 *
 * Display routines for display messages in MIPS boards ascii display.
7 8 9 10 11
 *
 * Copyright (C) 1999,2000,2012  MIPS Technologies, Inc.
 * All rights reserved.
 * Authors: Carsten Langgaard <carstenl@mips.com>
 *          Steven J. Hill <sjhill@mips.com>
L
Linus Torvalds 已提交
12 13
 */
#include <linux/compiler.h>
14
#include <linux/timer.h>
15 16
#include <linux/io.h>

L
Linus Torvalds 已提交
17 18
#include <asm/mips-boards/generic.h>

19 20 21 22
extern const char display_string[];
static unsigned int display_count;
static unsigned int max_display_count;

L
Linus Torvalds 已提交
23 24
void mips_display_message(const char *str)
{
25
	static unsigned int __iomem *display = NULL;
L
Linus Torvalds 已提交
26 27 28
	int i;

	if (unlikely(display == NULL))
29
		display = ioremap(ASCII_DISPLAY_POS_BASE, 16*sizeof(int));
L
Linus Torvalds 已提交
30

31 32 33 34 35
	for (i = 0; i <= 14; i += 2) {
		if (*str)
			__raw_writel(*str++, display + i);
		else
			__raw_writel(' ', display + i);
L
Linus Torvalds 已提交
36 37
	}
}
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

static void scroll_display_message(unsigned long data);
static DEFINE_TIMER(mips_scroll_timer, scroll_display_message, HZ, 0);

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 - 8;
	mod_timer(&mips_scroll_timer, jiffies + 1);
}