linux/drivers/parisc/hppb.c
<<
>>
Prefs
   1/*
   2** hppb.c:
   3**      HP-PB bus driver for the NOVA and K-Class systems.
   4**
   5**      (c) Copyright 2002 Ryan Bradetich
   6**      (c) Copyright 2002 Hewlett-Packard Company
   7**
   8** This program is free software; you can redistribute it and/or modify
   9** it under the terms of the GNU General Public License as published by
  10** the Free Software Foundation; either version 2 of the License, or
  11** (at your option) any later version.
  12**
  13*/
  14
  15#include <linux/types.h>
  16#include <linux/init.h>
  17#include <linux/mm.h>
  18#include <linux/slab.h>
  19#include <linux/dma-mapping.h>
  20#include <linux/ioport.h>
  21
  22#include <asm/io.h>
  23#include <asm/hardware.h>
  24#include <asm/parisc-device.h>
  25
  26struct hppb_card {
  27        unsigned long hpa;
  28        struct resource mmio_region;
  29        struct hppb_card *next;
  30};
  31
  32static struct hppb_card hppb_card_head = {
  33        .hpa = 0,
  34        .next = NULL,
  35};
  36
  37#define IO_IO_LOW  offsetof(struct bc_module, io_io_low)
  38#define IO_IO_HIGH offsetof(struct bc_module, io_io_high)
  39
  40/**
  41 * hppb_probe - Determine if the hppb driver should claim this device.
  42 * @dev: The device which has been found
  43 *
  44 * Determine if hppb driver should claim this chip (return 0) or not 
  45 * (return 1). If so, initialize the chip and tell other partners in crime 
  46 * they have work to do.
  47 */
  48static int hppb_probe(struct parisc_device *dev)
  49{
  50        int status;
  51        struct hppb_card *card = &hppb_card_head;
  52
  53        while(card->next) {
  54                card = card->next;
  55        }
  56
  57        if(card->hpa) {
  58                card->next = kzalloc(sizeof(struct hppb_card), GFP_KERNEL);
  59                if(!card->next) {
  60                        printk(KERN_ERR "HP-PB: Unable to allocate memory.\n");
  61                        return 1;
  62                }
  63                card = card->next;
  64        }
  65        printk(KERN_INFO "Found GeckoBoa at 0x%llx\n",
  66                        (unsigned long long) dev->hpa.start);
  67
  68        card->hpa = dev->hpa.start;
  69        card->mmio_region.name = "HP-PB Bus";
  70        card->mmio_region.flags = IORESOURCE_MEM;
  71
  72        card->mmio_region.start = gsc_readl(dev->hpa.start + IO_IO_LOW);
  73        card->mmio_region.end = gsc_readl(dev->hpa.start + IO_IO_HIGH) - 1;
  74
  75        status = ccio_request_resource(dev, &card->mmio_region);
  76        if(status < 0) {
  77                printk(KERN_ERR "%s: failed to claim HP-PB bus space (%pR)\n",
  78                        __FILE__, &card->mmio_region);
  79        }
  80
  81        return 0;
  82}
  83
  84static struct parisc_device_id hppb_tbl[] = {
  85        { HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, /* E25 and K */
  86        { HPHW_BCPORT, 0x0, 0x501, 0xc }, /* E35 */
  87        { HPHW_BCPORT, 0x0, 0x502, 0xc }, /* E45 */
  88        { HPHW_BCPORT, 0x0, 0x503, 0xc }, /* E55 */
  89        { 0, }
  90};
  91
  92static struct parisc_driver hppb_driver = {
  93        .name =         "gecko_boa",
  94        .id_table =     hppb_tbl,
  95        .probe =        hppb_probe,
  96};
  97
  98/**
  99 * hppb_init - HP-PB bus initialization procedure.
 100 *
 101 * Register this driver.   
 102 */
 103void __init hppb_init(void)
 104{
 105        register_parisc_driver(&hppb_driver);
 106}
 107