hppb.c 2.68 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
** 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>
19
#include <linux/dma-mapping.h>
Linus Torvalds's avatar
Linus Torvalds committed
20 21 22 23 24 25 26 27 28 29 30 31
#include <linux/ioport.h>

#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/parisc-device.h>

struct hppb_card {
	unsigned long hpa;
	struct resource mmio_region;
	struct hppb_card *next;
};

32
static struct hppb_card hppb_card_head = {
Linus Torvalds's avatar
Linus Torvalds committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
	.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.
 */
static int hppb_probe(struct parisc_device *dev)
{
	int status;
	struct hppb_card *card = &hppb_card_head;

	while(card->next) {
		card = card->next;
	}

	if(card->hpa) {
58
		card->next = kzalloc(sizeof(struct hppb_card), GFP_KERNEL);
Linus Torvalds's avatar
Linus Torvalds committed
59 60 61 62 63 64
		if(!card->next) {
			printk(KERN_ERR "HP-PB: Unable to allocate memory.\n");
			return 1;
		}
		card = card->next;
	}
65 66
	printk(KERN_INFO "Found GeckoBoa at 0x%llx\n",
			(unsigned long long) dev->hpa.start);
Linus Torvalds's avatar
Linus Torvalds committed
67

68
	card->hpa = dev->hpa.start;
Linus Torvalds's avatar
Linus Torvalds committed
69 70 71
	card->mmio_region.name = "HP-PB Bus";
	card->mmio_region.flags = IORESOURCE_MEM;

72 73
	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;
Linus Torvalds's avatar
Linus Torvalds committed
74 75 76

	status = ccio_request_resource(dev, &card->mmio_region);
	if(status < 0) {
77 78
		printk(KERN_ERR "%s: failed to claim HP-PB bus space (%pR)\n",
			__FILE__, &card->mmio_region);
Linus Torvalds's avatar
Linus Torvalds committed
79 80 81 82 83 84
	}

        return 0;
}

static struct parisc_device_id hppb_tbl[] = {
85 86 87 88
        { 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 */
Linus Torvalds's avatar
Linus Torvalds committed
89 90 91 92
        { 0, }
};

static struct parisc_driver hppb_driver = {
93
        .name =         "gecko_boa",
Linus Torvalds's avatar
Linus Torvalds committed
94 95 96 97 98
        .id_table =     hppb_tbl,
	.probe =        hppb_probe,
};

/**
99
 * hppb_init - HP-PB bus initialization procedure.
Linus Torvalds's avatar
Linus Torvalds committed
100 101 102 103 104 105 106
 *
 * Register this driver.   
 */
void __init hppb_init(void)
{
        register_parisc_driver(&hppb_driver);
}