diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-11 17:01:23 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-11 17:01:23 -0800 |
commit | 79901d14654ae96222df563bc43570a2720228b6 (patch) | |
tree | a4b24c1046dd392a1f70059b5dcadc1318a1342a /driver | |
parent | 9a037602e512dbe57da6d1e33b34e9271e200fa4 (diff) | |
download | patches-79901d14654ae96222df563bc43570a2720228b6.tar.gz |
another driver patch
Diffstat (limited to 'driver')
-rw-r--r-- | driver/add-css-ccw-_bus_type-probe-remove-shutdown-methods..patch | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/driver/add-css-ccw-_bus_type-probe-remove-shutdown-methods..patch b/driver/add-css-ccw-_bus_type-probe-remove-shutdown-methods..patch new file mode 100644 index 0000000000000..f0a1fc69d7c14 --- /dev/null +++ b/driver/add-css-ccw-_bus_type-probe-remove-shutdown-methods..patch @@ -0,0 +1,228 @@ +From huckc@de.ibm.com Wed Jan 11 16:58:29 2006 +Date: Wed, 11 Jan 2006 10:56:22 +0100 +From: Cornelia Huck <huckc@de.ibm.com> +To: Cornelia Huck <cornelia.huck@gmail.com> +Cc: <schwidefsky@de.ibm.com>, Greg K-H <greg@kroah.com> +Subject: Add {css,ccw}_bus_type probe, remove, shutdown methods. +Message-ID: <20060111105622.7cba9de6@gondolin.boeblingen.de.ibm.com> + +The following patch converts css_bus_type and ccw_bus_type to use +the new bus_type methods. + +Signed-off-by: Cornelia Huck <huckc@de.ibm.com> +CC: Martin Schwidefsky <schwidefsky@de.ibm.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + + +--- + drivers/s390/cio/css.c | 36 +++++++++++++++++++++++++++++++-- + drivers/s390/cio/css.h | 4 +++ + drivers/s390/cio/device.c | 50 ++++++++++++++++++++++------------------------ + 3 files changed, 62 insertions(+), 28 deletions(-) + +--- gregkh-2.6.orig/drivers/s390/cio/css.c ++++ gregkh-2.6/drivers/s390/cio/css.c +@@ -542,9 +542,41 @@ css_bus_match (struct device *dev, struc + return 0; + } + ++static int ++css_probe (struct device *dev) ++{ ++ struct subchannel *sch; ++ ++ sch = to_subchannel(dev); ++ sch->driver = container_of (dev->driver, struct css_driver, drv); ++ return (sch->driver->probe ? sch->driver->probe(sch) : 0); ++} ++ ++static int ++css_remove (struct device *dev) ++{ ++ struct subchannel *sch; ++ ++ sch = to_subchannel(dev); ++ return (sch->driver->remove ? sch->driver->remove(sch) : 0); ++} ++ ++static void ++css_shutdown (struct device *dev) ++{ ++ struct subchannel *sch; ++ ++ sch = to_subchannel(dev); ++ if (sch->driver->shutdown) ++ sch->driver->shutdown(sch); ++} ++ + struct bus_type css_bus_type = { +- .name = "css", +- .match = &css_bus_match, ++ .name = "css", ++ .match = css_bus_match, ++ .probe = css_probe, ++ .remove = css_remove, ++ .shutdown = css_shutdown, + }; + + subsys_initcall(init_channel_subsystem); +--- gregkh-2.6.orig/drivers/s390/cio/css.h ++++ gregkh-2.6/drivers/s390/cio/css.h +@@ -115,6 +115,7 @@ struct ccw_device_private { + * Currently, we only care about I/O subchannels (type 0), these + * have a ccw_device connected to them. + */ ++struct subchannel; + struct css_driver { + unsigned int subchannel_type; + struct device_driver drv; +@@ -122,6 +123,9 @@ struct css_driver { + int (*notify)(struct device *, int); + void (*verify)(struct device *); + void (*termination)(struct device *); ++ int (*probe)(struct subchannel *); ++ int (*remove)(struct subchannel *); ++ void (*shutdown)(struct subchannel *); + }; + + /* +--- gregkh-2.6.orig/drivers/s390/cio/device.c ++++ gregkh-2.6/drivers/s390/cio/device.c +@@ -107,33 +107,29 @@ ccw_uevent (struct device *dev, char **e + return 0; + } + +-struct bus_type ccw_bus_type = { +- .name = "ccw", +- .match = &ccw_bus_match, +- .uevent = &ccw_uevent, +-}; ++struct bus_type ccw_bus_type; + +-static int io_subchannel_probe (struct device *); +-static int io_subchannel_remove (struct device *); ++static int io_subchannel_probe (struct subchannel *); ++static int io_subchannel_remove (struct subchannel *); + void io_subchannel_irq (struct device *); + static int io_subchannel_notify(struct device *, int); + static void io_subchannel_verify(struct device *); + static void io_subchannel_ioterm(struct device *); +-static void io_subchannel_shutdown(struct device *); ++static void io_subchannel_shutdown(struct subchannel *); + + struct css_driver io_subchannel_driver = { + .subchannel_type = SUBCHANNEL_TYPE_IO, + .drv = { + .name = "io_subchannel", + .bus = &css_bus_type, +- .probe = &io_subchannel_probe, +- .remove = &io_subchannel_remove, +- .shutdown = &io_subchannel_shutdown, + }, + .irq = io_subchannel_irq, + .notify = io_subchannel_notify, + .verify = io_subchannel_verify, + .termination = io_subchannel_ioterm, ++ .probe = io_subchannel_probe, ++ .remove = io_subchannel_remove, ++ .shutdown = io_subchannel_shutdown, + }; + + struct workqueue_struct *ccw_device_work; +@@ -803,14 +799,12 @@ io_subchannel_recog(struct ccw_device *c + } + + static int +-io_subchannel_probe (struct device *pdev) ++io_subchannel_probe (struct subchannel *sch) + { +- struct subchannel *sch; + struct ccw_device *cdev; + int rc; + unsigned long flags; + +- sch = to_subchannel(pdev); + if (sch->dev.driver_data) { + /* + * This subchannel already has an associated ccw_device. +@@ -846,7 +840,7 @@ io_subchannel_probe (struct device *pdev + memset(cdev->private, 0, sizeof(struct ccw_device_private)); + atomic_set(&cdev->private->onoff, 0); + cdev->dev = (struct device) { +- .parent = pdev, ++ .parent = &sch->dev, + .release = ccw_device_release, + }; + INIT_LIST_HEAD(&cdev->private->kick_work.entry); +@@ -859,7 +853,7 @@ io_subchannel_probe (struct device *pdev + return -ENODEV; + } + +- rc = io_subchannel_recog(cdev, to_subchannel(pdev)); ++ rc = io_subchannel_recog(cdev, sch); + if (rc) { + spin_lock_irqsave(&sch->lock, flags); + sch->dev.driver_data = NULL; +@@ -883,17 +877,17 @@ ccw_device_unregister(void *data) + } + + static int +-io_subchannel_remove (struct device *dev) ++io_subchannel_remove (struct subchannel *sch) + { + struct ccw_device *cdev; + unsigned long flags; + +- if (!dev->driver_data) ++ if (!sch->dev.driver_data) + return 0; +- cdev = dev->driver_data; ++ cdev = sch->dev.driver_data; + /* Set ccw device to not operational and drop reference. */ + spin_lock_irqsave(cdev->ccwlock, flags); +- dev->driver_data = NULL; ++ sch->dev.driver_data = NULL; + cdev->private->state = DEV_STATE_NOT_OPER; + spin_unlock_irqrestore(cdev->ccwlock, flags); + /* +@@ -948,14 +942,12 @@ io_subchannel_ioterm(struct device *dev) + } + + static void +-io_subchannel_shutdown(struct device *dev) ++io_subchannel_shutdown(struct subchannel *sch) + { +- struct subchannel *sch; + struct ccw_device *cdev; + int ret; + +- sch = to_subchannel(dev); +- cdev = dev->driver_data; ++ cdev = sch->dev.driver_data; + + if (cio_is_console(sch->schid)) + return; +@@ -1129,6 +1121,14 @@ ccw_device_remove (struct device *dev) + return 0; + } + ++struct bus_type ccw_bus_type = { ++ .name = "ccw", ++ .match = ccw_bus_match, ++ .uevent = ccw_uevent, ++ .probe = ccw_device_probe, ++ .remove = ccw_device_remove, ++}; ++ + int + ccw_driver_register (struct ccw_driver *cdriver) + { +@@ -1136,8 +1136,6 @@ ccw_driver_register (struct ccw_driver * + + drv->bus = &ccw_bus_type; + drv->name = cdriver->name; +- drv->probe = ccw_device_probe; +- drv->remove = ccw_device_remove; + + return driver_register(drv); + } |