Symbol: imx334
drivers/media/i2c/imx334.c
1004
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
1011
gpiod_set_value_cansleep(imx334->reset_gpio, 1);
drivers/media/i2c/imx334.c
1013
ret = clk_prepare_enable(imx334->inclk);
drivers/media/i2c/imx334.c
1015
dev_err(imx334->dev, "fail to enable inclk\n");
drivers/media/i2c/imx334.c
1024
gpiod_set_value_cansleep(imx334->reset_gpio, 0);
drivers/media/i2c/imx334.c
1032
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
1034
gpiod_set_value_cansleep(imx334->reset_gpio, 0);
drivers/media/i2c/imx334.c
1036
clk_disable_unprepare(imx334->inclk);
drivers/media/i2c/imx334.c
1047
static int imx334_init_controls(struct imx334 *imx334)
drivers/media/i2c/imx334.c
1049
struct v4l2_ctrl_handler *ctrl_hdlr = &imx334->ctrl_handler;
drivers/media/i2c/imx334.c
1050
const struct imx334_mode *mode = imx334->cur_mode;
drivers/media/i2c/imx334.c
1060
imx334->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1068
imx334->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1076
v4l2_ctrl_cluster(2, &imx334->exp_ctrl);
drivers/media/i2c/imx334.c
1078
imx334->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1086
imx334->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1092
imx334->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx334.c
1095
__fls(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
1096
__ffs(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
1099
if (imx334->link_freq_ctrl)
drivers/media/i2c/imx334.c
1100
imx334->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx334.c
1102
imx334->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx334.c
1108
if (imx334->hblank_ctrl)
drivers/media/i2c/imx334.c
1109
imx334->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx334.c
1117
dev_err(imx334->dev, "control init failed: %d",
drivers/media/i2c/imx334.c
1123
imx334->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx334.c
1130
struct imx334 *imx334;
drivers/media/i2c/imx334.c
1133
imx334 = devm_kzalloc(&client->dev, sizeof(*imx334), GFP_KERNEL);
drivers/media/i2c/imx334.c
1134
if (!imx334)
drivers/media/i2c/imx334.c
1137
imx334->dev = &client->dev;
drivers/media/i2c/imx334.c
1138
imx334->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx334.c
1139
if (IS_ERR(imx334->cci)) {
drivers/media/i2c/imx334.c
1140
dev_err(imx334->dev, "Unable to initialize I2C\n");
drivers/media/i2c/imx334.c
1145
v4l2_i2c_subdev_init(&imx334->sd, client, &imx334_subdev_ops);
drivers/media/i2c/imx334.c
1146
imx334->sd.internal_ops = &imx334_internal_ops;
drivers/media/i2c/imx334.c
1148
ret = imx334_parse_hw_config(imx334);
drivers/media/i2c/imx334.c
1150
return dev_err_probe(imx334->dev, ret,
drivers/media/i2c/imx334.c
1153
ret = imx334_power_on(imx334->dev);
drivers/media/i2c/imx334.c
1155
dev_err_probe(imx334->dev, ret, "failed to power-on the sensor\n");
drivers/media/i2c/imx334.c
1160
ret = imx334_detect(imx334);
drivers/media/i2c/imx334.c
1162
dev_err(imx334->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx334.c
1167
imx334->cur_mode = &supported_modes[__ffs(imx334->link_freq_bitmap)];
drivers/media/i2c/imx334.c
1168
imx334->cur_code = imx334_mbus_codes[0];
drivers/media/i2c/imx334.c
1169
imx334->vblank = imx334->cur_mode->vblank;
drivers/media/i2c/imx334.c
1171
ret = imx334_init_controls(imx334);
drivers/media/i2c/imx334.c
1173
dev_err(imx334->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx334.c
1178
imx334->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx334.c
1179
imx334->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx334.c
1182
imx334->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx334.c
1183
ret = media_entity_pads_init(&imx334->sd.entity, 1, &imx334->pad);
drivers/media/i2c/imx334.c
1185
dev_err(imx334->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx334.c
1189
imx334->sd.state_lock = imx334->ctrl_handler.lock;
drivers/media/i2c/imx334.c
1190
ret = v4l2_subdev_init_finalize(&imx334->sd);
drivers/media/i2c/imx334.c
1192
dev_err(imx334->dev, "subdev init error: %d\n", ret);
drivers/media/i2c/imx334.c
1196
pm_runtime_set_active(imx334->dev);
drivers/media/i2c/imx334.c
1197
pm_runtime_enable(imx334->dev);
drivers/media/i2c/imx334.c
1199
ret = v4l2_async_register_subdev_sensor(&imx334->sd);
drivers/media/i2c/imx334.c
1201
dev_err(imx334->dev,
drivers/media/i2c/imx334.c
1206
pm_runtime_idle(imx334->dev);
drivers/media/i2c/imx334.c
1211
v4l2_subdev_cleanup(&imx334->sd);
drivers/media/i2c/imx334.c
1212
pm_runtime_disable(imx334->dev);
drivers/media/i2c/imx334.c
1213
pm_runtime_set_suspended(imx334->dev);
drivers/media/i2c/imx334.c
1216
media_entity_cleanup(&imx334->sd.entity);
drivers/media/i2c/imx334.c
1219
v4l2_ctrl_handler_free(imx334->sd.ctrl_handler);
drivers/media/i2c/imx334.c
1222
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
571
struct imx334 *imx334 =
drivers/media/i2c/imx334.c
572
container_of(ctrl->handler, struct imx334, ctrl_handler);
drivers/media/i2c/imx334.c
578
imx334->vblank = imx334->vblank_ctrl->val;
drivers/media/i2c/imx334.c
580
dev_dbg(imx334->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx334.c
581
imx334->vblank,
drivers/media/i2c/imx334.c
582
imx334->vblank + imx334->cur_mode->height);
drivers/media/i2c/imx334.c
584
ret = __v4l2_ctrl_modify_range(imx334->exp_ctrl,
drivers/media/i2c/imx334.c
586
imx334->vblank +
drivers/media/i2c/imx334.c
587
imx334->cur_mode->height -
drivers/media/i2c/imx334.c
595
if (!pm_runtime_get_if_in_use(imx334->dev))
drivers/media/i2c/imx334.c
600
exposure = imx334->exp_ctrl->val;
drivers/media/i2c/imx334.c
601
analog_gain = imx334->again_ctrl->val;
drivers/media/i2c/imx334.c
603
ret = imx334_update_exp_gain(imx334, exposure, analog_gain);
drivers/media/i2c/imx334.c
609
analog_gain = imx334->again_ctrl->val;
drivers/media/i2c/imx334.c
611
dev_dbg(imx334->dev, "Received exp %u analog gain %u\n",
drivers/media/i2c/imx334.c
614
ret = imx334_update_exp_gain(imx334, exposure, analog_gain);
drivers/media/i2c/imx334.c
624
cci_write(imx334->cci, IMX334_TP_CLK_EN,
drivers/media/i2c/imx334.c
626
cci_write(imx334->cci, IMX334_DIG_CLP_MODE, 0x0, NULL);
drivers/media/i2c/imx334.c
627
cci_write(imx334->cci, IMX334_TPG_COLORW,
drivers/media/i2c/imx334.c
629
cci_write(imx334->cci, IMX334_REG_TP,
drivers/media/i2c/imx334.c
631
cci_write(imx334->cci, IMX334_TPG_EN_DOUT,
drivers/media/i2c/imx334.c
634
cci_write(imx334->cci, IMX334_DIG_CLP_MODE, 0x1, NULL);
drivers/media/i2c/imx334.c
635
cci_write(imx334->cci, IMX334_TP_CLK_EN,
drivers/media/i2c/imx334.c
637
cci_write(imx334->cci, IMX334_TPG_EN_DOUT,
drivers/media/i2c/imx334.c
643
dev_err(imx334->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx334.c
647
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
657
static int imx334_get_format_code(struct imx334 *imx334, u32 code)
drivers/media/i2c/imx334.c
685
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
691
code = imx334_get_format_code(imx334, fsize->code);
drivers/media/i2c/imx334.c
711
static void imx334_fill_pad_format(struct imx334 *imx334,
drivers/media/i2c/imx334.c
728
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
736
fmt->format.code = imx334->cur_code;
drivers/media/i2c/imx334.c
737
imx334_fill_pad_format(imx334, imx334->cur_mode, fmt);
drivers/media/i2c/imx334.c
747
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
756
imx334_fill_pad_format(imx334, mode, fmt);
drivers/media/i2c/imx334.c
757
fmt->format.code = imx334_get_format_code(imx334, fmt->format.code);
drivers/media/i2c/imx334.c
764
} else if (imx334->cur_mode != mode || imx334->cur_code != fmt->format.code) {
drivers/media/i2c/imx334.c
765
imx334->cur_code = fmt->format.code;
drivers/media/i2c/imx334.c
766
ret = imx334_update_controls(imx334, mode);
drivers/media/i2c/imx334.c
768
imx334->cur_mode = mode;
drivers/media/i2c/imx334.c
777
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
782
imx334_fill_pad_format(imx334, imx334->cur_mode, &fmt);
drivers/media/i2c/imx334.c
784
__v4l2_ctrl_modify_range(imx334->link_freq_ctrl, 0,
drivers/media/i2c/imx334.c
785
__fls(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
786
~(imx334->link_freq_bitmap),
drivers/media/i2c/imx334.c
787
__ffs(imx334->link_freq_bitmap));
drivers/media/i2c/imx334.c
792
static int imx334_set_framefmt(struct imx334 *imx334)
drivers/media/i2c/imx334.c
794
switch (imx334->cur_code) {
drivers/media/i2c/imx334.c
796
return cci_multi_reg_write(imx334->cci, raw10_framefmt_regs,
drivers/media/i2c/imx334.c
801
return cci_multi_reg_write(imx334->cci, raw12_framefmt_regs,
drivers/media/i2c/imx334.c
812
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
816
ret = pm_runtime_resume_and_get(imx334->dev);
drivers/media/i2c/imx334.c
820
ret = cci_multi_reg_write(imx334->cci, common_mode_regs,
drivers/media/i2c/imx334.c
823
dev_err(imx334->dev, "fail to write common registers\n");
drivers/media/i2c/imx334.c
828
reg_list = &imx334->cur_mode->reg_list;
drivers/media/i2c/imx334.c
829
ret = cci_multi_reg_write(imx334->cci, reg_list->regs,
drivers/media/i2c/imx334.c
832
dev_err(imx334->dev, "fail to write initial registers\n");
drivers/media/i2c/imx334.c
836
ret = cci_write(imx334->cci, IMX334_REG_LANEMODE,
drivers/media/i2c/imx334.c
839
dev_err(imx334->dev, "failed to configure lanes\n");
drivers/media/i2c/imx334.c
843
ret = imx334_set_framefmt(imx334);
drivers/media/i2c/imx334.c
845
dev_err(imx334->dev, "%s failed to set frame format: %d\n",
drivers/media/i2c/imx334.c
851
ret = __v4l2_ctrl_handler_setup(imx334->sd.ctrl_handler);
drivers/media/i2c/imx334.c
853
dev_err(imx334->dev, "fail to setup handler\n");
drivers/media/i2c/imx334.c
858
ret = cci_write(imx334->cci, IMX334_REG_MODE_SELECT,
drivers/media/i2c/imx334.c
861
dev_err(imx334->dev, "fail to start streaming\n");
drivers/media/i2c/imx334.c
868
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
876
struct imx334 *imx334 = to_imx334(sd);
drivers/media/i2c/imx334.c
879
ret = cci_write(imx334->cci, IMX334_REG_MODE_SELECT,
drivers/media/i2c/imx334.c
882
dev_err(imx334->dev, "%s failed to stop stream\n", __func__);
drivers/media/i2c/imx334.c
884
pm_runtime_put(imx334->dev);
drivers/media/i2c/imx334.c
895
static int imx334_detect(struct imx334 *imx334)
drivers/media/i2c/imx334.c
900
ret = cci_read(imx334->cci, IMX334_REG_ID, &val, NULL);
drivers/media/i2c/imx334.c
905
dev_err(imx334->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx334.c
919
static int imx334_parse_hw_config(struct imx334 *imx334)
drivers/media/i2c/imx334.c
921
struct fwnode_handle *fwnode = dev_fwnode(imx334->dev);
drivers/media/i2c/imx334.c
933
imx334->reset_gpio = devm_gpiod_get_optional(imx334->dev, "reset",
drivers/media/i2c/imx334.c
935
if (IS_ERR(imx334->reset_gpio))
drivers/media/i2c/imx334.c
936
return dev_err_probe(imx334->dev, PTR_ERR(imx334->reset_gpio),
drivers/media/i2c/imx334.c
940
imx334->inclk = devm_v4l2_sensor_clk_get(imx334->dev, NULL);
drivers/media/i2c/imx334.c
941
if (IS_ERR(imx334->inclk))
drivers/media/i2c/imx334.c
942
return dev_err_probe(imx334->dev, PTR_ERR(imx334->inclk),
drivers/media/i2c/imx334.c
945
rate = clk_get_rate(imx334->inclk);
drivers/media/i2c/imx334.c
947
return dev_err_probe(imx334->dev, -EINVAL,
drivers/media/i2c/imx334.c
960
dev_err(imx334->dev,
drivers/media/i2c/imx334.c
967
ret = v4l2_link_freq_to_bitmap(imx334->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx334.c
970
&imx334->link_freq_bitmap);