Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / drivers / media / video / imx074.c
index 3319b40..eec75bb 100644 (file)
 
 #include <linux/delay.h>
 #include <linux/i2c.h>
+#include <linux/v4l2-mediabus.h>
 #include <linux/slab.h>
 #include <linux/videodev2.h>
 #include <linux/module.h>
 
 #include <media/soc_camera.h>
-#include <media/soc_mediabus.h>
 #include <media/v4l2-subdev.h>
 #include <media/v4l2-chip-ident.h>
 
@@ -268,6 +268,17 @@ static int imx074_g_chip_ident(struct v4l2_subdev *sd,
        return 0;
 }
 
+static int imx074_g_mbus_config(struct v4l2_subdev *sd,
+                               struct v4l2_mbus_config *cfg)
+{
+       cfg->type = V4L2_MBUS_CSI2;
+       cfg->flags = V4L2_MBUS_CSI2_2_LANE |
+               V4L2_MBUS_CSI2_CHANNEL_0 |
+               V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+
+       return 0;
+}
+
 static struct v4l2_subdev_video_ops imx074_subdev_video_ops = {
        .s_stream       = imx074_s_stream,
        .s_mbus_fmt     = imx074_s_fmt,
@@ -276,6 +287,7 @@ static struct v4l2_subdev_video_ops imx074_subdev_video_ops = {
        .enum_mbus_fmt  = imx074_enum_fmt,
        .g_crop         = imx074_g_crop,
        .cropcap        = imx074_cropcap,
+       .g_mbus_config  = imx074_g_mbus_config,
 };
 
 static struct v4l2_subdev_core_ops imx074_subdev_core_ops = {
@@ -287,28 +299,7 @@ static struct v4l2_subdev_ops imx074_subdev_ops = {
        .video  = &imx074_subdev_video_ops,
 };
 
-/*
- * We have to provide soc-camera operations, but we don't have anything to say
- * there. The MIPI CSI2 driver will provide .query_bus_param and .set_bus_param
- */
-static unsigned long imx074_query_bus_param(struct soc_camera_device *icd)
-{
-       return 0;
-}
-
-static int imx074_set_bus_param(struct soc_camera_device *icd,
-                                unsigned long flags)
-{
-       return -EINVAL;
-}
-
-static struct soc_camera_ops imx074_ops = {
-       .query_bus_param        = imx074_query_bus_param,
-       .set_bus_param          = imx074_set_bus_param,
-};
-
-static int imx074_video_probe(struct soc_camera_device *icd,
-                             struct i2c_client *client)
+static int imx074_video_probe(struct i2c_client *client)
 {
        int ret;
        u16 id;
@@ -418,17 +409,10 @@ static int imx074_probe(struct i2c_client *client,
                        const struct i2c_device_id *did)
 {
        struct imx074 *priv;
-       struct soc_camera_device *icd = client->dev.platform_data;
        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
-       struct soc_camera_link *icl;
+       struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
        int ret;
 
-       if (!icd) {
-               dev_err(&client->dev, "IMX074: missing soc-camera data!\n");
-               return -EINVAL;
-       }
-
-       icl = to_soc_camera_link(icd);
        if (!icl) {
                dev_err(&client->dev, "IMX074: missing platform data!\n");
                return -EINVAL;
@@ -446,12 +430,10 @@ static int imx074_probe(struct i2c_client *client,
 
        v4l2_i2c_subdev_init(&priv->subdev, client, &imx074_subdev_ops);
 
-       icd->ops        = &imx074_ops;
        priv->fmt       = &imx074_colour_fmts[0];
 
-       ret = imx074_video_probe(icd, client);
+       ret = imx074_video_probe(client);
        if (ret < 0) {
-               icd->ops = NULL;
                kfree(priv);
                return ret;
        }
@@ -462,10 +444,8 @@ static int imx074_probe(struct i2c_client *client,
 static int imx074_remove(struct i2c_client *client)
 {
        struct imx074 *priv = to_imx074(client);
-       struct soc_camera_device *icd = client->dev.platform_data;
-       struct soc_camera_link *icl = to_soc_camera_link(icd);
+       struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
 
-       icd->ops = NULL;
        if (icl->free_bus)
                icl->free_bus(icl);
        kfree(priv);