vio cleanups

Stephen Rothwell sfr at canb.auug.org.au
Tue May 4 14:04:36 EST 2004


Hi Dave,

First round of vio cleanups in preparation of using it for iSeries.
This removes archdata and driver_data from struct vio_dev and uses
platform_data and driver_data in the embedded struct device instead.

Also, it adds type and name fields to struct viodev which on pSeries
just point to the type and name fields of the platform_data (i.e. the
open firmware struct device_node fields).  This will allow them to be
used differently by the iSeries implementation.

If you think this is OK (I have compiled it, but not booted it),
please either commit it to Ameslab or let me know and I will get
that done and then I will submit it upstream.

--
Cheers,
Stephen Rothwell                    sfr at canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
-------------- next part --------------
diff -ruN ppc64-linux-2.5/arch/ppc64/kernel/vio.c ppc64-linux-2.5.for-ames/arch/ppc64/kernel/vio.c
--- ppc64-linux-2.5/arch/ppc64/kernel/vio.c	2004-04-13 18:06:15.000000000 +1000
+++ ppc64-linux-2.5.for-ames/arch/ppc64/kernel/vio.c	2004-05-04 13:03:52.000000000 +1000
@@ -143,8 +143,8 @@

 #ifdef CONFIG_PPC_PSERIES
 	while (ids->type) {
-		if ((strncmp(dev->archdata->type, ids->type, strlen(ids->type)) == 0) &&
-			device_is_compatible((struct device_node*)dev->archdata, ids->compat))
+		if ((strncmp(dev->type, ids->type, strlen(ids->type)) == 0) &&
+			device_is_compatible(dev->dev.platform_data, ids->compat))
 			return ids;
 		ids++;
 	}
@@ -263,16 +263,15 @@
 	DBGENTER();

 	/* XXX free TCE table */
-	of_node_put(viodev->archdata);
+	of_node_put(viodev->dev.platform_data);
 	kfree(viodev);
 }

 static ssize_t viodev_show_name(struct device *dev, char *buf)
 {
 	struct vio_dev *viodev = to_vio_dev(dev);
-	struct device_node *of_node = viodev->archdata;

-	return sprintf(buf, "%s\n", of_node->name);
+	return sprintf(buf, "%s\n", viodev->name);
 }
 DEVICE_ATTR(name, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_name, NULL);

@@ -281,7 +280,7 @@
  * @of_node:	The OF node for this device.
  *
  * Creates and initializes a vio_dev structure from the data in
- * of_node (archdata) and adds it to the list of virtual devices.
+ * of_node (dev.platform_data) and adds it to the list of virtual devices.
  * Returns a pointer to the created vio_dev or NULL if node has
  * NULL device_type or compatible fields.
  */
@@ -315,7 +314,9 @@
 	}
 	memset(viodev, 0, sizeof(struct vio_dev));

-	viodev->archdata = (void *)of_node_get(of_node);
+	viodev->dev.platform_data = of_node_get(of_node);
+	viodev->type = of_node->type;
+	viodev->name = of_node->name;
 	viodev->unit_address = *unit_address;
 	viodev->iommu_table = vio_build_iommu_table(viodev);

@@ -368,7 +369,7 @@
 */
 const void * vio_get_attribute(struct vio_dev *vdev, void* which, int* length)
 {
-	return get_property((struct device_node *)vdev->archdata, (char*)which, length);
+	return get_property(vdev->dev.platform_data, (char*)which, length);
 }
 EXPORT_SYMBOL(vio_get_attribute);

@@ -423,7 +424,7 @@
 	unsigned long size;
 	int dma_window_property_size;

-	dma_window = (unsigned int *) get_property((struct device_node *)dev->archdata, "ibm,my-dma-window", &dma_window_property_size);
+	dma_window = (unsigned int *) get_property(dev->dev.platform_data, "ibm,my-dma-window", &dma_window_property_size);
 	if(!dma_window) {
 		return NULL;
 	}
diff -ruN ppc64-linux-2.5/drivers/char/hvcs.c ppc64-linux-2.5.for-ames/drivers/char/hvcs.c
--- ppc64-linux-2.5/drivers/char/hvcs.c	2004-04-10 09:04:31.000000000 +1000
+++ ppc64-linux-2.5.for-ames/drivers/char/hvcs.c	2004-05-04 13:14:27.000000000 +1000
@@ -314,7 +314,7 @@
 	hvcsd->kobj.ktype = &hvcs_kobj_type;

 	hvcsd->vdev = dev;
-	dev->driver_data = hvcsd;
+	dev->dev.driver_data = hvcsd;
 	sprintf(hvcsd->name,"%X",dev->unit_address);

 	hvcsd->index = ++hvcs_struct_count;
@@ -347,7 +347,7 @@

 static void __devexit hvcs_remove(struct vio_dev *dev)
 {
-	struct hvcs_struct *hvcsd = (struct hvcs_struct *)dev->driver_data;
+	struct hvcs_struct *hvcsd = (struct hvcs_struct *)dev->dev.driver_data;

 	if (!hvcsd)
 		return;
@@ -889,7 +889,7 @@

 static inline struct hvcs_struct *from_vio_dev(struct vio_dev *viod)
 {
-	return (struct hvcs_struct *)viod->driver_data;
+	return (struct hvcs_struct *)viod->dev.driver_data;
 }
 /* The sysfs interface for the driver and devices */

diff -ruN ppc64-linux-2.5/drivers/net/ibmveth.c ppc64-linux-2.5.for-ames/drivers/net/ibmveth.c
--- ppc64-linux-2.5/drivers/net/ibmveth.c	2004-04-29 08:04:40.000000000 +1000
+++ ppc64-linux-2.5.for-ames/drivers/net/ibmveth.c	2004-05-04 13:15:23.000000000 +1000
@@ -902,7 +902,7 @@

 	adapter = netdev->priv;
 	memset(adapter, 0, sizeof(adapter));
-	dev->driver_data = netdev;
+	dev->dev.driver_data = netdev;

 	adapter->vdev = dev;
 	adapter->netdev = netdev;
@@ -972,7 +972,7 @@

 static int __devexit ibmveth_remove(struct vio_dev *dev)
 {
-	struct net_device *netdev = dev->driver_data;
+	struct net_device *netdev = dev->dev.driver_data;
 	struct ibmveth_adapter *adapter = netdev->priv;

 	unregister_netdev(netdev);
diff -ruN ppc64-linux-2.5/drivers/scsi/ibmvscsi/ibmvscsis.c ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/ibmvscsis.c
--- ppc64-linux-2.5/drivers/scsi/ibmvscsi/ibmvscsis.c	2004-04-28 17:04:34.000000000 +1000
+++ ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/ibmvscsis.c	2004-05-04 13:16:52.000000000 +1000
@@ -2496,7 +2496,7 @@
 	memset(adapter, 0x00, sizeof(*adapter));
 	adapter->dma_dev = dev;
 	adapter->dev = &dev->dev;
-	dev->driver_data = adapter;
+	dev->dev.driver_data = adapter;
 	sprintf(adapter->name, "%x", dev->unit_address);
 	adapter->lock = SPIN_LOCK_UNLOCKED;

@@ -2560,7 +2560,7 @@
 	int target;

 	struct server_adapter *adapter =
-	    (struct server_adapter *)dev->driver_data;
+	    (struct server_adapter *)dev->dev.driver_data;

 	info("entering remove for UA 0x%x\n", dev->unit_address);

diff -ruN ppc64-linux-2.5/drivers/scsi/ibmvscsi/iseries_vscsi.c ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/iseries_vscsi.c
--- ppc64-linux-2.5/drivers/scsi/ibmvscsi/iseries_vscsi.c	2004-04-28 17:04:34.000000000 +1000
+++ ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/iseries_vscsi.c	2004-05-03 17:20:16.000000000 +1000
@@ -153,7 +153,6 @@

 int __init ibmvscsi_module_init(void)
 {
-	iseries_vscsi_dev.archdata = to_vio_dev(iSeries_vio_dev)->archdata;
 	if (device_register(&iseries_vscsi_dev.dev)) {
 		printk(KERN_ERR "ibmvscsi: failed to register device\n");
 		return 1;
diff -ruN ppc64-linux-2.5/drivers/scsi/ibmvscsi/rpa_vscsi.c ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/rpa_vscsi.c
--- ppc64-linux-2.5/drivers/scsi/ibmvscsi/rpa_vscsi.c	2004-04-28 17:04:34.000000000 +1000
+++ ppc64-linux-2.5.for-ames/drivers/scsi/ibmvscsi/rpa_vscsi.c	2004-05-04 13:16:22.000000000 +1000
@@ -282,7 +282,7 @@
 {
 	struct ibmvscsi_host_data *hostdata = ibmvscsi_probe(&vdev->dev);
 	if (hostdata) {
-		vdev->driver_data = hostdata;
+		vdev->dev.driver_data = hostdata;
 		return 0;
 	} else {
 		return -1;
@@ -296,7 +296,7 @@
 static int rpa_remove(struct vio_dev *vdev)
 {
 	struct ibmvscsi_host_data *hostdata =
-	    (struct ibmvscsi_host_data *)vdev->driver_data;
+	    (struct ibmvscsi_host_data *)vdev->dev.driver_data;
 	ibmvscsi_remove(hostdata);
 	return 0;
 }
diff -ruN ppc64-linux-2.5/include/asm-ppc64/vio.h ppc64-linux-2.5.for-ames/include/asm-ppc64/vio.h
--- ppc64-linux-2.5/include/asm-ppc64/vio.h	2004-04-13 18:06:17.000000000 +1000
+++ ppc64-linux-2.5.for-ames/include/asm-ppc64/vio.h	2004-05-04 13:17:35.000000000 +1000
@@ -110,8 +110,8 @@
  * The vio_dev structure is used to describe virtual I/O devices.
  */
 struct vio_dev {
-	struct device_node *archdata;   /* Open Firmware node */
-	void *driver_data;              /* data private to the driver */
+	char *name;
+	char *type;
 	struct iommu_table *iommu_table;     /* vio_map_* uses this */
 	uint32_t unit_address;
 	unsigned int irq;


More information about the Linuxppc64-dev mailing list