2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* ASP Device Driver
*
* ( c ) Copyright 2000 The Puffin Group Inc .
*
2023-08-27 11:49:20 +03:00
* ( c ) 2000 - 2023 by Helge Deller < deller @ gmx . de >
2005-04-17 02:20:36 +04:00
*/
# include <linux/errno.h>
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/module.h>
# include <linux/types.h>
# include <asm/io.h>
# include <asm/led.h>
# include "gsc.h"
# define ASP_GSC_IRQ 3 /* hardcoded interrupt for GSC */
# define ASP_VER_OFFSET 0x20 /* offset of ASP version */
# define ASP_LED_ADDR 0xf0800020
# define VIPER_INT_WORD 0xFFFBF088 /* addr of viper interrupt word */
static struct gsc_asic asp ;
static void asp_choose_irq ( struct parisc_device * dev , void * ctrl )
{
int irq ;
switch ( dev - > id . sversion ) {
case 0x71 : irq = 9 ; break ; /* SCSI */
case 0x72 : irq = 8 ; break ; /* LAN */
case 0x73 : irq = 1 ; break ; /* HIL */
case 0x74 : irq = 7 ; break ; /* Centronics */
case 0x75 : irq = ( dev - > hw_path = = 4 ) ? 5 : 6 ; break ; /* RS232 */
case 0x76 : irq = 10 ; break ; /* EISA BA */
case 0x77 : irq = 11 ; break ; /* Graphics1 */
case 0x7a : irq = 13 ; break ; /* Audio (Bushmaster) */
case 0x7b : irq = 13 ; break ; /* Audio (Scorpio) */
case 0x7c : irq = 3 ; break ; /* FW SCSI */
case 0x7d : irq = 4 ; break ; /* FDDI */
case 0x7f : irq = 13 ; break ; /* Audio (Outfield) */
default : return ; /* Unknown */
}
gsc_asic_assign_irq ( ctrl , irq , & dev - > irq ) ;
switch ( dev - > id . sversion ) {
case 0x73 : irq = 2 ; break ; /* i8042 High-priority */
case 0x76 : irq = 0 ; break ; /* EISA BA */
default : return ; /* Other */
}
gsc_asic_assign_irq ( ctrl , irq , & dev - > aux_irq ) ;
}
/* There are two register ranges we're interested in. Interrupt /
* Status / LED are at 0xf080 xxxx and Asp special registers are at
* 0xf082f xxx . PDC only tells us that Asp is at 0xf082f000 , so for
* the purposes of interrupt handling , we have to tell other bits of
* the kernel to look at the other registers .
*/
# define ASP_INTERRUPT_ADDR 0xf0800000
2008-12-02 06:28:16 +03:00
static int __init asp_init_chip ( struct parisc_device * dev )
2005-04-17 02:20:36 +04:00
{
struct gsc_irq gsc_irq ;
int ret ;
2005-10-22 06:36:40 +04:00
asp . version = gsc_readb ( dev - > hpa . start + ASP_VER_OFFSET ) & 0xf ;
2005-04-17 02:20:36 +04:00
asp . name = ( asp . version = = 1 ) ? " Asp " : " Cutoff " ;
asp . hpa = ASP_INTERRUPT_ADDR ;
printk ( KERN_INFO " %s version %d at 0x%lx found. \n " ,
parisc: drivers: fix warnings
ccio-dma.c:456: warning: overflow in implicit constant conversion
ccio-dma.c:459: warning: overflow in implicit constant conversion
ccio-dma.c:1032: warning: unused variable 'j'
ccio-dma.c:1031: warning: unused variable 'max'
ccio-dma.c:1031: warning: unused variable 'min'
ccio-dma.c:1031: warning: unused variable 'avg'
ccio-dma.c:1403: warning: format '%08lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
ccio-dma.c:1403: warning: format '%08lx' expects type 'long unsigned int', but argument 4 has type 'resource_size_t'
ccio-dma.c:1554: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
dino.c:822: warning: format '%lx' expects type 'long unsigned int', but argument 4 has type 'resource_size_t'
dino.c:822: warning: format '%lx' expects type 'long unsigned int', but argument 5 has type 'resource_size_t'
dino.c:902: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
dino.c:902: warning: format '%lx' expects type 'long unsigned int', but argument 4 has type 'resource_size_t'
asp.c:84: warning: format '%lx' expects type 'long unsigned int', but argument 4 has type 'resource_size_t'
eisa.c:317: warning: format '%08lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
eisa_enumerator.c:101: warning: format '%lx' expects type 'long unsigned int', but argument 2 has type 'resource_size_t'
eisa_enumerator.c:101: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
eisa_enumerator.c:191: warning: format '%lx' expects type 'long unsigned int', but argument 2 has type 'resource_size_t'
eisa_enumerator.c:191: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'resource_size_t'
Signed-off-by: Alexander Beregalov <a.beregalov@gmail.com>
Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
2009-03-19 13:54:07 +03:00
asp . name , asp . version , ( unsigned long ) dev - > hpa . start ) ;
2005-04-17 02:20:36 +04:00
/* the IRQ ASP should use */
ret = - EBUSY ;
dev - > irq = gsc_claim_irq ( & gsc_irq , ASP_GSC_IRQ ) ;
if ( dev - > irq < 0 ) {
2008-05-15 03:21:56 +04:00
printk ( KERN_ERR " %s(): cannot get GSC irq \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
goto out ;
}
asp . eim = ( ( u32 ) gsc_irq . txn_addr ) | gsc_irq . txn_data ;
ret = request_irq ( gsc_irq . irq , gsc_asic_intr , 0 , " asp " , & asp ) ;
if ( ret < 0 )
goto out ;
/* Program VIPER to interrupt on the ASP irq */
gsc_writel ( ( 1 < < ( 31 - ASP_GSC_IRQ ) ) , VIPER_INT_WORD ) ;
/* Done init'ing, register this driver */
ret = gsc_common_setup ( dev , & asp ) ;
if ( ret )
goto out ;
gsc_fixup_irqs ( dev , & asp , asp_choose_irq ) ;
/* Mongoose is a sibling of Asp, not a child... */
gsc_fixup_irqs ( parisc_parent ( dev ) , & asp , asp_choose_irq ) ;
/* initialize the chassis LEDs */
# ifdef CONFIG_CHASSIS_LCD_LED
register_led_driver ( DISPLAY_MODEL_OLD_ASP , LED_CMD_REG_NONE ,
ASP_LED_ADDR ) ;
# endif
out :
return ret ;
}
2017-08-21 23:02:19 +03:00
static const struct parisc_device_id asp_tbl [ ] __initconst = {
2005-04-17 02:20:36 +04:00
{ HPHW_BA , HVERSION_REV_ANY_ID , HVERSION_ANY_ID , 0x00070 } ,
{ 0 , }
} ;
2023-08-27 11:49:20 +03:00
MODULE_DEVICE_TABLE ( parisc , asp_tbl ) ;
2005-04-17 02:20:36 +04:00
2023-08-27 11:49:20 +03:00
static struct parisc_driver asp_driver __refdata = {
2005-10-22 06:36:23 +04:00
. name = " asp " ,
2005-04-17 02:20:36 +04:00
. id_table = asp_tbl ,
. probe = asp_init_chip ,
} ;
2023-08-27 11:49:20 +03:00
static int __init asp_init ( void )
{
return register_parisc_driver ( & asp_driver ) ;
}
arch_initcall ( asp_init ) ;