diff options
Diffstat (limited to 'drivers/sbus/sbus.c')
-rw-r--r-- | drivers/sbus/sbus.c | 170 |
1 files changed, 0 insertions, 170 deletions
diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c deleted file mode 100644 index 399567b7e15e..000000000000 --- a/drivers/sbus/sbus.c +++ /dev/null | |||
@@ -1,170 +0,0 @@ | |||
1 | /* sbus.c: SBus support routines. | ||
2 | * | ||
3 | * Copyright (C) 1995, 2006 David S. Miller (davem@davemloft.net) | ||
4 | */ | ||
5 | |||
6 | #include <linux/kernel.h> | ||
7 | #include <linux/slab.h> | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/device.h> | ||
10 | #include <linux/of_device.h> | ||
11 | |||
12 | #include <asm/system.h> | ||
13 | #include <asm/sbus.h> | ||
14 | #include <asm/dma.h> | ||
15 | #include <asm/oplib.h> | ||
16 | #include <asm/prom.h> | ||
17 | #include <asm/irq.h> | ||
18 | |||
19 | static ssize_t | ||
20 | show_sbusobppath_attr(struct device * dev, struct device_attribute * attr, char * buf) | ||
21 | { | ||
22 | struct sbus_dev *sbus; | ||
23 | |||
24 | sbus = to_sbus_device(dev); | ||
25 | |||
26 | return snprintf (buf, PAGE_SIZE, "%s\n", sbus->ofdev.node->full_name); | ||
27 | } | ||
28 | |||
29 | static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_sbusobppath_attr, NULL); | ||
30 | |||
31 | static void __init fill_sbus_device_iommu(struct sbus_dev *sdev) | ||
32 | { | ||
33 | struct of_device *op = of_find_device_by_node(sdev->ofdev.node); | ||
34 | struct dev_archdata *sd, *bus_sd; | ||
35 | struct sbus_bus *sbus; | ||
36 | |||
37 | sbus = sdev->bus; | ||
38 | bus_sd = &sbus->ofdev.dev.archdata; | ||
39 | |||
40 | sd = &sdev->ofdev.dev.archdata; | ||
41 | sd->iommu = bus_sd->iommu; | ||
42 | sd->stc = bus_sd->stc; | ||
43 | |||
44 | sd = &op->dev.archdata; | ||
45 | sd->iommu = bus_sd->iommu; | ||
46 | sd->stc = bus_sd->stc; | ||
47 | } | ||
48 | |||
49 | static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev) | ||
50 | { | ||
51 | struct dev_archdata *sd; | ||
52 | int err; | ||
53 | |||
54 | sd = &sdev->ofdev.dev.archdata; | ||
55 | sd->prom_node = dp; | ||
56 | sd->op = &sdev->ofdev; | ||
57 | |||
58 | sdev->ofdev.node = dp; | ||
59 | if (sdev->parent) | ||
60 | sdev->ofdev.dev.parent = &sdev->parent->ofdev.dev; | ||
61 | else | ||
62 | sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; | ||
63 | sdev->ofdev.dev.bus = &sbus_bus_type; | ||
64 | dev_set_name(&sdev->ofdev.dev, "sbus[%08x]", dp->node); | ||
65 | |||
66 | if (of_device_register(&sdev->ofdev) != 0) | ||
67 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", | ||
68 | dp->path_component_name); | ||
69 | |||
70 | /* WE HAVE BEEN INVADED BY ALIENS! */ | ||
71 | err = sysfs_create_file(&sdev->ofdev.dev.kobj, &dev_attr_obppath.attr); | ||
72 | |||
73 | fill_sbus_device_iommu(sdev); | ||
74 | } | ||
75 | |||
76 | static void __init sdev_insert(struct sbus_dev *sdev, struct sbus_dev **root) | ||
77 | { | ||
78 | while (*root) | ||
79 | root = &(*root)->next; | ||
80 | *root = sdev; | ||
81 | sdev->next = NULL; | ||
82 | } | ||
83 | |||
84 | static void __init walk_children(struct device_node *dp, struct sbus_dev *parent, struct sbus_bus *sbus) | ||
85 | { | ||
86 | dp = dp->child; | ||
87 | while (dp) { | ||
88 | struct sbus_dev *sdev; | ||
89 | |||
90 | sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); | ||
91 | if (sdev) { | ||
92 | sdev_insert(sdev, &parent->child); | ||
93 | |||
94 | sdev->bus = sbus; | ||
95 | sdev->parent = parent; | ||
96 | |||
97 | fill_sbus_device(dp, sdev); | ||
98 | |||
99 | walk_children(dp, sdev, sbus); | ||
100 | } | ||
101 | dp = dp->sibling; | ||
102 | } | ||
103 | } | ||
104 | |||
105 | static void __init build_one_sbus(struct device_node *dp, int num_sbus) | ||
106 | { | ||
107 | struct device_node *dev_dp; | ||
108 | struct sbus_bus *sbus; | ||
109 | |||
110 | sbus = kzalloc(sizeof(struct sbus_bus), GFP_ATOMIC); | ||
111 | if (!sbus) | ||
112 | return; | ||
113 | |||
114 | sbus_setup_iommu(sbus, dp); | ||
115 | |||
116 | printk("sbus%d: ", num_sbus); | ||
117 | |||
118 | sbus->ofdev.node = dp; | ||
119 | sbus->ofdev.dev.parent = NULL; | ||
120 | sbus->ofdev.dev.bus = &sbus_bus_type; | ||
121 | dev_set_name(&sbus->ofdev.dev, "sbus%d", num_sbus); | ||
122 | |||
123 | if (of_device_register(&sbus->ofdev) != 0) | ||
124 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", | ||
125 | dev_name(&sbus->ofdev.dev)); | ||
126 | |||
127 | dev_dp = dp->child; | ||
128 | while (dev_dp) { | ||
129 | struct sbus_dev *sdev; | ||
130 | |||
131 | sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); | ||
132 | if (sdev) { | ||
133 | sdev_insert(sdev, &sbus->devices); | ||
134 | |||
135 | sdev->bus = sbus; | ||
136 | sdev->parent = NULL; | ||
137 | sdev->ofdev.dev.archdata.iommu = | ||
138 | sbus->ofdev.dev.archdata.iommu; | ||
139 | sdev->ofdev.dev.archdata.stc = | ||
140 | sbus->ofdev.dev.archdata.stc; | ||
141 | |||
142 | fill_sbus_device(dev_dp, sdev); | ||
143 | |||
144 | walk_children(dev_dp, sdev, sbus); | ||
145 | } | ||
146 | dev_dp = dev_dp->sibling; | ||
147 | } | ||
148 | } | ||
149 | |||
150 | static int __init sbus_init(void) | ||
151 | { | ||
152 | struct device_node *dp; | ||
153 | const char *sbus_name = "sbus"; | ||
154 | int num_sbus = 0; | ||
155 | |||
156 | if (sparc_cpu_model == sun4d) | ||
157 | sbus_name = "sbi"; | ||
158 | |||
159 | for_each_node_by_name(dp, sbus_name) { | ||
160 | build_one_sbus(dp, num_sbus); | ||
161 | num_sbus++; | ||
162 | |||
163 | } | ||
164 | |||
165 | sbus_arch_postinit(); | ||
166 | |||
167 | return 0; | ||
168 | } | ||
169 | |||
170 | subsys_initcall(sbus_init); | ||