]> Pileus Git - ~andy/linux/blobdiff - drivers/media/i2c/soc_camera/ov772x.c
Merge tag 'samsung-dev' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux...
[~andy/linux] / drivers / media / i2c / soc_camera / ov772x.c
index 713d62e349f67efd7f125929c04f62430e474492..7f2b3c8926afbfade0fca5c58bea1e9356dc9d3b 100644 (file)
@@ -26,8 +26,8 @@
 
 #include <media/ov772x.h>
 #include <media/soc_camera.h>
+#include <media/v4l2-clk.h>
 #include <media/v4l2-ctrls.h>
-#include <media/v4l2-chip-ident.h>
 #include <media/v4l2-subdev.h>
 
 /*
@@ -396,10 +396,10 @@ struct ov772x_win_size {
 struct ov772x_priv {
        struct v4l2_subdev                subdev;
        struct v4l2_ctrl_handler          hdl;
+       struct v4l2_clk                  *clk;
        struct ov772x_camera_info        *info;
        const struct ov772x_color_format *cfmt;
        const struct ov772x_win_size     *win;
-       int                               model;
        unsigned short                    flag_vflip:1;
        unsigned short                    flag_hflip:1;
        /* band_filter = COM8[5] ? 256 - BDBASE : 0 */
@@ -620,17 +620,6 @@ static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
        return -EINVAL;
 }
 
-static int ov772x_g_chip_ident(struct v4l2_subdev *sd,
-                              struct v4l2_dbg_chip_ident *id)
-{
-       struct ov772x_priv *priv = to_ov772x(sd);
-
-       id->ident    = priv->model;
-       id->revision = 0;
-
-       return 0;
-}
-
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 static int ov772x_g_register(struct v4l2_subdev *sd,
                             struct v4l2_dbg_register *reg)
@@ -668,8 +657,9 @@ static int ov772x_s_power(struct v4l2_subdev *sd, int on)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
+       struct ov772x_priv *priv = to_ov772x(sd);
 
-       return soc_camera_set_power(&client->dev, ssdd, on);
+       return soc_camera_set_power(&client->dev, ssdd, priv->clk, on);
 }
 
 static const struct ov772x_win_size *ov772x_select_win(u32 width, u32 height)
@@ -965,11 +955,9 @@ static int ov772x_video_probe(struct ov772x_priv *priv)
        switch (VERSION(pid, ver)) {
        case OV7720:
                devname     = "ov7720";
-               priv->model = V4L2_IDENT_OV7720;
                break;
        case OV7725:
                devname     = "ov7725";
-               priv->model = V4L2_IDENT_OV7725;
                break;
        default:
                dev_err(&client->dev,
@@ -997,7 +985,6 @@ static const struct v4l2_ctrl_ops ov772x_ctrl_ops = {
 };
 
 static struct v4l2_subdev_core_ops ov772x_subdev_core_ops = {
-       .g_chip_ident   = ov772x_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        .g_register     = ov772x_g_register,
        .s_register     = ov772x_s_register,
@@ -1088,13 +1075,22 @@ static int ov772x_probe(struct i2c_client *client,
        if (priv->hdl.error)
                return priv->hdl.error;
 
+       priv->clk = v4l2_clk_get(&client->dev, "mclk");
+       if (IS_ERR(priv->clk)) {
+               ret = PTR_ERR(priv->clk);
+               goto eclkget;
+       }
+
        ret = ov772x_video_probe(priv);
        if (ret < 0) {
+               v4l2_clk_put(priv->clk);
+eclkget:
                v4l2_ctrl_handler_free(&priv->hdl);
        } else {
                priv->cfmt = &ov772x_cfmts[0];
                priv->win = &ov772x_win_sizes[0];
        }
+
        return ret;
 }
 
@@ -1102,6 +1098,7 @@ static int ov772x_remove(struct i2c_client *client)
 {
        struct ov772x_priv *priv = to_ov772x(i2c_get_clientdata(client));
 
+       v4l2_clk_put(priv->clk);
        v4l2_device_unregister_subdev(&priv->subdev);
        v4l2_ctrl_handler_free(&priv->hdl);
        return 0;