diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c index cb7515ba2193..2a8d9a36d6f0 100644 --- a/drivers/media/common/siano/smscoreapi.c +++ b/drivers/media/common/siano/smscoreapi.c @@ -653,7 +653,8 @@ smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer, * @return 0 on success, <0 on error. */ int smscore_register_device(struct smsdevice_params_t *params, - struct smscore_device_t **coredev) + struct smscore_device_t **coredev, + void *mdev) { struct smscore_device_t *dev; u8 *buffer; @@ -662,6 +663,10 @@ int smscore_register_device(struct smsdevice_params_t *params, if (!dev) return -ENOMEM; +#ifdef CONFIG_MEDIA_CONTROLLER_DVB + dev->media_dev = mdev; +#endif + /* init list entry so it could be safe in smscore_unregister_device */ INIT_LIST_HEAD(&dev->entry); diff --git a/drivers/media/common/siano/smscoreapi.h b/drivers/media/common/siano/smscoreapi.h index 6ff8f64a3794..eb8bd689b936 100644 --- a/drivers/media/common/siano/smscoreapi.h +++ b/drivers/media/common/siano/smscoreapi.h @@ -1123,7 +1123,8 @@ extern int smscore_register_hotplug(hotplug_t hotplug); extern void smscore_unregister_hotplug(hotplug_t hotplug); extern int smscore_register_device(struct smsdevice_params_t *params, - struct smscore_device_t **coredev); + struct smscore_device_t **coredev, + void *mdev); extern void smscore_unregister_device(struct smscore_device_t *coredev); extern int smscore_start_device(struct smscore_device_t *coredev); diff --git a/drivers/media/mmc/siano/smssdio.c b/drivers/media/mmc/siano/smssdio.c index b30b0c6fd3b9..fee2d710bbf8 100644 --- a/drivers/media/mmc/siano/smssdio.c +++ b/drivers/media/mmc/siano/smssdio.c @@ -279,7 +279,7 @@ static int smssdio_probe(struct sdio_func *func, goto free; } - ret = smscore_register_device(¶ms, &smsdev->coredev); + ret = smscore_register_device(¶ms, &smsdev->coredev, NULL); if (ret < 0) goto free; diff --git a/drivers/media/usb/siano/smsusb.c b/drivers/media/usb/siano/smsusb.c index 8e0b8212b23d..0b13ad3d3a8c 100644 --- a/drivers/media/usb/siano/smsusb.c +++ b/drivers/media/usb/siano/smsusb.c @@ -340,18 +340,18 @@ static void smsusb_term_device(struct usb_interface *intf) usb_set_intfdata(intf, NULL); } -static void siano_media_device_register(struct smsusb_device_t *dev) +static void *siano_media_device_register(struct smsusb_device_t *dev, + int board_id) { #ifdef CONFIG_MEDIA_CONTROLLER_DVB struct media_device *mdev; struct usb_device *udev = dev->udev; - int board_id = smscore_get_board_id(dev->coredev); struct sms_board *board = sms_get_board(board_id); int ret; mdev = kzalloc(sizeof(*mdev), GFP_KERNEL); if (!mdev) - return; + return NULL; mdev->dev = &udev->dev; strlcpy(mdev->model, board->name, sizeof(mdev->model)); @@ -366,13 +366,14 @@ static void siano_media_device_register(struct smsusb_device_t *dev) pr_err("Couldn't create a media device. Error: %d\n", ret); kfree(mdev); - return; + return NULL; } - dev->coredev->media_dev = mdev; - pr_info("media controller created\n"); + return mdev; +#else + return NULL; #endif } @@ -380,6 +381,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) { struct smsdevice_params_t params; struct smsusb_device_t *dev; + void *mdev; int i, rc; /* create device object */ @@ -431,11 +433,15 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) params.context = dev; usb_make_path(dev->udev, params.devpath, sizeof(params.devpath)); + mdev = siano_media_device_register(dev, board_id); + /* register in smscore */ - rc = smscore_register_device(¶ms, &dev->coredev); + rc = smscore_register_device(¶ms, &dev->coredev, mdev); if (rc < 0) { pr_err("smscore_register_device(...) failed, rc %d\n", rc); smsusb_term_device(intf); + media_device_unregister(mdev); + kfree(mdev); return rc; } @@ -467,7 +473,6 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) } pr_debug("device 0x%p created\n", dev); - siano_media_device_register(dev); return rc; }