aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common/siano/smscoreapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/common/siano/smscoreapi.c')
-rw-r--r--drivers/media/common/siano/smscoreapi.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c
index c5c827e11b64..b5dcc6d1fe90 100644
--- a/drivers/media/common/siano/smscoreapi.c
+++ b/drivers/media/common/siano/smscoreapi.c
@@ -631,7 +631,8 @@ smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer,
631 631
632 cb->p = buffer; 632 cb->p = buffer;
633 cb->offset_in_common = buffer - (u8 *) common_buffer; 633 cb->offset_in_common = buffer - (u8 *) common_buffer;
634 cb->phys = common_buffer_phys + cb->offset_in_common; 634 if (common_buffer_phys)
635 cb->phys = common_buffer_phys + cb->offset_in_common;
635 636
636 return cb; 637 return cb;
637} 638}
@@ -690,17 +691,21 @@ int smscore_register_device(struct smsdevice_params_t *params,
690 691
691 /* alloc common buffer */ 692 /* alloc common buffer */
692 dev->common_buffer_size = params->buffer_size * params->num_buffers; 693 dev->common_buffer_size = params->buffer_size * params->num_buffers;
693 dev->common_buffer = dma_alloc_coherent(NULL, dev->common_buffer_size, 694 if (params->usb_device)
694 &dev->common_buffer_phys, 695 buffer = kzalloc(dev->common_buffer_size, GFP_KERNEL);
695 GFP_KERNEL | GFP_DMA); 696 else
696 if (!dev->common_buffer) { 697 buffer = dma_alloc_coherent(params->device,
698 dev->common_buffer_size,
699 &dev->common_buffer_phys,
700 GFP_KERNEL | GFP_DMA);
701 if (!buffer) {
697 smscore_unregister_device(dev); 702 smscore_unregister_device(dev);
698 return -ENOMEM; 703 return -ENOMEM;
699 } 704 }
705 dev->common_buffer = buffer;
700 706
701 /* prepare dma buffers */ 707 /* prepare dma buffers */
702 for (buffer = dev->common_buffer; 708 for (; dev->num_buffers < params->num_buffers;
703 dev->num_buffers < params->num_buffers;
704 dev->num_buffers++, buffer += params->buffer_size) { 709 dev->num_buffers++, buffer += params->buffer_size) {
705 struct smscore_buffer_t *cb; 710 struct smscore_buffer_t *cb;
706 711
@@ -720,6 +725,7 @@ int smscore_register_device(struct smsdevice_params_t *params,
720 dev->board_id = SMS_BOARD_UNKNOWN; 725 dev->board_id = SMS_BOARD_UNKNOWN;
721 dev->context = params->context; 726 dev->context = params->context;
722 dev->device = params->device; 727 dev->device = params->device;
728 dev->usb_device = params->usb_device;
723 dev->setmode_handler = params->setmode_handler; 729 dev->setmode_handler = params->setmode_handler;
724 dev->detectmode_handler = params->detectmode_handler; 730 dev->detectmode_handler = params->detectmode_handler;
725 dev->sendrequest_handler = params->sendrequest_handler; 731 dev->sendrequest_handler = params->sendrequest_handler;
@@ -1231,10 +1237,15 @@ void smscore_unregister_device(struct smscore_device_t *coredev)
1231 1237
1232 pr_debug("freed %d buffers\n", num_buffers); 1238 pr_debug("freed %d buffers\n", num_buffers);
1233 1239
1234 if (coredev->common_buffer) 1240 if (coredev->common_buffer) {
1235 dma_free_coherent(NULL, coredev->common_buffer_size, 1241 if (coredev->usb_device)
1236 coredev->common_buffer, coredev->common_buffer_phys); 1242 kfree(coredev->common_buffer);
1237 1243 else
1244 dma_free_coherent(coredev->device,
1245 coredev->common_buffer_size,
1246 coredev->common_buffer,
1247 coredev->common_buffer_phys);
1248 }
1238 kfree(coredev->fw_buf); 1249 kfree(coredev->fw_buf);
1239 1250
1240 list_del(&coredev->entry); 1251 list_del(&coredev->entry);