2005-04-17 02:20:36 +04:00
/*
* * hppb . c :
* * HP - PB bus driver for the NOVA and K - Class systems .
* *
* * ( c ) Copyright 2002 Ryan Bradetich
* * ( c ) Copyright 2002 Hewlett - Packard Company
* *
* * This program is free software ; you can redistribute it and / or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation ; either version 2 of the License , or
* * ( at your option ) any later version .
* *
*/
# include <linux/types.h>
# include <linux/init.h>
# include <linux/mm.h>
# include <linux/slab.h>
2007-07-17 21:30:38 +04:00
# include <linux/dma-mapping.h>
2005-04-17 02:20:36 +04:00
# include <linux/ioport.h>
# include <asm/io.h>
# include <asm/hardware.h>
# include <asm/parisc-device.h>
2019-01-29 21:13:04 +03:00
# include "iommu.h"
2005-04-17 02:20:36 +04:00
struct hppb_card {
unsigned long hpa ;
struct resource mmio_region ;
struct hppb_card * next ;
} ;
2008-12-02 06:28:16 +03:00
static struct hppb_card hppb_card_head = {
2005-04-17 02:20:36 +04:00
. hpa = 0 ,
. next = NULL ,
} ;
# define IO_IO_LOW offsetof(struct bc_module, io_io_low)
# define IO_IO_HIGH offsetof(struct bc_module, io_io_high)
/**
* hppb_probe - Determine if the hppb driver should claim this device .
* @ dev : The device which has been found
*
* Determine if hppb driver should claim this chip ( return 0 ) or not
* ( return 1 ) . If so , initialize the chip and tell other partners in crime
* they have work to do .
*/
2017-08-21 23:02:19 +03:00
static int __init hppb_probe ( struct parisc_device * dev )
2005-04-17 02:20:36 +04:00
{
int status ;
struct hppb_card * card = & hppb_card_head ;
while ( card - > next ) {
card = card - > next ;
}
if ( card - > hpa ) {
2006-01-17 22:40:40 +03:00
card - > next = kzalloc ( sizeof ( struct hppb_card ) , GFP_KERNEL ) ;
2005-04-17 02:20:36 +04:00
if ( ! card - > next ) {
printk ( KERN_ERR " HP-PB: Unable to allocate memory. \n " ) ;
return 1 ;
}
card = card - > next ;
}
2009-08-02 17:42:39 +04:00
printk ( KERN_INFO " Found GeckoBoa at 0x%llx \n " ,
( unsigned long long ) dev - > hpa . start ) ;
2005-04-17 02:20:36 +04:00
2005-10-22 06:36:40 +04:00
card - > hpa = dev - > hpa . start ;
2005-04-17 02:20:36 +04:00
card - > mmio_region . name = " HP-PB Bus " ;
card - > mmio_region . flags = IORESOURCE_MEM ;
2005-10-22 06:36:40 +04:00
card - > mmio_region . start = gsc_readl ( dev - > hpa . start + IO_IO_LOW ) ;
card - > mmio_region . end = gsc_readl ( dev - > hpa . start + IO_IO_HIGH ) - 1 ;
2005-04-17 02:20:36 +04:00
status = ccio_request_resource ( dev , & card - > mmio_region ) ;
if ( status < 0 ) {
2010-11-13 00:38:00 +03:00
printk ( KERN_ERR " %s: failed to claim HP-PB bus space (%pR) \n " ,
__FILE__ , & card - > mmio_region ) ;
2005-04-17 02:20:36 +04:00
}
return 0 ;
}
2017-08-21 23:02:19 +03:00
static const struct parisc_device_id hppb_tbl [ ] __initconst = {
2006-11-03 08:05:01 +03:00
{ HPHW_BCPORT , HVERSION_REV_ANY_ID , 0x500 , 0xc } , /* E25 and K */
{ HPHW_BCPORT , 0x0 , 0x501 , 0xc } , /* E35 */
{ HPHW_BCPORT , 0x0 , 0x502 , 0xc } , /* E45 */
{ HPHW_BCPORT , 0x0 , 0x503 , 0xc } , /* E55 */
2005-04-17 02:20:36 +04:00
{ 0 , }
} ;
2017-08-21 23:02:19 +03:00
static struct parisc_driver hppb_driver __refdata = {
2005-10-22 06:36:23 +04:00
. name = " gecko_boa " ,
2005-04-17 02:20:36 +04:00
. id_table = hppb_tbl ,
. probe = hppb_probe ,
} ;
/**
2008-02-03 18:24:37 +03:00
* hppb_init - HP - PB bus initialization procedure .
2005-04-17 02:20:36 +04:00
*
* Register this driver .
*/
void __init hppb_init ( void )
{
register_parisc_driver ( & hppb_driver ) ;
}