Skip to content

Commit

Permalink
[media] siano: register media controller earlier
Browse files Browse the repository at this point in the history
We need to initialize the media controller earlier, as the core
will call the smsdvb hotplug during register time. Ok, this is
an async operation, so, when the module is not loaded, the media
controller works.

However, if the module is already loaded, nothing will be
registered at the media controller, as it will load too late.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  • Loading branch information
mchehab committed Feb 26, 2015
1 parent fb372a4 commit 4b208f8
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 11 deletions.
7 changes: 6 additions & 1 deletion drivers/media/common/siano/smscoreapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion drivers/media/common/siano/smscoreapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/media/mmc/siano/smssdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ static int smssdio_probe(struct sdio_func *func,
goto free;
}

ret = smscore_register_device(&params, &smsdev->coredev);
ret = smscore_register_device(&params, &smsdev->coredev, NULL);
if (ret < 0)
goto free;

Expand Down
21 changes: 13 additions & 8 deletions drivers/media/usb/siano/smsusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -366,20 +366,22 @@ 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
}

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 */
Expand Down Expand Up @@ -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(&params, &dev->coredev);
rc = smscore_register_device(&params, &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;
}

Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 4b208f8

Please sign in to comment.