Symbol: imx335
drivers/media/i2c/imx335.c
1001
ret = imx335_set_framefmt(imx335);
drivers/media/i2c/imx335.c
1003
dev_err(imx335->dev, "%s failed to set frame format: %d\n",
drivers/media/i2c/imx335.c
1009
ret = cci_write(imx335->cci, IMX335_REG_LANEMODE,
drivers/media/i2c/imx335.c
1010
imx335->lane_mode, NULL);
drivers/media/i2c/imx335.c
1015
ret = __v4l2_ctrl_handler_setup(imx335->sd.ctrl_handler);
drivers/media/i2c/imx335.c
1017
dev_err(imx335->dev, "fail to setup handler\n");
drivers/media/i2c/imx335.c
1022
ret = cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
drivers/media/i2c/imx335.c
1025
dev_err(imx335->dev, "fail to start streaming\n");
drivers/media/i2c/imx335.c
1035
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
1044
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1047
ret = cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
drivers/media/i2c/imx335.c
1049
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
1060
static int imx335_detect(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1065
ret = cci_read(imx335->cci, IMX335_REG_ID, &val, NULL);
drivers/media/i2c/imx335.c
1070
dev_err(imx335->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx335.c
1084
static int imx335_parse_hw_config(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1086
struct fwnode_handle *fwnode = dev_fwnode(imx335->dev);
drivers/media/i2c/imx335.c
1099
imx335->reset_gpio = devm_gpiod_get_optional(imx335->dev, "reset",
drivers/media/i2c/imx335.c
1101
if (IS_ERR(imx335->reset_gpio)) {
drivers/media/i2c/imx335.c
1102
dev_err(imx335->dev, "failed to get reset gpio %pe\n",
drivers/media/i2c/imx335.c
1103
imx335->reset_gpio);
drivers/media/i2c/imx335.c
1104
return PTR_ERR(imx335->reset_gpio);
drivers/media/i2c/imx335.c
1108
imx335->supplies[i].supply = imx335_supply_name[i];
drivers/media/i2c/imx335.c
1110
ret = devm_regulator_bulk_get(imx335->dev,
drivers/media/i2c/imx335.c
1112
imx335->supplies);
drivers/media/i2c/imx335.c
1114
dev_err(imx335->dev, "Failed to get regulators\n");
drivers/media/i2c/imx335.c
1119
imx335->inclk = devm_v4l2_sensor_clk_get(imx335->dev, NULL);
drivers/media/i2c/imx335.c
1120
if (IS_ERR(imx335->inclk))
drivers/media/i2c/imx335.c
1121
return dev_err_probe(imx335->dev, PTR_ERR(imx335->inclk),
drivers/media/i2c/imx335.c
1124
rate = clk_get_rate(imx335->inclk);
drivers/media/i2c/imx335.c
1126
dev_err(imx335->dev, "inclk frequency mismatch\n");
drivers/media/i2c/imx335.c
1132
dev_err(imx335->dev, "Failed to get next endpoint\n");
drivers/media/i2c/imx335.c
1143
imx335->lane_mode = IMX335_2LANE;
drivers/media/i2c/imx335.c
1146
imx335->lane_mode = IMX335_4LANE;
drivers/media/i2c/imx335.c
1149
dev_err(imx335->dev,
drivers/media/i2c/imx335.c
1156
ret = v4l2_link_freq_to_bitmap(imx335->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx335.c
1159
&imx335->link_freq_bitmap);
drivers/media/i2c/imx335.c
1201
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1205
imx335->supplies);
drivers/media/i2c/imx335.c
1214
gpiod_set_value_cansleep(imx335->reset_gpio, 0);
drivers/media/i2c/imx335.c
1216
ret = clk_prepare_enable(imx335->inclk);
drivers/media/i2c/imx335.c
1218
dev_err(imx335->dev, "fail to enable inclk\n");
drivers/media/i2c/imx335.c
1227
gpiod_set_value_cansleep(imx335->reset_gpio, 1);
drivers/media/i2c/imx335.c
1228
regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
drivers/media/i2c/imx335.c
1236
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1238
gpiod_set_value_cansleep(imx335->reset_gpio, 1);
drivers/media/i2c/imx335.c
1239
clk_disable_unprepare(imx335->inclk);
drivers/media/i2c/imx335.c
1240
regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
drivers/media/i2c/imx335.c
1251
static int imx335_init_controls(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1253
struct v4l2_ctrl_handler *ctrl_hdlr = &imx335->ctrl_handler;
drivers/media/i2c/imx335.c
1254
const struct imx335_mode *mode = imx335->cur_mode;
drivers/media/i2c/imx335.c
1259
ret = v4l2_fwnode_device_parse(imx335->dev, &props);
drivers/media/i2c/imx335.c
1273
imx335->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1289
imx335->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1297
v4l2_ctrl_cluster(2, &imx335->exp_ctrl);
drivers/media/i2c/imx335.c
1299
imx335->vflip = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1303
if (imx335->vflip)
drivers/media/i2c/imx335.c
1304
imx335->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx335.c
1306
imx335->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1320
imx335->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1326
imx335->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx335.c
1329
__fls(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
1330
__ffs(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
1332
if (imx335->link_freq_ctrl)
drivers/media/i2c/imx335.c
1333
imx335->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx335.c
1335
imx335->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1341
if (imx335->hblank_ctrl)
drivers/media/i2c/imx335.c
1342
imx335->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx335.c
1347
dev_err(imx335->dev, "control init failed: %d\n",
drivers/media/i2c/imx335.c
1353
imx335->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx335.c
1360
struct imx335 *imx335;
drivers/media/i2c/imx335.c
1363
imx335 = devm_kzalloc(&client->dev, sizeof(*imx335), GFP_KERNEL);
drivers/media/i2c/imx335.c
1364
if (!imx335)
drivers/media/i2c/imx335.c
1367
imx335->dev = &client->dev;
drivers/media/i2c/imx335.c
1368
imx335->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx335.c
1369
if (IS_ERR(imx335->cci)) {
drivers/media/i2c/imx335.c
1370
dev_err(imx335->dev, "Unable to initialize I2C\n");
drivers/media/i2c/imx335.c
1375
v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
drivers/media/i2c/imx335.c
1376
imx335->sd.internal_ops = &imx335_internal_ops;
drivers/media/i2c/imx335.c
1378
ret = imx335_parse_hw_config(imx335);
drivers/media/i2c/imx335.c
1380
dev_err(imx335->dev, "HW configuration is not supported\n");
drivers/media/i2c/imx335.c
1384
ret = imx335_power_on(imx335->dev);
drivers/media/i2c/imx335.c
1386
dev_err(imx335->dev, "failed to power-on the sensor\n");
drivers/media/i2c/imx335.c
1391
ret = imx335_detect(imx335);
drivers/media/i2c/imx335.c
1393
dev_err(imx335->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx335.c
1398
imx335->cur_mode = &supported_modes[0];
drivers/media/i2c/imx335.c
1399
imx335->cur_mbus_code = imx335_mbus_codes[0];
drivers/media/i2c/imx335.c
1400
imx335->vblank = imx335->cur_mode->vblank;
drivers/media/i2c/imx335.c
1402
ret = imx335_init_controls(imx335);
drivers/media/i2c/imx335.c
1404
dev_err(imx335->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx335.c
1409
imx335->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx335.c
1410
imx335->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx335.c
1413
imx335->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx335.c
1414
ret = media_entity_pads_init(&imx335->sd.entity, 1, &imx335->pad);
drivers/media/i2c/imx335.c
1416
dev_err(imx335->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx335.c
1420
imx335->sd.state_lock = imx335->ctrl_handler.lock;
drivers/media/i2c/imx335.c
1421
ret = v4l2_subdev_init_finalize(&imx335->sd);
drivers/media/i2c/imx335.c
1423
dev_err(imx335->dev, "subdev init error\n");
drivers/media/i2c/imx335.c
1427
ret = v4l2_async_register_subdev_sensor(&imx335->sd);
drivers/media/i2c/imx335.c
1429
dev_err(imx335->dev,
drivers/media/i2c/imx335.c
1434
pm_runtime_set_active(imx335->dev);
drivers/media/i2c/imx335.c
1435
pm_runtime_enable(imx335->dev);
drivers/media/i2c/imx335.c
1436
pm_runtime_idle(imx335->dev);
drivers/media/i2c/imx335.c
1441
v4l2_subdev_cleanup(&imx335->sd);
drivers/media/i2c/imx335.c
1443
media_entity_cleanup(&imx335->sd.entity);
drivers/media/i2c/imx335.c
1445
v4l2_ctrl_handler_free(imx335->sd.ctrl_handler);
drivers/media/i2c/imx335.c
1447
imx335_power_off(imx335->dev);
drivers/media/i2c/imx335.c
583
static inline struct imx335 *to_imx335(struct v4l2_subdev *subdev)
drivers/media/i2c/imx335.c
585
return container_of(subdev, struct imx335, sd);
drivers/media/i2c/imx335.c
595
static int imx335_update_controls(struct imx335 *imx335,
drivers/media/i2c/imx335.c
600
ret = __v4l2_ctrl_s_ctrl(imx335->link_freq_ctrl,
drivers/media/i2c/imx335.c
601
__ffs(imx335->link_freq_bitmap));
drivers/media/i2c/imx335.c
605
ret = __v4l2_ctrl_modify_range(imx335->hblank_ctrl, mode->hblank,
drivers/media/i2c/imx335.c
610
return __v4l2_ctrl_modify_range(imx335->vblank_ctrl, mode->vblank_min,
drivers/media/i2c/imx335.c
622
static int imx335_update_exp_gain(struct imx335 *imx335, u32 exposure, u32 gain)
drivers/media/i2c/imx335.c
628
lpfr = imx335->vblank + imx335->cur_mode->height;
drivers/media/i2c/imx335.c
631
dev_dbg(imx335->dev, "Set exp %u, analog gain %u, shutter %u, lpfr %u\n",
drivers/media/i2c/imx335.c
634
cci_write(imx335->cci, IMX335_REG_HOLD, 1, &ret);
drivers/media/i2c/imx335.c
635
cci_write(imx335->cci, IMX335_REG_VMAX, lpfr, &ret);
drivers/media/i2c/imx335.c
636
cci_write(imx335->cci, IMX335_REG_SHUTTER, shutter, &ret);
drivers/media/i2c/imx335.c
637
cci_write(imx335->cci, IMX335_REG_GAIN, gain, &ret);
drivers/media/i2c/imx335.c
642
ret_hold = cci_write(imx335->cci, IMX335_REG_HOLD, 0, NULL);
drivers/media/i2c/imx335.c
649
static int imx335_update_vertical_flip(struct imx335 *imx335, u32 vflip)
drivers/media/i2c/imx335.c
652
vflip ? &imx335->cur_mode->vflip_inverted :
drivers/media/i2c/imx335.c
653
&imx335->cur_mode->vflip_normal;
drivers/media/i2c/imx335.c
656
cci_multi_reg_write(imx335->cci, vflip_regs->regs,
drivers/media/i2c/imx335.c
659
return cci_write(imx335->cci, IMX335_REG_VREVERSE, vflip, &ret);
drivers/media/i2c/imx335.c
662
static int imx335_update_test_pattern(struct imx335 *imx335, u32 pattern_index)
drivers/media/i2c/imx335.c
679
cci_write(imx335->cci, IMX335_REG_TPG,
drivers/media/i2c/imx335.c
682
cci_multi_reg_write(imx335->cci, tpg_enable_regs,
drivers/media/i2c/imx335.c
694
cci_multi_reg_write(imx335->cci, tpg_disable_regs,
drivers/media/i2c/imx335.c
703
struct imx335 *imx335 =
drivers/media/i2c/imx335.c
704
container_of(ctrl->handler, struct imx335, ctrl_handler);
drivers/media/i2c/imx335.c
714
imx335->vblank = imx335->vblank_ctrl->val;
drivers/media/i2c/imx335.c
715
lpfr = imx335->vblank + imx335->cur_mode->height;
drivers/media/i2c/imx335.c
717
dev_dbg(imx335->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx335.c
718
imx335->vblank, lpfr);
drivers/media/i2c/imx335.c
720
if (imx335->cur_mode->scan_mode == IMX335_2_2_BINNING)
drivers/media/i2c/imx335.c
723
ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl,
drivers/media/i2c/imx335.c
735
if (pm_runtime_get_if_in_use(imx335->dev) == 0)
drivers/media/i2c/imx335.c
740
exposure = imx335->exp_ctrl->val;
drivers/media/i2c/imx335.c
741
analog_gain = imx335->again_ctrl->val;
drivers/media/i2c/imx335.c
743
ret = imx335_update_exp_gain(imx335, exposure, analog_gain);
drivers/media/i2c/imx335.c
748
analog_gain = imx335->again_ctrl->val;
drivers/media/i2c/imx335.c
750
dev_dbg(imx335->dev, "Received exp %u, analog gain %u\n",
drivers/media/i2c/imx335.c
753
ret = imx335_update_exp_gain(imx335, exposure, analog_gain);
drivers/media/i2c/imx335.c
757
ret = imx335_update_vertical_flip(imx335, ctrl->val);
drivers/media/i2c/imx335.c
761
ret = imx335_update_test_pattern(imx335, ctrl->val);
drivers/media/i2c/imx335.c
765
dev_err(imx335->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx335.c
769
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
779
static int imx335_get_format_code(struct imx335 *imx335, u32 code)
drivers/media/i2c/imx335.c
807
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
813
code = imx335_get_format_code(imx335, fsize->code);
drivers/media/i2c/imx335.c
832
static void imx335_fill_pad_format(struct imx335 *imx335,
drivers/media/i2c/imx335.c
838
fmt->format.code = imx335->cur_mbus_code;
drivers/media/i2c/imx335.c
850
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
863
imx335->cur_mbus_code = imx335_mbus_codes[i];
drivers/media/i2c/imx335.c
866
imx335_fill_pad_format(imx335, mode, fmt);
drivers/media/i2c/imx335.c
882
ret = imx335_update_controls(imx335, mode);
drivers/media/i2c/imx335.c
884
imx335->cur_mode = mode;
drivers/media/i2c/imx335.c
893
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
897
imx335_fill_pad_format(imx335, &supported_modes[0], &fmt);
drivers/media/i2c/imx335.c
899
__v4l2_ctrl_modify_range(imx335->link_freq_ctrl, 0,
drivers/media/i2c/imx335.c
900
__fls(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
901
~(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
902
__ffs(imx335->link_freq_bitmap));
drivers/media/i2c/imx335.c
930
static int imx335_set_framefmt(struct imx335 *imx335)
drivers/media/i2c/imx335.c
941
u8 bpp = imx335->cur_mbus_code == MEDIA_BUS_FMT_SRGGB10_1X10 ? 10 : 12;
drivers/media/i2c/imx335.c
945
cci_write(imx335->cci, IMX335_REG_MDBIT, bpp == 12, &ret);
drivers/media/i2c/imx335.c
948
if (imx335->cur_mode->scan_mode == IMX335_2_2_BINNING)
drivers/media/i2c/imx335.c
953
cci_write(imx335->cci, IMX335_REG_ADBIT, 0x00, &ret);
drivers/media/i2c/imx335.c
954
cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x1ff, &ret);
drivers/media/i2c/imx335.c
956
cci_write(imx335->cci, IMX335_REG_ADBIT, 0x01, &ret);
drivers/media/i2c/imx335.c
957
cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x47, &ret);
drivers/media/i2c/imx335.c
967
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
971
ret = pm_runtime_resume_and_get(imx335->dev);
drivers/media/i2c/imx335.c
976
reg_list = &link_freq_reglist[__ffs(imx335->link_freq_bitmap)];
drivers/media/i2c/imx335.c
977
ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
drivers/media/i2c/imx335.c
980
dev_err(imx335->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/imx335.c
985
reg_list = &imx335->cur_mode->reg_list;
drivers/media/i2c/imx335.c
986
ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
drivers/media/i2c/imx335.c
989
dev_err(imx335->dev, "fail to write initial registers\n");
drivers/media/i2c/imx335.c
994
ret = cci_multi_reg_write(imx335->cci, imx335_common_regs,
drivers/media/i2c/imx335.c
997
dev_err(imx335->dev, "fail to write initial registers\n");