/***************************************************************************/
 /* Private functions */
 
-static void *pwc_alloc_urb_buffer(struct device *dev,
+static void *pwc_alloc_urb_buffer(struct usb_device *dev,
                                  size_t size, dma_addr_t *dma_handle)
 {
+       struct device *dmadev = dev->bus->sysdev;
        void *buffer = kmalloc(size, GFP_KERNEL);
 
        if (!buffer)
                return NULL;
 
-       *dma_handle = dma_map_single(dev, buffer, size, DMA_FROM_DEVICE);
-       if (dma_mapping_error(dev, *dma_handle)) {
+       *dma_handle = dma_map_single(dmadev, buffer, size, DMA_FROM_DEVICE);
+       if (dma_mapping_error(dmadev, *dma_handle)) {
                kfree(buffer);
                return NULL;
        }
        return buffer;
 }
 
-static void pwc_free_urb_buffer(struct device *dev,
+static void pwc_free_urb_buffer(struct usb_device *dev,
                                size_t size,
                                void *buffer,
                                dma_addr_t dma_handle)
 {
-       dma_unmap_single(dev, dma_handle, size, DMA_FROM_DEVICE);
+       struct device *dmadev = dev->bus->sysdev;
+
+       dma_unmap_single(dmadev, dma_handle, size, DMA_FROM_DEVICE);
        kfree(buffer);
 }
 
 static void pwc_isoc_handler(struct urb *urb)
 {
        struct pwc_device *pdev = (struct pwc_device *)urb->context;
+       struct device *dmadev = urb->dev->bus->sysdev;
        int i, fst, flen;
        unsigned char *iso_buf = NULL;
 
        /* Reset ISOC error counter. We did get here, after all. */
        pdev->visoc_errors = 0;
 
-       dma_sync_single_for_cpu(&urb->dev->dev,
+       dma_sync_single_for_cpu(dmadev,
                                urb->transfer_dma,
                                urb->transfer_buffer_length,
                                DMA_FROM_DEVICE);
                pdev->vlast_packet_size = flen;
        }
 
-       dma_sync_single_for_device(&urb->dev->dev,
+       dma_sync_single_for_device(dmadev,
                                   urb->transfer_dma,
                                   urb->transfer_buffer_length,
                                   DMA_FROM_DEVICE);
                urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
                urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
                urb->transfer_buffer_length = ISO_BUFFER_SIZE;
-               urb->transfer_buffer = pwc_alloc_urb_buffer(&udev->dev,
+               urb->transfer_buffer = pwc_alloc_urb_buffer(udev,
                                                            urb->transfer_buffer_length,
                                                            &urb->transfer_dma);
                if (urb->transfer_buffer == NULL) {
                if (urb) {
                        PWC_DEBUG_MEMORY("Freeing URB\n");
                        if (urb->transfer_buffer)
-                               pwc_free_urb_buffer(&urb->dev->dev,
+                               pwc_free_urb_buffer(urb->dev,
                                                    urb->transfer_buffer_length,
                                                    urb->transfer_buffer,
                                                    urb->transfer_dma);