• Home
  • Raw
  • Download

Lines Matching full:imx274

2  * imx274.c - IMX274 CMOS Image Sensor driver
107 #define DRIVER_NAME "IMX274"
110 * IMX274 register definitions
146 * imx274 I2C operation related structure
166 * Parameters for each imx274 readout mode.
191 * imx274 test pattern related structure
227 * imx274 mode1(refer to datasheet) register configuration with
268 * imx274 mode3(refer to datasheet) register configuration with
308 * imx274 mode5(refer to datasheet) register configuration with
347 * imx274 first step register configuration for
356 * imx274 second step register configuration for
410 * imx274 third step register configuration for
420 * imx274 forth step register configuration for
430 * imx274 register configuration for stoping stream
438 * imx274 disable test pattern register configuration
449 * imx274 test pattern register configuration
493 * struct imx274_ctrls - imx274 ctrl structure
509 * struct stim274 - imx274 device structure
513 * @ctrls: imx274 control structure
735 * imx274 datasheet, it should wait 10ms or more here. in imx274_start_stream()
745 * imx274 datasheet, it should wait 7ms or more here. in imx274_start_stream()
775 * imx274_s_ctrl - This is used to set the imx274 V4L2 controls
778 * This function is used to set the V4L2 controls for the imx274 sensor.
785 struct stimx274 *imx274 = to_imx274(sd); in imx274_s_ctrl() local
788 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
794 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
796 ret = imx274_set_exposure(imx274, ctrl->val); in imx274_s_ctrl()
800 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
802 ret = imx274_set_gain(imx274, ctrl); in imx274_s_ctrl()
806 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
808 ret = imx274_set_vflip(imx274, ctrl->val); in imx274_s_ctrl()
812 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
814 ret = imx274_set_test_pattern(imx274, ctrl->val); in imx274_s_ctrl()
821 static int imx274_binning_goodness(struct stimx274 *imx274, in imx274_binning_goodness() argument
825 struct device *dev = &imx274->client->dev; in imx274_binning_goodness()
865 * Must be called with imx274->lock locked.
867 * @imx274: The device object
876 static int __imx274_change_compose(struct stimx274 *imx274, in __imx274_change_compose() argument
883 struct device *dev = &imx274->client->dev; in __imx274_change_compose()
894 cur_crop = &imx274->crop; in __imx274_change_compose()
895 tgt_fmt = &imx274->format; in __imx274_change_compose()
902 imx274, in __imx274_change_compose()
917 imx274->mode = best_mode; in __imx274_change_compose()
943 struct stimx274 *imx274 = to_imx274(sd); in imx274_get_fmt() local
945 mutex_lock(&imx274->lock); in imx274_get_fmt()
946 fmt->format = imx274->format; in imx274_get_fmt()
947 mutex_unlock(&imx274->lock); in imx274_get_fmt()
966 struct stimx274 *imx274 = to_imx274(sd); in imx274_set_fmt() local
969 mutex_lock(&imx274->lock); in imx274_set_fmt()
971 err = __imx274_change_compose(imx274, cfg, format->which, in imx274_set_fmt()
986 imx274->format = *fmt; in imx274_set_fmt()
989 mutex_unlock(&imx274->lock); in imx274_set_fmt()
998 struct stimx274 *imx274 = to_imx274(sd); in imx274_get_selection() local
1018 src_crop = &imx274->crop; in imx274_get_selection()
1019 src_fmt = &imx274->format; in imx274_get_selection()
1022 mutex_lock(&imx274->lock); in imx274_get_selection()
1044 mutex_unlock(&imx274->lock); in imx274_get_selection()
1049 static int imx274_set_selection_crop(struct stimx274 *imx274, in imx274_set_selection_crop() argument
1089 tgt_crop = &imx274->crop; in imx274_set_selection_crop()
1091 mutex_lock(&imx274->lock); in imx274_set_selection_crop()
1101 __imx274_change_compose(imx274, cfg, sel->which, in imx274_set_selection_crop()
1105 mutex_unlock(&imx274->lock); in imx274_set_selection_crop()
1114 struct stimx274 *imx274 = to_imx274(sd); in imx274_set_selection() local
1120 return imx274_set_selection_crop(imx274, cfg, sel); in imx274_set_selection()
1125 mutex_lock(&imx274->lock); in imx274_set_selection()
1126 err = __imx274_change_compose(imx274, cfg, sel->which, in imx274_set_selection()
1129 mutex_unlock(&imx274->lock); in imx274_set_selection()
1146 static int imx274_apply_trimming(struct stimx274 *imx274) in imx274_apply_trimming() argument
1157 h_start = imx274->crop.left + 12; in imx274_apply_trimming()
1158 h_end = h_start + imx274->crop.width; in imx274_apply_trimming()
1163 hmax = max_t(u32, 260, (imx274->crop.width) / 16 + 23); in imx274_apply_trimming()
1166 v_pos = imx274->ctrls.vflip->cur.val ? in imx274_apply_trimming()
1167 (-imx274->crop.top / 2) : (imx274->crop.top / 2); in imx274_apply_trimming()
1168 v_cut = (IMX274_MAX_HEIGHT - imx274->crop.height) / 2; in imx274_apply_trimming()
1169 write_v_size = imx274->crop.height + 22; in imx274_apply_trimming()
1170 y_out_size = imx274->crop.height + 14; in imx274_apply_trimming()
1172 err = imx274_write_mbreg(imx274, IMX274_HMAX_REG_LSB, hmax, 2); in imx274_apply_trimming()
1174 err = imx274_write_mbreg(imx274, IMX274_HTRIM_EN_REG, 1, 1); in imx274_apply_trimming()
1176 err = imx274_write_mbreg(imx274, IMX274_HTRIM_START_REG_LSB, in imx274_apply_trimming()
1179 err = imx274_write_mbreg(imx274, IMX274_HTRIM_END_REG_LSB, in imx274_apply_trimming()
1182 err = imx274_write_mbreg(imx274, IMX274_VWIDCUTEN_REG, 1, 1); in imx274_apply_trimming()
1184 err = imx274_write_mbreg(imx274, IMX274_VWIDCUT_REG_LSB, in imx274_apply_trimming()
1187 err = imx274_write_mbreg(imx274, IMX274_VWINPOS_REG_LSB, in imx274_apply_trimming()
1190 err = imx274_write_mbreg(imx274, IMX274_WRITE_VSIZE_REG_LSB, in imx274_apply_trimming()
1193 err = imx274_write_mbreg(imx274, IMX274_Y_OUT_SIZE_REG_LSB, in imx274_apply_trimming()
1211 struct stimx274 *imx274 = to_imx274(sd); in imx274_g_frame_interval() local
1213 fi->interval = imx274->frame_interval; in imx274_g_frame_interval()
1214 dev_dbg(&imx274->client->dev, "%s frame rate = %d / %d\n", in imx274_g_frame_interval()
1215 __func__, imx274->frame_interval.numerator, in imx274_g_frame_interval()
1216 imx274->frame_interval.denominator); in imx274_g_frame_interval()
1233 struct stimx274 *imx274 = to_imx274(sd); in imx274_s_frame_interval() local
1234 struct v4l2_ctrl *ctrl = imx274->ctrls.exposure; in imx274_s_frame_interval()
1238 mutex_lock(&imx274->lock); in imx274_s_frame_interval()
1239 ret = imx274_set_frame_interval(imx274, fi->interval); in imx274_s_frame_interval()
1242 fi->interval = imx274->frame_interval; in imx274_s_frame_interval()
1253 dev_err(&imx274->client->dev, in imx274_s_frame_interval()
1259 imx274_set_exposure(imx274, ctrl->val); in imx274_s_frame_interval()
1261 dev_dbg(&imx274->client->dev, "set frame interval to %uus\n", in imx274_s_frame_interval()
1267 mutex_unlock(&imx274->lock); in imx274_s_frame_interval()
1320 * imx274 sensor.
1326 struct stimx274 *imx274 = to_imx274(sd); in imx274_s_stream() local
1329 dev_dbg(&imx274->client->dev, "%s : %s, mode index = %td\n", __func__, in imx274_s_stream()
1331 imx274->mode - &imx274_formats[0]); in imx274_s_stream()
1333 mutex_lock(&imx274->lock); in imx274_s_stream()
1337 ret = imx274_mode_regs(imx274); in imx274_s_stream()
1341 ret = imx274_apply_trimming(imx274); in imx274_s_stream()
1351 ret = imx274_set_frame_interval(imx274, in imx274_s_stream()
1352 imx274->frame_interval); in imx274_s_stream()
1357 ret = __v4l2_ctrl_s_ctrl(imx274->ctrls.exposure, in imx274_s_stream()
1358 imx274->ctrls.exposure->val); in imx274_s_stream()
1363 ret = imx274_start_stream(imx274); in imx274_s_stream()
1368 ret = imx274_write_table(imx274, imx274_stop); in imx274_s_stream()
1373 mutex_unlock(&imx274->lock); in imx274_s_stream()
1374 dev_dbg(&imx274->client->dev, "%s : Done\n", __func__); in imx274_s_stream()
1378 mutex_unlock(&imx274->lock); in imx274_s_stream()
1379 dev_err(&imx274->client->dev, "s_stream failed\n"); in imx274_s_stream()
1487 * The caller should hold the mutex lock imx274->lock if necessary
1529 /* convert to register value, refer to imx274 datasheet */ in imx274_set_gain()
1599 * The caller should hold the mutex lock imx274->lock if necessary
1660 * The caller should hold the mutex lock imx274->lock if necessary
1748 * The caller should hold the mutex lock imx274->lock if necessary
1853 { .compatible = "sony,imx274" },
1859 { "IMX274", 0 },
1868 struct stimx274 *imx274; in imx274_probe() local
1871 /* initialize imx274 */ in imx274_probe()
1872 imx274 = devm_kzalloc(&client->dev, sizeof(*imx274), GFP_KERNEL); in imx274_probe()
1873 if (!imx274) in imx274_probe()
1876 mutex_init(&imx274->lock); in imx274_probe()
1879 imx274->mode = &imx274_formats[IMX274_DEFAULT_MODE]; in imx274_probe()
1880 imx274->crop.width = IMX274_MAX_WIDTH; in imx274_probe()
1881 imx274->crop.height = IMX274_MAX_HEIGHT; in imx274_probe()
1882 imx274->format.width = imx274->crop.width / imx274->mode->bin_ratio; in imx274_probe()
1883 imx274->format.height = imx274->crop.height / imx274->mode->bin_ratio; in imx274_probe()
1884 imx274->format.field = V4L2_FIELD_NONE; in imx274_probe()
1885 imx274->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; in imx274_probe()
1886 imx274->format.colorspace = V4L2_COLORSPACE_SRGB; in imx274_probe()
1887 imx274->frame_interval.numerator = 1; in imx274_probe()
1888 imx274->frame_interval.denominator = IMX274_DEF_FRAME_RATE; in imx274_probe()
1891 imx274->regmap = devm_regmap_init_i2c(client, &imx274_regmap_config); in imx274_probe()
1892 if (IS_ERR(imx274->regmap)) { in imx274_probe()
1894 "regmap init failed: %ld\n", PTR_ERR(imx274->regmap)); in imx274_probe()
1900 imx274->client = client; in imx274_probe()
1901 sd = &imx274->sd; in imx274_probe()
1907 imx274->pad.flags = MEDIA_PAD_FL_SOURCE; in imx274_probe()
1909 ret = media_entity_pads_init(&sd->entity, 1, &imx274->pad); in imx274_probe()
1917 imx274->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in imx274_probe()
1919 if (IS_ERR(imx274->reset_gpio)) { in imx274_probe()
1920 if (PTR_ERR(imx274->reset_gpio) != -EPROBE_DEFER) in imx274_probe()
1922 ret = PTR_ERR(imx274->reset_gpio); in imx274_probe()
1927 imx274_reset(imx274, 1); in imx274_probe()
1930 ret = v4l2_ctrl_handler_init(&imx274->ctrls.handler, 2); in imx274_probe()
1937 imx274->ctrls.handler.lock = &imx274->lock; in imx274_probe()
1940 imx274->ctrls.test_pattern = v4l2_ctrl_new_std_menu_items( in imx274_probe()
1941 &imx274->ctrls.handler, &imx274_ctrl_ops, in imx274_probe()
1945 imx274->ctrls.gain = v4l2_ctrl_new_std( in imx274_probe()
1946 &imx274->ctrls.handler, in imx274_probe()
1952 imx274->ctrls.exposure = v4l2_ctrl_new_std( in imx274_probe()
1953 &imx274->ctrls.handler, in imx274_probe()
1959 imx274->ctrls.vflip = v4l2_ctrl_new_std( in imx274_probe()
1960 &imx274->ctrls.handler, in imx274_probe()
1964 imx274->sd.ctrl_handler = &imx274->ctrls.handler; in imx274_probe()
1965 if (imx274->ctrls.handler.error) { in imx274_probe()
1966 ret = imx274->ctrls.handler.error; in imx274_probe()
1971 ret = v4l2_ctrl_handler_setup(&imx274->ctrls.handler); in imx274_probe()
1979 ret = imx274_load_default(imx274); in imx274_probe()
1996 dev_info(&client->dev, "imx274 : imx274 probe success !\n"); in imx274_probe()
2000 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_probe()
2004 mutex_destroy(&imx274->lock); in imx274_probe()
2011 struct stimx274 *imx274 = to_imx274(sd); in imx274_remove() local
2014 imx274_write_table(imx274, imx274_stop); in imx274_remove()
2017 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_remove()
2019 mutex_destroy(&imx274->lock); in imx274_remove()
2036 MODULE_DESCRIPTION("IMX274 CMOS Image Sensor driver");