diff options
Diffstat (limited to 'drivers/media/common/siano/smscoreapi.c')
-rw-r--r-- | drivers/media/common/siano/smscoreapi.c | 33 |
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); |