2005-04-16 15:20:36 -07:00
/*
* Carsten Langgaard , carstenl @ mips . com
* Copyright ( C ) 1999 , 2000 MIPS Technologies , Inc . All rights reserved .
*
* This program is free software ; you can distribute it and / or modify it
* under the terms of the GNU General Public License ( Version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 59 Temple Place - Suite 330 , Boston MA 02111 - 1307 , USA .
*
* Display routines for display messages in MIPS boards ascii display .
*/
# include <linux/compiler.h>
2007-05-16 17:54:08 +02:00
# include <linux/timer.h>
2005-04-16 15:20:36 -07:00
# include <asm/io.h>
# include <asm/mips-boards/generic.h>
2008-06-18 10:18:23 +03:00
# include <asm/mips-boards/prom.h>
2005-04-16 15:20:36 -07:00
2007-05-16 17:54:08 +02:00
extern const char display_string [ ] ;
static unsigned int display_count ;
static unsigned int max_display_count ;
2005-04-16 15:20:36 -07:00
void mips_display_message ( const char * str )
{
2007-04-26 15:46:24 +01:00
static unsigned int __iomem * display = NULL ;
2005-04-16 15:20:36 -07:00
int i ;
if ( unlikely ( display = = NULL ) )
2007-04-26 15:46:24 +01:00
display = ioremap ( ASCII_DISPLAY_POS_BASE , 16 * sizeof ( int ) ) ;
2005-04-16 15:20:36 -07:00
for ( i = 0 ; i < = 14 ; i = i + 2 ) {
if ( * str )
2007-12-06 15:35:54 +00:00
__raw_writel ( * str + + , display + i ) ;
2005-04-16 15:20:36 -07:00
else
2007-12-06 15:35:54 +00:00
__raw_writel ( ' ' , display + i ) ;
2005-04-16 15:20:36 -07:00
}
}
2007-05-16 17:54:08 +02:00
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 ) ;
}