Lines Matching defs:imx274
3 * imx274.c - IMX274 CMOS Image Sensor driver
144 * imx274 I2C operation related structure
158 * Parameters for each imx274 readout mode.
185 * imx274 test pattern related structure
221 * imx274 mode1(refer to datasheet) register configuration with
262 * imx274 mode3(refer to datasheet) register configuration with
302 * imx274 mode5(refer to datasheet) register configuration with
342 * imx274 mode6(refer to datasheet) register configuration with
381 * imx274 first step register configuration for
438 * imx274 second step register configuration for
448 * imx274 third step register configuration for
458 * imx274 register configuration for stopping stream
466 * imx274 disable test pattern register configuration
477 * imx274 test pattern register configuration
534 * struct imx274_ctrls - imx274 ctrl structure
550 * struct stim274 - imx274 device structure
554 * @ctrls: imx274 control structure
799 * imx274 datasheet, it should wait 10ms or more here.
809 * imx274 datasheet, it should wait 7ms or more here.
842 struct stimx274 *imx274 = to_imx274(sd);
846 imx274_reset(imx274, 0);
848 ret = clk_prepare_enable(imx274->inck);
850 dev_err(&imx274->client->dev,
855 ret = regulator_bulk_enable(IMX274_NUM_SUPPLIES, imx274->supplies);
857 dev_err(&imx274->client->dev,
863 imx274_reset(imx274, 1);
868 clk_disable_unprepare(imx274->inck);
876 struct stimx274 *imx274 = to_imx274(sd);
878 imx274_reset(imx274, 0);
880 regulator_bulk_disable(IMX274_NUM_SUPPLIES, imx274->supplies);
882 clk_disable_unprepare(imx274->inck);
887 static int imx274_regulators_get(struct device *dev, struct stimx274 *imx274)
892 imx274->supplies[i].supply = imx274_supply_names[i];
895 imx274->supplies);
899 * imx274_s_ctrl - This is used to set the imx274 V4L2 controls
902 * This function is used to set the V4L2 controls for the imx274 sensor.
909 struct stimx274 *imx274 = to_imx274(sd);
912 if (!pm_runtime_get_if_in_use(&imx274->client->dev))
915 dev_dbg(&imx274->client->dev,
921 dev_dbg(&imx274->client->dev,
923 ret = imx274_set_exposure(imx274, ctrl->val);
927 dev_dbg(&imx274->client->dev,
929 ret = imx274_set_gain(imx274, ctrl);
933 dev_dbg(&imx274->client->dev,
935 ret = imx274_set_vflip(imx274, ctrl->val);
939 dev_dbg(&imx274->client->dev,
941 ret = imx274_set_test_pattern(imx274, ctrl->val);
945 pm_runtime_put(&imx274->client->dev);
950 static int imx274_binning_goodness(struct stimx274 *imx274,
954 struct device *dev = &imx274->client->dev;
995 * Must be called with imx274->lock locked.
997 * @imx274: The device object
1006 static int __imx274_change_compose(struct stimx274 *imx274,
1013 struct device *dev = &imx274->client->dev;
1024 cur_crop = &imx274->crop;
1025 tgt_fmt = &imx274->format;
1033 imx274,
1048 imx274->mode = best_mode;
1074 struct stimx274 *imx274 = to_imx274(sd);
1076 mutex_lock(&imx274->lock);
1077 fmt->format = imx274->format;
1078 mutex_unlock(&imx274->lock);
1097 struct stimx274 *imx274 = to_imx274(sd);
1100 mutex_lock(&imx274->lock);
1102 err = __imx274_change_compose(imx274, sd_state, format->which,
1117 imx274->format = *fmt;
1120 mutex_unlock(&imx274->lock);
1129 struct stimx274 *imx274 = to_imx274(sd);
1149 src_crop = &imx274->crop;
1150 src_fmt = &imx274->format;
1153 mutex_lock(&imx274->lock);
1175 mutex_unlock(&imx274->lock);
1180 static int imx274_set_selection_crop(struct stimx274 *imx274,
1220 tgt_crop = &imx274->crop;
1222 mutex_lock(&imx274->lock);
1232 __imx274_change_compose(imx274, sd_state, sel->which,
1236 mutex_unlock(&imx274->lock);
1245 struct stimx274 *imx274 = to_imx274(sd);
1251 return imx274_set_selection_crop(imx274, sd_state, sel);
1256 mutex_lock(&imx274->lock);
1257 err = __imx274_change_compose(imx274, sd_state, sel->which,
1260 mutex_unlock(&imx274->lock);
1277 static int imx274_apply_trimming(struct stimx274 *imx274)
1288 h_start = imx274->crop.left + 12;
1289 h_end = h_start + imx274->crop.width;
1294 hmax = max_t(u32, 260, (imx274->crop.width) / 16 + 23);
1297 v_pos = imx274->ctrls.vflip->cur.val ?
1298 (-imx274->crop.top / 2) : (imx274->crop.top / 2);
1299 v_cut = (IMX274_MAX_HEIGHT - imx274->crop.height) / 2;
1300 write_v_size = imx274->crop.height + 22;
1301 y_out_size = imx274->crop.height;
1303 err = imx274_write_mbreg(imx274, IMX274_HMAX_REG_LSB, hmax, 2);
1305 err = imx274_write_mbreg(imx274, IMX274_HTRIM_EN_REG, 1, 1);
1307 err = imx274_write_mbreg(imx274, IMX274_HTRIM_START_REG_LSB,
1310 err = imx274_write_mbreg(imx274, IMX274_HTRIM_END_REG_LSB,
1313 err = imx274_write_mbreg(imx274, IMX274_VWIDCUTEN_REG, 1, 1);
1315 err = imx274_write_mbreg(imx274, IMX274_VWIDCUT_REG_LSB,
1318 err = imx274_write_mbreg(imx274, IMX274_VWINPOS_REG_LSB,
1321 err = imx274_write_mbreg(imx274, IMX274_WRITE_VSIZE_REG_LSB,
1324 err = imx274_write_mbreg(imx274, IMX274_Y_OUT_SIZE_REG_LSB,
1342 struct stimx274 *imx274 = to_imx274(sd);
1344 fi->interval = imx274->frame_interval;
1345 dev_dbg(&imx274->client->dev, "%s frame rate = %d / %d\n",
1346 __func__, imx274->frame_interval.numerator,
1347 imx274->frame_interval.denominator);
1364 struct stimx274 *imx274 = to_imx274(sd);
1365 struct v4l2_ctrl *ctrl = imx274->ctrls.exposure;
1369 ret = pm_runtime_resume_and_get(&imx274->client->dev);
1373 mutex_lock(&imx274->lock);
1374 ret = imx274_set_frame_interval(imx274, fi->interval);
1377 fi->interval = imx274->frame_interval;
1389 dev_err(&imx274->client->dev,
1395 imx274_set_exposure(imx274, ctrl->val);
1397 dev_dbg(&imx274->client->dev, "set frame interval to %uus\n",
1403 mutex_unlock(&imx274->lock);
1404 pm_runtime_put(&imx274->client->dev);
1432 * imx274 sensor.
1438 struct stimx274 *imx274 = to_imx274(sd);
1441 dev_dbg(&imx274->client->dev, "%s : %s, mode index = %td\n", __func__,
1443 imx274->mode - &imx274_modes[0]);
1445 mutex_lock(&imx274->lock);
1448 ret = pm_runtime_resume_and_get(&imx274->client->dev);
1450 mutex_unlock(&imx274->lock);
1455 ret = imx274_mode_regs(imx274);
1459 ret = imx274_apply_trimming(imx274);
1469 ret = imx274_set_frame_interval(imx274,
1470 imx274->frame_interval);
1475 ret = imx274_start_stream(imx274);
1480 ret = imx274_write_table(imx274, imx274_stop);
1484 pm_runtime_put(&imx274->client->dev);
1487 mutex_unlock(&imx274->lock);
1488 dev_dbg(&imx274->client->dev, "%s : Done\n", __func__);
1492 pm_runtime_put(&imx274->client->dev);
1493 mutex_unlock(&imx274->lock);
1494 dev_err(&imx274->client->dev, "s_stream failed\n");
1582 * The caller should hold the mutex lock imx274->lock if necessary
1624 /* convert to register value, refer to imx274 datasheet */
1694 * The caller should hold the mutex lock imx274->lock if necessary
1750 * The caller should hold the mutex lock imx274->lock if necessary
1838 * The caller should hold the mutex lock imx274->lock if necessary
1948 { .compatible = "sony,imx274" },
1997 struct stimx274 *imx274;
2001 /* initialize imx274 */
2002 imx274 = devm_kzalloc(dev, sizeof(*imx274), GFP_KERNEL);
2003 if (!imx274)
2006 mutex_init(&imx274->lock);
2012 imx274->inck = devm_clk_get_optional(dev, "inck");
2013 if (IS_ERR(imx274->inck))
2014 return PTR_ERR(imx274->inck);
2016 ret = imx274_regulators_get(dev, imx274);
2023 imx274->mode = &imx274_modes[0];
2024 imx274->crop.width = IMX274_MAX_WIDTH;
2025 imx274->crop.height = IMX274_MAX_HEIGHT;
2026 imx274->format.width = imx274->crop.width / imx274->mode->wbin_ratio;
2027 imx274->format.height = imx274->crop.height / imx274->mode->hbin_ratio;
2028 imx274->format.field = V4L2_FIELD_NONE;
2029 imx274->format.code = MEDIA_BUS_FMT_SRGGB10_1X10;
2030 imx274->format.colorspace = V4L2_COLORSPACE_SRGB;
2031 imx274->frame_interval.numerator = 1;
2032 imx274->frame_interval.denominator = IMX274_DEF_FRAME_RATE;
2035 imx274->regmap = devm_regmap_init_i2c(client, &imx274_regmap_config);
2036 if (IS_ERR(imx274->regmap)) {
2038 "regmap init failed: %ld\n", PTR_ERR(imx274->regmap));
2044 imx274->client = client;
2045 sd = &imx274->sd;
2050 imx274->pad.flags = MEDIA_PAD_FL_SOURCE;
2052 ret = media_entity_pads_init(&sd->entity, 1, &imx274->pad);
2060 imx274->reset_gpio = devm_gpiod_get_optional(dev, "reset",
2062 if (IS_ERR(imx274->reset_gpio)) {
2063 ret = dev_err_probe(dev, PTR_ERR(imx274->reset_gpio),
2071 dev_err(dev, "%s : imx274 power on failed\n", __func__);
2076 ret = v4l2_ctrl_handler_init(&imx274->ctrls.handler, 4);
2082 imx274->ctrls.handler.lock = &imx274->lock;
2085 imx274->ctrls.test_pattern = v4l2_ctrl_new_std_menu_items(
2086 &imx274->ctrls.handler, &imx274_ctrl_ops,
2090 imx274->ctrls.gain = v4l2_ctrl_new_std(
2091 &imx274->ctrls.handler,
2097 imx274->ctrls.exposure = v4l2_ctrl_new_std(
2098 &imx274->ctrls.handler,
2104 imx274->ctrls.vflip = v4l2_ctrl_new_std(
2105 &imx274->ctrls.handler,
2109 imx274->sd.ctrl_handler = &imx274->ctrls.handler;
2110 if (imx274->ctrls.handler.error) {
2111 ret = imx274->ctrls.handler.error;
2116 imx274_load_default(imx274);
2130 dev_info(dev, "imx274 : imx274 probe success !\n");
2134 v4l2_ctrl_handler_free(&imx274->ctrls.handler);
2140 mutex_destroy(&imx274->lock);
2147 struct stimx274 *imx274 = to_imx274(sd);
2155 v4l2_ctrl_handler_free(&imx274->ctrls.handler);
2158 mutex_destroy(&imx274->lock);