Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
wax.c
Go to the documentation of this file.
1 /*
2  * WAX Device Driver
3  *
4  * (c) Copyright 2000 The Puffin Group Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * by Helge Deller <[email protected]>
12  */
13 
14 #include <linux/errno.h>
15 #include <linux/init.h>
16 #include <linux/interrupt.h>
17 #include <linux/ioport.h>
18 #include <linux/slab.h>
19 #include <linux/module.h>
20 #include <linux/types.h>
21 
22 #include <asm/io.h>
23 #include <asm/hardware.h>
24 
25 #include "gsc.h"
26 
27 #define WAX_GSC_IRQ 7 /* Hardcoded Interrupt for GSC */
28 
29 static void wax_choose_irq(struct parisc_device *dev, void *ctrl)
30 {
31  int irq;
32 
33  switch (dev->id.sversion) {
34  case 0x73: irq = 1; break; /* i8042 General */
35  case 0x8c: irq = 6; break; /* Serial */
36  case 0x90: irq = 10; break; /* EISA */
37  default: return; /* Unknown */
38  }
39 
40  gsc_asic_assign_irq(ctrl, irq, &dev->irq);
41 
42  switch (dev->id.sversion) {
43  case 0x73: irq = 2; break; /* i8042 High-priority */
44  case 0x90: irq = 0; break; /* EISA NMI */
45  default: return; /* No secondary IRQ */
46  }
47 
48  gsc_asic_assign_irq(ctrl, irq, &dev->aux_irq);
49 }
50 
51 static void __init
52 wax_init_irq(struct gsc_asic *wax)
53 {
54  unsigned long base = wax->hpa;
55 
56  /* Wax-off */
57  gsc_writel(0x00000000, base+OFFSET_IMR);
58 
59  /* clear pending interrupts */
60  gsc_readl(base+OFFSET_IRR);
61 
62  /* We're not really convinced we want to reset the onboard
63  * devices. Firmware does it for us...
64  */
65 
66  /* Resets */
67 // gsc_writel(0xFFFFFFFF, base+0x1000); /* HIL */
68 // gsc_writel(0xFFFFFFFF, base+0x2000); /* RS232-B on Wax */
69 }
70 
71 static int __init wax_init_chip(struct parisc_device *dev)
72 {
73  struct gsc_asic *wax;
74  struct parisc_device *parent;
75  struct gsc_irq gsc_irq;
76  int ret;
77 
78  wax = kzalloc(sizeof(*wax), GFP_KERNEL);
79  if (!wax)
80  return -ENOMEM;
81 
82  wax->name = "wax";
83  wax->hpa = dev->hpa.start;
84 
85  wax->version = 0; /* gsc_readb(wax->hpa+WAX_VER); */
86  printk(KERN_INFO "%s at 0x%lx found.\n", wax->name, wax->hpa);
87 
88  /* Stop wax hissing for a bit */
89  wax_init_irq(wax);
90 
91  /* the IRQ wax should use */
93  if (dev->irq < 0) {
94  printk(KERN_ERR "%s(): cannot get GSC irq\n",
95  __func__);
96  kfree(wax);
97  return -EBUSY;
98  }
99 
100  wax->eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
101 
102  ret = request_irq(gsc_irq.irq, gsc_asic_intr, 0, "wax", wax);
103  if (ret < 0) {
104  kfree(wax);
105  return ret;
106  }
107 
108  /* enable IRQ's for devices below WAX */
109  gsc_writel(wax->eim, wax->hpa + OFFSET_IAR);
110 
111  /* Done init'ing, register this driver */
112  ret = gsc_common_setup(dev, wax);
113  if (ret) {
114  kfree(wax);
115  return ret;
116  }
117 
118  gsc_fixup_irqs(dev, wax, wax_choose_irq);
119  /* On 715-class machines, Wax EISA is a sibling of Wax, not a child. */
120  parent = parisc_parent(dev);
121  if (parent->id.hw_type != HPHW_IOA) {
122  gsc_fixup_irqs(parent, wax, wax_choose_irq);
123  }
124 
125  return ret;
126 }
127 
128 static struct parisc_device_id wax_tbl[] = {
130  { 0, }
131 };
132 
133 MODULE_DEVICE_TABLE(parisc, wax_tbl);
134 
136  .name = "wax",
137  .id_table = wax_tbl,
138  .probe = wax_init_chip,
139 };