Symbol: imx208
drivers/media/i2c/imx208.c
1001
dev_err(imx208->dev, "sysfs otp creation failed\n");
drivers/media/i2c/imx208.c
1007
pm_runtime_set_active(imx208->dev);
drivers/media/i2c/imx208.c
1008
pm_runtime_enable(imx208->dev);
drivers/media/i2c/imx208.c
1009
pm_runtime_idle(imx208->dev);
drivers/media/i2c/imx208.c
1014
v4l2_async_unregister_subdev(&imx208->sd);
drivers/media/i2c/imx208.c
1017
media_entity_cleanup(&imx208->sd.entity);
drivers/media/i2c/imx208.c
1020
imx208_free_controls(imx208);
drivers/media/i2c/imx208.c
1023
mutex_destroy(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
1031
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
1033
device_remove_bin_file(imx208->dev, &bin_attr_otp);
drivers/media/i2c/imx208.c
1036
imx208_free_controls(imx208);
drivers/media/i2c/imx208.c
1038
pm_runtime_disable(imx208->dev);
drivers/media/i2c/imx208.c
1039
pm_runtime_set_suspended(imx208->dev);
drivers/media/i2c/imx208.c
1041
mutex_destroy(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
306
static inline struct imx208 *to_imx208(struct v4l2_subdev *_sd)
drivers/media/i2c/imx208.c
308
return container_of(_sd, struct imx208, sd);
drivers/media/i2c/imx208.c
312
static u32 imx208_get_format_code(struct imx208 *imx208)
drivers/media/i2c/imx208.c
323
return codes[imx208->vflip->val][imx208->hflip->val];
drivers/media/i2c/imx208.c
327
static int imx208_read_reg(struct imx208 *imx208, u16 reg, u32 len, u32 *val)
drivers/media/i2c/imx208.c
329
struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
drivers/media/i2c/imx208.c
360
static int imx208_write_reg(struct imx208 *imx208, u16 reg, u32 len, u32 val)
drivers/media/i2c/imx208.c
362
struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
drivers/media/i2c/imx208.c
377
static int imx208_write_regs(struct imx208 *imx208,
drivers/media/i2c/imx208.c
384
ret = imx208_write_reg(imx208, regs[i].address, 1,
drivers/media/i2c/imx208.c
387
dev_err_ratelimited(imx208->dev,
drivers/media/i2c/imx208.c
413
static int imx208_update_digital_gain(struct imx208 *imx208, u32 len, u32 val)
drivers/media/i2c/imx208.c
419
ret = imx208_write_reg(imx208, IMX208_REG_GR_DIGITAL_GAIN, 2, val);
drivers/media/i2c/imx208.c
423
ret = imx208_write_reg(imx208, IMX208_REG_GB_DIGITAL_GAIN, 2, val);
drivers/media/i2c/imx208.c
427
ret = imx208_write_reg(imx208, IMX208_REG_R_DIGITAL_GAIN, 2, val);
drivers/media/i2c/imx208.c
431
return imx208_write_reg(imx208, IMX208_REG_B_DIGITAL_GAIN, 2, val);
drivers/media/i2c/imx208.c
436
struct imx208 *imx208 =
drivers/media/i2c/imx208.c
437
container_of(ctrl->handler, struct imx208, ctrl_handler);
drivers/media/i2c/imx208.c
444
if (!pm_runtime_get_if_in_use(imx208->dev))
drivers/media/i2c/imx208.c
449
ret = imx208_write_reg(imx208, IMX208_REG_ANALOG_GAIN,
drivers/media/i2c/imx208.c
453
ret = imx208_write_reg(imx208, IMX208_REG_EXPOSURE,
drivers/media/i2c/imx208.c
457
ret = imx208_update_digital_gain(imx208, 2, ctrl->val);
drivers/media/i2c/imx208.c
461
ret = imx208_write_reg(imx208, IMX208_REG_VTS, 2,
drivers/media/i2c/imx208.c
462
imx208->cur_mode->height + ctrl->val);
drivers/media/i2c/imx208.c
465
ret = imx208_write_reg(imx208, IMX208_REG_TEST_PATTERN_MODE,
drivers/media/i2c/imx208.c
470
ret = imx208_write_reg(imx208, IMX208_REG_ORIENTATION_CONTROL,
drivers/media/i2c/imx208.c
472
imx208->hflip->val |
drivers/media/i2c/imx208.c
473
imx208->vflip->val << 1);
drivers/media/i2c/imx208.c
477
dev_err(imx208->dev,
drivers/media/i2c/imx208.c
483
pm_runtime_put(imx208->dev);
drivers/media/i2c/imx208.c
509
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
514
code->code = imx208_get_format_code(imx208);
drivers/media/i2c/imx208.c
523
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
528
if (fse->code != imx208_get_format_code(imx208))
drivers/media/i2c/imx208.c
539
static void imx208_mode_to_pad_format(struct imx208 *imx208,
drivers/media/i2c/imx208.c
545
fmt->format.code = imx208_get_format_code(imx208);
drivers/media/i2c/imx208.c
549
static int __imx208_get_pad_format(struct imx208 *imx208,
drivers/media/i2c/imx208.c
557
imx208_mode_to_pad_format(imx208, imx208->cur_mode, fmt);
drivers/media/i2c/imx208.c
566
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
569
mutex_lock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
570
ret = __imx208_get_pad_format(imx208, sd_state, fmt);
drivers/media/i2c/imx208.c
571
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
580
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
588
mutex_lock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
590
fmt->format.code = imx208_get_format_code(imx208);
drivers/media/i2c/imx208.c
594
imx208_mode_to_pad_format(imx208, mode, fmt);
drivers/media/i2c/imx208.c
598
imx208->cur_mode = mode;
drivers/media/i2c/imx208.c
599
__v4l2_ctrl_s_ctrl(imx208->link_freq, mode->link_freq_index);
drivers/media/i2c/imx208.c
602
__v4l2_ctrl_s_ctrl_int64(imx208->pixel_rate, pixel_rate);
drivers/media/i2c/imx208.c
604
vblank_def = imx208->cur_mode->vts_def -
drivers/media/i2c/imx208.c
605
imx208->cur_mode->height;
drivers/media/i2c/imx208.c
606
vblank_min = imx208->cur_mode->vts_min -
drivers/media/i2c/imx208.c
607
imx208->cur_mode->height;
drivers/media/i2c/imx208.c
608
__v4l2_ctrl_modify_range(imx208->vblank, vblank_min,
drivers/media/i2c/imx208.c
609
IMX208_VTS_MAX - imx208->cur_mode->height,
drivers/media/i2c/imx208.c
611
__v4l2_ctrl_s_ctrl(imx208->vblank, vblank_def);
drivers/media/i2c/imx208.c
614
- imx208->cur_mode->width;
drivers/media/i2c/imx208.c
615
__v4l2_ctrl_modify_range(imx208->hblank, h_blank,
drivers/media/i2c/imx208.c
619
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
624
static int imx208_identify_module(struct imx208 *imx208)
drivers/media/i2c/imx208.c
629
if (imx208->identified)
drivers/media/i2c/imx208.c
632
ret = imx208_read_reg(imx208, IMX208_REG_CHIP_ID,
drivers/media/i2c/imx208.c
635
dev_err(imx208->dev, "failed to read chip id %x\n",
drivers/media/i2c/imx208.c
641
dev_err(imx208->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/imx208.c
646
imx208->identified = true;
drivers/media/i2c/imx208.c
652
static int imx208_start_streaming(struct imx208 *imx208)
drivers/media/i2c/imx208.c
657
ret = imx208_identify_module(imx208);
drivers/media/i2c/imx208.c
662
link_freq_index = imx208->cur_mode->link_freq_index;
drivers/media/i2c/imx208.c
664
ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx208.c
666
dev_err(imx208->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/imx208.c
671
reg_list = &imx208->cur_mode->reg_list;
drivers/media/i2c/imx208.c
672
ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx208.c
674
dev_err(imx208->dev, "%s failed to set mode\n", __func__);
drivers/media/i2c/imx208.c
679
ret = __v4l2_ctrl_handler_setup(imx208->sd.ctrl_handler);
drivers/media/i2c/imx208.c
684
return imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
drivers/media/i2c/imx208.c
689
static int imx208_stop_streaming(struct imx208 *imx208)
drivers/media/i2c/imx208.c
694
ret = imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
drivers/media/i2c/imx208.c
697
dev_err(imx208->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/imx208.c
708
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
711
mutex_lock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
714
ret = pm_runtime_resume_and_get(imx208->dev);
drivers/media/i2c/imx208.c
716
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
724
ret = imx208_start_streaming(imx208);
drivers/media/i2c/imx208.c
728
imx208_stop_streaming(imx208);
drivers/media/i2c/imx208.c
729
pm_runtime_put(imx208->dev);
drivers/media/i2c/imx208.c
732
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
735
v4l2_ctrl_grab(imx208->vflip, enable);
drivers/media/i2c/imx208.c
736
v4l2_ctrl_grab(imx208->hflip, enable);
drivers/media/i2c/imx208.c
741
pm_runtime_put(imx208->dev);
drivers/media/i2c/imx208.c
742
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
768
static int imx208_read_otp(struct imx208 *imx208)
drivers/media/i2c/imx208.c
770
struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
drivers/media/i2c/imx208.c
775
mutex_lock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
777
if (imx208->otp_read)
drivers/media/i2c/imx208.c
780
ret = pm_runtime_resume_and_get(imx208->dev);
drivers/media/i2c/imx208.c
784
ret = imx208_identify_module(imx208);
drivers/media/i2c/imx208.c
797
msgs[1].len = sizeof(imx208->otp_data);
drivers/media/i2c/imx208.c
798
msgs[1].buf = imx208->otp_data;
drivers/media/i2c/imx208.c
802
imx208->otp_read = true;
drivers/media/i2c/imx208.c
807
pm_runtime_put(imx208->dev);
drivers/media/i2c/imx208.c
810
mutex_unlock(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
821
struct imx208 *imx208 = to_imx208(sd);
drivers/media/i2c/imx208.c
824
ret = imx208_read_otp(imx208);
drivers/media/i2c/imx208.c
828
memcpy(buf, &imx208->otp_data[off], count);
drivers/media/i2c/imx208.c
835
static int imx208_init_controls(struct imx208 *imx208)
drivers/media/i2c/imx208.c
837
struct v4l2_ctrl_handler *ctrl_hdlr = &imx208->ctrl_handler;
drivers/media/i2c/imx208.c
849
mutex_init(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
850
ctrl_hdlr->lock = &imx208->imx208_mx;
drivers/media/i2c/imx208.c
851
imx208->link_freq =
drivers/media/i2c/imx208.c
858
if (imx208->link_freq)
drivers/media/i2c/imx208.c
859
imx208->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx208.c
865
imx208->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
drivers/media/i2c/imx208.c
870
vblank_def = imx208->cur_mode->vts_def - imx208->cur_mode->height;
drivers/media/i2c/imx208.c
871
vblank_min = imx208->cur_mode->vts_min - imx208->cur_mode->height;
drivers/media/i2c/imx208.c
872
imx208->vblank =
drivers/media/i2c/imx208.c
875
IMX208_VTS_MAX - imx208->cur_mode->height, 1,
drivers/media/i2c/imx208.c
878
imx208->hblank =
drivers/media/i2c/imx208.c
880
IMX208_PPL_384MHZ - imx208->cur_mode->width,
drivers/media/i2c/imx208.c
881
IMX208_PPL_384MHZ - imx208->cur_mode->width,
drivers/media/i2c/imx208.c
883
IMX208_PPL_384MHZ - imx208->cur_mode->width);
drivers/media/i2c/imx208.c
885
if (imx208->hblank)
drivers/media/i2c/imx208.c
886
imx208->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx208.c
888
exposure_max = imx208->cur_mode->vts_def - 8;
drivers/media/i2c/imx208.c
893
imx208->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
drivers/media/i2c/imx208.c
895
if (imx208->hflip)
drivers/media/i2c/imx208.c
896
imx208->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx208.c
897
imx208->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
drivers/media/i2c/imx208.c
899
if (imx208->vflip)
drivers/media/i2c/imx208.c
900
imx208->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx208.c
915
dev_err(imx208->dev, "%s control init failed (%d)\n",
drivers/media/i2c/imx208.c
920
imx208->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx208.c
926
mutex_destroy(&imx208->imx208_mx);
drivers/media/i2c/imx208.c
931
static void imx208_free_controls(struct imx208 *imx208)
drivers/media/i2c/imx208.c
933
v4l2_ctrl_handler_free(imx208->sd.ctrl_handler);
drivers/media/i2c/imx208.c
938
struct imx208 *imx208;
drivers/media/i2c/imx208.c
943
imx208 = devm_kzalloc(&client->dev, sizeof(*imx208), GFP_KERNEL);
drivers/media/i2c/imx208.c
944
if (!imx208)
drivers/media/i2c/imx208.c
947
imx208->dev = &client->dev;
drivers/media/i2c/imx208.c
949
imx208->clk = devm_v4l2_sensor_clk_get(imx208->dev, NULL);
drivers/media/i2c/imx208.c
950
if (IS_ERR(imx208->clk))
drivers/media/i2c/imx208.c
951
return dev_err_probe(imx208->dev, PTR_ERR(imx208->clk),
drivers/media/i2c/imx208.c
954
freq = clk_get_rate(imx208->clk);
drivers/media/i2c/imx208.c
956
return dev_err_probe(imx208->dev, -EINVAL,
drivers/media/i2c/imx208.c
961
v4l2_i2c_subdev_init(&imx208->sd, client, &imx208_subdev_ops);
drivers/media/i2c/imx208.c
963
full_power = acpi_dev_state_d0(imx208->dev);
drivers/media/i2c/imx208.c
966
ret = imx208_identify_module(imx208);
drivers/media/i2c/imx208.c
968
dev_err(imx208->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/imx208.c
974
imx208->cur_mode = &supported_modes[0];
drivers/media/i2c/imx208.c
976
ret = imx208_init_controls(imx208);
drivers/media/i2c/imx208.c
978
dev_err(imx208->dev, "failed to init controls: %d", ret);
drivers/media/i2c/imx208.c
983
imx208->sd.internal_ops = &imx208_internal_ops;
drivers/media/i2c/imx208.c
984
imx208->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx208.c
985
imx208->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx208.c
988
imx208->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx208.c
989
ret = media_entity_pads_init(&imx208->sd.entity, 1, &imx208->pad);
drivers/media/i2c/imx208.c
991
dev_err(imx208->dev, "%s failed:%d\n", __func__, ret);
drivers/media/i2c/imx208.c
995
ret = v4l2_async_register_subdev_sensor(&imx208->sd);
drivers/media/i2c/imx208.c
999
ret = device_create_bin_file(imx208->dev, &bin_attr_otp);