summary refs log tree commit diff
path: root/arch
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2005-08-17 16:41:44 +1000
committerPaul Mackerras <paulus@samba.org>2005-08-30 13:23:47 +1000
commit71d276d751ff5ddba28312aecefb174b20a5b970 (patch)
tree1d2262f427fb0e117d0ad464eaf3375373e166f8 /arch
parentb877b90f227fb9698d99fb70492d432362584082 (diff)
downloadlinux-71d276d751ff5ddba28312aecefb174b20a5b970.tar.gz
[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,
 	return strncmp(dev->type, id->type, strlen(id->type)) == 0;
 }
 
+static struct vio_bus_ops vio_bus_ops_iseries = {
+	.match = vio_match_device_iseries,
+};
+
 /**
  * vio_bus_init_iseries: - Initialize the iSeries virtual IO bus
  */
@@ -138,7 +142,7 @@ static int __init vio_bus_init_iseries(void)
 {
 	int err;
 
-	err = vio_bus_init(vio_match_device_iseries, NULL, NULL);
+	err = vio_bus_init(&vio_bus_ops_iseries);
 	if (err == 0) {
 		iommu_vio_init();
 		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)
 	device_remove_file(&viodev->dev, &dev_attr_devspec);
 }
 
+static struct vio_bus_ops vio_bus_ops_pseries = {
+	.match = vio_match_device_pseries,
+	.unregister_device = vio_unregister_device_pseries,
+	.release_device = vio_release_device_pseries,
+};
+
 /**
  * vio_bus_init_pseries: - Initialize the pSeries virtual IO bus
  */
@@ -83,9 +89,7 @@ static int __init vio_bus_init_pseries(void)
 {
 	int err;
 
-	err = vio_bus_init(vio_match_device_pseries,
-			vio_unregister_device_pseries,
-			vio_release_device_pseries);
+	err = vio_bus_init(&vio_bus_ops_pseries);
 	if (err == 0)
 		probe_bus_pseries();
 	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 */
 	.dev.bus = &vio_bus_type,
 };
 
-static int (*is_match)(const struct vio_device_id *id,
-		const struct vio_dev *dev);
-static void (*unregister_device_callback)(struct vio_dev *dev);
-static void (*release_device_callback)(struct device *dev);
+static struct vio_bus_ops vio_bus_ops;
 
 /*
  * 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(
 		const struct vio_device_id *ids, const struct vio_dev *dev)
 {
 	while (ids->type) {
-		if (is_match(ids, dev))
+		if (vio_bus_ops.match(ids, dev))
 			return ids;
 		ids++;
 	}
@@ -125,16 +122,11 @@ static const struct vio_device_id *vio_match_device(
 /**
  * vio_bus_init: - Initialize the virtual IO bus
  */
-int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
-			const struct vio_dev *dev),
-		void (*unregister_dev)(struct vio_dev *),
-		void (*release_dev)(struct device *))
+int __init vio_bus_init(struct vio_bus_ops *ops)
 {
 	int err;
 
-	is_match = match_func;
-	unregister_device_callback = unregister_dev;
-	release_device_callback = release_dev;
+	vio_bus_ops = *ops;
 
 	err = bus_register(&vio_bus_type);
 	if (err) {
@@ -159,8 +151,8 @@ int __init vio_bus_init(int (*match_func)(const struct vio_device_id *id,
 /* vio_dev refcount hit 0 */
 static void __devinit vio_dev_release(struct device *dev)
 {
-	if (release_device_callback)
-		release_device_callback(dev);
+	if (vio_bus_ops.release_device)
+		vio_bus_ops.release_device(dev);
 	kfree(to_vio_dev(dev));
 }
 
@@ -191,8 +183,8 @@ struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev)
 
 void __devinit vio_unregister_device(struct vio_dev *viodev)
 {
-	if (unregister_device_callback)
-		unregister_device_callback(viodev);
+	if (vio_bus_ops.unregister_device)
+		vio_bus_ops.unregister_device(viodev);
 	device_remove_file(&viodev->dev, &dev_attr_name);
 	device_unregister(&viodev->dev);
 }