aboutsummaryrefslogtreecommitdiffstats
path: root/pending
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-04-05 20:31:53 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2009-04-05 20:31:53 -0700
commit720460da39aa61e2e5e368b916e6c6252e3306b4 (patch)
tree626df8930b77ec5f4ff99b2deebc3ad1cb1f6551 /pending
parent71734cb366f41335c67d82f3cd4cb333f43d92a8 (diff)
downloadpatches-720460da39aa61e2e5e368b916e6c6252e3306b4.tar.gz
more moving around
Diffstat (limited to 'pending')
-rw-r--r--pending/acpi-fixup-typo-in-acpi_device_remove.patch31
-rw-r--r--pending/driver-core-use-dev_get_drvdata-accessors.patch1992
-rw-r--r--pending/usb-gotemp.patch349
3 files changed, 2372 insertions, 0 deletions
diff --git a/pending/acpi-fixup-typo-in-acpi_device_remove.patch b/pending/acpi-fixup-typo-in-acpi_device_remove.patch
new file mode 100644
index 00000000000000..1ea76cf8209333
--- /dev/null
+++ b/pending/acpi-fixup-typo-in-acpi_device_remove.patch
@@ -0,0 +1,31 @@
+From kernel-bounces+gregkh=suse.de@suse.de Thu Sep 11 02:14:13 2008
+From: Hannes Reinecke <hare@suse.de>
+Date: Wed, 10 Sep 2008 14:16:09 +0200
+Subject: acpi: Fixup typo in acpi_device_remove()
+To: kernel@suse.de
+Message-ID: <20080910121610.33FA818C734@pentland.suse.de>
+
+
+
+The driver data is stored in the acpi device, not the driver
+core device.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Cc: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/scan.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -384,7 +384,7 @@ static int acpi_device_remove(struct dev
+ acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type);
+ }
+ acpi_dev->driver = NULL;
+- acpi_driver_data(dev) = NULL;
++ acpi_driver_data(acpi_dev) = NULL;
+
+ put_device(dev);
+ return 0;
diff --git a/pending/driver-core-use-dev_get_drvdata-accessors.patch b/pending/driver-core-use-dev_get_drvdata-accessors.patch
new file mode 100644
index 00000000000000..88471e5b81057d
--- /dev/null
+++ b/pending/driver-core-use-dev_get_drvdata-accessors.patch
@@ -0,0 +1,1992 @@
+From kernel-bounces+gregkh=suse.de@suse.de Thu Sep 11 01:54:40 2008
+From: Hannes Reinecke <hare@suse.de>
+Date: Wed, 10 Sep 2008 14:16:04 +0200
+Subject: Driver core: Use dev_get_drvdata() accessors
+To: kernel@suse.de
+Message-ID: <20080910121604.E47B318C734@pentland.suse.de>
+
+Deprecated direct access to the ->driver_data field and
+use accessors throughout.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Cc: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/block/xen-blkfront.c | 14 ++++----
+ drivers/eisa/pci_eisa.c | 2 -
+ drivers/eisa/virtual_root.c | 2 -
+ drivers/ide/legacy/ide_platform.c | 2 -
+ drivers/input/xen-kbdfront.c | 8 ++--
+ drivers/media/video/pvrusb2/pvrusb2-sysfs.c | 22 ++++++-------
+ drivers/mfd/htc-pasic3.c | 8 ++--
+ drivers/net/3c509.c | 42 +++++++++++++++++--------
+ drivers/net/depca.c | 17 +++++++---
+ drivers/net/hp100.c | 4 +-
+ drivers/net/ne3210.c | 4 +-
+ drivers/net/tulip/de4x5.c | 7 ++--
+ drivers/net/wireless/atmel_cs.c | 2 -
+ drivers/net/wireless/ipw2100.c | 8 ++--
+ drivers/net/wireless/ipw2200.c | 46 +++++++++++++--------------
+ drivers/net/wireless/iwlwifi/iwl3945-base.c | 22 ++++++-------
+ drivers/net/xen-netfront.c | 10 ++---
+ drivers/pcmcia/ds.c | 8 ++--
+ drivers/s390/block/dasd_devmap.c | 6 +--
+ drivers/s390/char/con3215.c | 16 ++++-----
+ drivers/s390/char/raw3270.c | 16 ++++-----
+ drivers/s390/char/tape_34xx.c | 4 +-
+ drivers/s390/char/tape_core.c | 20 +++++------
+ drivers/s390/char/vmlogrdr.c | 12 +++----
+ drivers/s390/char/vmur.c | 10 ++---
+ drivers/s390/net/claw.c | 40 +++++++++++------------
+ drivers/s390/net/lcs.c | 23 +++++++------
+ drivers/s390/net/netiucv.c | 47 ++++++++++++++--------------
+ drivers/scsi/aha1740.c | 3 +
+ drivers/scsi/ibmvscsi/ibmvstgt.c | 2 -
+ drivers/scsi/libsrp.c | 2 -
+ drivers/thermal/thermal_sys.c | 4 +-
+ drivers/video/xen-fbfront.c | 8 ++--
+ include/linux/eisa.h | 4 +-
+ 34 files changed, 236 insertions(+), 209 deletions(-)
+
+--- a/drivers/block/xen-blkfront.c
++++ b/drivers/block/xen-blkfront.c
+@@ -756,12 +756,12 @@ static int blkfront_probe(struct xenbus_
+
+ /* Front end dir is a number, which is used as the id. */
+ info->handle = simple_strtoul(strrchr(dev->nodename, '/')+1, NULL, 0);
+- dev->dev.driver_data = info;
++ dev_set_drvdata(&dev->dev, info);
+
+ err = talk_to_backend(dev, info);
+ if (err) {
+ kfree(info);
+- dev->dev.driver_data = NULL;
++ dev_set_drvdata(&dev->dev, NULL);
+ return err;
+ }
+
+@@ -846,7 +846,7 @@ static int blkif_recover(struct blkfront
+ */
+ static int blkfront_resume(struct xenbus_device *dev)
+ {
+- struct blkfront_info *info = dev->dev.driver_data;
++ struct blkfront_info *info = dev_get_drvdata(&dev->dev);
+ int err;
+
+ dev_dbg(&dev->dev, "blkfront_resume: %s\n", dev->nodename);
+@@ -925,7 +925,7 @@ static void blkfront_connect(struct blkf
+ */
+ static void blkfront_closing(struct xenbus_device *dev)
+ {
+- struct blkfront_info *info = dev->dev.driver_data;
++ struct blkfront_info *info = dev_get_drvdata(&dev->dev);
+ unsigned long flags;
+
+ dev_dbg(&dev->dev, "blkfront_closing: %s removed\n", dev->nodename);
+@@ -960,7 +960,7 @@ static void blkfront_closing(struct xenb
+ static void backend_changed(struct xenbus_device *dev,
+ enum xenbus_state backend_state)
+ {
+- struct blkfront_info *info = dev->dev.driver_data;
++ struct blkfront_info *info = dev_get_drvdata(&dev->dev);
+ struct block_device *bd;
+
+ dev_dbg(&dev->dev, "blkfront:backend_changed.\n");
+@@ -996,7 +996,7 @@ static void backend_changed(struct xenbu
+
+ static int blkfront_remove(struct xenbus_device *dev)
+ {
+- struct blkfront_info *info = dev->dev.driver_data;
++ struct blkfront_info *info = dev_get_drvdata(&dev->dev);
+
+ dev_dbg(&dev->dev, "blkfront_remove: %s removed\n", dev->nodename);
+
+@@ -1009,7 +1009,7 @@ static int blkfront_remove(struct xenbus
+
+ static int blkfront_is_ready(struct xenbus_device *dev)
+ {
+- struct blkfront_info *info = dev->dev.driver_data;
++ struct blkfront_info *info = dev_get_drvdata(&dev->dev);
+
+ return info->is_ready;
+ }
+--- a/drivers/eisa/pci_eisa.c
++++ b/drivers/eisa/pci_eisa.c
+@@ -31,11 +31,11 @@ static int __init pci_eisa_init(struct p
+ }
+
+ pci_eisa_root.dev = &pdev->dev;
+- pci_eisa_root.dev->driver_data = &pci_eisa_root;
+ pci_eisa_root.res = pdev->bus->resource[0];
+ pci_eisa_root.bus_base_addr = pdev->bus->resource[0]->start;
+ pci_eisa_root.slots = EISA_MAX_SLOTS;
+ pci_eisa_root.dma_mask = pdev->dma_mask;
++ dev_set_drvdata(pci_eisa_root.dev, &pci_eisa_root);
+
+ if (eisa_root_register (&pci_eisa_root)) {
+ printk (KERN_ERR "pci_eisa : Could not register EISA root\n");
+--- a/drivers/eisa/virtual_root.c
++++ b/drivers/eisa/virtual_root.c
+@@ -57,7 +57,7 @@ static int __init virtual_eisa_root_init
+
+ eisa_bus_root.force_probe = force_probe;
+
+- eisa_root_dev.dev.driver_data = &eisa_bus_root;
++ platform_set_drvdata(&eisa_root_dev, &eisa_bus_root);
+
+ if (eisa_root_register (&eisa_bus_root)) {
+ /* A real bridge may have been registered before
+--- a/drivers/ide/legacy/ide_platform.c
++++ b/drivers/ide/legacy/ide_platform.c
+@@ -113,7 +113,7 @@ out:
+
+ static int __devexit plat_ide_remove(struct platform_device *pdev)
+ {
+- struct ide_host *host = pdev->dev.driver_data;
++ struct ide_host *host = platform_get_drvdata(pdev);
+
+ ide_host_remove(host);
+
+--- a/drivers/input/xen-kbdfront.c
++++ b/drivers/input/xen-kbdfront.c
+@@ -114,7 +114,7 @@ static int __devinit xenkbd_probe(struct
+ xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
+ return -ENOMEM;
+ }
+- dev->dev.driver_data = info;
++ dev_set_drvdata(&dev->dev, info);
+ info->xbdev = dev;
+ info->irq = -1;
+ snprintf(info->phys, sizeof(info->phys), "xenbus/%s", dev->nodename);
+@@ -186,7 +186,7 @@ static int __devinit xenkbd_probe(struct
+
+ static int xenkbd_resume(struct xenbus_device *dev)
+ {
+- struct xenkbd_info *info = dev->dev.driver_data;
++ struct xenkbd_info *info = dev_get_drvdata(&dev->dev);
+
+ xenkbd_disconnect_backend(info);
+ memset(info->page, 0, PAGE_SIZE);
+@@ -195,7 +195,7 @@ static int xenkbd_resume(struct xenbus_d
+
+ static int xenkbd_remove(struct xenbus_device *dev)
+ {
+- struct xenkbd_info *info = dev->dev.driver_data;
++ struct xenkbd_info *info = dev_get_drvdata(&dev->dev);
+
+ xenkbd_disconnect_backend(info);
+ if (info->kbd)
+@@ -266,7 +266,7 @@ static void xenkbd_disconnect_backend(st
+ static void xenkbd_backend_changed(struct xenbus_device *dev,
+ enum xenbus_state backend_state)
+ {
+- struct xenkbd_info *info = dev->dev.driver_data;
++ struct xenkbd_info *info = dev_get_drvdata(&dev->dev);
+ int ret, val;
+
+ switch (backend_state) {
+--- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c
++++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c
+@@ -537,7 +537,7 @@ static void class_dev_destroy(struct pvr
+ &sfp->attr_unit_number);
+ }
+ pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
+- sfp->class_dev->driver_data = NULL;
++ dev_set_drvdata(sfp->class_dev, NULL);
+ device_unregister(sfp->class_dev);
+ sfp->class_dev = NULL;
+ }
+@@ -547,7 +547,7 @@ static ssize_t v4l_minor_number_show(str
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%d\n",
+ pvr2_hdw_v4l_get_minor_number(sfp->channel.hdw,
+@@ -559,7 +559,7 @@ static ssize_t bus_info_show(struct devi
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%s\n",
+ pvr2_hdw_get_bus_info(sfp->channel.hdw));
+@@ -570,7 +570,7 @@ static ssize_t hdw_name_show(struct devi
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%s\n",
+ pvr2_hdw_get_type(sfp->channel.hdw));
+@@ -581,7 +581,7 @@ static ssize_t hdw_desc_show(struct devi
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%s\n",
+ pvr2_hdw_get_desc(sfp->channel.hdw));
+@@ -593,7 +593,7 @@ static ssize_t v4l_radio_minor_number_sh
+ char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%d\n",
+ pvr2_hdw_v4l_get_minor_number(sfp->channel.hdw,
+@@ -605,7 +605,7 @@ static ssize_t unit_number_show(struct d
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return scnprintf(buf,PAGE_SIZE,"%d\n",
+ pvr2_hdw_get_unit_number(sfp->channel.hdw));
+@@ -641,7 +641,7 @@ static void class_dev_create(struct pvr2
+ class_dev->parent = &usb_dev->dev;
+
+ sfp->class_dev = class_dev;
+- class_dev->driver_data = sfp;
++ dev_set_drvdata(class_dev,sfp);
+ ret = device_register(class_dev);
+ if (ret) {
+ pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+@@ -798,7 +798,7 @@ static ssize_t debuginfo_show(struct dev
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ pvr2_hdw_trigger_module_log(sfp->channel.hdw);
+ return pvr2_debugifc_print_info(sfp->channel.hdw,buf,PAGE_SIZE);
+@@ -809,7 +809,7 @@ static ssize_t debugcmd_show(struct devi
+ struct device_attribute *attr, char *buf)
+ {
+ struct pvr2_sysfs *sfp;
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+ return pvr2_debugifc_print_status(sfp->channel.hdw,buf,PAGE_SIZE);
+ }
+@@ -822,7 +822,7 @@ static ssize_t debugcmd_store(struct dev
+ struct pvr2_sysfs *sfp;
+ int ret;
+
+- sfp = (struct pvr2_sysfs *)class_dev->driver_data;
++ sfp = dev_get_drvdata(class_dev);
+ if (!sfp) return -EINVAL;
+
+ ret = pvr2_debugifc_docmd(sfp->channel.hdw,buf,count);
+--- a/drivers/mfd/htc-pasic3.c
++++ b/drivers/mfd/htc-pasic3.c
+@@ -36,7 +36,7 @@ struct pasic3_data {
+ */
+ void pasic3_write_register(struct device *dev, u32 reg, u8 val)
+ {
+- struct pasic3_data *asic = dev->driver_data;
++ struct pasic3_data *asic = dev_get_drvdata(dev);
+ int bus_shift = asic->bus_shift;
+ void __iomem *addr = asic->mapping + (REG_ADDR << bus_shift);
+ void __iomem *data = asic->mapping + (REG_DATA << bus_shift);
+@@ -51,7 +51,7 @@ EXPORT_SYMBOL(pasic3_write_register); /*
+ */
+ u8 pasic3_read_register(struct device *dev, u32 reg)
+ {
+- struct pasic3_data *asic = dev->driver_data;
++ struct pasic3_data *asic = dev_get_drvdata(dev);
+ int bus_shift = asic->bus_shift;
+ void __iomem *addr = asic->mapping + (REG_ADDR << bus_shift);
+ void __iomem *data = asic->mapping + (REG_DATA << bus_shift);
+@@ -68,7 +68,7 @@ EXPORT_SYMBOL(pasic3_read_register); /*
+ static int led_device_add(struct device *pasic3_dev,
+ const struct pasic3_leds_machinfo *pdata)
+ {
+- struct pasic3_data *asic = pasic3_dev->driver_data;
++ struct pasic3_data *asic = dev_get_drvdata(pasic3_dev);
+ struct platform_device *pdev;
+ int ret;
+
+@@ -135,7 +135,7 @@ static struct ds1wm_platform_data ds1wm_
+ static int ds1wm_device_add(struct platform_device *pasic3_pdev, int bus_shift)
+ {
+ struct device *pasic3_dev = &pasic3_pdev->dev;
+- struct pasic3_data *asic = pasic3_dev->driver_data;
++ struct pasic3_data *asic = dev_get_drvdata(pasic3_dev);
+ struct platform_device *pdev;
+ int ret;
+
+--- a/drivers/net/3c509.c
++++ b/drivers/net/3c509.c
+@@ -188,6 +188,8 @@ static int nopnp;
+
+ static int __init el3_common_init(struct net_device *dev);
+ static void el3_common_remove(struct net_device *dev);
++static int el3_common_suspend(struct net_device *dev);
++static int el3_common_resume(struct net_device *dev);
+ static ushort id_read_eeprom(int index);
+ static ushort read_eeprom(int ioaddr, int index);
+ static int el3_open(struct net_device *dev);
+@@ -346,7 +348,7 @@ static int __devinit el3_isa_match(struc
+ static int __devexit el3_isa_remove(struct device *pdev,
+ unsigned int ndev)
+ {
+- el3_device_remove(pdev);
++ el3_common_remove(dev_get_drvdata(pdev));
+ dev_set_drvdata(pdev, NULL);
+ return 0;
+ }
+@@ -356,7 +358,7 @@ static int el3_isa_suspend(struct device
+ pm_message_t state)
+ {
+ current_tag = 0;
+- return el3_suspend(dev, state);
++ return el3_common_suspend(dev_get_drvdata(dev));
+ }
+
+ static int el3_isa_resume(struct device *dev, unsigned int n)
+@@ -378,7 +380,7 @@ static int el3_isa_resume(struct device
+ return 1;
+ /* Free the interrupt so that some other card can use it. */
+ outw(0x0f00, ioaddr + WN0_IRQ);
+- return el3_resume(dev);
++ return el3_common_resume(ndev);
+ }
+ #endif
+
+@@ -456,12 +458,12 @@ static void __devexit el3_pnp_remove(str
+ #ifdef CONFIG_PM
+ static int el3_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
+ {
+- return el3_suspend(&pdev->dev, state);
++ return el3_common_suspend(pnp_get_drvdata(pdev));
+ }
+
+ static int el3_pnp_resume(struct pnp_dev *pdev)
+ {
+- return el3_resume(&pdev->dev);
++ return el3_common_resume(pnp_get_drvdata(pdev));
+ }
+ #endif
+
+@@ -647,11 +649,11 @@ static int __init el3_mca_probe(struct d
+ netdev_boot_setup_check(dev);
+
+ el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_MCA);
+- device->driver_data = dev;
++ dev_set_drvdata(device, dev);
+ err = el3_common_init(dev);
+
+ if (err) {
+- device->driver_data = NULL;
++ dev_set_drvdata(device, NULL);
+ free_netdev(dev);
+ return -ENOMEM;
+ }
+@@ -1439,14 +1441,12 @@ el3_up(struct net_device *dev)
+ #ifdef CONFIG_PM
+
+ static int
+-el3_suspend(struct device *pdev, pm_message_t state)
++el3_common_suspend(struct net_device *dev)
+ {
+ unsigned long flags;
+- struct net_device *dev;
+ struct el3_private *lp;
+ int ioaddr;
+
+- dev = pdev->driver_data;
+ lp = netdev_priv(dev);
+ ioaddr = dev->base_addr;
+
+@@ -1463,14 +1463,21 @@ el3_suspend(struct device *pdev, pm_mess
+ }
+
+ static int
+-el3_resume(struct device *pdev)
++el3_suspend(struct device *pdev, pm_message_t state)
+ {
+- unsigned long flags;
+ struct net_device *dev;
++
++ dev = dev_get_drvdata(pdev);
++ return el3_common_suspend(dev);
++}
++
++static int
++el3_common_resume(struct net_device *dev)
++{
++ unsigned long flags;
+ struct el3_private *lp;
+ int ioaddr;
+
+- dev = pdev->driver_data;
+ lp = netdev_priv(dev);
+ ioaddr = dev->base_addr;
+
+@@ -1486,6 +1493,15 @@ el3_resume(struct device *pdev)
+ return 0;
+ }
+
++static int
++el3_resume(struct device *pdev)
++{
++ struct net_device *dev;
++
++ dev = dev_get_drvdata(pdev);
++ return el3_common_resume(dev);
++}
++
+ #endif /* CONFIG_PM */
+
+ module_param(debug,int, 0);
+--- a/drivers/net/depca.c
++++ b/drivers/net/depca.c
+@@ -398,10 +398,11 @@ static struct mca_driver depca_mca_drive
+ #endif
+
+ static int depca_isa_probe (struct platform_device *);
++static int depca_common_remove(struct net_device *dev);
+
+ static int __devexit depca_isa_remove(struct platform_device *pdev)
+ {
+- return depca_device_remove(&pdev->dev);
++ return depca_common_remove(dev_get_drvdata(&pdev->dev));
+ }
+
+ static struct platform_driver depca_isa_driver = {
+@@ -804,7 +805,7 @@ static int __init depca_hw_init (struct
+
+ dev->mem_start = 0;
+
+- device->driver_data = dev;
++ dev_set_drvdata(device, dev);
+ SET_NETDEV_DEV (dev, device);
+
+ status = register_netdev(dev);
+@@ -1598,13 +1599,11 @@ static int __init depca_eisa_probe (stru
+ }
+ #endif
+
+-static int __devexit depca_device_remove (struct device *device)
++static int __devexit depca_common_remove (struct net_device *dev)
+ {
+- struct net_device *dev;
+ struct depca_private *lp;
+ int bus;
+
+- dev = device->driver_data;
+ lp = dev->priv;
+
+ unregister_netdev (dev);
+@@ -1617,6 +1616,14 @@ static int __devexit depca_device_remove
+ return 0;
+ }
+
++static int __devexit depca_device_remove (struct device *device)
++{
++ struct net_device *dev;
++
++ dev = dev_get_drvdata(device);
++ return depca_common_remove(dev);
++}
++
+ /*
+ ** Look for a particular board name in the on-board Remote Diagnostics
+ ** and Boot (readb) ROM. This will also give us a clue to the network RAM
+--- a/drivers/net/hp100.c
++++ b/drivers/net/hp100.c
+@@ -2851,7 +2851,7 @@ static int __init hp100_eisa_probe (stru
+ printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
+ dev->base_addr);
+ #endif
+- gendev->driver_data = dev;
++ dev_set_drvdata(gendev, dev);
+ return 0;
+ out1:
+ free_netdev(dev);
+@@ -2860,7 +2860,7 @@ static int __init hp100_eisa_probe (stru
+
+ static int __devexit hp100_eisa_remove (struct device *gendev)
+ {
+- struct net_device *dev = gendev->driver_data;
++ struct net_device *dev = dev_get_drvdata(gendev);
+ cleanup_dev(dev);
+ return 0;
+ }
+--- a/drivers/net/ne3210.c
++++ b/drivers/net/ne3210.c
+@@ -108,7 +108,7 @@ static int __init ne3210_eisa_probe (str
+ }
+
+ SET_NETDEV_DEV(dev, device);
+- device->driver_data = dev;
++ dev_set_drvdata(device, dev);
+ ioaddr = edev->base_addr;
+
+ if (!request_region(ioaddr, NE3210_IO_EXTENT, DRV_NAME)) {
+@@ -231,7 +231,7 @@ static int __init ne3210_eisa_probe (str
+
+ static int __devexit ne3210_eisa_remove (struct device *device)
+ {
+- struct net_device *dev = device->driver_data;
++ struct net_device *dev = dev_get_drvdata(device);
+ unsigned long ioaddr = to_eisa_device (device)->base_addr;
+
+ unregister_netdev (dev);
+--- a/drivers/net/tulip/de4x5.c
++++ b/drivers/net/tulip/de4x5.c
+@@ -1087,7 +1087,7 @@ de4x5_hw_init(struct net_device *dev, u_
+ int i, status=0;
+ DECLARE_MAC_BUF(mac);
+
+- gendev->driver_data = dev;
++ dev_set_drvdata(gendev, dev);
+
+ /* Ensure we're not sleeping */
+ if (lp->bus == EISA) {
+@@ -2089,13 +2089,14 @@ static int __devexit de4x5_eisa_remove (
+ struct net_device *dev;
+ u_long iobase;
+
+- dev = device->driver_data;
++ dev = dev_get_drvdata(device);
+ iobase = dev->base_addr;
+
+ unregister_netdev (dev);
+ free_netdev (dev);
+ release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE);
+ release_region (iobase, DE4X5_EISA_TOTAL_SIZE);
++ dev_set_drvdata(device, NULL);
+
+ return 0;
+ }
+@@ -2333,7 +2334,7 @@ static void __devexit de4x5_pci_remove (
+ struct net_device *dev;
+ u_long iobase;
+
+- dev = pdev->dev.driver_data;
++ dev = dev_get_drvdata(&pdev->dev);
+ iobase = dev->base_addr;
+
+ unregister_netdev (dev);
+--- a/drivers/net/wireless/atmel_cs.c
++++ b/drivers/net/wireless/atmel_cs.c
+@@ -279,7 +279,7 @@ static int atmel_config(struct pcmcia_de
+ struct pcmcia_device_id *did;
+
+ dev = link->priv;
+- did = handle_to_dev(link).driver_data;
++ did = dev_get_drvdata(&handle_to_dev(link));
+
+ DEBUG(0, "atmel_config(0x%p)\n", link);
+
+--- a/drivers/net/wireless/ipw2100.c
++++ b/drivers/net/wireless/ipw2100.c
+@@ -3477,7 +3477,7 @@ static DEVICE_ATTR(pci, S_IRUGO, show_pc
+ static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw2100_priv *p = d->driver_data;
++ struct ipw2100_priv *p = dev_get_drvdata(d);
+ return sprintf(buf, "0x%08x\n", (int)p->config);
+ }
+
+@@ -3486,7 +3486,7 @@ static DEVICE_ATTR(cfg, S_IRUGO, show_cf
+ static ssize_t show_status(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw2100_priv *p = d->driver_data;
++ struct ipw2100_priv *p = dev_get_drvdata(d);
+ return sprintf(buf, "0x%08x\n", (int)p->status);
+ }
+
+@@ -3495,7 +3495,7 @@ static DEVICE_ATTR(status, S_IRUGO, show
+ static ssize_t show_capability(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw2100_priv *p = d->driver_data;
++ struct ipw2100_priv *p = dev_get_drvdata(d);
+ return sprintf(buf, "0x%08x\n", (int)p->capability);
+ }
+
+@@ -4214,7 +4214,7 @@ static ssize_t show_rf_kill(struct devic
+ 1 - SW based RF kill active (sysfs)
+ 2 - HW based RF kill active
+ 3 - Both HW and SW baed RF kill active */
+- struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data;
++ struct ipw2100_priv *priv = dev_get_drvdata(d);
+ int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
+ (rf_kill_active(priv) ? 0x2 : 0x0);
+ return sprintf(buf, "%i\n", val);
+--- a/drivers/net/wireless/ipw2200.c
++++ b/drivers/net/wireless/ipw2200.c
+@@ -1513,7 +1513,7 @@ static DEVICE_ATTR(led, S_IWUSR | S_IRUG
+ static ssize_t show_status(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+ return sprintf(buf, "0x%08x\n", (int)p->status);
+ }
+
+@@ -1522,7 +1522,7 @@ static DEVICE_ATTR(status, S_IRUGO, show
+ static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+ return sprintf(buf, "0x%08x\n", (int)p->config);
+ }
+
+@@ -1531,7 +1531,7 @@ static DEVICE_ATTR(cfg, S_IRUGO, show_cf
+ static ssize_t show_nic_type(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ return sprintf(buf, "TYPE: %d\n", priv->nic_type);
+ }
+
+@@ -1541,7 +1541,7 @@ static ssize_t show_ucode_version(struct
+ struct device_attribute *attr, char *buf)
+ {
+ u32 len = sizeof(u32), tmp = 0;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ if (ipw_get_ordinal(p, IPW_ORD_STAT_UCODE_VERSION, &tmp, &len))
+ return 0;
+@@ -1555,7 +1555,7 @@ static ssize_t show_rtc(struct device *d
+ char *buf)
+ {
+ u32 len = sizeof(u32), tmp = 0;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ if (ipw_get_ordinal(p, IPW_ORD_STAT_RTC, &tmp, &len))
+ return 0;
+@@ -1572,14 +1572,14 @@ static DEVICE_ATTR(rtc, S_IWUSR | S_IRUG
+ static ssize_t show_eeprom_delay(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- int n = ((struct ipw_priv *)d->driver_data)->eeprom_delay;
++ int n = ((struct ipw_priv *)dev_get_drvdata(d))->eeprom_delay;
+ return sprintf(buf, "%i\n", n);
+ }
+ static ssize_t store_eeprom_delay(struct device *d,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+ sscanf(buf, "%i", &p->eeprom_delay);
+ return strnlen(buf, count);
+ }
+@@ -1591,7 +1591,7 @@ static ssize_t show_command_event_reg(st
+ struct device_attribute *attr, char *buf)
+ {
+ u32 reg = 0;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ reg = ipw_read_reg32(p, IPW_INTERNAL_CMD_EVENT);
+ return sprintf(buf, "0x%08x\n", reg);
+@@ -1601,7 +1601,7 @@ static ssize_t store_command_event_reg(s
+ const char *buf, size_t count)
+ {
+ u32 reg;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ sscanf(buf, "%x", &reg);
+ ipw_write_reg32(p, IPW_INTERNAL_CMD_EVENT, reg);
+@@ -1615,7 +1615,7 @@ static ssize_t show_mem_gpio_reg(struct
+ struct device_attribute *attr, char *buf)
+ {
+ u32 reg = 0;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ reg = ipw_read_reg32(p, 0x301100);
+ return sprintf(buf, "0x%08x\n", reg);
+@@ -1625,7 +1625,7 @@ static ssize_t store_mem_gpio_reg(struct
+ const char *buf, size_t count)
+ {
+ u32 reg;
+- struct ipw_priv *p = d->driver_data;
++ struct ipw_priv *p = dev_get_drvdata(d);
+
+ sscanf(buf, "%x", &reg);
+ ipw_write_reg32(p, 0x301100, reg);
+@@ -1639,7 +1639,7 @@ static ssize_t show_indirect_dword(struc
+ struct device_attribute *attr, char *buf)
+ {
+ u32 reg = 0;
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ if (priv->status & STATUS_INDIRECT_DWORD)
+ reg = ipw_read_reg32(priv, priv->indirect_dword);
+@@ -1652,7 +1652,7 @@ static ssize_t store_indirect_dword(stru
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ sscanf(buf, "%x", &priv->indirect_dword);
+ priv->status |= STATUS_INDIRECT_DWORD;
+@@ -1666,7 +1666,7 @@ static ssize_t show_indirect_byte(struct
+ struct device_attribute *attr, char *buf)
+ {
+ u8 reg = 0;
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ if (priv->status & STATUS_INDIRECT_BYTE)
+ reg = ipw_read_reg8(priv, priv->indirect_byte);
+@@ -1679,7 +1679,7 @@ static ssize_t store_indirect_byte(struc
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ sscanf(buf, "%x", &priv->indirect_byte);
+ priv->status |= STATUS_INDIRECT_BYTE;
+@@ -1693,7 +1693,7 @@ static ssize_t show_direct_dword(struct
+ struct device_attribute *attr, char *buf)
+ {
+ u32 reg = 0;
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ if (priv->status & STATUS_DIRECT_DWORD)
+ reg = ipw_read32(priv, priv->direct_dword);
+@@ -1706,7 +1706,7 @@ static ssize_t store_direct_dword(struct
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ sscanf(buf, "%x", &priv->direct_dword);
+ priv->status |= STATUS_DIRECT_DWORD;
+@@ -1733,7 +1733,7 @@ static ssize_t show_rf_kill(struct devic
+ 1 - SW based RF kill active (sysfs)
+ 2 - HW based RF kill active
+ 3 - Both HW and SW baed RF kill active */
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
+ (rf_kill_active(priv) ? 0x2 : 0x0);
+ return sprintf(buf, "%i\n", val);
+@@ -1777,7 +1777,7 @@ static int ipw_radio_kill_sw(struct ipw_
+ static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+
+ ipw_radio_kill_sw(priv, buf[0] == '1');
+
+@@ -1789,7 +1789,7 @@ static DEVICE_ATTR(rf_kill, S_IWUSR | S_
+ static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ int pos = 0, len = 0;
+ if (priv->config & CFG_SPEED_SCAN) {
+ while (priv->speed_scan[pos] != 0)
+@@ -1804,7 +1804,7 @@ static ssize_t show_speed_scan(struct de
+ static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ int channel, pos = 0;
+ const char *p = buf;
+
+@@ -1843,14 +1843,14 @@ static DEVICE_ATTR(speed_scan, S_IWUSR |
+ static ssize_t show_net_stats(struct device *d, struct device_attribute *attr,
+ char *buf)
+ {
+- struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0');
+ }
+
+ static ssize_t store_net_stats(struct device *d, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
++ struct ipw_priv *priv = dev_get_drvdata(d);
+ if (buf[0] == '1')
+ priv->config |= CFG_NET_STATS;
+ else
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -7360,7 +7360,7 @@ static DRIVER_ATTR(debug_level, S_IWUSR
+ static ssize_t show_temperature(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+
+ if (!iwl3945_is_alive(priv))
+ return -EAGAIN;
+@@ -7373,7 +7373,7 @@ static DEVICE_ATTR(temperature, S_IRUGO,
+ static ssize_t show_tx_power(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+ return sprintf(buf, "%d\n", priv->user_txpower_limit);
+ }
+
+@@ -7381,7 +7381,7 @@ static ssize_t store_tx_power(struct dev
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+ char *p = (char *)buf;
+ u32 val;
+
+@@ -7400,7 +7400,7 @@ static DEVICE_ATTR(tx_power, S_IWUSR | S
+ static ssize_t show_flags(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+
+ return sprintf(buf, "0x%04X\n", priv->active_rxon.flags);
+ }
+@@ -7409,7 +7409,7 @@ static ssize_t store_flags(struct device
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+ u32 flags = simple_strtoul(buf, NULL, 0);
+
+ mutex_lock(&priv->mutex);
+@@ -7434,7 +7434,7 @@ static DEVICE_ATTR(flags, S_IWUSR | S_IR
+ static ssize_t show_filter_flags(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+
+ return sprintf(buf, "0x%04X\n",
+ le32_to_cpu(priv->active_rxon.filter_flags));
+@@ -7444,7 +7444,7 @@ static ssize_t store_filter_flags(struct
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+ u32 filter_flags = simple_strtoul(buf, NULL, 0);
+
+ mutex_lock(&priv->mutex);
+@@ -7742,7 +7742,7 @@ static DEVICE_ATTR(antenna, S_IWUSR | S_
+ static ssize_t show_status(struct device *d,
+ struct device_attribute *attr, char *buf)
+ {
+- struct iwl3945_priv *priv = (struct iwl3945_priv *)d->driver_data;
++ struct iwl3945_priv *priv = dev_get_drvdata(d);
+ if (!iwl3945_is_alive(priv))
+ return -EAGAIN;
+ return sprintf(buf, "0x%08x\n", (int)priv->status);
+@@ -7757,7 +7757,7 @@ static ssize_t dump_error_log(struct dev
+ char *p = (char *)buf;
+
+ if (p[0] == '1')
+- iwl3945_dump_nic_error_log((struct iwl3945_priv *)d->driver_data);
++ iwl3945_dump_nic_error_log(dev_get_drvdata(d));
+
+ return strnlen(buf, count);
+ }
+@@ -7771,7 +7771,7 @@ static ssize_t dump_event_log(struct dev
+ char *p = (char *)buf;
+
+ if (p[0] == '1')
+- iwl3945_dump_nic_event_log((struct iwl3945_priv *)d->driver_data);
++ iwl3945_dump_nic_event_log(dev_get_drvdata(d));
+
+ return strnlen(buf, count);
+ }
+@@ -7868,7 +7868,7 @@ static int iwl3945_pci_probe(struct pci_
+ int err = 0;
+ struct iwl3945_priv *priv;
+ struct ieee80211_hw *hw;
+- struct iwl_3945_cfg *cfg = (struct iwl_3945_cfg *)(ent->driver_data);
++ struct iwl_3945_cfg *cfg = dev_get_drvdata(ent);
+ unsigned long flags;
+ DECLARE_MAC_BUF(mac);
+
+--- a/drivers/net/xen-netfront.c
++++ b/drivers/net/xen-netfront.c
+@@ -1206,7 +1206,7 @@ static int __devinit netfront_probe(stru
+ }
+
+ info = netdev_priv(netdev);
+- dev->dev.driver_data = info;
++ dev_set_drvdata(&dev->dev, info);
+
+ err = register_netdev(info->netdev);
+ if (err) {
+@@ -1227,7 +1227,7 @@ static int __devinit netfront_probe(stru
+
+ fail:
+ free_netdev(netdev);
+- dev->dev.driver_data = NULL;
++ dev_set_drvdata(&dev->dev, NULL);
+ return err;
+ }
+
+@@ -1269,7 +1269,7 @@ static void xennet_disconnect_backend(st
+ */
+ static int netfront_resume(struct xenbus_device *dev)
+ {
+- struct netfront_info *info = dev->dev.driver_data;
++ struct netfront_info *info = dev_get_drvdata(&dev->dev);
+
+ dev_dbg(&dev->dev, "%s\n", dev->nodename);
+
+@@ -1594,7 +1594,7 @@ static int xennet_connect(struct net_dev
+ static void backend_changed(struct xenbus_device *dev,
+ enum xenbus_state backend_state)
+ {
+- struct netfront_info *np = dev->dev.driver_data;
++ struct netfront_info *np = dev_get_drvdata(&dev->dev);
+ struct net_device *netdev = np->netdev;
+
+ dev_dbg(&dev->dev, "%s\n", xenbus_strstate(backend_state));
+@@ -1768,7 +1768,7 @@ static struct xenbus_device_id netfront_
+
+ static int __devexit xennet_remove(struct xenbus_device *dev)
+ {
+- struct netfront_info *info = dev->dev.driver_data;
++ struct netfront_info *info = dev_get_drvdata(&dev->dev);
+
+ dev_dbg(&dev->dev, "%s\n", dev->nodename);
+
+--- a/drivers/pcmcia/ds.c
++++ b/drivers/pcmcia/ds.c
+@@ -394,7 +394,7 @@ static int pcmcia_device_probe(struct de
+ p_drv = to_pcmcia_drv(dev->driver);
+ s = p_dev->socket;
+
+- /* The PCMCIA code passes the match data in via dev->driver_data
++ /* The PCMCIA code passes the match data in via driver data
+ * which is an ugly hack. Once the driver probe is called it may
+ * and often will overwrite the match data so we must save it first
+ *
+@@ -404,7 +404,7 @@ static int pcmcia_device_probe(struct de
+ * call which will then check whether there are two
+ * pseudo devices, and if not, add the second one.
+ */
+- did = p_dev->dev.driver_data;
++ did = dev_get_drvdata(&p_dev->dev);
+
+ ds_dev_dbg(1, dev, "trying to bind to %s\n", p_drv->drv.name);
+
+@@ -499,7 +499,7 @@ static int pcmcia_device_remove(struct d
+ * pseudo multi-function card, we need to unbind
+ * all devices
+ */
+- did = p_dev->dev.driver_data;
++ did = dev_get_drvdata(dev);
+ if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
+ (p_dev->socket->device_count != 0) &&
+ (p_dev->device_no == 0))
+@@ -987,7 +987,7 @@ static inline int pcmcia_devmatch(struct
+ return 0;
+ }
+
+- dev->dev.driver_data = (void *) did;
++ dev_set_drvdata(&dev->dev, did);
+
+ return 1;
+ }
+--- a/drivers/s390/block/dasd_devmap.c
++++ b/drivers/s390/block/dasd_devmap.c
+@@ -561,7 +561,7 @@ dasd_create_device(struct ccw_device *cd
+ }
+
+ spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+- cdev->dev.driver_data = device;
++ dev_set_drvdata(&cdev->dev, device);
+ spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+
+ return device;
+@@ -597,7 +597,7 @@ dasd_delete_device(struct dasd_device *d
+
+ /* Disconnect dasd_device structure from ccw_device structure. */
+ spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
+- device->cdev->dev.driver_data = NULL;
++ dev_set_drvdata(&device->cdev->dev, NULL);
+ spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
+
+ /*
+@@ -638,7 +638,7 @@ dasd_put_device_wake(struct dasd_device
+ struct dasd_device *
+ dasd_device_from_cdev_locked(struct ccw_device *cdev)
+ {
+- struct dasd_device *device = cdev->dev.driver_data;
++ struct dasd_device *device = dev_get_drvdata(&cdev->dev);
+
+ if (!device)
+ return ERR_PTR(-ENODEV);
+--- a/drivers/s390/char/con3215.c
++++ b/drivers/s390/char/con3215.c
+@@ -368,7 +368,7 @@ raw3215_irq(struct ccw_device *cdev, uns
+ int cstat, dstat;
+ int count;
+
+- raw = cdev->dev.driver_data;
++ raw = dev_get_drvdata(&cdev->dev);
+ req = (struct raw3215_req *) intparm;
+ cstat = irb->scsw.cmd.cstat;
+ dstat = irb->scsw.cmd.dstat;
+@@ -635,7 +635,7 @@ raw3215_probe (struct ccw_device *cdev)
+ int line;
+
+ /* Console is special. */
+- if (raw3215[0] && (cdev->dev.driver_data == raw3215[0]))
++ if (raw3215[0] && (dev_get_drvdata(&cdev->dev) == raw3215[0]))
+ return 0;
+ raw = kmalloc(sizeof(struct raw3215_info) +
+ RAW3215_INBUF_SIZE, GFP_KERNEL|GFP_DMA);
+@@ -669,7 +669,7 @@ raw3215_probe (struct ccw_device *cdev)
+ }
+ init_waitqueue_head(&raw->empty_wait);
+
+- cdev->dev.driver_data = raw;
++ dev_set_drvdata(&cdev->dev, raw);
+ cdev->handler = raw3215_irq;
+
+ return 0;
+@@ -681,9 +681,9 @@ raw3215_remove (struct ccw_device *cdev)
+ struct raw3215_info *raw;
+
+ ccw_device_set_offline(cdev);
+- raw = cdev->dev.driver_data;
++ raw = dev_get_drvdata(&cdev->dev);
+ if (raw) {
+- cdev->dev.driver_data = NULL;
++ dev_set_drvdata(&cdev->dev, NULL);
+ kfree(raw->buffer);
+ kfree(raw);
+ }
+@@ -694,7 +694,7 @@ raw3215_set_online (struct ccw_device *c
+ {
+ struct raw3215_info *raw;
+
+- raw = cdev->dev.driver_data;
++ raw = dev_get_drvdata(&cdev->dev);
+ if (!raw)
+ return -ENODEV;
+
+@@ -706,7 +706,7 @@ raw3215_set_offline (struct ccw_device *
+ {
+ struct raw3215_info *raw;
+
+- raw = cdev->dev.driver_data;
++ raw = dev_get_drvdata(&cdev->dev);
+ if (!raw)
+ return -ENODEV;
+
+@@ -848,7 +848,7 @@ con3215_init(void)
+ raw->buffer = (char *) alloc_bootmem_low(RAW3215_BUFFER_SIZE);
+ raw->inbuf = (char *) alloc_bootmem_low(RAW3215_INBUF_SIZE);
+ raw->cdev = cdev;
+- cdev->dev.driver_data = raw;
++ dev_set_drvdata(&cdev->dev, raw);
+ cdev->handler = raw3215_irq;
+
+ raw->flags |= RAW3215_FIXED;
+--- a/drivers/s390/char/raw3270.c
++++ b/drivers/s390/char/raw3270.c
+@@ -355,7 +355,7 @@ raw3270_irq (struct ccw_device *cdev, un
+ struct raw3270_request *rq;
+ int rc;
+
+- rp = (struct raw3270 *) cdev->dev.driver_data;
++ rp = dev_get_drvdata(&cdev->dev);
+ if (!rp)
+ return;
+ rq = (struct raw3270_request *) intparm;
+@@ -828,7 +828,7 @@ raw3270_setup_device(struct ccw_device *
+ if (rp->minor == -1)
+ return -EUSERS;
+ rp->cdev = cdev;
+- cdev->dev.driver_data = rp;
++ dev_set_drvdata(&cdev->dev, rp);
+ cdev->handler = raw3270_irq;
+ return 0;
+ }
+@@ -1105,7 +1105,7 @@ raw3270_delete_device(struct raw3270 *rp
+ /* Disconnect from ccw_device. */
+ cdev = rp->cdev;
+ rp->cdev = NULL;
+- cdev->dev.driver_data = NULL;
++ dev_set_drvdata(&cdev->dev, NULL);
+ cdev->handler = NULL;
+
+ /* Put ccw_device structure. */
+@@ -1129,7 +1129,7 @@ static ssize_t
+ raw3270_model_show(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%i\n",
+- ((struct raw3270 *) dev->driver_data)->model);
++ ((struct raw3270 *) dev_get_drvdata(dev))->model);
+ }
+ static DEVICE_ATTR(model, 0444, raw3270_model_show, NULL);
+
+@@ -1137,7 +1137,7 @@ static ssize_t
+ raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%i\n",
+- ((struct raw3270 *) dev->driver_data)->rows);
++ ((struct raw3270 *) dev_get_drvdata(dev))->rows);
+ }
+ static DEVICE_ATTR(rows, 0444, raw3270_rows_show, NULL);
+
+@@ -1145,7 +1145,7 @@ static ssize_t
+ raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%i\n",
+- ((struct raw3270 *) dev->driver_data)->cols);
++ ((struct raw3270 *) dev_get_drvdata(dev))->cols);
+ }
+ static DEVICE_ATTR(columns, 0444, raw3270_columns_show, NULL);
+
+@@ -1282,7 +1282,7 @@ raw3270_remove (struct ccw_device *cdev)
+ struct raw3270_view *v;
+ struct raw3270_notifier *np;
+
+- rp = cdev->dev.driver_data;
++ rp = dev_get_drvdata(&cdev->dev);
+ /*
+ * _remove is the opposite of _probe; it's probe that
+ * should set up rp. raw3270_remove gets entered for
+@@ -1330,7 +1330,7 @@ raw3270_set_offline (struct ccw_device *
+ {
+ struct raw3270 *rp;
+
+- rp = cdev->dev.driver_data;
++ rp = dev_get_drvdata(&cdev->dev);
+ if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags))
+ return -EBUSY;
+ raw3270_remove(cdev);
+--- a/drivers/s390/char/tape_34xx.c
++++ b/drivers/s390/char/tape_34xx.c
+@@ -1310,7 +1310,7 @@ static int
+ tape_34xx_online(struct ccw_device *cdev)
+ {
+ return tape_generic_online(
+- cdev->dev.driver_data,
++ dev_get_drvdata(&cdev->dev),
+ &tape_discipline_34xx
+ );
+ }
+@@ -1318,7 +1318,7 @@ tape_34xx_online(struct ccw_device *cdev
+ static int
+ tape_34xx_offline(struct ccw_device *cdev)
+ {
+- return tape_generic_offline(cdev->dev.driver_data);
++ return tape_generic_offline(dev_get_drvdata(&cdev->dev));
+ }
+
+ static struct ccw_driver tape_34xx_driver = {
+--- a/drivers/s390/char/tape_core.c
++++ b/drivers/s390/char/tape_core.c
+@@ -92,7 +92,7 @@ tape_medium_state_show(struct device *de
+ {
+ struct tape_device *tdev;
+
+- tdev = (struct tape_device *) dev->driver_data;
++ tdev = dev_get_drvdata(dev);
+ return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->medium_state);
+ }
+
+@@ -104,7 +104,7 @@ tape_first_minor_show(struct device *dev
+ {
+ struct tape_device *tdev;
+
+- tdev = (struct tape_device *) dev->driver_data;
++ tdev = dev_get_drvdata(dev);
+ return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->first_minor);
+ }
+
+@@ -116,7 +116,7 @@ tape_state_show(struct device *dev, stru
+ {
+ struct tape_device *tdev;
+
+- tdev = (struct tape_device *) dev->driver_data;
++ tdev = dev_get_drvdata(dev);
+ return scnprintf(buf, PAGE_SIZE, "%s\n", (tdev->first_minor < 0) ?
+ "OFFLINE" : tape_state_verbose[tdev->tape_state]);
+ }
+@@ -130,7 +130,7 @@ tape_operation_show(struct device *dev,
+ struct tape_device *tdev;
+ ssize_t rc;
+
+- tdev = (struct tape_device *) dev->driver_data;
++ tdev = dev_get_drvdata(dev);
+ if (tdev->first_minor < 0)
+ return scnprintf(buf, PAGE_SIZE, "N/A\n");
+
+@@ -156,7 +156,7 @@ tape_blocksize_show(struct device *dev,
+ {
+ struct tape_device *tdev;
+
+- tdev = (struct tape_device *) dev->driver_data;
++ tdev = dev_get_drvdata(dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->char_data.block_size);
+ }
+@@ -542,7 +542,7 @@ tape_generic_probe(struct ccw_device *cd
+ dev_name(&cdev->dev));
+ return ret;
+ }
+- cdev->dev.driver_data = device;
++ dev_set_drvdata(&cdev->dev, device);
+ cdev->handler = __tape_do_irq;
+ device->cdev = cdev;
+ ccw_device_get_id(cdev, &dev_id);
+@@ -582,7 +582,7 @@ tape_generic_remove(struct ccw_device *c
+ {
+ struct tape_device * device;
+
+- device = cdev->dev.driver_data;
++ device = dev_get_drvdata(&cdev->dev);
+ if (!device) {
+ PRINT_ERR("No device pointer in tape_generic_remove!\n");
+ return;
+@@ -625,9 +625,9 @@ tape_generic_remove(struct ccw_device *c
+ tape_cleanup_device(device);
+ }
+
+- if (cdev->dev.driver_data != NULL) {
++ if (dev_get_drvdata(&cdev->dev) != NULL) {
+ sysfs_remove_group(&cdev->dev.kobj, &tape_attr_group);
+- cdev->dev.driver_data = tape_put_device(cdev->dev.driver_data);
++ dev_set_drvdata(&cdev->dev, tape_put_device(dev_get_drvdata(&cdev->dev)));
+ }
+ }
+
+@@ -1049,7 +1049,7 @@ __tape_do_irq (struct ccw_device *cdev,
+ struct tape_request *request;
+ int rc;
+
+- device = (struct tape_device *) cdev->dev.driver_data;
++ device = dev_get_drvdata(&cdev->dev);
+ if (device == NULL) {
+ PRINT_ERR("could not get device structure for %s "
+ "in interrupt\n", dev_name(&cdev->dev));
+--- a/drivers/s390/char/vmlogrdr.c
++++ b/drivers/s390/char/vmlogrdr.c
+@@ -503,7 +503,7 @@ static ssize_t vmlogrdr_autopurge_store(
+ struct device_attribute *attr,
+ const char * buf, size_t count)
+ {
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+ ssize_t ret = count;
+
+ switch (buf[0]) {
+@@ -524,7 +524,7 @@ static ssize_t vmlogrdr_autopurge_show(s
+ struct device_attribute *attr,
+ char *buf)
+ {
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+ return sprintf(buf, "%u\n", priv->autopurge);
+ }
+
+@@ -540,7 +540,7 @@ static ssize_t vmlogrdr_purge_store(stru
+
+ char cp_command[80];
+ char cp_response[80];
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+
+ if (buf[0] != '1')
+ return -EINVAL;
+@@ -577,7 +577,7 @@ static ssize_t vmlogrdr_autorecording_st
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+ ssize_t ret = count;
+
+ switch (buf[0]) {
+@@ -598,7 +598,7 @@ static ssize_t vmlogrdr_autorecording_sh
+ struct device_attribute *attr,
+ char *buf)
+ {
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+ return sprintf(buf, "%u\n", priv->autorecording);
+ }
+
+@@ -611,7 +611,7 @@ static ssize_t vmlogrdr_recording_store(
+ struct device_attribute *attr,
+ const char * buf, size_t count)
+ {
+- struct vmlogrdr_priv_t *priv = dev->driver_data;
++ struct vmlogrdr_priv_t *priv = dev_get_drvdata(dev);
+ ssize_t ret;
+
+ switch (buf[0]) {
+--- a/drivers/s390/char/vmur.c
++++ b/drivers/s390/char/vmur.c
+@@ -128,7 +128,7 @@ static struct urdev *urdev_get_from_cdev
+ unsigned long flags;
+
+ spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+- urd = cdev->dev.driver_data;
++ urd = dev_get_drvdata(&cdev->dev);
+ if (urd)
+ urdev_get(urd);
+ spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+@@ -285,7 +285,7 @@ static void ur_int_handler(struct ccw_de
+ TRACE("ur_int_handler: unsolicited interrupt\n");
+ return;
+ }
+- urd = cdev->dev.driver_data;
++ urd = dev_get_drvdata(&cdev->dev);
+ BUG_ON(!urd);
+ /* On special conditions irb is an error pointer */
+ if (IS_ERR(irb))
+@@ -831,7 +831,7 @@ static int ur_probe(struct ccw_device *c
+ goto fail_remove_attr;
+ }
+ spin_lock_irq(get_ccwdev_lock(cdev));
+- cdev->dev.driver_data = urd;
++ dev_set_drvdata(&cdev->dev, urd);
+ spin_unlock_irq(get_ccwdev_lock(cdev));
+
+ mutex_unlock(&vmur_mutex);
+@@ -971,8 +971,8 @@ static void ur_remove(struct ccw_device
+ ur_remove_attributes(&cdev->dev);
+
+ spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+- urdev_put(cdev->dev.driver_data);
+- cdev->dev.driver_data = NULL;
++ urdev_put(dev_get_drvdata(&cdev->dev));
++ dev_set_drvdata(&cdev->dev, NULL);
+ spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+
+ mutex_unlock(&vmur_mutex);
+--- a/drivers/s390/net/claw.c
++++ b/drivers/s390/net/claw.c
+@@ -581,7 +581,7 @@ claw_irq_handler(struct ccw_device *cdev
+
+ CLAW_DBF_TEXT(4, trace, "clawirq");
+ /* Bypass all 'unsolicited interrupts' */
+- if (!cdev->dev.driver_data) {
++ if (!dev_get_drvdata(&cdev->dev)) {
+ printk(KERN_WARNING "claw: unsolicited interrupt for device:"
+ "%s received c-%02x d-%02x\n",
+ dev_name(&cdev->dev), irb->scsw.cmd.cstat,
+@@ -589,7 +589,7 @@ claw_irq_handler(struct ccw_device *cdev
+ CLAW_DBF_TEXT(2, trace, "badirq");
+ return;
+ }
+- privptr = (struct claw_privbk *)cdev->dev.driver_data;
++ privptr = dev_get_drvdata(&cdev->dev);
+
+ /* Try to extract channel from driver data. */
+ if (privptr->channel[READ].cdev == cdev)
+@@ -1964,7 +1964,7 @@ probe_error( struct ccwgroup_device *cgd
+ struct claw_privbk *privptr;
+
+ CLAW_DBF_TEXT(4, trace, "proberr");
+- privptr = (struct claw_privbk *) cgdev->dev.driver_data;
++ privptr = dev_get_drvdata(&cgdev->dev);
+ if (privptr != NULL) {
+ cgdev->dev.driver_data = NULL;
+ kfree(privptr->p_env);
+@@ -2883,7 +2883,7 @@ claw_new_device(struct ccwgroup_device *
+ printk(KERN_INFO "claw: add for %s\n",
+ dev_name(&cgdev->cdev[READ]->dev));
+ CLAW_DBF_TEXT(2, setup, "new_dev");
+- privptr = cgdev->dev.driver_data;
++ privptr = dev_get_drvdata(&cgdev->dev);
+ cgdev->cdev[READ]->dev.driver_data = privptr;
+ cgdev->cdev[WRITE]->dev.driver_data = privptr;
+ if (!privptr)
+@@ -2935,7 +2935,7 @@ claw_new_device(struct ccwgroup_device *
+ }
+ dev->flags &=~IFF_RUNNING;
+ if (privptr->buffs_alloc == 0) {
+- ret=init_ccw_bk(dev);
++ ret=init_ccw_bk(dev);
+ if (ret !=0) {
+ unregister_netdev(dev);
+ claw_free_netdevice(dev,1);
+@@ -2991,7 +2991,7 @@ claw_shutdown_device(struct ccwgroup_dev
+ int ret;
+
+ CLAW_DBF_TEXT_(2, setup, "%s", dev_name(&cgdev->dev));
+- priv = cgdev->dev.driver_data;
++ priv = dev_get_drvdata(&cgdev->dev);
+ if (!priv)
+ return -ENODEV;
+ ndev = priv->channel[READ].ndev;
+@@ -3021,7 +3021,7 @@ claw_remove_device(struct ccwgroup_devic
+
+ BUG_ON(!cgdev);
+ CLAW_DBF_TEXT_(2, setup, "%s", dev_name(&cgdev->dev));
+- priv = cgdev->dev.driver_data;
++ priv = dev_get_drvdata(&cgdev->dev);
+ BUG_ON(!priv);
+ printk(KERN_INFO "claw: %s() called %s will be removed.\n",
+ __func__, dev_name(&cgdev->cdev[0]->dev));
+@@ -3037,9 +3037,9 @@ claw_remove_device(struct ccwgroup_devic
+ kfree(priv->channel[1].irb);
+ priv->channel[1].irb=NULL;
+ kfree(priv);
+- cgdev->dev.driver_data=NULL;
+- cgdev->cdev[READ]->dev.driver_data = NULL;
+- cgdev->cdev[WRITE]->dev.driver_data = NULL;
++ dev_set_drvdata(&cgdev->dev,NULL);
++ dev_set_drvdata(&cgdev->cdev[READ]->dev, NULL);
++ dev_set_drvdata(&cgdev->cdev[WRITE]->dev, NULL);
+ put_device(&cgdev->dev);
+
+ return;
+@@ -3055,7 +3055,7 @@ claw_hname_show(struct device *dev, stru
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3068,7 +3068,7 @@ claw_hname_write(struct device *dev, str
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3092,7 +3092,7 @@ claw_adname_show(struct device *dev, str
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3105,7 +3105,7 @@ claw_adname_write(struct device *dev, st
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3129,7 +3129,7 @@ claw_apname_show(struct device *dev, str
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3143,7 +3143,7 @@ claw_apname_write(struct device *dev, st
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3177,7 +3177,7 @@ claw_wbuff_show(struct device *dev, stru
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3191,7 +3191,7 @@ claw_wbuff_write(struct device *dev, str
+ struct claw_env * p_env;
+ int nnn,max;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3218,7 +3218,7 @@ claw_rbuff_show(struct device *dev, stru
+ struct claw_privbk *priv;
+ struct claw_env * p_env;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+@@ -3232,7 +3232,7 @@ claw_rbuff_write(struct device *dev, str
+ struct claw_env *p_env;
+ int nnn,max;
+
+- priv = dev->driver_data;
++ priv = dev_get_drvdata(dev);
+ if (!priv)
+ return -ENODEV;
+ p_env = priv->p_env;
+--- a/drivers/s390/net/lcs.c
++++ b/drivers/s390/net/lcs.c
+@@ -1378,6 +1378,7 @@ lcs_schedule_recovery(struct lcs_card *c
+ static void
+ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
+ {
++ struct ccwgroup_device *gdev = dev_get_drvdata(&cdev->dev);
+ struct lcs_card *card;
+ struct lcs_channel *channel;
+ int rc, index;
+@@ -1386,7 +1387,7 @@ lcs_irq(struct ccw_device *cdev, unsigne
+ if (lcs_check_irb_error(cdev, irb))
+ return;
+
+- card = CARD_FROM_DEV(cdev);
++ card = dev_get_drvdata(&gdev->dev);
+ if (card->read.ccwdev == cdev)
+ channel = &card->read;
+ else
+@@ -1924,7 +1925,7 @@ lcs_portno_show (struct device *dev, str
+ {
+ struct lcs_card *card;
+
+- card = (struct lcs_card *)dev->driver_data;
++ card = dev_get_drvdata(dev);
+
+ if (!card)
+ return 0;
+@@ -1941,7 +1942,7 @@ lcs_portno_store (struct device *dev, st
+ struct lcs_card *card;
+ int value;
+
+- card = (struct lcs_card *)dev->driver_data;
++ card = dev_get_drvdata(dev);
+
+ if (!card)
+ return 0;
+@@ -1975,7 +1976,7 @@ lcs_timeout_show(struct device *dev, str
+ {
+ struct lcs_card *card;
+
+- card = (struct lcs_card *)dev->driver_data;
++ card = dev_get_drvdata(dev);
+
+ return card ? sprintf(buf, "%u\n", card->lancmd_timeout) : 0;
+ }
+@@ -1986,7 +1987,7 @@ lcs_timeout_store (struct device *dev, s
+ struct lcs_card *card;
+ int value;
+
+- card = (struct lcs_card *)dev->driver_data;
++ card = dev_get_drvdata(dev);
+
+ if (!card)
+ return 0;
+@@ -2005,7 +2006,7 @@ static ssize_t
+ lcs_dev_recover_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct lcs_card *card = dev->driver_data;
++ struct lcs_card *card = dev_get_drvdata(dev);
+ char *tmp;
+ int i;
+
+@@ -2058,7 +2059,7 @@ lcs_probe_device(struct ccwgroup_device
+ put_device(&ccwgdev->dev);
+ return ret;
+ }
+- ccwgdev->dev.driver_data = card;
++ dev_set_drvdata(&ccwgdev->dev, card);
+ ccwgdev->cdev[0]->handler = lcs_irq;
+ ccwgdev->cdev[1]->handler = lcs_irq;
+ card->gdev = ccwgdev;
+@@ -2075,7 +2076,7 @@ lcs_register_netdev(struct ccwgroup_devi
+ struct lcs_card *card;
+
+ LCS_DBF_TEXT(2, setup, "regnetdv");
+- card = (struct lcs_card *)ccwgdev->dev.driver_data;
++ card = dev_get_drvdata(&ccwgdev->dev);
+ if (card->dev->reg_state != NETREG_UNINITIALIZED)
+ return 0;
+ SET_NETDEV_DEV(card->dev, &ccwgdev->dev);
+@@ -2094,7 +2095,7 @@ lcs_new_device(struct ccwgroup_device *c
+ enum lcs_dev_states recover_state;
+ int rc;
+
+- card = (struct lcs_card *)ccwgdev->dev.driver_data;
++ card = dev_get_drvdata(&ccwgdev->dev);
+ if (!card)
+ return -ENODEV;
+
+@@ -2202,7 +2203,7 @@ __lcs_shutdown_device(struct ccwgroup_de
+ int ret;
+
+ LCS_DBF_TEXT(3, setup, "shtdndev");
+- card = (struct lcs_card *)ccwgdev->dev.driver_data;
++ card = dev_get_drvdata(&ccwgdev->dev);
+ if (!card)
+ return -ENODEV;
+ if (recovery_mode == 0) {
+@@ -2269,7 +2270,7 @@ lcs_remove_device(struct ccwgroup_device
+ {
+ struct lcs_card *card;
+
+- card = (struct lcs_card *)ccwgdev->dev.driver_data;
++ card = dev_get_drvdata(&ccwgdev->dev);
+ if (!card)
+ return;
+
+--- a/drivers/s390/net/netiucv.c
++++ b/drivers/s390/net/netiucv.c
+@@ -1353,7 +1353,7 @@ static int netiucv_change_mtu(struct net
+ static ssize_t user_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%s\n", netiucv_printname(priv->conn->userid));
+@@ -1362,7 +1362,7 @@ static ssize_t user_show(struct device *
+ static ssize_t user_write(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+ struct net_device *ndev = priv->conn->netdev;
+ char *p;
+ char *tmp;
+@@ -1419,7 +1419,8 @@ static DEVICE_ATTR(user, 0644, user_show
+
+ static ssize_t buffer_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+-{ struct netiucv_priv *priv = dev->driver_data;
++{
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%d\n", priv->conn->max_buffsize);
+@@ -1428,7 +1429,7 @@ static ssize_t buffer_show (struct devic
+ static ssize_t buffer_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+ struct net_device *ndev = priv->conn->netdev;
+ char *e;
+ int bs1;
+@@ -1476,7 +1477,7 @@ static DEVICE_ATTR(buffer, 0644, buffer_
+ static ssize_t dev_fsm_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%s\n", fsm_getstate_str(priv->fsm));
+@@ -1487,7 +1488,7 @@ static DEVICE_ATTR(device_fsm_state, 044
+ static ssize_t conn_fsm_show (struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%s\n", fsm_getstate_str(priv->conn->fsm));
+@@ -1498,7 +1499,7 @@ static DEVICE_ATTR(connection_fsm_state,
+ static ssize_t maxmulti_show (struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.maxmulti);
+@@ -1508,7 +1509,7 @@ static ssize_t maxmulti_write (struct de
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.maxmulti = 0;
+@@ -1520,7 +1521,7 @@ static DEVICE_ATTR(max_tx_buffer_used, 0
+ static ssize_t maxcq_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.maxcqueue);
+@@ -1529,7 +1530,7 @@ static ssize_t maxcq_show (struct device
+ static ssize_t maxcq_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.maxcqueue = 0;
+@@ -1541,7 +1542,7 @@ static DEVICE_ATTR(max_chained_skbs, 064
+ static ssize_t sdoio_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.doios_single);
+@@ -1550,7 +1551,7 @@ static ssize_t sdoio_show (struct device
+ static ssize_t sdoio_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.doios_single = 0;
+@@ -1562,7 +1563,7 @@ static DEVICE_ATTR(tx_single_write_ops,
+ static ssize_t mdoio_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.doios_multi);
+@@ -1571,7 +1572,7 @@ static ssize_t mdoio_show (struct device
+ static ssize_t mdoio_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ priv->conn->prof.doios_multi = 0;
+@@ -1583,7 +1584,7 @@ static DEVICE_ATTR(tx_multi_write_ops, 0
+ static ssize_t txlen_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.txlen);
+@@ -1592,7 +1593,7 @@ static ssize_t txlen_show (struct device
+ static ssize_t txlen_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.txlen = 0;
+@@ -1604,7 +1605,7 @@ static DEVICE_ATTR(netto_bytes, 0644, tx
+ static ssize_t txtime_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.tx_time);
+@@ -1613,7 +1614,7 @@ static ssize_t txtime_show (struct devic
+ static ssize_t txtime_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.tx_time = 0;
+@@ -1625,7 +1626,7 @@ static DEVICE_ATTR(max_tx_io_time, 0644,
+ static ssize_t txpend_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.tx_pending);
+@@ -1634,7 +1635,7 @@ static ssize_t txpend_show (struct devic
+ static ssize_t txpend_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.tx_pending = 0;
+@@ -1646,7 +1647,7 @@ static DEVICE_ATTR(tx_pending, 0644, txp
+ static ssize_t txmpnd_show (struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 5, __func__);
+ return sprintf(buf, "%ld\n", priv->conn->prof.tx_max_pending);
+@@ -1655,7 +1656,7 @@ static ssize_t txmpnd_show (struct devic
+ static ssize_t txmpnd_write (struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct netiucv_priv *priv = dev->driver_data;
++ struct netiucv_priv *priv = dev_get_drvdata(dev);
+
+ IUCV_DBF_TEXT(trace, 4, __func__);
+ priv->conn->prof.tx_max_pending = 0;
+@@ -1747,7 +1748,7 @@ static int netiucv_register_device(struc
+ if (ret)
+ goto out_unreg;
+ priv->dev = dev;
+- dev->driver_data = priv;
++ dev_set_drvdata(dev, priv);
+ return 0;
+
+ out_unreg:
+--- a/drivers/scsi/aha1740.c
++++ b/drivers/scsi/aha1740.c
+@@ -646,7 +646,8 @@ static int aha1740_probe (struct device
+
+ static __devexit int aha1740_remove (struct device *dev)
+ {
+- struct Scsi_Host *shpnt = dev->driver_data;
++ struct eisa_device *edev = to_eisa_device (dev);
++ struct Scsi_Host *shpnt = eisa_get_drvdata(edev);
+ struct aha1740_hostdata *host = HOSTDATA (shpnt);
+
+ scsi_remove_host(shpnt);
+--- a/drivers/scsi/ibmvscsi/ibmvstgt.c
++++ b/drivers/scsi/ibmvscsi/ibmvstgt.c
+@@ -890,7 +890,7 @@ free_vport:
+
+ static int ibmvstgt_remove(struct vio_dev *dev)
+ {
+- struct srp_target *target = (struct srp_target *) dev->dev.driver_data;
++ struct srp_target *target = dev_get_drvdata(&dev->dev);
+ struct Scsi_Host *shost = target->shost;
+ struct vio_port *vport = target->ldata;
+
+--- a/drivers/scsi/libsrp.c
++++ b/drivers/scsi/libsrp.c
+@@ -135,7 +135,7 @@ int srp_target_alloc(struct srp_target *
+ INIT_LIST_HEAD(&target->cmd_queue);
+
+ target->dev = dev;
+- target->dev->driver_data = target;
++ dev_set_drvdata(target->dev, target);
+
+ target->srp_iu_size = iu_size;
+ target->rx_ring_size = nr;
+--- a/drivers/thermal/thermal_sys.c
++++ b/drivers/thermal/thermal_sys.c
+@@ -304,7 +304,7 @@ static LIST_HEAD(thermal_hwmon_list);
+ static ssize_t
+ name_show(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+- struct thermal_hwmon_device *hwmon = dev->driver_data;
++ struct thermal_hwmon_device *hwmon = dev_get_drvdata(dev);
+ return sprintf(buf, "%s\n", hwmon->type);
+ }
+ static DEVICE_ATTR(name, 0444, name_show, NULL);
+@@ -362,7 +362,7 @@ thermal_add_hwmon_sysfs(struct thermal_z
+ result = PTR_ERR(hwmon->device);
+ goto free_mem;
+ }
+- hwmon->device->driver_data = hwmon;
++ dev_set_drvdata(hwmon->device, hwmon);
+ result = device_create_file(hwmon->device, &dev_attr_name);
+ if (result)
+ goto unregister_hwmon_device;
+--- a/drivers/video/xen-fbfront.c
++++ b/drivers/video/xen-fbfront.c
+@@ -384,7 +384,7 @@ static int __devinit xenfb_probe(struct
+ fb_size = XENFB_DEFAULT_FB_LEN;
+ }
+
+- dev->dev.driver_data = info;
++ dev_set_drvdata(&dev->dev, info);
+ info->xbdev = dev;
+ info->irq = -1;
+ info->x1 = info->y1 = INT_MAX;
+@@ -503,7 +503,7 @@ xenfb_make_preferred_console(void)
+
+ static int xenfb_resume(struct xenbus_device *dev)
+ {
+- struct xenfb_info *info = dev->dev.driver_data;
++ struct xenfb_info *info = dev_get_drvdata(&dev->dev);
+
+ xenfb_disconnect_backend(info);
+ xenfb_init_shared_page(info, info->fb_info);
+@@ -512,7 +512,7 @@ static int xenfb_resume(struct xenbus_de
+
+ static int xenfb_remove(struct xenbus_device *dev)
+ {
+- struct xenfb_info *info = dev->dev.driver_data;
++ struct xenfb_info *info = dev_get_drvdata(&dev->dev);
+
+ xenfb_disconnect_backend(info);
+ if (info->fb_info) {
+@@ -621,7 +621,7 @@ static void xenfb_disconnect_backend(str
+ static void xenfb_backend_changed(struct xenbus_device *dev,
+ enum xenbus_state backend_state)
+ {
+- struct xenfb_info *info = dev->dev.driver_data;
++ struct xenfb_info *info = dev_get_drvdata(&dev->dev);
+ int val;
+
+ switch (backend_state) {
+--- a/include/linux/eisa.h
++++ b/include/linux/eisa.h
+@@ -78,12 +78,12 @@ static inline void eisa_driver_unregiste
+ /* Mimics pci.h... */
+ static inline void *eisa_get_drvdata (struct eisa_device *edev)
+ {
+- return edev->dev.driver_data;
++ return dev_get_drvdata(&edev->dev);
+ }
+
+ static inline void eisa_set_drvdata (struct eisa_device *edev, void *data)
+ {
+- edev->dev.driver_data = data;
++ dev_set_drvdata(&edev->dev, data);
+ }
+
+ /* The EISA root device. There's rumours about machines with multiple
diff --git a/pending/usb-gotemp.patch b/pending/usb-gotemp.patch
new file mode 100644
index 00000000000000..87a0b37d52dbbc
--- /dev/null
+++ b/pending/usb-gotemp.patch
@@ -0,0 +1,349 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Tue, 09 Apr 2002 12:14:34 -0700
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: USB: driver for gotemp device
+
+NOT FOR MAINLINE!
+
+This is for the driver tutorial I give. It will not be included in the
+mainline kernel tree ever. Use the ldusb driver that is already there
+instead for this device.
+
+This is only a teaching tool.
+
+---
+ drivers/usb/misc/Kconfig | 8 +
+ drivers/usb/misc/Makefile | 1
+ drivers/usb/misc/gotemp.c | 301 ++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 310 insertions(+)
+
+--- /dev/null
++++ b/drivers/usb/misc/gotemp.c
+@@ -0,0 +1,301 @@
++/*
++ * USB GoTemp driver
++ *
++ * Copyright (C) 2005 Greg Kroah-Hartman (greg@kroah.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation, version 2.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <linux/usb.h>
++
++
++#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com"
++#define DRIVER_DESC "USB GoTemp driver"
++
++#define VENDOR_ID 0x08f7
++#define PRODUCT_ID 0x0002
++
++/* table of devices that work with this driver */
++static struct usb_device_id id_table[] = {
++ { USB_DEVICE(VENDOR_ID, PRODUCT_ID) },
++ { },
++};
++MODULE_DEVICE_TABLE(usb, id_table);
++
++struct gotemp {
++ struct usb_device *udev;
++ int temp;
++ unsigned char *int_in_buffer;
++ __u8 int_in_endpointAddr;
++ struct urb *int_in_urb;
++};
++
++#define CMD_ID_GET_STATUS 0x10
++#define CMD_ID_WRITE_LOCAL_NV_MEM_1BYTE 0x11
++#define CMD_ID_WRITE_LOCAL_NV_MEM_2BYTES 0x12
++#define CMD_ID_WRITE_LOCAL_NV_MEM_3BYTES 0x13
++#define CMD_ID_WRITE_LOCAL_NV_MEM_4BYTES 0x14
++#define CMD_ID_WRITE_LOCAL_NV_MEM_5BYTES 0x15
++#define CMD_ID_WRITE_LOCAL_NV_MEM_6BYTES 0x16
++#define CMD_ID_READ_LOCAL_NV_MEM 0x17
++#define CMD_ID_START_MEASUREMENTS 0x18
++#define CMD_ID_STOP_MEASUREMENTS 0x19
++#define CMD_ID_INIT 0x1A
++#define CMD_ID_SET_MEASUREMENT_PERIOD 0x1B
++#define CMD_ID_GET_MEASUREMENT_PERIOD 0x1C
++#define CMD_ID_SET_LED_STATE 0x1D
++#define CMD_ID_GET_LED_STATE 0x1E
++#define CMD_ID_GET_SERIAL_NUMBER 0x20
++
++struct output_packet {
++ u8 cmd;
++ u8 params[7];
++} __attribute__ ((packed));
++
++struct measurement_packet {
++ u8 measurements_in_packet;
++ u8 rolling_counter;
++ __le16 measurement0;
++ __le16 measurement1;
++ __le16 measurement2;
++} __attribute__ ((packed));
++
++static int send_cmd(struct gotemp *gdev, u8 cmd)
++{
++ struct output_packet *pkt;
++ int retval;
++
++ pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
++ if (!pkt)
++ return -ENOMEM;
++ pkt->cmd = cmd;
++
++ retval = usb_control_msg(gdev->udev,
++ usb_sndctrlpipe(gdev->udev, 0),
++ 0x09, /* bRequest = SET_REPORT */
++ 0x21, /* bRequestType = 00100001 */
++ 0x0200, /* or is it 0x0002? */
++ 0x0000, /* interface 0 */
++ pkt, sizeof(*pkt), 10000);
++ dev_dbg(&gdev->udev->dev, "retval=%d\n", retval);
++ if (retval == sizeof(*pkt))
++ retval = 0;
++
++ kfree(pkt);
++ return retval;
++}
++
++static void init_dev(struct gotemp *gdev)
++{
++ int retval;
++
++ /* First send an init message */
++ send_cmd(gdev, CMD_ID_INIT);
++
++ /* hack hack hack */
++ /* problem is, we want a usb_interrupt_msg() call to read the interrupt
++ * endpoint right now. only after it is flushed, can we properly start
++ * up the measurements. */
++ msleep(1000);
++
++ /* kick off interrupt urb */
++ retval = usb_submit_urb(gdev->int_in_urb, GFP_KERNEL);
++ if (retval)
++ dev_err(&gdev->udev->dev,
++ "%s - Error %d submitting interrupt urb\n",
++ __func__, retval);
++
++ msleep(3000);
++ send_cmd(gdev, CMD_ID_START_MEASUREMENTS);
++}
++
++static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct usb_interface *intf = to_usb_interface(dev);
++ struct gotemp *gdev = usb_get_intfdata(intf);
++
++ return sprintf(buf, "%d\n", gdev->temp);
++}
++
++static DEVICE_ATTR(temp, S_IRUGO, show_temp, NULL);
++
++static void read_int_callback(struct urb *urb)
++{
++ struct gotemp *gdev = urb->context;
++ unsigned char *data = urb->transfer_buffer;
++ struct measurement_packet *measurement = urb->transfer_buffer;
++ int retval;
++ int i;
++
++ switch (urb->status) {
++ case 0:
++ /* success */
++ break;
++ case -ECONNRESET:
++ case -ENOENT:
++ case -ESHUTDOWN:
++ /* this urb is terminated, clean up */
++ dbg("%s - urb shutting down with status: %d",
++ __func__, urb->status);
++ return;
++ default:
++ dbg("%s - nonzero urb status received: %d",
++ __func__, urb->status);
++ goto exit;
++ }
++
++ dev_info(&urb->dev->dev, "int read data: ");
++ for (i = 0; i < urb->actual_length; ++i)
++ printk("%02x ", data[i]);
++ printk("\n");
++
++ dev_dbg(&urb->dev->dev, "counter %d, temp=%d\n",
++ measurement->rolling_counter,
++ measurement->measurement0);
++ gdev->temp = le16_to_cpu(measurement->measurement0);
++
++exit:
++ retval = usb_submit_urb(urb, GFP_ATOMIC);
++ if (retval)
++ dev_err(&urb->dev->dev,
++ "%s - Error %d submitting interrupt urb\n",
++ __func__, retval);
++}
++
++static int gotemp_probe(struct usb_interface *interface,
++ const struct usb_device_id *id)
++{
++ struct usb_device *udev = interface_to_usbdev(interface);
++ struct gotemp *gdev = NULL;
++ int retval = -ENOMEM;
++ int i;
++ struct usb_host_interface *iface_desc;
++ struct usb_endpoint_descriptor *endpoint = NULL;
++ size_t buffer_size = 0;
++
++ gdev = kzalloc(sizeof(struct gotemp), GFP_KERNEL);
++ if (gdev == NULL) {
++ dev_err(&interface->dev, "Out of memory\n");
++ goto error;
++ }
++
++ gdev->udev = usb_get_dev(udev);
++
++ /* find the one control endpoint of this device */
++ iface_desc = interface->cur_altsetting;
++ for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
++ endpoint = &iface_desc->endpoint[i].desc;
++
++ if (usb_endpoint_is_int_in(endpoint)) {
++ buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
++ gdev->int_in_endpointAddr = endpoint->bEndpointAddress;
++ gdev->int_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
++ if (!gdev->int_in_buffer) {
++ dev_err(&interface->dev,
++ "Could not allocate buffer");
++ goto error;
++ }
++ break;
++ }
++ }
++ if (!gdev->int_in_endpointAddr) {
++ dev_err(&interface->dev, "Could not find int-in endpoint");
++ retval = -ENODEV;
++ goto error;
++ }
++
++ gdev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
++ if (!gdev->int_in_urb) {
++ dev_err(&interface->dev, "No free urbs available\n");
++ goto error;
++ }
++ usb_fill_int_urb(gdev->int_in_urb, udev,
++ usb_rcvintpipe(udev,
++ endpoint->bEndpointAddress),
++ gdev->int_in_buffer, buffer_size,
++ read_int_callback, gdev,
++ endpoint->bInterval);
++
++ usb_set_intfdata(interface, gdev);
++
++ init_dev(gdev);
++
++ /*
++ * this must come last - after this call the device is active
++ * if we delayed any initialization until after this, the user
++ * would read garbage
++ */
++ retval = device_create_file(&interface->dev, &dev_attr_temp);
++ if (retval)
++ goto error;
++
++ dev_info(&interface->dev, "USB GoTemp device now attached\n");
++ return 0;
++
++error:
++ usb_set_intfdata(interface, NULL);
++ if (gdev) {
++ usb_free_urb(gdev->int_in_urb);
++ kfree(gdev->int_in_buffer);
++ }
++ kfree(gdev);
++ return retval;
++}
++
++static void gotemp_disconnect(struct usb_interface *interface)
++{
++ struct gotemp *gdev;
++
++ gdev = usb_get_intfdata(interface);
++
++ device_remove_file(&interface->dev, &dev_attr_temp);
++ /* intfdata must remain valid while reads are under way */
++ usb_set_intfdata(interface, NULL);
++
++ usb_put_dev(gdev->udev);
++
++ usb_kill_urb(gdev->int_in_urb);
++ usb_free_urb(gdev->int_in_urb);
++ kfree(gdev->int_in_buffer);
++ kfree(gdev);
++
++ dev_info(&interface->dev, "USB GoTemp now disconnected\n");
++}
++
++static struct usb_driver gotemp_driver = {
++ .name = "gotemp",
++ .probe = gotemp_probe,
++ .disconnect = gotemp_disconnect,
++ .id_table = id_table,
++};
++
++static int __init gotemp_init(void)
++{
++ int retval = 0;
++
++ retval = usb_register(&gotemp_driver);
++ if (retval)
++ err("usb_register failed. Error number %d", retval);
++ return retval;
++}
++
++static void __exit gotemp_exit(void)
++{
++ usb_deregister(&gotemp_driver);
++}
++
++module_init(gotemp_init);
++module_exit(gotemp_exit);
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_LICENSE("GPL");
+--- a/drivers/usb/misc/Kconfig
++++ b/drivers/usb/misc/Kconfig
+@@ -255,4 +255,12 @@ config USB_VST
+ To compile this driver as a module, choose M here: the
+ module will be called vstusb.
+
++config USB_GOTEMP
++ tristate "GoTemp USB thermometer driver support"
++ depends on USB
++ help
++ Say Y here if you want to connect a GoTemp USB thermometer
++ device to your computer's USB port.
+
++ To compile this driver as a module, choose M here: the
++ module will be called gotemp.
+--- a/drivers/usb/misc/Makefile
++++ b/drivers/usb/misc/Makefile
+@@ -11,6 +11,7 @@ obj-$(CONFIG_USB_CYTHERM) += cytherm.o
+ obj-$(CONFIG_USB_EMI26) += emi26.o
+ obj-$(CONFIG_USB_EMI62) += emi62.o
+ obj-$(CONFIG_USB_FTDI_ELAN) += ftdi-elan.o
++obj-$(CONFIG_USB_GOTEMP) += gotemp.o
+ obj-$(CONFIG_USB_IDMOUSE) += idmouse.o
+ obj-$(CONFIG_USB_IOWARRIOR) += iowarrior.o
+ obj-$(CONFIG_USB_ISIGHTFW) += isight_firmware.o