Symbol: imx412
drivers/media/i2c/imx412.c
1002
imx412->supplies);
drivers/media/i2c/imx412.c
1013
static int imx412_init_controls(struct imx412 *imx412)
drivers/media/i2c/imx412.c
1015
struct v4l2_ctrl_handler *ctrl_hdlr = &imx412->ctrl_handler;
drivers/media/i2c/imx412.c
1016
const struct imx412_mode *mode = imx412->cur_mode;
drivers/media/i2c/imx412.c
1025
ctrl_hdlr->lock = &imx412->mutex;
drivers/media/i2c/imx412.c
1029
imx412->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1037
imx412->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1045
v4l2_ctrl_cluster(2, &imx412->exp_ctrl);
drivers/media/i2c/imx412.c
1047
imx412->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1055
imx412->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1061
imx412->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx412.c
1068
if (imx412->link_freq_ctrl)
drivers/media/i2c/imx412.c
1069
imx412->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx412.c
1071
imx412->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1077
if (imx412->hblank_ctrl)
drivers/media/i2c/imx412.c
1078
imx412->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx412.c
1081
dev_err(imx412->dev, "control init failed: %d\n",
drivers/media/i2c/imx412.c
1087
imx412->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx412.c
1094
struct imx412 *imx412;
drivers/media/i2c/imx412.c
1098
imx412 = devm_kzalloc(&client->dev, sizeof(*imx412), GFP_KERNEL);
drivers/media/i2c/imx412.c
1099
if (!imx412)
drivers/media/i2c/imx412.c
1102
imx412->dev = &client->dev;
drivers/media/i2c/imx412.c
1108
v4l2_i2c_subdev_init(&imx412->sd, client, &imx412_subdev_ops);
drivers/media/i2c/imx412.c
1109
imx412->sd.internal_ops = &imx412_internal_ops;
drivers/media/i2c/imx412.c
1111
ret = imx412_parse_hw_config(imx412);
drivers/media/i2c/imx412.c
1113
dev_err(imx412->dev, "HW configuration is not supported\n");
drivers/media/i2c/imx412.c
1117
mutex_init(&imx412->mutex);
drivers/media/i2c/imx412.c
1119
ret = imx412_power_on(imx412->dev);
drivers/media/i2c/imx412.c
1121
dev_err(imx412->dev, "failed to power-on the sensor\n");
drivers/media/i2c/imx412.c
1126
ret = imx412_detect(imx412);
drivers/media/i2c/imx412.c
1128
dev_err(imx412->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx412.c
1133
imx412->cur_mode = &supported_mode;
drivers/media/i2c/imx412.c
1134
imx412->vblank = imx412->cur_mode->vblank;
drivers/media/i2c/imx412.c
1136
ret = imx412_init_controls(imx412);
drivers/media/i2c/imx412.c
1138
dev_err(imx412->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx412.c
1143
imx412->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx412.c
1144
imx412->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx412.c
1146
v4l2_i2c_subdev_set_name(&imx412->sd, client, name, NULL);
drivers/media/i2c/imx412.c
1149
imx412->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx412.c
1150
ret = media_entity_pads_init(&imx412->sd.entity, 1, &imx412->pad);
drivers/media/i2c/imx412.c
1152
dev_err(imx412->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx412.c
1156
ret = v4l2_async_register_subdev_sensor(&imx412->sd);
drivers/media/i2c/imx412.c
1158
dev_err(imx412->dev,
drivers/media/i2c/imx412.c
1163
pm_runtime_set_active(imx412->dev);
drivers/media/i2c/imx412.c
1164
pm_runtime_enable(imx412->dev);
drivers/media/i2c/imx412.c
1165
pm_runtime_idle(imx412->dev);
drivers/media/i2c/imx412.c
1170
media_entity_cleanup(&imx412->sd.entity);
drivers/media/i2c/imx412.c
1172
v4l2_ctrl_handler_free(imx412->sd.ctrl_handler);
drivers/media/i2c/imx412.c
1174
imx412_power_off(imx412->dev);
drivers/media/i2c/imx412.c
1176
mutex_destroy(&imx412->mutex);
drivers/media/i2c/imx412.c
1184
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
1195
mutex_destroy(&imx412->mutex);
drivers/media/i2c/imx412.c
415
static inline struct imx412 *to_imx412(struct v4l2_subdev *subdev)
drivers/media/i2c/imx412.c
417
return container_of(subdev, struct imx412, sd);
drivers/media/i2c/imx412.c
429
static int imx412_read_reg(struct imx412 *imx412, u16 reg, u32 len, u32 *val)
drivers/media/i2c/imx412.c
431
struct i2c_client *client = v4l2_get_subdevdata(&imx412->sd);
drivers/media/i2c/imx412.c
472
static int imx412_write_reg(struct imx412 *imx412, u16 reg, u32 len, u32 val)
drivers/media/i2c/imx412.c
474
struct i2c_client *client = v4l2_get_subdevdata(&imx412->sd);
drivers/media/i2c/imx412.c
496
static int imx412_write_regs(struct imx412 *imx412,
drivers/media/i2c/imx412.c
503
ret = imx412_write_reg(imx412, regs[i].address, 1, regs[i].val);
drivers/media/i2c/imx412.c
518
static int imx412_update_controls(struct imx412 *imx412,
drivers/media/i2c/imx412.c
523
ret = __v4l2_ctrl_s_ctrl(imx412->link_freq_ctrl, mode->link_freq_idx);
drivers/media/i2c/imx412.c
527
ret = __v4l2_ctrl_s_ctrl(imx412->hblank_ctrl, mode->hblank);
drivers/media/i2c/imx412.c
531
return __v4l2_ctrl_modify_range(imx412->vblank_ctrl, mode->vblank_min,
drivers/media/i2c/imx412.c
543
static int imx412_update_exp_gain(struct imx412 *imx412, u32 exposure, u32 gain)
drivers/media/i2c/imx412.c
548
lpfr = imx412->vblank + imx412->cur_mode->height;
drivers/media/i2c/imx412.c
550
dev_dbg(imx412->dev, "Set exp %u, analog gain %u, lpfr %u\n",
drivers/media/i2c/imx412.c
553
ret = imx412_write_reg(imx412, IMX412_REG_HOLD, 1, 1);
drivers/media/i2c/imx412.c
557
ret = imx412_write_reg(imx412, IMX412_REG_LPFR, 2, lpfr);
drivers/media/i2c/imx412.c
561
ret = imx412_write_reg(imx412, IMX412_REG_EXPOSURE_CIT, 2, exposure);
drivers/media/i2c/imx412.c
565
ret = imx412_write_reg(imx412, IMX412_REG_AGAIN, 2, gain);
drivers/media/i2c/imx412.c
568
imx412_write_reg(imx412, IMX412_REG_HOLD, 1, 0);
drivers/media/i2c/imx412.c
575
struct imx412 *imx412 =
drivers/media/i2c/imx412.c
576
container_of(ctrl->handler, struct imx412, ctrl_handler);
drivers/media/i2c/imx412.c
583
imx412->vblank = imx412->vblank_ctrl->val;
drivers/media/i2c/imx412.c
585
dev_dbg(imx412->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx412.c
586
imx412->vblank,
drivers/media/i2c/imx412.c
587
imx412->vblank + imx412->cur_mode->height);
drivers/media/i2c/imx412.c
589
ret = __v4l2_ctrl_modify_range(imx412->exp_ctrl,
drivers/media/i2c/imx412.c
591
imx412->vblank +
drivers/media/i2c/imx412.c
592
imx412->cur_mode->height -
drivers/media/i2c/imx412.c
598
if (!pm_runtime_get_if_in_use(imx412->dev))
drivers/media/i2c/imx412.c
602
analog_gain = imx412->again_ctrl->val;
drivers/media/i2c/imx412.c
604
dev_dbg(imx412->dev, "Received exp %u, analog gain %u\n",
drivers/media/i2c/imx412.c
607
ret = imx412_update_exp_gain(imx412, exposure, analog_gain);
drivers/media/i2c/imx412.c
609
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
613
dev_err(imx412->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx412.c
662
static void imx412_fill_pad_format(struct imx412 *imx412,
drivers/media/i2c/imx412.c
680
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
682
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
690
imx412_fill_pad_format(imx412, imx412->cur_mode, fmt);
drivers/media/i2c/imx412.c
693
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
702
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
706
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
709
imx412_fill_pad_format(imx412, mode, fmt);
drivers/media/i2c/imx412.c
717
ret = imx412_update_controls(imx412, mode);
drivers/media/i2c/imx412.c
719
imx412->cur_mode = mode;
drivers/media/i2c/imx412.c
722
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
730
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
734
imx412_fill_pad_format(imx412, &supported_mode, &fmt);
drivers/media/i2c/imx412.c
745
static int imx412_start_streaming(struct imx412 *imx412)
drivers/media/i2c/imx412.c
751
reg_list = &imx412->cur_mode->reg_list;
drivers/media/i2c/imx412.c
752
ret = imx412_write_regs(imx412, reg_list->regs,
drivers/media/i2c/imx412.c
755
dev_err(imx412->dev, "fail to write initial registers\n");
drivers/media/i2c/imx412.c
760
ret = __v4l2_ctrl_handler_setup(imx412->sd.ctrl_handler);
drivers/media/i2c/imx412.c
762
dev_err(imx412->dev, "fail to setup handler\n");
drivers/media/i2c/imx412.c
770
ret = imx412_write_reg(imx412, IMX412_REG_MODE_SELECT,
drivers/media/i2c/imx412.c
773
dev_err(imx412->dev, "fail to start streaming\n");
drivers/media/i2c/imx412.c
786
static int imx412_stop_streaming(struct imx412 *imx412)
drivers/media/i2c/imx412.c
788
return imx412_write_reg(imx412, IMX412_REG_MODE_SELECT,
drivers/media/i2c/imx412.c
794
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
797
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
800
ret = pm_runtime_resume_and_get(imx412->dev);
drivers/media/i2c/imx412.c
804
ret = imx412_start_streaming(imx412);
drivers/media/i2c/imx412.c
808
imx412_stop_streaming(imx412);
drivers/media/i2c/imx412.c
809
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
812
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
817
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
819
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
830
static int imx412_detect(struct imx412 *imx412)
drivers/media/i2c/imx412.c
835
ret = imx412_read_reg(imx412, IMX412_REG_ID, 2, &val);
drivers/media/i2c/imx412.c
840
dev_err(imx412->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/imx412.c
854
static int imx412_parse_hw_config(struct imx412 *imx412)
drivers/media/i2c/imx412.c
856
struct fwnode_handle *fwnode = dev_fwnode(imx412->dev);
drivers/media/i2c/imx412.c
869
imx412->reset_gpio = devm_gpiod_get_optional(imx412->dev, "reset",
drivers/media/i2c/imx412.c
871
if (IS_ERR(imx412->reset_gpio)) {
drivers/media/i2c/imx412.c
872
dev_err(imx412->dev, "failed to get reset gpio %pe\n",
drivers/media/i2c/imx412.c
873
imx412->reset_gpio);
drivers/media/i2c/imx412.c
874
return PTR_ERR(imx412->reset_gpio);
drivers/media/i2c/imx412.c
878
imx412->inclk = devm_v4l2_sensor_clk_get(imx412->dev, NULL);
drivers/media/i2c/imx412.c
879
if (IS_ERR(imx412->inclk))
drivers/media/i2c/imx412.c
880
return dev_err_probe(imx412->dev, PTR_ERR(imx412->inclk),
drivers/media/i2c/imx412.c
883
rate = clk_get_rate(imx412->inclk);
drivers/media/i2c/imx412.c
885
dev_err(imx412->dev, "inclk frequency mismatch\n");
drivers/media/i2c/imx412.c
891
imx412->supplies[i].supply = imx412_supply_names[i];
drivers/media/i2c/imx412.c
893
ret = devm_regulator_bulk_get(imx412->dev,
drivers/media/i2c/imx412.c
895
imx412->supplies);
drivers/media/i2c/imx412.c
909
dev_err(imx412->dev,
drivers/media/i2c/imx412.c
917
dev_err(imx412->dev, "no link frequencies defined\n");
drivers/media/i2c/imx412.c
958
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
962
imx412->supplies);
drivers/media/i2c/imx412.c
968
gpiod_set_value_cansleep(imx412->reset_gpio, 0);
drivers/media/i2c/imx412.c
970
ret = clk_prepare_enable(imx412->inclk);
drivers/media/i2c/imx412.c
972
dev_err(imx412->dev, "fail to enable inclk\n");
drivers/media/i2c/imx412.c
985
gpiod_set_value_cansleep(imx412->reset_gpio, 1);
drivers/media/i2c/imx412.c
987
imx412->supplies);
drivers/media/i2c/imx412.c
995
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
997
clk_disable_unprepare(imx412->inclk);
drivers/media/i2c/imx412.c
999
gpiod_set_value_cansleep(imx412->reset_gpio, 1);