Lines Matching refs:imx355

100 struct imx355 {
1062 static inline struct imx355 *to_imx355(struct v4l2_subdev *_sd)
1064 return container_of(_sd, struct imx355, sd);
1068 static u32 imx355_get_format_code(struct imx355 *imx355)
1080 lockdep_assert_held(&imx355->mutex);
1081 code = codes[imx355->vflip->val][imx355->hflip->val];
1087 static int imx355_read_reg(struct imx355 *imx355, u16 reg, u32 len, u32 *val)
1089 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1121 static int imx355_write_reg(struct imx355 *imx355, u16 reg, u32 len, u32 val)
1123 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1138 static int imx355_write_regs(struct imx355 *imx355,
1141 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1146 ret = imx355_write_reg(imx355, regs[i].address, 1, regs[i].val);
1162 struct imx355 *imx355 = to_imx355(sd);
1166 mutex_lock(&imx355->mutex);
1169 try_fmt->width = imx355->cur_mode->width;
1170 try_fmt->height = imx355->cur_mode->height;
1171 try_fmt->code = imx355_get_format_code(imx355);
1174 mutex_unlock(&imx355->mutex);
1181 struct imx355 *imx355 = container_of(ctrl->handler,
1182 struct imx355, ctrl_handler);
1183 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1191 max = imx355->cur_mode->height + ctrl->val - 10;
1192 __v4l2_ctrl_modify_range(imx355->exposure,
1193 imx355->exposure->minimum,
1194 max, imx355->exposure->step, max);
1208 ret = imx355_write_reg(imx355, IMX355_REG_ANALOG_GAIN, 2,
1212 ret = imx355_write_reg(imx355, IMX355_REG_DIG_GAIN_GLOBAL, 2,
1216 ret = imx355_write_reg(imx355, IMX355_REG_EXPOSURE, 2,
1221 ret = imx355_write_reg(imx355, IMX355_REG_FLL, 2,
1222 imx355->cur_mode->height + ctrl->val);
1225 ret = imx355_write_reg(imx355, IMX355_REG_TEST_PATTERN,
1230 ret = imx355_write_reg(imx355, IMX355_REG_ORIENTATION, 1,
1231 imx355->hflip->val |
1232 imx355->vflip->val << 1);
1254 struct imx355 *imx355 = to_imx355(sd);
1259 mutex_lock(&imx355->mutex);
1260 code->code = imx355_get_format_code(imx355);
1261 mutex_unlock(&imx355->mutex);
1270 struct imx355 *imx355 = to_imx355(sd);
1275 mutex_lock(&imx355->mutex);
1276 if (fse->code != imx355_get_format_code(imx355)) {
1277 mutex_unlock(&imx355->mutex);
1280 mutex_unlock(&imx355->mutex);
1290 static void imx355_update_pad_format(struct imx355 *imx355,
1296 fmt->format.code = imx355_get_format_code(imx355);
1300 static int imx355_do_get_pad_format(struct imx355 *imx355,
1305 struct v4l2_subdev *sd = &imx355->sd;
1311 imx355_update_pad_format(imx355, imx355->cur_mode, fmt);
1321 struct imx355 *imx355 = to_imx355(sd);
1324 mutex_lock(&imx355->mutex);
1325 ret = imx355_do_get_pad_format(imx355, cfg, fmt);
1326 mutex_unlock(&imx355->mutex);
1336 struct imx355 *imx355 = to_imx355(sd);
1345 mutex_lock(&imx355->mutex);
1351 fmt->format.code = imx355_get_format_code(imx355);
1357 imx355_update_pad_format(imx355, mode, fmt);
1362 imx355->cur_mode = mode;
1363 pixel_rate = imx355->link_def_freq * 2 * 4;
1365 __v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate);
1367 height = imx355->cur_mode->height;
1368 vblank_def = imx355->cur_mode->fll_def - height;
1369 vblank_min = imx355->cur_mode->fll_min - height;
1371 __v4l2_ctrl_modify_range(imx355->vblank, vblank_min, height, 1,
1373 __v4l2_ctrl_s_ctrl(imx355->vblank, vblank_def);
1374 h_blank = mode->llp - imx355->cur_mode->width;
1379 __v4l2_ctrl_modify_range(imx355->hblank, h_blank,
1383 mutex_unlock(&imx355->mutex);
1389 static int imx355_start_streaming(struct imx355 *imx355)
1391 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1397 ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
1404 reg_list = &imx355->cur_mode->reg_list;
1405 ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
1412 ret = imx355_write_reg(imx355, IMX355_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
1417 ret = __v4l2_ctrl_handler_setup(imx355->sd.ctrl_handler);
1421 return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
1426 static int imx355_stop_streaming(struct imx355 *imx355)
1428 return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
1434 struct imx355 *imx355 = to_imx355(sd);
1438 mutex_lock(&imx355->mutex);
1439 if (imx355->streaming == enable) {
1440 mutex_unlock(&imx355->mutex);
1455 ret = imx355_start_streaming(imx355);
1459 imx355_stop_streaming(imx355);
1463 imx355->streaming = enable;
1466 __v4l2_ctrl_grab(imx355->vflip, enable);
1467 __v4l2_ctrl_grab(imx355->hflip, enable);
1469 mutex_unlock(&imx355->mutex);
1476 mutex_unlock(&imx355->mutex);
1485 struct imx355 *imx355 = to_imx355(sd);
1487 if (imx355->streaming)
1488 imx355_stop_streaming(imx355);
1497 struct imx355 *imx355 = to_imx355(sd);
1500 if (imx355->streaming) {
1501 ret = imx355_start_streaming(imx355);
1509 imx355_stop_streaming(imx355);
1510 imx355->streaming = 0;
1515 static int imx355_identify_module(struct imx355 *imx355)
1517 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1521 ret = imx355_read_reg(imx355, IMX355_REG_CHIP_ID, 2, &val);
1564 static int imx355_init_controls(struct imx355 *imx355)
1566 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
1577 ctrl_hdlr = &imx355->ctrl_handler;
1582 ctrl_hdlr->lock = &imx355->mutex;
1584 imx355->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx355_ctrl_ops,
1587 if (imx355->link_freq)
1588 imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1591 pixel_rate = imx355->link_def_freq * 2 * 4;
1594 imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1599 mode = imx355->cur_mode;
1602 imx355->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1608 imx355->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1611 if (imx355->hblank)
1612 imx355->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1616 imx355->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1622 imx355->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1624 imx355->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
1646 imx355->sd.ctrl_handler = ctrl_hdlr;
1726 struct imx355 *imx355;
1730 imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL);
1731 if (!imx355)
1734 mutex_init(&imx355->mutex);
1737 v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
1740 ret = imx355_identify_module(imx355);
1746 imx355->hwcfg = imx355_get_hwcfg(&client->dev);
1747 if (!imx355->hwcfg) {
1753 imx355->link_def_freq = link_freq_menu_items[IMX355_LINK_FREQ_INDEX];
1754 for (i = 0; i < imx355->hwcfg->nr_of_link_freqs; i++) {
1755 if (imx355->hwcfg->link_freqs[i] == imx355->link_def_freq) {
1761 if (i == imx355->hwcfg->nr_of_link_freqs) {
1768 imx355->cur_mode = &supported_modes[0];
1770 ret = imx355_init_controls(imx355);
1777 imx355->sd.internal_ops = &imx355_internal_ops;
1778 imx355->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
1780 imx355->sd.entity.ops = &imx355_subdev_entity_ops;
1781 imx355->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1784 imx355->pad.flags = MEDIA_PAD_FL_SOURCE;
1785 ret = media_entity_pads_init(&imx355->sd.entity, 1, &imx355->pad);
1791 ret = v4l2_async_register_subdev_sensor_common(&imx355->sd);
1806 media_entity_cleanup(&imx355->sd.entity);
1809 v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
1812 mutex_destroy(&imx355->mutex);
1820 struct imx355 *imx355 = to_imx355(sd);
1829 mutex_destroy(&imx355->mutex);
1846 .name = "imx355",
1859 MODULE_DESCRIPTION("Sony imx355 sensor driver");