• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
26  struct hppb_card {
27  	unsigned long hpa;
28  	struct resource mmio_region;
29  	struct hppb_card *next;
30  };
31  
32  static 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   */
hppb_probe(struct parisc_device * dev)48  static 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  
84  static 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  
92  static 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   */
hppb_init(void)103  void __init hppb_init(void)
104  {
105          register_parisc_driver(&hppb_driver);
106  }
107