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