Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[pandora-kernel.git] / drivers / media / video / sh_mobile_csi2.c
index 6f9f2b7..8a652b5 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/videodev2.h>
+#include <linux/module.h>
 
 #include <media/sh_mobile_ceu.h>
 #include <media/sh_mobile_csi2.h>
@@ -142,7 +143,7 @@ static int sh_csi2_s_mbus_config(struct v4l2_subdev *sd,
                                 const struct v4l2_mbus_config *cfg)
 {
        struct sh_csi2 *priv = container_of(sd, struct sh_csi2, subdev);
-       struct soc_camera_device *icd = (struct soc_camera_device *)sd->grp_id;
+       struct soc_camera_device *icd = v4l2_get_subdev_hostdata(sd);
        struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd);
        struct v4l2_mbus_config client_cfg = {.type = V4L2_MBUS_CSI2,
                                              .flags = priv->mipi_flags};
@@ -201,21 +202,15 @@ static void sh_csi2_hwinit(struct sh_csi2 *priv)
 static int sh_csi2_client_connect(struct sh_csi2 *priv)
 {
        struct sh_csi2_pdata *pdata = priv->pdev->dev.platform_data;
-       struct v4l2_subdev *sd, *csi2_sd = &priv->subdev;
-       struct soc_camera_device *icd = NULL;
+       struct soc_camera_device *icd = v4l2_get_subdev_hostdata(&priv->subdev);
+       struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd);
        struct device *dev = v4l2_get_subdevdata(&priv->subdev);
        struct v4l2_mbus_config cfg;
        unsigned long common_flags, csi2_flags;
        int i, ret;
 
-       v4l2_device_for_each_subdev(sd, csi2_sd->v4l2_dev)
-               if (sd->grp_id) {
-                       icd = (struct soc_camera_device *)sd->grp_id;
-                       break;
-               }
-
-       if (!icd)
-               return -EINVAL;
+       if (priv->client)
+               return -EBUSY;
 
        for (i = 0; i < pdata->num_clients; i++)
                if (&pdata->clients[i].pdev->dev == icd->pdev)
@@ -246,7 +241,7 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
        }
 
        cfg.type = V4L2_MBUS_CSI2;
-       ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
+       ret = v4l2_subdev_call(client_sd, video, g_mbus_config, &cfg);
        if (ret == -ENOIOCTLCMD)
                common_flags = csi2_flags;
        else if (!ret)
@@ -262,8 +257,6 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
        priv->mipi_flags = common_flags;
        priv->client = pdata->clients + i;
 
-       csi2_sd->grp_id = (long)icd;
-
        pm_runtime_get_sync(dev);
 
        sh_csi2_hwinit(priv);
@@ -273,8 +266,10 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
 
 static void sh_csi2_client_disconnect(struct sh_csi2 *priv)
 {
+       if (!priv->client)
+               return;
+
        priv->client = NULL;
-       priv->subdev.grp_id = 0;
 
        pm_runtime_put(v4l2_get_subdevdata(&priv->subdev));
 }