Symbol: imx334
drivers/media/i2c/imx334.c
1002
imx334->reset_gpio = devm_gpiod_get_optional(imx334->dev, "reset",
drivers/media/i2c/imx334.c
1004
if (IS_ERR(imx334->reset_gpio))
drivers/media/i2c/imx334.c
1005
return dev_err_probe(imx334->dev, PTR_ERR(imx334->reset_gpio),
drivers/media/i2c/imx334.c
1009
imx334->inclk = devm_v4l2_sensor_clk_get(imx334->dev, NULL);
drivers/media/i2c/imx334.c
1010
if (IS_ERR(imx334->inclk))
drivers/media/i2c/imx334.c
1011
return dev_err_probe(imx334->dev, PTR_ERR(imx334->inclk),
drivers/media/i2c/imx334.c
1014
rate = clk_get_rate(imx334->inclk);
drivers/media/i2c/imx334.c
1016
return dev_err_probe(imx334->dev, -EINVAL,
drivers/media/i2c/imx334.c
1029
dev_err(imx334->dev,
drivers/media/i2c/imx334.c
1036
ret = v4l2_link_freq_to_bitmap(imx334->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx334.c
1039
&imx334->link_freq_bitmap);
drivers/media/i2c/imx334.c
1079
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
1086
gpiod_set_value_cansleep(imx334->reset_gpio, 1);
drivers/media/i2c/imx334.c
1088
ret = clk_prepare_enable(imx334->inclk);
drivers/media/i2c/imx334.c
1090
dev_err(imx334->dev, "fail to enable inclk\n");
drivers/media/i2c/imx334.c
1099
gpiod_set_value_cansleep(imx334->reset_gpio, 0);
drivers/media/i2c/imx334.c
1113
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
1115
gpiod_set_value_cansleep(imx334->reset_gpio, 0);
drivers/media/i2c/imx334.c
1117
clk_disable_unprepare(imx334->inclk);
drivers/media/i2c/imx334.c
1128
static int imx334_init_controls(struct imx334 *imx334)
drivers/media/i2c/imx334.c
1130
struct v4l2_ctrl_handler *ctrl_hdlr = &imx334->ctrl_handler;
drivers/media/i2c/imx334.c
1131
const struct imx334_mode *mode = imx334->cur_mode;
drivers/media/i2c/imx334.c
1141
imx334->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1149
imx334->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1157
v4l2_ctrl_cluster(2, &imx334->exp_ctrl);
drivers/media/i2c/imx334.c
1159
imx334->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1167
imx334->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1173
imx334->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx334.c
1176
__fls(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
1177
__ffs(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
1180
if (imx334->link_freq_ctrl)
drivers/media/i2c/imx334.c
1181
imx334->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx334.c
1183
imx334->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1189
if (imx334->hblank_ctrl)
drivers/media/i2c/imx334.c
1190
imx334->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx334.c
1198
dev_err(imx334->dev, "control init failed: %d",
drivers/media/i2c/imx334.c
1204
imx334->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx334.c
1217
struct imx334 *imx334;
drivers/media/i2c/imx334.c
1220
imx334 = devm_kzalloc(&client->dev, sizeof(*imx334), GFP_KERNEL);
drivers/media/i2c/imx334.c
1221
if (!imx334)
drivers/media/i2c/imx334.c
1224
imx334->dev = &client->dev;
drivers/media/i2c/imx334.c
1225
imx334->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx334.c
1226
if (IS_ERR(imx334->cci)) {
drivers/media/i2c/imx334.c
1227
dev_err(imx334->dev, "Unable to initialize I2C\n");
drivers/media/i2c/imx334.c
1232
v4l2_i2c_subdev_init(&imx334->sd, client, &imx334_subdev_ops);
drivers/media/i2c/imx334.c
1233
imx334->sd.internal_ops = &imx334_internal_ops;
drivers/media/i2c/imx334.c
1235
ret = imx334_parse_hw_config(imx334);
drivers/media/i2c/imx334.c
1237
return dev_err_probe(imx334->dev, ret,
drivers/media/i2c/imx334.c
1240
ret = imx334_power_on(imx334->dev);
drivers/media/i2c/imx334.c
1242
dev_err_probe(imx334->dev, ret, "failed to power-on the sensor\n");
drivers/media/i2c/imx334.c
1247
ret = imx334_detect(imx334);
drivers/media/i2c/imx334.c
1249
dev_err(imx334->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx334.c
1254
imx334->cur_mode = &supported_modes[__ffs(imx334->link_freq_bitmap)];
drivers/media/i2c/imx334.c
1255
imx334->cur_code = imx334_mbus_codes[0];
drivers/media/i2c/imx334.c
1256
imx334->vblank = imx334->cur_mode->vblank;
drivers/media/i2c/imx334.c
1258
ret = imx334_init_controls(imx334);
drivers/media/i2c/imx334.c
1260
dev_err(imx334->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx334.c
1265
imx334->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx334.c
1266
imx334->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx334.c
1269
imx334->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx334.c
1270
ret = media_entity_pads_init(&imx334->sd.entity, 1, &imx334->pad);
drivers/media/i2c/imx334.c
1272
dev_err(imx334->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx334.c
1276
imx334->sd.state_lock = imx334->ctrl_handler.lock;
drivers/media/i2c/imx334.c
1277
ret = v4l2_subdev_init_finalize(&imx334->sd);
drivers/media/i2c/imx334.c
1279
dev_err(imx334->dev, "subdev init error: %d\n", ret);
drivers/media/i2c/imx334.c
1283
pm_runtime_set_active(imx334->dev);
drivers/media/i2c/imx334.c
1284
pm_runtime_enable(imx334->dev);
drivers/media/i2c/imx334.c
1286
ret = v4l2_async_register_subdev_sensor(&imx334->sd);
drivers/media/i2c/imx334.c
1288
dev_err(imx334->dev,
drivers/media/i2c/imx334.c
1293
pm_runtime_idle(imx334->dev);
drivers/media/i2c/imx334.c
1298
v4l2_subdev_cleanup(&imx334->sd);
drivers/media/i2c/imx334.c
1299
pm_runtime_disable(imx334->dev);
drivers/media/i2c/imx334.c
1300
pm_runtime_set_suspended(imx334->dev);
drivers/media/i2c/imx334.c
1303
media_entity_cleanup(&imx334->sd.entity);
drivers/media/i2c/imx334.c
1306
v4l2_ctrl_handler_free(imx334->sd.ctrl_handler);
drivers/media/i2c/imx334.c
1309
imx334_power_off(imx334->dev);
drivers/media/i2c/imx334.c
498
static inline struct imx334 *to_imx334(struct v4l2_subdev *subdev)
drivers/media/i2c/imx334.c
500
return container_of(subdev, struct imx334, sd);
drivers/media/i2c/imx334.c
510
static int imx334_update_controls(struct imx334 *imx334,
drivers/media/i2c/imx334.c
515
ret = __v4l2_ctrl_s_ctrl(imx334->link_freq_ctrl, mode->link_freq_idx);
drivers/media/i2c/imx334.c
519
ret = __v4l2_ctrl_modify_range(imx334->pclk_ctrl, mode->pclk,
drivers/media/i2c/imx334.c
524
ret = __v4l2_ctrl_modify_range(imx334->hblank_ctrl, mode->hblank,
drivers/media/i2c/imx334.c
529
ret = __v4l2_ctrl_modify_range(imx334->vblank_ctrl, mode->vblank_min,
drivers/media/i2c/imx334.c
534
return __v4l2_ctrl_s_ctrl(imx334->vblank_ctrl, mode->vblank);
drivers/media/i2c/imx334.c
545
static int imx334_update_exp_gain(struct imx334 *imx334, u32 exposure, u32 gain)
drivers/media/i2c/imx334.c
551
lpfr = imx334->vblank + imx334->cur_mode->height;
drivers/media/i2c/imx334.c
554
dev_dbg(imx334->dev, "Set long exp %u analog gain %u sh0 %u lpfr %u\n",
drivers/media/i2c/imx334.c
557
cci_write(imx334->cci, IMX334_REG_HOLD, 1, &ret);
drivers/media/i2c/imx334.c
558
cci_write(imx334->cci, IMX334_REG_VMAX, lpfr, &ret);
drivers/media/i2c/imx334.c
559
cci_write(imx334->cci, IMX334_REG_SHUTTER, shutter, &ret);
drivers/media/i2c/imx334.c
560
cci_write(imx334->cci, IMX334_REG_AGAIN, gain, &ret);
drivers/media/i2c/imx334.c
562
ret_hold = cci_write(imx334->cci, IMX334_REG_HOLD, 0, NULL);
drivers/media/i2c/imx334.c
583
struct imx334 *imx334 =
drivers/media/i2c/imx334.c
584
container_of(ctrl->handler, struct imx334, ctrl_handler);
drivers/media/i2c/imx334.c
590
imx334->vblank = imx334->vblank_ctrl->val;
drivers/media/i2c/imx334.c
592
dev_dbg(imx334->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx334.c
593
imx334->vblank,
drivers/media/i2c/imx334.c
594
imx334->vblank + imx334->cur_mode->height);
drivers/media/i2c/imx334.c
596
ret = __v4l2_ctrl_modify_range(imx334->exp_ctrl,
drivers/media/i2c/imx334.c
598
imx334->vblank +
drivers/media/i2c/imx334.c
599
imx334->cur_mode->height -
drivers/media/i2c/imx334.c
607
if (!pm_runtime_get_if_in_use(imx334->dev))
drivers/media/i2c/imx334.c
612
exposure = imx334->exp_ctrl->val;
drivers/media/i2c/imx334.c
613
analog_gain = imx334->again_ctrl->val;
drivers/media/i2c/imx334.c
615
ret = imx334_update_exp_gain(imx334, exposure, analog_gain);
drivers/media/i2c/imx334.c
621
analog_gain = imx334->again_ctrl->val;
drivers/media/i2c/imx334.c
623
dev_dbg(imx334->dev, "Received exp %u analog gain %u\n",
drivers/media/i2c/imx334.c
626
ret = imx334_update_exp_gain(imx334, exposure, analog_gain);
drivers/media/i2c/imx334.c
636
cci_write(imx334->cci, IMX334_TP_CLK_EN,
drivers/media/i2c/imx334.c
638
cci_write(imx334->cci, IMX334_DIG_CLP_MODE, 0x0, NULL);
drivers/media/i2c/imx334.c
639
cci_write(imx334->cci, IMX334_TPG_COLORW,
drivers/media/i2c/imx334.c
641
cci_write(imx334->cci, IMX334_REG_TP,
drivers/media/i2c/imx334.c
643
cci_write(imx334->cci, IMX334_TPG_EN_DOUT,
drivers/media/i2c/imx334.c
646
cci_write(imx334->cci, IMX334_DIG_CLP_MODE, 0x1, NULL);
drivers/media/i2c/imx334.c
647
cci_write(imx334->cci, IMX334_TP_CLK_EN,
drivers/media/i2c/imx334.c
649
cci_write(imx334->cci, IMX334_TPG_EN_DOUT,
drivers/media/i2c/imx334.c
655
dev_err(imx334->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx334.c
659
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
669
static int imx334_get_format_code(struct imx334 *imx334, u32 code)
drivers/media/i2c/imx334.c
713
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
719
code = imx334_get_format_code(imx334, fsize->code);
drivers/media/i2c/imx334.c
739
static void imx334_fill_pad_format(struct imx334 *imx334,
drivers/media/i2c/imx334.c
764
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
772
fmt->format.code = imx334->cur_code;
drivers/media/i2c/imx334.c
773
imx334_fill_pad_format(imx334, imx334->cur_mode, fmt);
drivers/media/i2c/imx334.c
791
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
800
imx334_fill_pad_format(imx334, mode, fmt);
drivers/media/i2c/imx334.c
801
fmt->format.code = imx334_get_format_code(imx334, fmt->format.code);
drivers/media/i2c/imx334.c
808
} else if (imx334->cur_mode != mode || imx334->cur_code != fmt->format.code) {
drivers/media/i2c/imx334.c
809
imx334->cur_code = fmt->format.code;
drivers/media/i2c/imx334.c
810
ret = imx334_update_controls(imx334, mode);
drivers/media/i2c/imx334.c
812
imx334->cur_mode = mode;
drivers/media/i2c/imx334.c
828
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
833
imx334_fill_pad_format(imx334, imx334->cur_mode, &fmt);
drivers/media/i2c/imx334.c
835
__v4l2_ctrl_modify_range(imx334->link_freq_ctrl, 0,
drivers/media/i2c/imx334.c
836
__fls(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
837
~(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
838
__ffs(imx334->link_freq_bitmap));
drivers/media/i2c/imx334.c
843
static int imx334_set_framefmt(struct imx334 *imx334)
drivers/media/i2c/imx334.c
845
switch (imx334->cur_code) {
drivers/media/i2c/imx334.c
847
return cci_multi_reg_write(imx334->cci, raw10_framefmt_regs,
drivers/media/i2c/imx334.c
852
return cci_multi_reg_write(imx334->cci, raw12_framefmt_regs,
drivers/media/i2c/imx334.c
872
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
876
ret = pm_runtime_resume_and_get(imx334->dev);
drivers/media/i2c/imx334.c
880
ret = cci_multi_reg_write(imx334->cci, common_mode_regs,
drivers/media/i2c/imx334.c
883
dev_err(imx334->dev, "fail to write common registers\n");
drivers/media/i2c/imx334.c
888
reg_list = &imx334->cur_mode->reg_list;
drivers/media/i2c/imx334.c
889
ret = cci_multi_reg_write(imx334->cci, reg_list->regs,
drivers/media/i2c/imx334.c
892
dev_err(imx334->dev, "fail to write initial registers\n");
drivers/media/i2c/imx334.c
896
ret = cci_write(imx334->cci, IMX334_REG_LANEMODE,
drivers/media/i2c/imx334.c
899
dev_err(imx334->dev, "failed to configure lanes\n");
drivers/media/i2c/imx334.c
903
ret = imx334_set_framefmt(imx334);
drivers/media/i2c/imx334.c
905
dev_err(imx334->dev, "%s failed to set frame format: %d\n",
drivers/media/i2c/imx334.c
911
ret = __v4l2_ctrl_handler_setup(imx334->sd.ctrl_handler);
drivers/media/i2c/imx334.c
913
dev_err(imx334->dev, "fail to setup handler\n");
drivers/media/i2c/imx334.c
918
ret = cci_write(imx334->cci, IMX334_REG_MODE_SELECT,
drivers/media/i2c/imx334.c
921
dev_err(imx334->dev, "fail to start streaming\n");
drivers/media/i2c/imx334.c
928
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
945
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
948
ret = cci_write(imx334->cci, IMX334_REG_MODE_SELECT,
drivers/media/i2c/imx334.c
951
dev_err(imx334->dev, "%s failed to stop stream\n", __func__);
drivers/media/i2c/imx334.c
953
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
964
static int imx334_detect(struct imx334 *imx334)
drivers/media/i2c/imx334.c
969
ret = cci_read(imx334->cci, IMX334_REG_ID, &val, NULL);
drivers/media/i2c/imx334.c
974
dev_err(imx334->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx334.c
988
static int imx334_parse_hw_config(struct imx334 *imx334)
drivers/media/i2c/imx334.c
990
struct fwnode_handle *fwnode = dev_fwnode(imx334->dev);