2006-09-27 14:53:35 +09:00
/*
* arch / sh / boards / landisk / setup . c
*
2006-09-27 15:16:42 +09:00
* Copyright ( C ) 2000 Kazumoto Kojima
2006-09-27 14:53:35 +09:00
* Copyright ( C ) 2002 Paul Mundt
*
* I - O DATA Device , Inc . LANDISK Support .
*
* Modified for LANDISK by
* Atom Create Engineering Co . , Ltd . 2002.
2006-09-27 15:16:42 +09:00
*
2006-09-27 14:53:35 +09:00
* modifed by kogiidena
* 2005.09 .16
2006-09-27 15:16:42 +09:00
*
* 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 .
2006-09-27 14:53:35 +09:00
*/
# include <linux/config.h>
# include <linux/init.h>
# include <linux/pm.h>
2006-09-27 15:16:42 +09:00
# include <linux/mm.h>
2006-09-27 14:53:35 +09:00
# include <asm/machvec.h>
# include <asm/rtc.h>
# include <asm/landisk/iodata_landisk.h>
2006-09-27 15:16:42 +09:00
# include <asm/io.h>
2006-09-27 14:53:35 +09:00
void landisk_time_init ( void ) ;
2006-09-27 15:16:42 +09:00
void init_landisk_IRQ ( void ) ;
2006-09-27 14:53:35 +09:00
int landisk_ledparam ;
int landisk_buzzerparam ;
int landisk_arch ;
2006-09-27 15:16:42 +09:00
/* cycle the led's in the clasic knightrider/sun pattern */
static void heartbeat_landisk ( void )
2006-09-27 14:53:35 +09:00
{
static unsigned int cnt = 0 , blink = 0x00 , period = 25 ;
2006-09-27 15:16:42 +09:00
volatile u8 * p = ( volatile u8 * ) PA_LED ;
2006-09-27 14:53:35 +09:00
char data ;
2006-09-27 15:16:42 +09:00
if ( ( landisk_ledparam & 0x080 ) = = 0 )
2006-09-27 14:53:35 +09:00
return ;
2006-09-27 15:16:42 +09:00
2006-09-27 14:53:35 +09:00
cnt + = 1 ;
2006-09-27 15:16:42 +09:00
if ( cnt < period )
2006-09-27 14:53:35 +09:00
return ;
2006-09-27 15:16:42 +09:00
2006-09-27 14:53:35 +09:00
cnt = 0 ;
blink + + ;
data = ( blink & 0x01 ) ? ( landisk_ledparam > > 16 ) : 0 ;
data | = ( blink & 0x02 ) ? ( landisk_ledparam > > 8 ) : 0 ;
data | = landisk_ledparam ;
/* buzzer */
if ( landisk_buzzerparam & 0x1 ) {
data | = 0x80 ;
} else {
data & = 0x7f ;
}
* p = data ;
2006-09-27 15:16:42 +09:00
if ( ( ( landisk_ledparam & 0x007f7f00 ) = = 0 ) & &
( landisk_buzzerparam = = 0 ) )
2006-09-27 14:53:35 +09:00
landisk_ledparam & = ( ~ 0x0080 ) ;
2006-09-27 15:16:42 +09:00
2006-09-27 14:53:35 +09:00
landisk_buzzerparam > > = 1 ;
}
/*
* The Machine Vector
*/
struct sh_machine_vector mv_landisk __initmv = {
. mv_nr_irqs = 72 ,
. mv_inb = landisk_inb ,
. mv_inw = landisk_inw ,
. mv_inl = landisk_inl ,
. mv_outb = landisk_outb ,
. mv_outw = landisk_outw ,
. mv_outl = landisk_outl ,
. mv_inb_p = landisk_inb_p ,
. mv_inw_p = landisk_inw ,
. mv_inl_p = landisk_inl ,
. mv_outb_p = landisk_outb_p ,
. mv_outw_p = landisk_outw ,
. mv_outl_p = landisk_outl ,
. mv_insb = landisk_insb ,
. mv_insw = landisk_insw ,
. mv_insl = landisk_insl ,
. mv_outsb = landisk_outsb ,
. mv_outsw = landisk_outsw ,
. mv_outsl = landisk_outsl ,
2006-09-27 15:16:42 +09:00
. mv_ioport_map = landisk_ioport_map ,
2006-09-27 14:53:35 +09:00
. mv_init_irq = init_landisk_IRQ ,
# ifdef CONFIG_HEARTBEAT
. mv_heartbeat = heartbeat_landisk ,
# endif
} ;
ALIAS_MV ( landisk )
2006-09-27 15:16:42 +09:00
const char * get_system_type ( void )
{
return " LANDISK " ;
}
static void landisk_power_off ( void )
{
ctrl_outb ( 0x01 , PA_SHUTDOWN ) ;
}
static void check_usl5p ( void )
{
volatile u8 * p = ( volatile u8 * ) PA_LED ;
u8 tmp1 , tmp2 ;
tmp1 = * p ;
* p = 0x40 ;
tmp2 = * p ;
* p = tmp1 ;
landisk_arch = ( tmp2 = = 0x40 ) ;
if ( landisk_arch = = 1 ) {
/* arch == usl-5p */
landisk_ledparam = 0x00000380 ;
landisk_ledparam | = ( tmp1 & 0x07c ) ;
} else {
/* arch == landisk */
landisk_ledparam = 0x02000180 ;
landisk_ledparam | = 0x04 ;
}
}
void __init platform_setup ( void )
{
landisk_buzzerparam = 0 ;
check_usl5p ( ) ;
printk ( KERN_INFO " I-O DATA DEVICE, INC. \" LANDISK Series \" support. \n " ) ;
board_time_init = landisk_time_init ;
pm_power_off = landisk_power_off ;
}
void * area5_io_base ;
void * area6_io_base ;
static int __init landisk_cf_init ( void )
{
pgprot_t prot ;
unsigned long paddrbase , psize ;
/* open I/O area window */
paddrbase = virt_to_phys ( ( void * ) PA_AREA5_IO ) ;
psize = PAGE_SIZE ;
prot = PAGE_KERNEL_PCC ( 1 , _PAGE_PCC_IO16 ) ;
area5_io_base = p3_ioremap ( paddrbase , psize , prot . pgprot ) ;
if ( ! area5_io_base ) {
printk ( " allocate_cf_area : can't open CF I/O window! \n " ) ;
return - ENOMEM ;
}
paddrbase = virt_to_phys ( ( void * ) PA_AREA6_IO ) ;
psize = PAGE_SIZE ;
prot = PAGE_KERNEL_PCC ( 0 , _PAGE_PCC_IO16 ) ;
area6_io_base = p3_ioremap ( paddrbase , psize , prot . pgprot ) ;
if ( ! area6_io_base ) {
printk ( " allocate_cf_area : can't open HDD I/O window! \n " ) ;
return - ENOMEM ;
}
printk ( KERN_INFO " Allocate Area5/6 success. \n " ) ;
/* XXX : do we need attribute and common-memory area also? */
return 0 ;
}
__initcall ( landisk_cf_init ) ;