[media] ov2640: add MC support
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 30 Jan 2017 13:50:45 +0000 (11:50 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 10 Apr 2017 17:26:50 +0000 (14:26 -0300)
The MC support is needed by the em28xx driver.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/i2c/ov2640.c

index dcc1c68..b67e44c 100644 (file)
@@ -282,6 +282,9 @@ struct ov2640_win_size {
 
 struct ov2640_priv {
        struct v4l2_subdev              subdev;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+       struct media_pad pad;
+#endif
        struct v4l2_ctrl_handler        hdl;
        u32     cfmt_code;
        struct clk                      *clk;
@@ -1063,6 +1066,7 @@ static int ov2640_probe(struct i2c_client *client,
                goto err_clk;
 
        v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
+       priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
        v4l2_ctrl_handler_init(&priv->hdl, 2);
        v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,
                        V4L2_CID_VFLIP, 0, 1, 1, 0);
@@ -1073,19 +1077,30 @@ static int ov2640_probe(struct i2c_client *client,
                ret = priv->hdl.error;
                goto err_hdl;
        }
+#if defined(CONFIG_MEDIA_CONTROLLER)
+       priv->pad.flags = MEDIA_PAD_FL_SOURCE;
+       priv->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
+       ret = media_entity_pads_init(&priv->subdev.entity, 1, &priv->pad);
+       if (ret < 0)
+               goto err_hdl;
+#endif
 
        ret = ov2640_video_probe(client);
        if (ret < 0)
-               goto err_hdl;
+               goto err_videoprobe;
 
        ret = v4l2_async_register_subdev(&priv->subdev);
        if (ret < 0)
-               goto err_hdl;
+               goto err_videoprobe;
 
        dev_info(&adapter->dev, "OV2640 Probed\n");
 
        return 0;
 
+err_videoprobe:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+       media_entity_cleanup(&priv->subdev.entity);
+#endif
 err_hdl:
        v4l2_ctrl_handler_free(&priv->hdl);
 err_clk:
@@ -1099,6 +1114,9 @@ static int ov2640_remove(struct i2c_client *client)
 
        v4l2_async_unregister_subdev(&priv->subdev);
        v4l2_ctrl_handler_free(&priv->hdl);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+       media_entity_cleanup(&priv->subdev.entity);
+#endif
        v4l2_device_unregister_subdev(&priv->subdev);
        clk_disable_unprepare(priv->clk);
        return 0;