2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
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
* *
* *
*/
# 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 ;
}
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 ) ;
2019-09-05 17:35:12 +03:00
pr_info ( " Found GeckoBoa at %pap, bus space %pR,%s claimed. \n " ,
& dev - > hpa . start ,
& card - > mmio_region ,
( status < 0 ) ? " not " : " " ) ;
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 ) ;
}