aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2006-06-29 18:07:37 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2006-06-29 19:37:38 -0400
commit2b1e59787198e75fb2ffb3bb4fb247da1c55ac12 (patch)
tree96d74048849b310135e0c79f663b16c52186caa5 /include/asm-sparc64
parentc3a8b85f5ac2c21f4ef75e87bfe55ee7a753ffcf (diff)
[SPARC64]: of_device layer IRQ resolution
Do IRQ determination generically by parsing the PROM properties, and using IRQ controller drivers for final resolution. One immediate positive effect is that all of the IRQ frobbing in the EBUS, ISA, and PCI controller layers has been eliminated. We just look up the of_device and use the properly computed value. The PCI controller irq_build() routines are gone and no longer used. Unfortunately sbus_build_irq() has to remain as there is a direct reference to this in the sunzilog driver. That can be killed off once the sparc32 side of this is written and the sunzilog driver is transformed into an "of" bus driver. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/asm-sparc64')
-rw-r--r--include/asm-sparc64/of_device.h5
-rw-r--r--include/asm-sparc64/pbm.h3
-rw-r--r--include/asm-sparc64/prom.h8
3 files changed, 14 insertions, 2 deletions
diff --git a/include/asm-sparc64/of_device.h b/include/asm-sparc64/of_device.h
index 37c5856fae12..a62c7b997d66 100644
--- a/include/asm-sparc64/of_device.h
+++ b/include/asm-sparc64/of_device.h
@@ -22,7 +22,8 @@ struct of_device
22 struct device_node *node; 22 struct device_node *node;
23 struct device dev; 23 struct device dev;
24 struct resource resource[PROMREG_MAX]; 24 struct resource resource[PROMREG_MAX];
25 unsigned int irq; 25 unsigned int irqs[PROMINTR_MAX];
26 int num_irqs;
26 27
27 void *sysdata; 28 void *sysdata;
28 29
@@ -35,6 +36,8 @@ struct of_device
35extern void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name); 36extern void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name);
36extern void of_iounmap(void __iomem *base, unsigned long size); 37extern void of_iounmap(void __iomem *base, unsigned long size);
37 38
39extern struct of_device *of_find_device_by_node(struct device_node *);
40
38extern const struct of_device_id *of_match_device( 41extern const struct of_device_id *of_match_device(
39 const struct of_device_id *matches, const struct of_device *dev); 42 const struct of_device_id *matches, const struct of_device *dev);
40 43
diff --git a/include/asm-sparc64/pbm.h b/include/asm-sparc64/pbm.h
index 83b3c26cd063..dcfa7629358c 100644
--- a/include/asm-sparc64/pbm.h
+++ b/include/asm-sparc64/pbm.h
@@ -16,6 +16,7 @@
16#include <asm/page.h> 16#include <asm/page.h>
17#include <asm/oplib.h> 17#include <asm/oplib.h>
18#include <asm/prom.h> 18#include <asm/prom.h>
19#include <asm/of_device.h>
19#include <asm/iommu.h> 20#include <asm/iommu.h>
20 21
21/* The abstraction used here is that there are PCI controllers, 22/* The abstraction used here is that there are PCI controllers,
@@ -209,7 +210,6 @@ struct pci_controller_info {
209 210
210 /* Operations which are controller specific. */ 211 /* Operations which are controller specific. */
211 void (*scan_bus)(struct pci_controller_info *); 212 void (*scan_bus)(struct pci_controller_info *);
212 unsigned int (*irq_build)(struct pci_pbm_info *, struct pci_dev *, unsigned int);
213 void (*base_address_update)(struct pci_dev *, int); 213 void (*base_address_update)(struct pci_dev *, int);
214 void (*resource_adjust)(struct pci_dev *, struct resource *, struct resource *); 214 void (*resource_adjust)(struct pci_dev *, struct resource *, struct resource *);
215 215
@@ -226,6 +226,7 @@ struct pci_controller_info {
226struct pcidev_cookie { 226struct pcidev_cookie {
227 struct pci_pbm_info *pbm; 227 struct pci_pbm_info *pbm;
228 struct device_node *prom_node; 228 struct device_node *prom_node;
229 struct of_device *op;
229 struct linux_prom_pci_registers prom_regs[PROMREG_MAX]; 230 struct linux_prom_pci_registers prom_regs[PROMREG_MAX];
230 int num_prom_regs; 231 int num_prom_regs;
231 struct linux_prom_pci_registers prom_assignments[PROMREG_MAX]; 232 struct linux_prom_pci_registers prom_assignments[PROMREG_MAX];
diff --git a/include/asm-sparc64/prom.h b/include/asm-sparc64/prom.h
index aad16c2aa5e8..99671ed6625d 100644
--- a/include/asm-sparc64/prom.h
+++ b/include/asm-sparc64/prom.h
@@ -34,6 +34,7 @@ struct property {
34 unsigned int unique_id; 34 unsigned int unique_id;
35}; 35};
36 36
37struct of_irq_controller;
37struct device_node { 38struct device_node {
38 char *name; 39 char *name;
39 char *type; 40 char *type;
@@ -53,6 +54,13 @@ struct device_node {
53 unsigned long _flags; 54 unsigned long _flags;
54 void *data; 55 void *data;
55 unsigned int unique_id; 56 unsigned int unique_id;
57
58 struct of_irq_controller *irq_trans;
59};
60
61struct of_irq_controller {
62 unsigned int (*irq_build)(struct device_node *, unsigned int, void *);
63 void *data;
56}; 64};
57 65
58/* flag descriptions */ 66/* flag descriptions */