aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2005-08-17 02:41:44 -0400
committerPaul Mackerras <paulus@samba.org>2005-08-29 23:23:47 -0400
commit71d276d751ff5ddba28312aecefb174b20a5b970 (patch)
tree1d2262f427fb0e117d0ad464eaf3375373e166f8 /arch
parentb877b90f227fb9698d99fb70492d432362584082 (diff)
[PATCH] Create vio_bus_ops
Create vio_bus_ops so that we just pass a structure to vio_bus_init instead of three separate function pointers. Rearrange vio.h to avoid forward references. vio.h only needs struct device_node from prom.h so remove the include and just declare it. Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/ppc64/kernel/iSeries_vio.c6
-rw-r--r--arch/ppc64/kernel/pSeries_vio.c10
-rw-r--r--arch/ppc64/kernel/vio.c24
3 files changed, 20 insertions, 20 deletions
diff --git a/arch/ppc64/kernel/iSeries_vio.c b/arch/ppc64/kernel/iSeries_vio.c
index d0960a82708c..6b754b0c8344 100644
--- a/arch/ppc64/kernel/iSeries_vio.c
+++ b/arch/ppc64/kernel/iSeries_vio.c
@@ -131,6 +131,10 @@ static int vio_match_device_iseries(const struct vio_device_id *id,
131 return strncmp(dev->type, id->type, strlen(id->type)) == 0; 131 return strncmp(dev->type, id->type, strlen(id->type)) == 0;
132} 132}
133 133
134static struct vio_bus_ops vio_bus_ops_iseries = {
135 .match = vio_match_device_iseries,
136};
137
134/** 138/**
135 * vio_bus_init_iseries: - Initialize the iSeries virtual IO bus 139 * vio_bus_init_iseries: - Initialize the iSeries virtual IO bus
136 */ 140 */
@@ -138,7 +142,7 @@ static int __init vio_bus_init_iseries(void)
138{ 142{
139 int err; 143 int err;
140 144
141 err = vio_bus_init(vio_match_device_iseries, NULL, NULL); 145 err = vio_bus_init(&vio_bus_ops_iseries);
142 if (err == 0) { 146 if (err == 0) {
143 iommu_vio_init(); 147 iommu_vio_init();
144 vio_bus_device.iommu_table = &vio_iommu_table; 148 vio_bus_device.iommu_table = &vio_iommu_table;
diff --git a/arch/ppc64/kernel/pSeries_vio.c b/arch/ppc64/kernel/pSeries_vio.c
index 81e94f8aa846..e0ae06f58f86 100644
--- a/arch/ppc64/kernel/pSeries_vio.c
+++ b/arch/ppc64/kernel/pSeries_vio.c
@@ -76,6 +76,12 @@ static void vio_unregister_device_pseries(struct vio_dev *viodev)
76 device_remove_file(&viodev->dev, &dev_attr_devspec); 76 device_remove_file(&viodev->dev, &dev_attr_devspec);
77} 77}
78 78
79static struct vio_bus_ops vio_bus_ops_pseries = {
80 .match = vio_match_device_pseries,
81 .unregister_device = vio_unregister_device_pseries,
82 .release_device = vio_release_device_pseries,
83};
84
79/** 85/**
80 * vio_bus_init_pseries: - Initialize the pSeries virtual IO bus 86 * vio_bus_init_pseries: - Initialize the pSeries virtual IO bus
81 */ 87 */
@@ -83,9 +89,7 @@ static int __init vio_bus_init_pseries(void)
83{ 89{
84 int err; 90 int err;
85 91
86 err = vio_bus_init(vio_match_device_pseries, 92 err = vio_bus_init(&vio_bus_ops_pseries);
87 vio_unregister_device_pseries,
88 vio_release_device_pseries);
89 if (err == 0) 93 if (err == 0)
90 probe_bus_pseries(); 94 probe_bus_pseries();
91 return err; 95 return err;
diff --git a/arch/ppc64/kernel/vio.c b/arch/ppc64/kernel/vio.c
index 3eab2290b12a..93c437a0911b 100644
--- a/arch/ppc64/kernel/vio.c
+++ b/arch/ppc64/kernel/vio.c
@@ -32,10 +32,7 @@ struct vio_dev vio_bus_device = { /* fake "parent" device */
32 .dev.bus = &vio_bus_type, 32 .dev.bus = &vio_bus_type,
33}; 33};
34 34
35static int (*is_match)(const struct vio_device_id *id, 35static struct vio_bus_ops vio_bus_ops;
36 const struct vio_dev *dev);
37static void (*unregister_device_callback)(struct vio_dev *dev);
38static void (*release_device_callback)(struct device *dev);
39 36
40/* 37/*
41 * Convert from struct device to struct vio_dev and pass to driver. 38 * Convert from struct device to struct vio_dev and pass to driver.
@@ -115,7 +112,7 @@ static const struct vio_device_id *vio_match_device(
115 const struct vio_device_id *ids, const struct vio_dev *dev) 112 const struct vio_device_id *ids, const struct vio_dev *dev)
116{ 113{
117 while (ids->type) { 114 while (ids->type) {
118 if (is_match(ids, dev)) 115 if (vio_bus_ops.match(ids, dev))
119 return ids; 116 return ids;
120 ids++; 117 ids++;
121 } 118 }
@@ -125,16 +122,11 @@ static const struct vio_device_id *vio_match_device(
125/** 122/**
126 * vio_bus_init: - Initialize the virtual IO bus 123 * vio_bus_init: - Initialize the virtual IO bus
127 */ 124 */
128int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id, 125int __init vio_bus_init(struct vio_bus_ops *ops)
129 const struct vio_dev *dev),
130 void (*unregister_dev)(struct vio_dev *),
131 void (*release_dev)(struct device *))
132{ 126{
133 int err; 127 int err;
134 128
135 is_match = match_func; 129 vio_bus_ops = *ops;
136 unregister_device_callback = unregister_dev;
137 release_device_callback = release_dev;
138 130
139 err = bus_register(&vio_bus_type); 131 err = bus_register(&vio_bus_type);
140 if (err) { 132 if (err) {
@@ -159,8 +151,8 @@ int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
159/* vio_dev refcount hit 0 */ 151/* vio_dev refcount hit 0 */
160static void __devinit vio_dev_release(struct device *dev) 152static void __devinit vio_dev_release(struct device *dev)
161{ 153{
162 if (release_device_callback) 154 if (vio_bus_ops.release_device)
163 release_device_callback(dev); 155 vio_bus_ops.release_device(dev);
164 kfree(to_vio_dev(dev)); 156 kfree(to_vio_dev(dev));
165} 157}
166 158
@@ -191,8 +183,8 @@ struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev)
191 183
192void __devinit vio_unregister_device(struct vio_dev *viodev) 184void __devinit vio_unregister_device(struct vio_dev *viodev)
193{ 185{
194 if (unregister_device_callback) 186 if (vio_bus_ops.unregister_device)
195 unregister_device_callback(viodev); 187 vio_bus_ops.unregister_device(viodev);
196 device_remove_file(&viodev->dev, &dev_attr_name); 188 device_remove_file(&viodev->dev, &dev_attr_name);
197 device_unregister(&viodev->dev); 189 device_unregister(&viodev->dev);
198} 190}