2005-04-16 15:20:36 -07:00
# ifndef _I8042_SPARCIO_H
# define _I8042_SPARCIO_H
# include <asm/io.h>
# include <asm/oplib.h>
2006-06-29 15:42:29 -07:00
# include <asm/prom.h>
# include <asm/of_device.h>
2005-04-16 15:20:36 -07:00
static int i8042_kbd_irq = - 1 ;
static int i8042_aux_irq = - 1 ;
# define I8042_KBD_IRQ i8042_kbd_irq
# define I8042_AUX_IRQ i8042_aux_irq
# define I8042_KBD_PHYS_DESC "sparcps2 / serio0"
# define I8042_AUX_PHYS_DESC "sparcps2 / serio1"
# define I8042_MUX_PHYS_DESC "sparcps2 / serio%d"
static void __iomem * kbd_iobase ;
2006-12-28 21:01:32 -08:00
static struct resource * kbd_res ;
2005-04-16 15:20:36 -07:00
# define I8042_COMMAND_REG (kbd_iobase + 0x64UL)
# define I8042_DATA_REG (kbd_iobase + 0x60UL)
static inline int i8042_read_data ( void )
{
return readb ( kbd_iobase + 0x60UL ) ;
}
static inline int i8042_read_status ( void )
{
return readb ( kbd_iobase + 0x64UL ) ;
}
static inline void i8042_write_data ( int val )
{
writeb ( val , kbd_iobase + 0x60UL ) ;
}
static inline void i8042_write_command ( int val )
{
writeb ( val , kbd_iobase + 0x64UL ) ;
}
# define OBP_PS2KBD_NAME1 "kb_ps2"
# define OBP_PS2KBD_NAME2 "keyboard"
# define OBP_PS2MS_NAME1 "kdmouse"
# define OBP_PS2MS_NAME2 "mouse"
2006-06-29 15:42:29 -07:00
static int __devinit sparc_i8042_probe ( struct of_device * op , const struct of_device_id * match )
{
struct device_node * dp = op - > node ;
dp = dp - > child ;
while ( dp ) {
if ( ! strcmp ( dp - > name , OBP_PS2KBD_NAME1 ) | |
! strcmp ( dp - > name , OBP_PS2KBD_NAME2 ) ) {
struct of_device * kbd = of_find_device_by_node ( dp ) ;
unsigned int irq = kbd - > irqs [ 0 ] ;
if ( irq = = 0xffffffff )
irq = op - > irqs [ 0 ] ;
i8042_kbd_irq = irq ;
kbd_iobase = of_ioremap ( & kbd - > resource [ 0 ] ,
0 , 8 , " kbd " ) ;
2006-12-28 21:01:32 -08:00
kbd_res = & kbd - > resource [ 0 ] ;
2006-06-29 15:42:29 -07:00
} else if ( ! strcmp ( dp - > name , OBP_PS2MS_NAME1 ) | |
! strcmp ( dp - > name , OBP_PS2MS_NAME2 ) ) {
struct of_device * ms = of_find_device_by_node ( dp ) ;
unsigned int irq = ms - > irqs [ 0 ] ;
if ( irq = = 0xffffffff )
irq = op - > irqs [ 0 ] ;
i8042_aux_irq = irq ;
}
dp = dp - > sibling ;
}
return 0 ;
}
static int __devexit sparc_i8042_remove ( struct of_device * op )
{
2006-12-28 21:01:32 -08:00
of_iounmap ( kbd_res , kbd_iobase , 8 ) ;
2006-06-29 15:42:29 -07:00
return 0 ;
}
static struct of_device_id sparc_i8042_match [ ] = {
{
. name = " 8042 " ,
} ,
{ } ,
} ;
2006-07-03 00:24:21 -07:00
MODULE_DEVICE_TABLE ( of , sparc_i8042_match ) ;
2006-06-29 15:42:29 -07:00
static struct of_platform_driver sparc_i8042_driver = {
. name = " i8042 " ,
. match_table = sparc_i8042_match ,
. probe = sparc_i8042_probe ,
. remove = __devexit_p ( sparc_i8042_remove ) ,
} ;
2005-09-04 01:41:38 -05:00
static int __init i8042_platform_init ( void )
2005-04-16 15:20:36 -07:00
{
# ifndef CONFIG_PCI
2005-09-04 01:41:38 -05:00
return - ENODEV ;
2005-04-16 15:20:36 -07:00
# else
2006-06-29 15:42:29 -07:00
struct device_node * root = of_find_node_by_path ( " / " ) ;
2005-04-16 15:20:36 -07:00
2006-06-29 15:42:29 -07:00
if ( ! strcmp ( root - > name , " SUNW,JavaStation-1 " ) ) {
2005-04-16 15:20:36 -07:00
/* Hardcoded values for MrCoffee. */
i8042_kbd_irq = i8042_aux_irq = 13 | 0x20 ;
kbd_iobase = ioremap ( 0x71300060 , 8 ) ;
if ( ! kbd_iobase )
2005-09-04 01:41:38 -05:00
return - ENODEV ;
2005-04-16 15:20:36 -07:00
} else {
2006-06-29 15:42:29 -07:00
int err = of_register_driver ( & sparc_i8042_driver ,
& of_bus_type ) ;
if ( err )
return err ;
2005-04-16 15:20:36 -07:00
if ( i8042_kbd_irq = = - 1 | |
i8042_aux_irq = = - 1 ) {
2006-06-29 15:42:29 -07:00
if ( kbd_iobase ) {
2006-12-28 21:01:32 -08:00
of_iounmap ( kbd_res , kbd_iobase , 8 ) ;
2006-06-29 15:42:29 -07:00
kbd_iobase = ( void __iomem * ) NULL ;
}
2005-09-04 01:41:38 -05:00
return - ENODEV ;
2005-04-16 15:20:36 -07:00
}
}
i8042_reset = 1 ;
return 0 ;
# endif /* CONFIG_PCI */
}
static inline void i8042_platform_exit ( void )
{
# ifdef CONFIG_PCI
2006-06-29 15:42:29 -07:00
struct device_node * root = of_find_node_by_path ( " / " ) ;
if ( strcmp ( root - > name , " SUNW,JavaStation-1 " ) )
of_unregister_driver ( & sparc_i8042_driver ) ;
2005-04-16 15:20:36 -07:00
# endif
}
# endif /* _I8042_SPARCIO_H */