drivers/media/i2c/imx335.c
1004
cci_write(imx335->cci, IMX335_REG_ADBIT, 0x00, &ret);
drivers/media/i2c/imx335.c
1005
cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x1ff, &ret);
drivers/media/i2c/imx335.c
1007
cci_write(imx335->cci, IMX335_REG_ADBIT, 0x01, &ret);
drivers/media/i2c/imx335.c
1008
cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x47, &ret);
drivers/media/i2c/imx335.c
1027
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1031
ret = pm_runtime_resume_and_get(imx335->dev);
drivers/media/i2c/imx335.c
1036
reg_list = &link_freq_reglist[__ffs(imx335->link_freq_bitmap)];
drivers/media/i2c/imx335.c
1037
ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
drivers/media/i2c/imx335.c
1040
dev_err(imx335->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/imx335.c
1045
reg_list = &imx335->cur_mode->reg_list;
drivers/media/i2c/imx335.c
1046
ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
drivers/media/i2c/imx335.c
1049
dev_err(imx335->dev, "fail to write initial registers\n");
drivers/media/i2c/imx335.c
1054
ret = cci_multi_reg_write(imx335->cci, imx335_common_regs,
drivers/media/i2c/imx335.c
1057
dev_err(imx335->dev, "fail to write initial registers\n");
drivers/media/i2c/imx335.c
1061
ret = imx335_set_framefmt(imx335);
drivers/media/i2c/imx335.c
1063
dev_err(imx335->dev, "%s failed to set frame format: %d\n",
drivers/media/i2c/imx335.c
1069
ret = cci_write(imx335->cci, IMX335_REG_LANEMODE,
drivers/media/i2c/imx335.c
1070
imx335->lane_mode, NULL);
drivers/media/i2c/imx335.c
1075
ret = __v4l2_ctrl_handler_setup(imx335->sd.ctrl_handler);
drivers/media/i2c/imx335.c
1077
dev_err(imx335->dev, "fail to setup handler\n");
drivers/media/i2c/imx335.c
1082
ret = cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
drivers/media/i2c/imx335.c
1085
dev_err(imx335->dev, "fail to start streaming\n");
drivers/media/i2c/imx335.c
1095
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
1113
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1116
ret = cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
drivers/media/i2c/imx335.c
1118
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
1129
static int imx335_detect(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1134
ret = cci_read(imx335->cci, IMX335_REG_ID, &val, NULL);
drivers/media/i2c/imx335.c
1139
dev_err(imx335->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx335.c
1153
static int imx335_parse_hw_config(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1155
struct fwnode_handle *fwnode = dev_fwnode(imx335->dev);
drivers/media/i2c/imx335.c
1168
imx335->reset_gpio = devm_gpiod_get_optional(imx335->dev, "reset",
drivers/media/i2c/imx335.c
1170
if (IS_ERR(imx335->reset_gpio)) {
drivers/media/i2c/imx335.c
1171
dev_err(imx335->dev, "failed to get reset gpio %pe\n",
drivers/media/i2c/imx335.c
1172
imx335->reset_gpio);
drivers/media/i2c/imx335.c
1173
return PTR_ERR(imx335->reset_gpio);
drivers/media/i2c/imx335.c
1177
imx335->supplies[i].supply = imx335_supply_name[i];
drivers/media/i2c/imx335.c
1179
ret = devm_regulator_bulk_get(imx335->dev,
drivers/media/i2c/imx335.c
1181
imx335->supplies);
drivers/media/i2c/imx335.c
1183
dev_err(imx335->dev, "Failed to get regulators\n");
drivers/media/i2c/imx335.c
1188
imx335->inclk = devm_v4l2_sensor_clk_get(imx335->dev, NULL);
drivers/media/i2c/imx335.c
1189
if (IS_ERR(imx335->inclk))
drivers/media/i2c/imx335.c
1190
return dev_err_probe(imx335->dev, PTR_ERR(imx335->inclk),
drivers/media/i2c/imx335.c
1193
rate = clk_get_rate(imx335->inclk);
drivers/media/i2c/imx335.c
1195
dev_err(imx335->dev, "inclk frequency mismatch\n");
drivers/media/i2c/imx335.c
1201
dev_err(imx335->dev, "Failed to get next endpoint\n");
drivers/media/i2c/imx335.c
1212
imx335->lane_mode = IMX335_2LANE;
drivers/media/i2c/imx335.c
1215
imx335->lane_mode = IMX335_4LANE;
drivers/media/i2c/imx335.c
1218
dev_err(imx335->dev,
drivers/media/i2c/imx335.c
1225
ret = v4l2_link_freq_to_bitmap(imx335->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx335.c
1228
&imx335->link_freq_bitmap);
drivers/media/i2c/imx335.c
1270
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1274
imx335->supplies);
drivers/media/i2c/imx335.c
1283
gpiod_set_value_cansleep(imx335->reset_gpio, 0);
drivers/media/i2c/imx335.c
1285
ret = clk_prepare_enable(imx335->inclk);
drivers/media/i2c/imx335.c
1287
dev_err(imx335->dev, "fail to enable inclk\n");
drivers/media/i2c/imx335.c
1296
gpiod_set_value_cansleep(imx335->reset_gpio, 1);
drivers/media/i2c/imx335.c
1297
regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
drivers/media/i2c/imx335.c
1311
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
1313
gpiod_set_value_cansleep(imx335->reset_gpio, 1);
drivers/media/i2c/imx335.c
1314
clk_disable_unprepare(imx335->inclk);
drivers/media/i2c/imx335.c
1315
regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
drivers/media/i2c/imx335.c
1326
static int imx335_init_controls(struct imx335 *imx335)
drivers/media/i2c/imx335.c
1328
struct v4l2_ctrl_handler *ctrl_hdlr = &imx335->ctrl_handler;
drivers/media/i2c/imx335.c
1329
const struct imx335_mode *mode = imx335->cur_mode;
drivers/media/i2c/imx335.c
1334
ret = v4l2_fwnode_device_parse(imx335->dev, &props);
drivers/media/i2c/imx335.c
1348
imx335->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1364
imx335->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1372
v4l2_ctrl_cluster(2, &imx335->exp_ctrl);
drivers/media/i2c/imx335.c
1374
imx335->vflip = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1378
if (imx335->vflip)
drivers/media/i2c/imx335.c
1379
imx335->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx335.c
1381
imx335->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1395
imx335->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1401
imx335->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx335.c
1404
__fls(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
1405
__ffs(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
1407
if (imx335->link_freq_ctrl)
drivers/media/i2c/imx335.c
1408
imx335->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx335.c
1410
imx335->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/imx335.c
1416
if (imx335->hblank_ctrl)
drivers/media/i2c/imx335.c
1417
imx335->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx335.c
1422
dev_err(imx335->dev, "control init failed: %d\n",
drivers/media/i2c/imx335.c
1428
imx335->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx335.c
1441
struct imx335 *imx335;
drivers/media/i2c/imx335.c
1444
imx335 = devm_kzalloc(&client->dev, sizeof(*imx335), GFP_KERNEL);
drivers/media/i2c/imx335.c
1445
if (!imx335)
drivers/media/i2c/imx335.c
1448
imx335->dev = &client->dev;
drivers/media/i2c/imx335.c
1449
imx335->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx335.c
1450
if (IS_ERR(imx335->cci)) {
drivers/media/i2c/imx335.c
1451
dev_err(imx335->dev, "Unable to initialize I2C\n");
drivers/media/i2c/imx335.c
1456
v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
drivers/media/i2c/imx335.c
1457
imx335->sd.internal_ops = &imx335_internal_ops;
drivers/media/i2c/imx335.c
1459
ret = imx335_parse_hw_config(imx335);
drivers/media/i2c/imx335.c
1461
dev_err(imx335->dev, "HW configuration is not supported\n");
drivers/media/i2c/imx335.c
1465
ret = imx335_power_on(imx335->dev);
drivers/media/i2c/imx335.c
1467
dev_err(imx335->dev, "failed to power-on the sensor\n");
drivers/media/i2c/imx335.c
1472
ret = imx335_detect(imx335);
drivers/media/i2c/imx335.c
1474
dev_err(imx335->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/imx335.c
1479
imx335->cur_mode = &supported_modes[0];
drivers/media/i2c/imx335.c
1480
imx335->cur_mbus_code = imx335_mbus_codes[0];
drivers/media/i2c/imx335.c
1481
imx335->vblank = imx335->cur_mode->vblank;
drivers/media/i2c/imx335.c
1483
ret = imx335_init_controls(imx335);
drivers/media/i2c/imx335.c
1485
dev_err(imx335->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/imx335.c
1490
imx335->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx335.c
1491
imx335->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx335.c
1494
imx335->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx335.c
1495
ret = media_entity_pads_init(&imx335->sd.entity, 1, &imx335->pad);
drivers/media/i2c/imx335.c
1497
dev_err(imx335->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx335.c
1501
imx335->sd.state_lock = imx335->ctrl_handler.lock;
drivers/media/i2c/imx335.c
1502
ret = v4l2_subdev_init_finalize(&imx335->sd);
drivers/media/i2c/imx335.c
1504
dev_err(imx335->dev, "subdev init error\n");
drivers/media/i2c/imx335.c
1508
ret = v4l2_async_register_subdev_sensor(&imx335->sd);
drivers/media/i2c/imx335.c
1510
dev_err(imx335->dev,
drivers/media/i2c/imx335.c
1515
pm_runtime_set_active(imx335->dev);
drivers/media/i2c/imx335.c
1516
pm_runtime_enable(imx335->dev);
drivers/media/i2c/imx335.c
1517
pm_runtime_idle(imx335->dev);
drivers/media/i2c/imx335.c
1522
v4l2_subdev_cleanup(&imx335->sd);
drivers/media/i2c/imx335.c
1524
media_entity_cleanup(&imx335->sd.entity);
drivers/media/i2c/imx335.c
1526
v4l2_ctrl_handler_free(imx335->sd.ctrl_handler);
drivers/media/i2c/imx335.c
1528
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
715
struct imx335 *imx335 =
drivers/media/i2c/imx335.c
716
container_of(ctrl->handler, struct imx335, ctrl_handler);
drivers/media/i2c/imx335.c
726
imx335->vblank = imx335->vblank_ctrl->val;
drivers/media/i2c/imx335.c
727
lpfr = imx335->vblank + imx335->cur_mode->height;
drivers/media/i2c/imx335.c
729
dev_dbg(imx335->dev, "Received vblank %u, new lpfr %u\n",
drivers/media/i2c/imx335.c
730
imx335->vblank, lpfr);
drivers/media/i2c/imx335.c
732
if (imx335->cur_mode->scan_mode == IMX335_2_2_BINNING)
drivers/media/i2c/imx335.c
735
ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl,
drivers/media/i2c/imx335.c
747
if (pm_runtime_get_if_in_use(imx335->dev) == 0)
drivers/media/i2c/imx335.c
752
exposure = imx335->exp_ctrl->val;
drivers/media/i2c/imx335.c
753
analog_gain = imx335->again_ctrl->val;
drivers/media/i2c/imx335.c
755
ret = imx335_update_exp_gain(imx335, exposure, analog_gain);
drivers/media/i2c/imx335.c
760
analog_gain = imx335->again_ctrl->val;
drivers/media/i2c/imx335.c
762
dev_dbg(imx335->dev, "Received exp %u, analog gain %u\n",
drivers/media/i2c/imx335.c
765
ret = imx335_update_exp_gain(imx335, exposure, analog_gain);
drivers/media/i2c/imx335.c
769
ret = imx335_update_vertical_flip(imx335, ctrl->val);
drivers/media/i2c/imx335.c
773
ret = imx335_update_test_pattern(imx335, ctrl->val);
drivers/media/i2c/imx335.c
777
dev_err(imx335->dev, "Invalid control %d\n", ctrl->id);
drivers/media/i2c/imx335.c
781
pm_runtime_put(imx335->dev);
drivers/media/i2c/imx335.c
791
static int imx335_get_format_code(struct imx335 *imx335, u32 code)
drivers/media/i2c/imx335.c
835
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
841
code = imx335_get_format_code(imx335, fsize->code);
drivers/media/i2c/imx335.c
860
static void imx335_fill_pad_format(struct imx335 *imx335,
drivers/media/i2c/imx335.c
866
fmt->format.code = imx335->cur_mbus_code;
drivers/media/i2c/imx335.c
886
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
899
imx335->cur_mbus_code = imx335_mbus_codes[i];
drivers/media/i2c/imx335.c
902
imx335_fill_pad_format(imx335, mode, fmt);
drivers/media/i2c/imx335.c
918
ret = imx335_update_controls(imx335, mode);
drivers/media/i2c/imx335.c
920
imx335->cur_mode = mode;
drivers/media/i2c/imx335.c
936
struct imx335 *imx335 = to_imx335(sd);
drivers/media/i2c/imx335.c
940
imx335_fill_pad_format(imx335, &supported_modes[0], &fmt);
drivers/media/i2c/imx335.c
942
__v4l2_ctrl_modify_range(imx335->link_freq_ctrl, 0,
drivers/media/i2c/imx335.c
943
__fls(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
944
~(imx335->link_freq_bitmap),
drivers/media/i2c/imx335.c
945
__ffs(imx335->link_freq_bitmap));
drivers/media/i2c/imx335.c
981
static int imx335_set_framefmt(struct imx335 *imx335)
drivers/media/i2c/imx335.c
992
u8 bpp = imx335->cur_mbus_code == MEDIA_BUS_FMT_SRGGB10_1X10 ? 10 : 12;
drivers/media/i2c/imx335.c
996
cci_write(imx335->cci, IMX335_REG_MDBIT, bpp == 12, &ret);
drivers/media/i2c/imx335.c
999
if (imx335->cur_mode->scan_mode == IMX335_2_2_BINNING)