media: ov2680: Remove VIDEO_V4L2_SUBDEV_API ifdef-s
[platform/kernel/linux-starfive.git] / drivers / media / i2c / ov2680.c
index 54153bf..5c1f5dd 100644 (file)
@@ -16,8 +16,8 @@
 #include <linux/err.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
+#include <linux/mod_devicetable.h>
 #include <linux/module.h>
-#include <linux/of_device.h>
 #include <linux/gpio/consumer.h>
 #include <linux/regulator/consumer.h>
 
@@ -85,15 +85,8 @@ struct ov2680_mode_info {
 
 struct ov2680_ctrls {
        struct v4l2_ctrl_handler handler;
-       struct {
-               struct v4l2_ctrl *auto_exp;
-               struct v4l2_ctrl *exposure;
-       };
-       struct {
-               struct v4l2_ctrl *auto_gain;
-               struct v4l2_ctrl *gain;
-       };
-
+       struct v4l2_ctrl *exposure;
+       struct v4l2_ctrl *gain;
        struct v4l2_ctrl *hflip;
        struct v4l2_ctrl *vflip;
        struct v4l2_ctrl *test_pattern;
@@ -143,6 +136,7 @@ static const struct reg_value ov2680_setting_30fps_QUXGA_800_600[] = {
        {0x380e, 0x02}, {0x380f, 0x84}, {0x3811, 0x04}, {0x3813, 0x04},
        {0x3814, 0x31}, {0x3815, 0x31}, {0x3820, 0xc0}, {0x4008, 0x00},
        {0x4009, 0x03}, {0x4837, 0x1e}, {0x3501, 0x4e}, {0x3502, 0xe0},
+       {0x3503, 0x03},
 };
 
 static const struct reg_value ov2680_setting_30fps_720P_1280_720[] = {
@@ -321,70 +315,49 @@ static void ov2680_power_down(struct ov2680_dev *sensor)
        usleep_range(5000, 10000);
 }
 
-static int ov2680_bayer_order(struct ov2680_dev *sensor)
+static void ov2680_set_bayer_order(struct ov2680_dev *sensor)
 {
-       u32 format1;
-       u32 format2;
-       u32 hv_flip;
-       int ret;
-
-       ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT1, &format1);
-       if (ret < 0)
-               return ret;
+       int hv_flip = 0;
 
-       ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT2, &format2);
-       if (ret < 0)
-               return ret;
+       if (sensor->ctrls.vflip && sensor->ctrls.vflip->val)
+               hv_flip += 1;
 
-       hv_flip = (format2 & BIT(2)  << 1) | (format1 & BIT(2));
+       if (sensor->ctrls.hflip && sensor->ctrls.hflip->val)
+               hv_flip += 2;
 
        sensor->fmt.code = ov2680_hv_flip_bayer_order[hv_flip];
-
-       return 0;
 }
 
-static int ov2680_vflip_enable(struct ov2680_dev *sensor)
+static int ov2680_set_vflip(struct ov2680_dev *sensor, s32 val)
 {
        int ret;
 
-       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(2));
-       if (ret < 0)
-               return ret;
-
-       return ov2680_bayer_order(sensor);
-}
-
-static int ov2680_vflip_disable(struct ov2680_dev *sensor)
-{
-       int ret;
+       if (sensor->is_streaming)
+               return -EBUSY;
 
-       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(0));
+       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1,
+                            BIT(2), val ? BIT(2) : 0);
        if (ret < 0)
                return ret;
 
-       return ov2680_bayer_order(sensor);
+       ov2680_set_bayer_order(sensor);
+       return 0;
 }
 
-static int ov2680_hflip_enable(struct ov2680_dev *sensor)
+static int ov2680_set_hflip(struct ov2680_dev *sensor, s32 val)
 {
        int ret;
 
-       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(2));
-       if (ret < 0)
-               return ret;
-
-       return ov2680_bayer_order(sensor);
-}
-
-static int ov2680_hflip_disable(struct ov2680_dev *sensor)
-{
-       int ret;
+       if (sensor->is_streaming)
+               return -EBUSY;
 
-       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(0));
+       ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2,
+                            BIT(2), val ? BIT(2) : 0);
        if (ret < 0)
                return ret;
 
-       return ov2680_bayer_order(sensor);
+       ov2680_set_bayer_order(sensor);
+       return 0;
 }
 
 static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value)
@@ -405,69 +378,15 @@ static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value)
        return 0;
 }
 
-static int ov2680_gain_set(struct ov2680_dev *sensor, bool auto_gain)
+static int ov2680_gain_set(struct ov2680_dev *sensor, u32 gain)
 {
-       struct ov2680_ctrls *ctrls = &sensor->ctrls;
-       u32 gain;
-       int ret;
-
-       ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(1),
-                            auto_gain ? 0 : BIT(1));
-       if (ret < 0)
-               return ret;
-
-       if (auto_gain || !ctrls->gain->is_new)
-               return 0;
-
-       gain = ctrls->gain->val;
-
-       ret = ov2680_write_reg16(sensor, OV2680_REG_GAIN_PK, gain);
-
-       return 0;
-}
-
-static int ov2680_gain_get(struct ov2680_dev *sensor)
-{
-       u32 gain;
-       int ret;
-
-       ret = ov2680_read_reg16(sensor, OV2680_REG_GAIN_PK, &gain);
-       if (ret)
-               return ret;
-
-       return gain;
-}
-
-static int ov2680_exposure_set(struct ov2680_dev *sensor, bool auto_exp)
-{
-       struct ov2680_ctrls *ctrls = &sensor->ctrls;
-       u32 exp;
-       int ret;
-
-       ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(0),
-                            auto_exp ? 0 : BIT(0));
-       if (ret < 0)
-               return ret;
-
-       if (auto_exp || !ctrls->exposure->is_new)
-               return 0;
-
-       exp = (u32)ctrls->exposure->val;
-       exp <<= 4;
-
-       return ov2680_write_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, exp);
+       return ov2680_write_reg16(sensor, OV2680_REG_GAIN_PK, gain);
 }
 
-static int ov2680_exposure_get(struct ov2680_dev *sensor)
+static int ov2680_exposure_set(struct ov2680_dev *sensor, u32 exp)
 {
-       int ret;
-       u32 exp;
-
-       ret = ov2680_read_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, &exp);
-       if (ret)
-               return ret;
-
-       return exp >> 4;
+       return ov2680_write_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH,
+                                 exp << 4);
 }
 
 static int ov2680_stream_enable(struct ov2680_dev *sensor)
@@ -482,33 +401,17 @@ static int ov2680_stream_disable(struct ov2680_dev *sensor)
 
 static int ov2680_mode_set(struct ov2680_dev *sensor)
 {
-       struct ov2680_ctrls *ctrls = &sensor->ctrls;
        int ret;
 
-       ret = ov2680_gain_set(sensor, false);
-       if (ret < 0)
-               return ret;
-
-       ret = ov2680_exposure_set(sensor, false);
+       ret = ov2680_load_regs(sensor, sensor->current_mode);
        if (ret < 0)
                return ret;
 
-       ret = ov2680_load_regs(sensor, sensor->current_mode);
+       /* Restore value of all ctrls */
+       ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
        if (ret < 0)
                return ret;
 
-       if (ctrls->auto_gain->val) {
-               ret = ov2680_gain_set(sensor, true);
-               if (ret < 0)
-                       return ret;
-       }
-
-       if (ctrls->auto_exp->val == V4L2_EXPOSURE_AUTO) {
-               ret = ov2680_exposure_set(sensor, true);
-               if (ret < 0)
-                       return ret;
-       }
-
        sensor->mode_pending_changes = false;
 
        return 0;
@@ -590,15 +493,10 @@ static int ov2680_s_power(struct v4l2_subdev *sd, int on)
        else
                ret = ov2680_power_off(sensor);
 
-       mutex_unlock(&sensor->lock);
-
-       if (on && ret == 0) {
-               ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
-               if (ret < 0)
-                       return ret;
-
+       if (on && ret == 0)
                ret = ov2680_mode_restore(sensor);
-       }
+
+       mutex_unlock(&sensor->lock);
 
        return ret;
 }
@@ -664,7 +562,6 @@ static int ov2680_get_fmt(struct v4l2_subdev *sd,
 {
        struct ov2680_dev *sensor = to_ov2680_dev(sd);
        struct v4l2_mbus_framefmt *fmt = NULL;
-       int ret = 0;
 
        if (format->pad != 0)
                return -EINVAL;
@@ -672,22 +569,17 @@ static int ov2680_get_fmt(struct v4l2_subdev *sd,
        mutex_lock(&sensor->lock);
 
        if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
-#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
                fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state,
                                                 format->pad);
-#else
-               ret = -EINVAL;
-#endif
        } else {
                fmt = &sensor->fmt;
        }
 
-       if (fmt)
-               format->format = *fmt;
+       format->format = *fmt;
 
        mutex_unlock(&sensor->lock);
 
-       return ret;
+       return 0;
 }
 
 static int ov2680_set_fmt(struct v4l2_subdev *sd,
@@ -696,9 +588,7 @@ static int ov2680_set_fmt(struct v4l2_subdev *sd,
 {
        struct ov2680_dev *sensor = to_ov2680_dev(sd);
        struct v4l2_mbus_framefmt *fmt = &format->format;
-#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
        struct v4l2_mbus_framefmt *try_fmt;
-#endif
        const struct ov2680_mode_info *mode;
        int ret = 0;
 
@@ -721,10 +611,8 @@ static int ov2680_set_fmt(struct v4l2_subdev *sd,
        }
 
        if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
-#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
                try_fmt = v4l2_subdev_get_try_format(sd, sd_state, 0);
                format->format = *try_fmt;
-#endif
                goto unlock;
        }
 
@@ -794,66 +682,23 @@ static int ov2680_enum_frame_interval(struct v4l2_subdev *sd,
        return 0;
 }
 
-static int ov2680_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
-{
-       struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
-       struct ov2680_dev *sensor = to_ov2680_dev(sd);
-       struct ov2680_ctrls *ctrls = &sensor->ctrls;
-       int val;
-
-       if (!sensor->is_enabled)
-               return 0;
-
-       switch (ctrl->id) {
-       case V4L2_CID_GAIN:
-               val = ov2680_gain_get(sensor);
-               if (val < 0)
-                       return val;
-               ctrls->gain->val = val;
-               break;
-       case V4L2_CID_EXPOSURE:
-               val = ov2680_exposure_get(sensor);
-               if (val < 0)
-                       return val;
-               ctrls->exposure->val = val;
-               break;
-       }
-
-       return 0;
-}
-
 static int ov2680_s_ctrl(struct v4l2_ctrl *ctrl)
 {
        struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
        struct ov2680_dev *sensor = to_ov2680_dev(sd);
-       struct ov2680_ctrls *ctrls = &sensor->ctrls;
 
        if (!sensor->is_enabled)
                return 0;
 
        switch (ctrl->id) {
-       case V4L2_CID_AUTOGAIN:
-               return ov2680_gain_set(sensor, !!ctrl->val);
        case V4L2_CID_GAIN:
-               return ov2680_gain_set(sensor, !!ctrls->auto_gain->val);
-       case V4L2_CID_EXPOSURE_AUTO:
-               return ov2680_exposure_set(sensor, !!ctrl->val);
+               return ov2680_gain_set(sensor, ctrl->val);
        case V4L2_CID_EXPOSURE:
-               return ov2680_exposure_set(sensor, !!ctrls->auto_exp->val);
+               return ov2680_exposure_set(sensor, ctrl->val);
        case V4L2_CID_VFLIP:
-               if (sensor->is_streaming)
-                       return -EBUSY;
-               if (ctrl->val)
-                       return ov2680_vflip_enable(sensor);
-               else
-                       return ov2680_vflip_disable(sensor);
+               return ov2680_set_vflip(sensor, ctrl->val);
        case V4L2_CID_HFLIP:
-               if (sensor->is_streaming)
-                       return -EBUSY;
-               if (ctrl->val)
-                       return ov2680_hflip_enable(sensor);
-               else
-                       return ov2680_hflip_disable(sensor);
+               return ov2680_set_hflip(sensor, ctrl->val);
        case V4L2_CID_TEST_PATTERN:
                return ov2680_test_pattern_set(sensor, ctrl->val);
        default:
@@ -864,7 +709,6 @@ static int ov2680_s_ctrl(struct v4l2_ctrl *ctrl)
 }
 
 static const struct v4l2_ctrl_ops ov2680_ctrl_ops = {
-       .g_volatile_ctrl = ov2680_g_volatile_ctrl,
        .s_ctrl = ov2680_s_ctrl,
 };
 
@@ -926,9 +770,7 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
        v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client,
                             &ov2680_subdev_ops);
 
-#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
        sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
-#endif
        sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
        sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
 
@@ -936,7 +778,7 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
        if (ret < 0)
                return ret;
 
-       v4l2_ctrl_handler_init(hdl, 7);
+       v4l2_ctrl_handler_init(hdl, 5);
 
        hdl->lock = &sensor->lock;
 
@@ -948,16 +790,9 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
                                        ARRAY_SIZE(test_pattern_menu) - 1,
                                        0, 0, test_pattern_menu);
 
-       ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops,
-                                                V4L2_CID_EXPOSURE_AUTO,
-                                                V4L2_EXPOSURE_MANUAL, 0,
-                                                V4L2_EXPOSURE_AUTO);
-
        ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE,
                                            0, 32767, 1, 0);
 
-       ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN,
-                                            0, 1, 1, 1);
        ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN, 0, 2047, 1, 0);
 
        if (hdl->error) {
@@ -965,14 +800,9 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
                goto cleanup_entity;
        }
 
-       ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
-       ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
        ctrls->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
        ctrls->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
 
-       v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true);
-       v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true);
-
        sensor->sd.ctrl_handler = hdl;
 
        ret = v4l2_async_register_subdev(&sensor->sd);
@@ -1156,9 +986,9 @@ static struct i2c_driver ov2680_i2c_driver = {
        .driver = {
                .name  = "ov2680",
                .pm = &ov2680_pm_ops,
-               .of_match_table = of_match_ptr(ov2680_dt_ids),
+               .of_match_table = ov2680_dt_ids,
        },
-       .probe_new      = ov2680_probe,
+       .probe          = ov2680_probe,
        .remove         = ov2680_remove,
 };
 module_i2c_driver(ov2680_i2c_driver);