drivers/media/i2c/imx290.c
1002
ret = imx290_set_register_array(imx290, imx290_global_init_settings,
drivers/media/i2c/imx290.c
1005
dev_err(imx290->dev, "Could not set init registers\n");
drivers/media/i2c/imx290.c
1010
ret = imx290_set_register_array(imx290, imx290->model->init_regs,
drivers/media/i2c/imx290.c
1011
imx290->model->init_regs_num);
drivers/media/i2c/imx290.c
1013
dev_err(imx290->dev, "Could not set model specific init registers\n");
drivers/media/i2c/imx290.c
1018
ret = imx290_set_clock(imx290);
drivers/media/i2c/imx290.c
1020
dev_err(imx290->dev, "Could not set clocks - %d\n", ret);
drivers/media/i2c/imx290.c
1025
ret = imx290_set_data_lanes(imx290);
drivers/media/i2c/imx290.c
1027
dev_err(imx290->dev, "Could not set data lanes - %d\n", ret);
drivers/media/i2c/imx290.c
1031
ret = imx290_set_csi_config(imx290);
drivers/media/i2c/imx290.c
1033
dev_err(imx290->dev, "Could not set csi cfg - %d\n", ret);
drivers/media/i2c/imx290.c
1039
ret = imx290_setup_format(imx290, format);
drivers/media/i2c/imx290.c
1041
dev_err(imx290->dev, "Could not set frame format - %d\n", ret);
drivers/media/i2c/imx290.c
1046
ret = imx290_set_register_array(imx290, imx290->current_mode->data,
drivers/media/i2c/imx290.c
1047
imx290->current_mode->data_size);
drivers/media/i2c/imx290.c
1049
dev_err(imx290->dev, "Could not set current mode - %d\n", ret);
drivers/media/i2c/imx290.c
1054
ret = __v4l2_ctrl_handler_setup(imx290->sd.ctrl_handler);
drivers/media/i2c/imx290.c
1056
dev_err(imx290->dev, "Could not sync v4l2 controls - %d\n", ret);
drivers/media/i2c/imx290.c
1060
cci_write(imx290->regmap, IMX290_STANDBY, 0x00, &ret);
drivers/media/i2c/imx290.c
1065
return cci_write(imx290->regmap, IMX290_XMSTA, 0x00, &ret);
drivers/media/i2c/imx290.c
1069
static int imx290_stop_streaming(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1073
cci_write(imx290->regmap, IMX290_STANDBY, 0x01, &ret);
drivers/media/i2c/imx290.c
1077
return cci_write(imx290->regmap, IMX290_XMSTA, 0x01, &ret);
drivers/media/i2c/imx290.c
1082
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1089
ret = pm_runtime_resume_and_get(imx290->dev);
drivers/media/i2c/imx290.c
1093
ret = imx290_start_streaming(imx290, state);
drivers/media/i2c/imx290.c
1095
dev_err(imx290->dev, "Start stream failed\n");
drivers/media/i2c/imx290.c
1096
pm_runtime_put_sync(imx290->dev);
drivers/media/i2c/imx290.c
1100
imx290_stop_streaming(imx290);
drivers/media/i2c/imx290.c
1101
pm_runtime_put_autosuspend(imx290->dev);
drivers/media/i2c/imx290.c
1108
__v4l2_ctrl_grab(imx290->vflip, enable);
drivers/media/i2c/imx290.c
1109
__v4l2_ctrl_grab(imx290->hflip, enable);
drivers/media/i2c/imx290.c
1120
const struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1125
code->code = imx290_formats[code->index].code[imx290->model->colour_variant];
drivers/media/i2c/imx290.c
1134
const struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1135
const struct imx290_mode *imx290_modes = imx290_modes_ptr(imx290);
drivers/media/i2c/imx290.c
1137
if (!imx290_format_info(imx290, fse->code))
drivers/media/i2c/imx290.c
1140
if (fse->index >= imx290_modes_num(imx290))
drivers/media/i2c/imx290.c
1155
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1159
mode = v4l2_find_nearest_size(imx290_modes_ptr(imx290),
drivers/media/i2c/imx290.c
1160
imx290_modes_num(imx290), width, height,
drivers/media/i2c/imx290.c
1166
if (!imx290_format_info(imx290, fmt->format.code))
drivers/media/i2c/imx290.c
1167
fmt->format.code = imx290_formats[0].code[imx290->model->colour_variant];
drivers/media/i2c/imx290.c
1178
imx290->current_mode = mode;
drivers/media/i2c/imx290.c
1180
imx290_ctrl_update(imx290, mode);
drivers/media/i2c/imx290.c
1181
imx290_exposure_update(imx290, mode);
drivers/media/i2c/imx290.c
1193
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1206
+ imx290->vflip->val;
drivers/media/i2c/imx290.c
1209
+ imx290->hflip->val;
drivers/media/i2c/imx290.c
1279
static int imx290_subdev_init(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1281
struct i2c_client *client = to_i2c_client(imx290->dev);
drivers/media/i2c/imx290.c
1285
imx290->current_mode = &imx290_modes_ptr(imx290)[0];
drivers/media/i2c/imx290.c
1294
v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
drivers/media/i2c/imx290.c
1295
pm_runtime_put_autosuspend(imx290->dev);
drivers/media/i2c/imx290.c
1297
imx290->sd.internal_ops = &imx290_internal_ops;
drivers/media/i2c/imx290.c
1298
imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx290.c
1299
imx290->sd.entity.ops = &imx290_subdev_entity_ops;
drivers/media/i2c/imx290.c
1300
imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx290.c
1302
imx290->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx290.c
1303
ret = media_entity_pads_init(&imx290->sd.entity, 1, &imx290->pad);
drivers/media/i2c/imx290.c
1305
dev_err(imx290->dev, "Could not register media entity\n");
drivers/media/i2c/imx290.c
1309
ret = imx290_ctrl_init(imx290);
drivers/media/i2c/imx290.c
1311
dev_err(imx290->dev, "Control initialization error %d\n", ret);
drivers/media/i2c/imx290.c
1315
imx290->sd.state_lock = imx290->ctrls.lock;
drivers/media/i2c/imx290.c
1317
ret = v4l2_subdev_init_finalize(&imx290->sd);
drivers/media/i2c/imx290.c
1319
dev_err(imx290->dev, "subdev initialization error %d\n", ret);
drivers/media/i2c/imx290.c
1323
state = v4l2_subdev_lock_and_get_active_state(&imx290->sd);
drivers/media/i2c/imx290.c
1324
imx290_ctrl_update(imx290, imx290->current_mode);
drivers/media/i2c/imx290.c
1330
v4l2_ctrl_handler_free(&imx290->ctrls);
drivers/media/i2c/imx290.c
1332
media_entity_cleanup(&imx290->sd.entity);
drivers/media/i2c/imx290.c
1336
static void imx290_subdev_cleanup(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1338
v4l2_subdev_cleanup(&imx290->sd);
drivers/media/i2c/imx290.c
1339
media_entity_cleanup(&imx290->sd.entity);
drivers/media/i2c/imx290.c
1340
v4l2_ctrl_handler_free(&imx290->ctrls);
drivers/media/i2c/imx290.c
1347
static int imx290_power_on(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1351
ret = clk_prepare_enable(imx290->xclk);
drivers/media/i2c/imx290.c
1353
dev_err(imx290->dev, "Failed to enable clock\n");
drivers/media/i2c/imx290.c
1357
ret = regulator_bulk_enable(ARRAY_SIZE(imx290->supplies),
drivers/media/i2c/imx290.c
1358
imx290->supplies);
drivers/media/i2c/imx290.c
1360
dev_err(imx290->dev, "Failed to enable regulators\n");
drivers/media/i2c/imx290.c
1361
clk_disable_unprepare(imx290->xclk);
drivers/media/i2c/imx290.c
1366
gpiod_set_value_cansleep(imx290->rst_gpio, 0);
drivers/media/i2c/imx290.c
1372
static void imx290_power_off(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1374
clk_disable_unprepare(imx290->xclk);
drivers/media/i2c/imx290.c
1375
gpiod_set_value_cansleep(imx290->rst_gpio, 1);
drivers/media/i2c/imx290.c
1376
regulator_bulk_disable(ARRAY_SIZE(imx290->supplies), imx290->supplies);
drivers/media/i2c/imx290.c
1382
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1384
return imx290_power_on(imx290);
drivers/media/i2c/imx290.c
1390
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1392
imx290_power_off(imx290);
drivers/media/i2c/imx290.c
1411
static int imx290_get_regulators(struct device *dev, struct imx290 *imx290)
drivers/media/i2c/imx290.c
1415
for (i = 0; i < ARRAY_SIZE(imx290->supplies); i++)
drivers/media/i2c/imx290.c
1416
imx290->supplies[i].supply = imx290_supply_name[i];
drivers/media/i2c/imx290.c
1418
return devm_regulator_bulk_get(dev, ARRAY_SIZE(imx290->supplies),
drivers/media/i2c/imx290.c
1419
imx290->supplies);
drivers/media/i2c/imx290.c
1422
static int imx290_init_clk(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1426
imx290->xclk = devm_v4l2_sensor_clk_get_legacy(imx290->dev, "xclk",
drivers/media/i2c/imx290.c
1428
if (IS_ERR(imx290->xclk))
drivers/media/i2c/imx290.c
1429
return dev_err_probe(imx290->dev, PTR_ERR(imx290->xclk),
drivers/media/i2c/imx290.c
1432
xclk_freq = clk_get_rate(imx290->xclk);
drivers/media/i2c/imx290.c
1437
imx290->xclk_idx = IMX290_CLK_37_125;
drivers/media/i2c/imx290.c
1440
imx290->xclk_idx = IMX290_CLK_74_25;
drivers/media/i2c/imx290.c
1443
dev_err(imx290->dev, "External clock frequency %u is not supported\n",
drivers/media/i2c/imx290.c
1456
static s64 imx290_check_link_freqs(const struct imx290 *imx290,
drivers/media/i2c/imx290.c
1460
const s64 *freqs = imx290_link_freqs_ptr(imx290);
drivers/media/i2c/imx290.c
1461
int freqs_count = imx290_link_freqs_num(imx290);
drivers/media/i2c/imx290.c
1511
static int imx290_parse_dt(struct imx290 *imx290)
drivers/media/i2c/imx290.c
1521
imx290->model = of_device_get_match_data(imx290->dev);
drivers/media/i2c/imx290.c
1523
endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx290->dev), NULL);
drivers/media/i2c/imx290.c
1525
dev_err(imx290->dev, "Endpoint node not found\n");
drivers/media/i2c/imx290.c
1532
dev_err(imx290->dev, "Unsupported bus type, should be CSI2\n");
drivers/media/i2c/imx290.c
1535
dev_err(imx290->dev, "Parsing endpoint node failed\n");
drivers/media/i2c/imx290.c
1540
imx290->nlanes = ep.bus.mipi_csi2.num_data_lanes;
drivers/media/i2c/imx290.c
1541
if (imx290->nlanes != 2 && imx290->nlanes != 4) {
drivers/media/i2c/imx290.c
1542
dev_err(imx290->dev, "Invalid data lanes: %d\n", imx290->nlanes);
drivers/media/i2c/imx290.c
1547
dev_dbg(imx290->dev, "Using %u data lanes\n", imx290->nlanes);
drivers/media/i2c/imx290.c
1550
dev_err(imx290->dev, "link-frequency property not found in DT\n");
drivers/media/i2c/imx290.c
1556
fq = imx290_check_link_freqs(imx290, &ep);
drivers/media/i2c/imx290.c
1558
dev_err(imx290->dev, "Link frequency of %lld is not supported\n",
drivers/media/i2c/imx290.c
1574
struct imx290 *imx290;
drivers/media/i2c/imx290.c
1577
imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL);
drivers/media/i2c/imx290.c
1578
if (!imx290)
drivers/media/i2c/imx290.c
1581
imx290->dev = dev;
drivers/media/i2c/imx290.c
1582
imx290->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx290.c
1583
if (IS_ERR(imx290->regmap)) {
drivers/media/i2c/imx290.c
1588
ret = imx290_parse_dt(imx290);
drivers/media/i2c/imx290.c
1593
ret = imx290_get_regulators(dev, imx290);
drivers/media/i2c/imx290.c
1597
imx290->rst_gpio = devm_gpiod_get_optional(dev, "reset",
drivers/media/i2c/imx290.c
1599
if (IS_ERR(imx290->rst_gpio))
drivers/media/i2c/imx290.c
1600
return dev_err_probe(dev, PTR_ERR(imx290->rst_gpio),
drivers/media/i2c/imx290.c
1604
ret = imx290_init_clk(imx290);
drivers/media/i2c/imx290.c
1613
ret = imx290_power_on(imx290);
drivers/media/i2c/imx290.c
1634
ret = imx290_stop_streaming(imx290);
drivers/media/i2c/imx290.c
1641
ret = imx290_subdev_init(imx290);
drivers/media/i2c/imx290.c
1645
v4l2_i2c_subdev_set_name(&imx290->sd, client,
drivers/media/i2c/imx290.c
1646
imx290->model->name, NULL);
drivers/media/i2c/imx290.c
1653
ret = v4l2_async_register_subdev(&imx290->sd);
drivers/media/i2c/imx290.c
1662
imx290_subdev_cleanup(imx290);
drivers/media/i2c/imx290.c
1666
imx290_power_off(imx290);
drivers/media/i2c/imx290.c
1673
struct imx290 *imx290 = to_imx290(sd);
drivers/media/i2c/imx290.c
1676
imx290_subdev_cleanup(imx290);
drivers/media/i2c/imx290.c
1682
pm_runtime_disable(imx290->dev);
drivers/media/i2c/imx290.c
1683
if (!pm_runtime_status_suspended(imx290->dev))
drivers/media/i2c/imx290.c
1684
imx290_power_off(imx290);
drivers/media/i2c/imx290.c
1685
pm_runtime_set_suspended(imx290->dev);
drivers/media/i2c/imx290.c
256
static inline struct imx290 *to_imx290(struct v4l2_subdev *_sd)
drivers/media/i2c/imx290.c
258
return container_of(_sd, struct imx290, sd);
drivers/media/i2c/imx290.c
487
static inline const s64 *imx290_link_freqs_ptr(const struct imx290 *imx290)
drivers/media/i2c/imx290.c
489
if (imx290->nlanes == 2)
drivers/media/i2c/imx290.c
495
static inline int imx290_link_freqs_num(const struct imx290 *imx290)
drivers/media/i2c/imx290.c
497
if (imx290->nlanes == 2)
drivers/media/i2c/imx290.c
596
static inline const struct imx290_mode *imx290_modes_ptr(const struct imx290 *imx290)
drivers/media/i2c/imx290.c
598
if (imx290->nlanes == 2)
drivers/media/i2c/imx290.c
604
static inline int imx290_modes_num(const struct imx290 *imx290)
drivers/media/i2c/imx290.c
606
if (imx290->nlanes == 2)
drivers/media/i2c/imx290.c
640
imx290_format_info(const struct imx290 *imx290, u32 code)
drivers/media/i2c/imx290.c
647
if (info->code[imx290->model->colour_variant] == code)
drivers/media/i2c/imx290.c
654
static int imx290_set_register_array(struct imx290 *imx290,
drivers/media/i2c/imx290.c
660
ret = cci_multi_reg_write(imx290->regmap, settings, num_settings, NULL);
drivers/media/i2c/imx290.c
670
static int imx290_set_clock(struct imx290 *imx290)
drivers/media/i2c/imx290.c
672
const struct imx290_mode *mode = imx290->current_mode;
drivers/media/i2c/imx290.c
673
enum imx290_clk_freq clk_idx = imx290->xclk_idx;
drivers/media/i2c/imx290.c
677
ret = imx290_set_register_array(imx290, xclk_regs[clk_idx],
drivers/media/i2c/imx290.c
680
cci_write(imx290->regmap, IMX290_INCKSEL1, clk_cfg->incksel1, &ret);
drivers/media/i2c/imx290.c
681
cci_write(imx290->regmap, IMX290_INCKSEL2, clk_cfg->incksel2, &ret);
drivers/media/i2c/imx290.c
682
cci_write(imx290->regmap, IMX290_INCKSEL3, clk_cfg->incksel3, &ret);
drivers/media/i2c/imx290.c
683
cci_write(imx290->regmap, IMX290_INCKSEL4, clk_cfg->incksel4, &ret);
drivers/media/i2c/imx290.c
684
cci_write(imx290->regmap, IMX290_INCKSEL5, clk_cfg->incksel5, &ret);
drivers/media/i2c/imx290.c
685
cci_write(imx290->regmap, IMX290_INCKSEL6, clk_cfg->incksel6, &ret);
drivers/media/i2c/imx290.c
690
static int imx290_set_data_lanes(struct imx290 *imx290)
drivers/media/i2c/imx290.c
694
cci_write(imx290->regmap, IMX290_PHY_LANE_NUM, imx290->nlanes - 1,
drivers/media/i2c/imx290.c
696
cci_write(imx290->regmap, IMX290_CSI_LANE_MODE, imx290->nlanes - 1,
drivers/media/i2c/imx290.c
698
cci_write(imx290->regmap, IMX290_FR_FDG_SEL, 0x01, &ret);
drivers/media/i2c/imx290.c
703
static int imx290_set_black_level(struct imx290 *imx290,
drivers/media/i2c/imx290.c
707
unsigned int bpp = imx290_format_info(imx290, format->code)->bpp;
drivers/media/i2c/imx290.c
709
return cci_write(imx290->regmap, IMX290_BLKLEVEL,
drivers/media/i2c/imx290.c
713
static int imx290_set_csi_config(struct imx290 *imx290)
drivers/media/i2c/imx290.c
715
const s64 *link_freqs = imx290_link_freqs_ptr(imx290);
drivers/media/i2c/imx290.c
719
switch (link_freqs[imx290->current_mode->link_freq_index]) {
drivers/media/i2c/imx290.c
736
cci_write(imx290->regmap, IMX290_REPETITION, csi_cfg->repetition, &ret);
drivers/media/i2c/imx290.c
737
cci_write(imx290->regmap, IMX290_TCLKPOST, csi_cfg->tclkpost, &ret);
drivers/media/i2c/imx290.c
738
cci_write(imx290->regmap, IMX290_THSZERO, csi_cfg->thszero, &ret);
drivers/media/i2c/imx290.c
739
cci_write(imx290->regmap, IMX290_THSPREPARE, csi_cfg->thsprepare, &ret);
drivers/media/i2c/imx290.c
740
cci_write(imx290->regmap, IMX290_TCLKTRAIL, csi_cfg->tclktrail, &ret);
drivers/media/i2c/imx290.c
741
cci_write(imx290->regmap, IMX290_THSTRAIL, csi_cfg->thstrail, &ret);
drivers/media/i2c/imx290.c
742
cci_write(imx290->regmap, IMX290_TCLKZERO, csi_cfg->tclkzero, &ret);
drivers/media/i2c/imx290.c
743
cci_write(imx290->regmap, IMX290_TCLKPREPARE, csi_cfg->tclkprepare,
drivers/media/i2c/imx290.c
745
cci_write(imx290->regmap, IMX290_TLPX, csi_cfg->tlpx, &ret);
drivers/media/i2c/imx290.c
750
static int imx290_setup_format(struct imx290 *imx290,
drivers/media/i2c/imx290.c
756
info = imx290_format_info(imx290, format->code);
drivers/media/i2c/imx290.c
758
ret = imx290_set_register_array(imx290, info->regs, info->num_regs);
drivers/media/i2c/imx290.c
760
dev_err(imx290->dev, "Could not set format registers\n");
drivers/media/i2c/imx290.c
764
return imx290_set_black_level(imx290, format,
drivers/media/i2c/imx290.c
771
static void imx290_exposure_update(struct imx290 *imx290,
drivers/media/i2c/imx290.c
776
exposure_max = imx290->vblank->val + mode->height -
drivers/media/i2c/imx290.c
778
__v4l2_ctrl_modify_range(imx290->exposure, 1, exposure_max, 1,
drivers/media/i2c/imx290.c
784
struct imx290 *imx290 = container_of(ctrl->handler,
drivers/media/i2c/imx290.c
785
struct imx290, ctrls);
drivers/media/i2c/imx290.c
799
imx290_exposure_update(imx290, imx290->current_mode);
drivers/media/i2c/imx290.c
803
if (!pm_runtime_get_if_in_use(imx290->dev))
drivers/media/i2c/imx290.c
806
state = v4l2_subdev_get_locked_active_state(&imx290->sd);
drivers/media/i2c/imx290.c
811
ret = cci_write(imx290->regmap, IMX290_GAIN, ctrl->val, NULL);
drivers/media/i2c/imx290.c
815
ret = cci_write(imx290->regmap, IMX290_VMAX,
drivers/media/i2c/imx290.c
816
ctrl->val + imx290->current_mode->height, NULL);
drivers/media/i2c/imx290.c
824
ctrl = imx290->exposure;
drivers/media/i2c/imx290.c
827
vmax = imx290->vblank->val + imx290->current_mode->height;
drivers/media/i2c/imx290.c
828
ret = cci_write(imx290->regmap, IMX290_SHS1,
drivers/media/i2c/imx290.c
834
imx290_set_black_level(imx290, format, 0, &ret);
drivers/media/i2c/imx290.c
836
cci_write(imx290->regmap, IMX290_PGCTRL,
drivers/media/i2c/imx290.c
841
cci_write(imx290->regmap, IMX290_PGCTRL, 0x00, &ret);
drivers/media/i2c/imx290.c
843
imx290_set_black_level(imx290, format,
drivers/media/i2c/imx290.c
849
ret = cci_write(imx290->regmap, IMX290_HMAX,
drivers/media/i2c/imx290.c
850
ctrl->val + imx290->current_mode->width, NULL);
drivers/media/i2c/imx290.c
858
reg = imx290->current_mode->ctrl_07;
drivers/media/i2c/imx290.c
859
if (imx290->hflip->val)
drivers/media/i2c/imx290.c
861
if (imx290->vflip->val)
drivers/media/i2c/imx290.c
863
ret = cci_write(imx290->regmap, IMX290_CTRL_07, reg, NULL);
drivers/media/i2c/imx290.c
872
pm_runtime_put_autosuspend(imx290->dev);
drivers/media/i2c/imx290.c
892
static void imx290_ctrl_update(struct imx290 *imx290,
drivers/media/i2c/imx290.c
900
__v4l2_ctrl_s_ctrl(imx290->link_freq, mode->link_freq_index);
drivers/media/i2c/imx290.c
902
__v4l2_ctrl_modify_range(imx290->hblank, hblank_min, hblank_max, 1,
drivers/media/i2c/imx290.c
904
__v4l2_ctrl_modify_range(imx290->vblank, vblank_min, vblank_max, 1,
drivers/media/i2c/imx290.c
908
static int imx290_ctrl_init(struct imx290 *imx290)
drivers/media/i2c/imx290.c
913
ret = v4l2_fwnode_device_parse(imx290->dev, &props);
drivers/media/i2c/imx290.c
917
v4l2_ctrl_handler_init(&imx290->ctrls, 11);
drivers/media/i2c/imx290.c
927
v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
929
imx290->model->max_analog_gain, 1, 0);
drivers/media/i2c/imx290.c
935
imx290->exposure = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
944
imx290->link_freq =
drivers/media/i2c/imx290.c
945
v4l2_ctrl_new_int_menu(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
947
imx290_link_freqs_num(imx290) - 1, 0,
drivers/media/i2c/imx290.c
948
imx290_link_freqs_ptr(imx290));
drivers/media/i2c/imx290.c
949
if (imx290->link_freq)
drivers/media/i2c/imx290.c
950
imx290->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx290.c
952
v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, V4L2_CID_PIXEL_RATE,
drivers/media/i2c/imx290.c
956
v4l2_ctrl_new_std_menu_items(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
964
imx290->hblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
967
imx290->vblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
970
imx290->hflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
972
imx290->vflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
974
v4l2_ctrl_cluster(2, &imx290->hflip);
drivers/media/i2c/imx290.c
976
v4l2_ctrl_new_fwnode_properties(&imx290->ctrls, &imx290_ctrl_ops,
drivers/media/i2c/imx290.c
979
imx290->sd.ctrl_handler = &imx290->ctrls;
drivers/media/i2c/imx290.c
981
if (imx290->ctrls.error) {
drivers/media/i2c/imx290.c
982
ret = imx290->ctrls.error;
drivers/media/i2c/imx290.c
983
v4l2_ctrl_handler_free(&imx290->ctrls);
drivers/media/i2c/imx290.c
995
static int imx290_start_streaming(struct imx290 *imx290,