aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common/siano/smscoreapi.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 20:16:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 20:16:59 -0400
commitef1c4a6fa91bbbe9b09f770d28eba31a9edf770c (patch)
tree52f5d175031c553160d14890e876ffc5432d2467 /drivers/media/common/siano/smscoreapi.c
parent147a89bc71e7db40f011454a40add7ff2d10f8d8 (diff)
parentf8a695c4b43d02c89b8bba9ba6058fd5db1bc71d (diff)
Merge tag 'media/v4.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - new CEC pin injection code for testing purposes - DVB frontend cxd2099 promoted from staging - new platform driver for Sony cxd2880 DVB devices - new sensor drivers: mt9t112, ov2685, ov5695, ov772x, tda1997x, tw9910.c - removal of unused cx18 and ivtv alsa mixers - the reneseas-ceu driver doesn't depend on soc_camera anymore and moved from staging - removed the mantis_vp3028 driver, unused since 2009 - s5p-mfc: add support for version 10 of the MSP - added a decoder for imon protocol - atomisp: lots of cleanups - imx074 and mt9t031: don't depend on soc_camera anymore, being promoted from staging - added helper functions to better support DVB I2C binding - lots of driver improvements and cleanups * tag 'media/v4.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (438 commits) media: v4l2-ioctl: rename a temp var that stores _IOC_SIZE(cmd) media: fimc-capture: get rid of two warnings media: dvb-usb-v2: fix a missing dependency of I2C_MUX media: uvc: to the right check at uvc_ioctl_enum_framesizes() media: cec-core: fix a bug at cec_error_inj_write() media: tda9840: cleanup a warning media: tm6000: avoid casting just to print pointer address media: em28xx-input: improve error handling code media: zr364xx: avoid casting just to print pointer address media: vivid-radio-rx: add a cast to avoid a warning media: saa7134-alsa: don't use casts to print a buffer address media: solo6x10: get rid of an address space warning media: zoran: don't cast pointers to print them media: ir-kbd-i2c: change the if logic to avoid a warning media: ir-kbd-i2c: improve error handling code media: saa7134-input: improve error handling media: s2255drv: fix a casting warning media: ivtvfb: Cleanup some warnings media: videobuf-dma-sg: Fix a weird cast soc_camera: fix a weird cast on printk ...
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);