[media] siano: register media controller earlier
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sun, 22 Feb 2015 15:29:23 +0000 (12:29 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Thu, 26 Feb 2015 12:10:39 +0000 (09:10 -0300)
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>
drivers/media/common/siano/smscoreapi.c
drivers/media/common/siano/smscoreapi.h
drivers/media/mmc/siano/smssdio.c
drivers/media/usb/siano/smsusb.c

index cb7515ba219373dd8a5a4181f20789c8ae22dc37..2a8d9a36d6f02c27f1bcabaea018fc72b60a0ac6 100644 (file)
@@ -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);
 
index 6ff8f64a3794950d39e0506ab0dfa43266134cfa..eb8bd689b936621b95e4d02df534616d5a5afa85 100644 (file)
@@ -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);
index b30b0c6fd3b96c308828f8fbbabfb89fb981956c..fee2d710bbf88fc1b839719d34a4d9c5b6a0a3cf 100644 (file)
@@ -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;
 
index 8e0b8212b23d71b884ec93eecd74049ee9f83b3a..0b13ad3d3a8c143d4d60f404ea4740f56b597c60 100644 (file)
@@ -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(&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;
        }
 
@@ -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;
 }