Symbol: imx412
drivers/media/i2c/imx412.c
1022
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
1026
imx412->supplies);
drivers/media/i2c/imx412.c
1032
gpiod_set_value_cansleep(imx412->reset_gpio, 0);
drivers/media/i2c/imx412.c
1034
ret = clk_prepare_enable(imx412->inclk);
drivers/media/i2c/imx412.c
1036
dev_err(imx412->dev, "fail to enable inclk\n");
drivers/media/i2c/imx412.c
1045
gpiod_set_value_cansleep(imx412->reset_gpio, 1);
drivers/media/i2c/imx412.c
1047
imx412->supplies);
drivers/media/i2c/imx412.c
1061
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
1063
clk_disable_unprepare(imx412->inclk);
drivers/media/i2c/imx412.c
1065
gpiod_set_value_cansleep(imx412->reset_gpio, 1);
drivers/media/i2c/imx412.c
1068
imx412->supplies);
drivers/media/i2c/imx412.c
1079
static int imx412_init_controls(struct imx412 *imx412)
drivers/media/i2c/imx412.c
1081
struct v4l2_ctrl_handler *ctrl_hdlr = &imx412->ctrl_handler;
drivers/media/i2c/imx412.c
1082
const struct imx412_mode *mode = imx412->cur_mode;
drivers/media/i2c/imx412.c
1091
ctrl_hdlr->lock = &imx412->mutex;
drivers/media/i2c/imx412.c
1095
imx412->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1103
imx412->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1111
v4l2_ctrl_cluster(2, &imx412->exp_ctrl);
drivers/media/i2c/imx412.c
1113
imx412->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1121
imx412->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1127
imx412->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx412.c
1134
if (imx412->link_freq_ctrl)
drivers/media/i2c/imx412.c
1135
imx412->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx412.c
1137
imx412->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx412.c
1143
if (imx412->hblank_ctrl)
drivers/media/i2c/imx412.c
1144
imx412->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx412.c
1147
dev_err(imx412->dev, "control init failed: %d\n",
drivers/media/i2c/imx412.c
1153
imx412->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx412.c
1166
struct imx412 *imx412;
drivers/media/i2c/imx412.c
1170
imx412 = devm_kzalloc(&client->dev, sizeof(*imx412), GFP_KERNEL);
drivers/media/i2c/imx412.c
1171
if (!imx412)
drivers/media/i2c/imx412.c
1174
imx412->dev = &client->dev;
drivers/media/i2c/imx412.c
1180
v4l2_i2c_subdev_init(&imx412->sd, client, &imx412_subdev_ops);
drivers/media/i2c/imx412.c
1181
imx412->sd.internal_ops = &imx412_internal_ops;
drivers/media/i2c/imx412.c
1183
ret = imx412_parse_hw_config(imx412);
drivers/media/i2c/imx412.c
1185
dev_err(imx412->dev, "HW configuration is not supported\n");
drivers/media/i2c/imx412.c
1189
mutex_init(&imx412->mutex);
drivers/media/i2c/imx412.c
1191
ret = imx412_power_on(imx412->dev);
drivers/media/i2c/imx412.c
1193
dev_err(imx412->dev, "failed to power-on the sensor\n");
drivers/media/i2c/imx412.c
1198
ret = imx412_detect(imx412);
drivers/media/i2c/imx412.c
1200
dev_err(imx412->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx412.c
1205
imx412->cur_mode = &supported_mode;
drivers/media/i2c/imx412.c
1206
imx412->vblank = imx412->cur_mode->vblank;
drivers/media/i2c/imx412.c
1208
ret = imx412_init_controls(imx412);
drivers/media/i2c/imx412.c
1210
dev_err(imx412->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx412.c
1215
imx412->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx412.c
1216
imx412->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx412.c
1218
v4l2_i2c_subdev_set_name(&imx412->sd, client, name, NULL);
drivers/media/i2c/imx412.c
1221
imx412->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx412.c
1222
ret = media_entity_pads_init(&imx412->sd.entity, 1, &imx412->pad);
drivers/media/i2c/imx412.c
1224
dev_err(imx412->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx412.c
1228
ret = v4l2_async_register_subdev_sensor(&imx412->sd);
drivers/media/i2c/imx412.c
1230
dev_err(imx412->dev,
drivers/media/i2c/imx412.c
1235
pm_runtime_set_active(imx412->dev);
drivers/media/i2c/imx412.c
1236
pm_runtime_enable(imx412->dev);
drivers/media/i2c/imx412.c
1237
pm_runtime_idle(imx412->dev);
drivers/media/i2c/imx412.c
1242
media_entity_cleanup(&imx412->sd.entity);
drivers/media/i2c/imx412.c
1244
v4l2_ctrl_handler_free(imx412->sd.ctrl_handler);
drivers/media/i2c/imx412.c
1246
imx412_power_off(imx412->dev);
drivers/media/i2c/imx412.c
1248
mutex_destroy(&imx412->mutex);
drivers/media/i2c/imx412.c
1262
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
1273
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
587
struct imx412 *imx412 =
drivers/media/i2c/imx412.c
588
container_of(ctrl->handler, struct imx412, ctrl_handler);
drivers/media/i2c/imx412.c
595
imx412->vblank = imx412->vblank_ctrl->val;
drivers/media/i2c/imx412.c
597
dev_dbg(imx412->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx412.c
598
imx412->vblank,
drivers/media/i2c/imx412.c
599
imx412->vblank + imx412->cur_mode->height);
drivers/media/i2c/imx412.c
601
ret = __v4l2_ctrl_modify_range(imx412->exp_ctrl,
drivers/media/i2c/imx412.c
603
imx412->vblank +
drivers/media/i2c/imx412.c
604
imx412->cur_mode->height -
drivers/media/i2c/imx412.c
610
if (!pm_runtime_get_if_in_use(imx412->dev))
drivers/media/i2c/imx412.c
614
analog_gain = imx412->again_ctrl->val;
drivers/media/i2c/imx412.c
616
dev_dbg(imx412->dev, "Received exp %u, analog gain %u\n",
drivers/media/i2c/imx412.c
619
ret = imx412_update_exp_gain(imx412, exposure, analog_gain);
drivers/media/i2c/imx412.c
621
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
625
dev_err(imx412->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx412.c
690
static void imx412_fill_pad_format(struct imx412 *imx412,
drivers/media/i2c/imx412.c
716
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
718
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
726
imx412_fill_pad_format(imx412, imx412->cur_mode, fmt);
drivers/media/i2c/imx412.c
729
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
746
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
750
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
753
imx412_fill_pad_format(imx412, mode, fmt);
drivers/media/i2c/imx412.c
761
ret = imx412_update_controls(imx412, mode);
drivers/media/i2c/imx412.c
763
imx412->cur_mode = mode;
drivers/media/i2c/imx412.c
766
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
781
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
785
imx412_fill_pad_format(imx412, &supported_mode, &fmt);
drivers/media/i2c/imx412.c
796
static int imx412_start_streaming(struct imx412 *imx412)
drivers/media/i2c/imx412.c
802
reg_list = &imx412->cur_mode->reg_list;
drivers/media/i2c/imx412.c
803
ret = imx412_write_regs(imx412, reg_list->regs,
drivers/media/i2c/imx412.c
806
dev_err(imx412->dev, "fail to write initial registers\n");
drivers/media/i2c/imx412.c
811
ret = __v4l2_ctrl_handler_setup(imx412->sd.ctrl_handler);
drivers/media/i2c/imx412.c
813
dev_err(imx412->dev, "fail to setup handler\n");
drivers/media/i2c/imx412.c
821
ret = imx412_write_reg(imx412, IMX412_REG_MODE_SELECT,
drivers/media/i2c/imx412.c
824
dev_err(imx412->dev, "fail to start streaming\n");
drivers/media/i2c/imx412.c
837
static int imx412_stop_streaming(struct imx412 *imx412)
drivers/media/i2c/imx412.c
839
return imx412_write_reg(imx412, IMX412_REG_MODE_SELECT,
drivers/media/i2c/imx412.c
852
struct imx412 *imx412 = to_imx412(sd);
drivers/media/i2c/imx412.c
855
mutex_lock(&imx412->mutex);
drivers/media/i2c/imx412.c
858
ret = pm_runtime_resume_and_get(imx412->dev);
drivers/media/i2c/imx412.c
862
ret = imx412_start_streaming(imx412);
drivers/media/i2c/imx412.c
866
imx412_stop_streaming(imx412);
drivers/media/i2c/imx412.c
867
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
870
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
875
pm_runtime_put(imx412->dev);
drivers/media/i2c/imx412.c
877
mutex_unlock(&imx412->mutex);
drivers/media/i2c/imx412.c
888
static int imx412_detect(struct imx412 *imx412)
drivers/media/i2c/imx412.c
893
ret = imx412_read_reg(imx412, IMX412_REG_ID, 2, &val);
drivers/media/i2c/imx412.c
898
dev_err(imx412->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/imx412.c
912
static int imx412_parse_hw_config(struct imx412 *imx412)
drivers/media/i2c/imx412.c
914
struct fwnode_handle *fwnode = dev_fwnode(imx412->dev);
drivers/media/i2c/imx412.c
927
imx412->reset_gpio = devm_gpiod_get_optional(imx412->dev, "reset",
drivers/media/i2c/imx412.c
929
if (IS_ERR(imx412->reset_gpio)) {
drivers/media/i2c/imx412.c
930
dev_err(imx412->dev, "failed to get reset gpio %pe\n",
drivers/media/i2c/imx412.c
931
imx412->reset_gpio);
drivers/media/i2c/imx412.c
932
return PTR_ERR(imx412->reset_gpio);
drivers/media/i2c/imx412.c
936
imx412->inclk = devm_v4l2_sensor_clk_get(imx412->dev, NULL);
drivers/media/i2c/imx412.c
937
if (IS_ERR(imx412->inclk))
drivers/media/i2c/imx412.c
938
return dev_err_probe(imx412->dev, PTR_ERR(imx412->inclk),
drivers/media/i2c/imx412.c
941
rate = clk_get_rate(imx412->inclk);
drivers/media/i2c/imx412.c
943
dev_err(imx412->dev, "inclk frequency mismatch\n");
drivers/media/i2c/imx412.c
949
imx412->supplies[i].supply = imx412_supply_names[i];
drivers/media/i2c/imx412.c
951
ret = devm_regulator_bulk_get(imx412->dev,
drivers/media/i2c/imx412.c
953
imx412->supplies);
drivers/media/i2c/imx412.c
967
dev_err(imx412->dev,
drivers/media/i2c/imx412.c
975
dev_err(imx412->dev, "no link frequencies defined\n");