Symbol: imx214
drivers/media/i2c/imx214.c
1000
ret = v4l2_fwnode_device_parse(imx214->dev, &props);
drivers/media/i2c/imx214.c
1004
ctrl_hdlr = &imx214->ctrls;
drivers/media/i2c/imx214.c
1005
ret = v4l2_ctrl_handler_init(&imx214->ctrls, 13);
drivers/media/i2c/imx214.c
1009
imx214->pixel_rate =
drivers/media/i2c/imx214.c
1013
imx214->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, NULL,
drivers/media/i2c/imx214.c
1015
imx214->bus_cfg.nr_of_link_frequencies - 1,
drivers/media/i2c/imx214.c
1016
0, imx214->bus_cfg.link_frequencies);
drivers/media/i2c/imx214.c
1030
imx214->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
drivers/media/i2c/imx214.c
1036
imx214->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
drivers/media/i2c/imx214.c
1041
imx214->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
drivers/media/i2c/imx214.c
1056
imx214->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
drivers/media/i2c/imx214.c
1059
imx214->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
drivers/media/i2c/imx214.c
1062
v4l2_ctrl_cluster(2, &imx214->hflip);
drivers/media/i2c/imx214.c
1084
imx214->unit_size = v4l2_ctrl_new_std_compound(ctrl_hdlr,
drivers/media/i2c/imx214.c
1096
dev_err(imx214->dev, "failed to add controls: %d\n", ret);
drivers/media/i2c/imx214.c
1101
imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx214.c
1102
imx214->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx214.c
1103
imx214->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx214.c
1104
imx214->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx214.c
1106
ret = imx214_pll_update(imx214);
drivers/media/i2c/imx214.c
1109
dev_err(imx214->dev, "failed to update PLL\n");
drivers/media/i2c/imx214.c
1113
imx214->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx214.c
1118
static int imx214_start_streaming(struct imx214 *imx214)
drivers/media/i2c/imx214.c
1126
ret = cci_multi_reg_write(imx214->regmap, mode_table_common,
drivers/media/i2c/imx214.c
1129
dev_err(imx214->dev, "could not sent common table %d\n", ret);
drivers/media/i2c/imx214.c
1133
ret = imx214_configure_pll(imx214);
drivers/media/i2c/imx214.c
1135
dev_err(imx214->dev, "failed to configure PLL: %d\n", ret);
drivers/media/i2c/imx214.c
1139
bit_rate_mbps = imx214->pll.pixel_rate_csi / 1000000
drivers/media/i2c/imx214.c
1140
* imx214->pll.bits_per_pixel;
drivers/media/i2c/imx214.c
1141
ret = cci_write(imx214->regmap, IMX214_REG_REQ_LINK_BIT_RATE,
drivers/media/i2c/imx214.c
1144
dev_err(imx214->dev, "failed to configure link bit rate\n");
drivers/media/i2c/imx214.c
1148
ret = cci_write(imx214->regmap, IMX214_REG_CSI_LANE_MODE,
drivers/media/i2c/imx214.c
1151
dev_err(imx214->dev, "failed to configure lanes\n");
drivers/media/i2c/imx214.c
1155
state = v4l2_subdev_get_locked_active_state(&imx214->sd);
drivers/media/i2c/imx214.c
1159
ret = cci_multi_reg_write(imx214->regmap, mode->reg_table,
drivers/media/i2c/imx214.c
1162
dev_err(imx214->dev, "could not sent mode table %d\n", ret);
drivers/media/i2c/imx214.c
1168
cci_write(imx214->regmap, IMX214_REG_TEMP_SENSOR_CONTROL, 0x01, NULL);
drivers/media/i2c/imx214.c
1170
ret = __v4l2_ctrl_handler_setup(&imx214->ctrls);
drivers/media/i2c/imx214.c
1172
dev_err(imx214->dev, "could not sync v4l2 controls\n");
drivers/media/i2c/imx214.c
1175
ret = cci_write(imx214->regmap, IMX214_REG_MODE_SELECT,
drivers/media/i2c/imx214.c
1178
dev_err(imx214->dev, "could not sent start table %d\n", ret);
drivers/media/i2c/imx214.c
1183
static int imx214_stop_streaming(struct imx214 *imx214)
drivers/media/i2c/imx214.c
1187
ret = cci_write(imx214->regmap, IMX214_REG_MODE_SELECT,
drivers/media/i2c/imx214.c
1190
dev_err(imx214->dev, "could not sent stop table %d\n", ret);
drivers/media/i2c/imx214.c
1197
struct imx214 *imx214 = to_imx214(subdev);
drivers/media/i2c/imx214.c
1202
ret = pm_runtime_resume_and_get(imx214->dev);
drivers/media/i2c/imx214.c
1207
ret = imx214_start_streaming(imx214);
drivers/media/i2c/imx214.c
1212
ret = imx214_stop_streaming(imx214);
drivers/media/i2c/imx214.c
1215
pm_runtime_put(imx214->dev);
drivers/media/i2c/imx214.c
1221
pm_runtime_put(imx214->dev);
drivers/media/i2c/imx214.c
1253
struct imx214 *imx214 = to_imx214(subdev);
drivers/media/i2c/imx214.c
1256
dev_warn_once(imx214->dev, "frame_interval functions return an unreliable value for compatibility reasons. Use the VBLANK and HBLANK controls to determine the correct frame rate.\n");
drivers/media/i2c/imx214.c
1265
fie->code = imx214_get_format_code(imx214);
drivers/media/i2c/imx214.c
1299
static int imx214_get_regulators(struct device *dev, struct imx214 *imx214)
drivers/media/i2c/imx214.c
1304
imx214->supplies[i].supply = imx214_supply_name[i];
drivers/media/i2c/imx214.c
1307
imx214->supplies);
drivers/media/i2c/imx214.c
1311
static int imx214_identify_module(struct imx214 *imx214)
drivers/media/i2c/imx214.c
1313
struct i2c_client *client = v4l2_get_subdevdata(&imx214->sd);
drivers/media/i2c/imx214.c
1317
ret = cci_read(imx214->regmap, IMX214_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/imx214.c
1331
static int imx214_parse_fwnode(struct imx214 *imx214)
drivers/media/i2c/imx214.c
1334
struct v4l2_fwnode_endpoint *bus_cfg = &imx214->bus_cfg;
drivers/media/i2c/imx214.c
1335
struct device *dev = imx214->dev;
drivers/media/i2c/imx214.c
1370
if (!imx214_pll_calculate(imx214, &pll, freq))
drivers/media/i2c/imx214.c
1383
v4l2_fwnode_endpoint_free(&imx214->bus_cfg);
drivers/media/i2c/imx214.c
1390
struct imx214 *imx214;
drivers/media/i2c/imx214.c
1393
imx214 = devm_kzalloc(dev, sizeof(*imx214), GFP_KERNEL);
drivers/media/i2c/imx214.c
1394
if (!imx214)
drivers/media/i2c/imx214.c
1397
imx214->dev = dev;
drivers/media/i2c/imx214.c
1399
imx214->xclk = devm_v4l2_sensor_clk_get(dev, NULL);
drivers/media/i2c/imx214.c
1400
if (IS_ERR(imx214->xclk))
drivers/media/i2c/imx214.c
1401
return dev_err_probe(dev, PTR_ERR(imx214->xclk),
drivers/media/i2c/imx214.c
1404
ret = imx214_get_regulators(dev, imx214);
drivers/media/i2c/imx214.c
1408
imx214->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
drivers/media/i2c/imx214.c
1409
if (IS_ERR(imx214->enable_gpio))
drivers/media/i2c/imx214.c
1410
return dev_err_probe(dev, PTR_ERR(imx214->enable_gpio),
drivers/media/i2c/imx214.c
1413
imx214->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx214.c
1414
if (IS_ERR(imx214->regmap))
drivers/media/i2c/imx214.c
1415
return dev_err_probe(dev, PTR_ERR(imx214->regmap),
drivers/media/i2c/imx214.c
1418
ret = imx214_parse_fwnode(imx214);
drivers/media/i2c/imx214.c
1422
v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
drivers/media/i2c/imx214.c
1423
imx214->sd.internal_ops = &imx214_internal_ops;
drivers/media/i2c/imx214.c
1429
ret = imx214_power_on(imx214->dev);
drivers/media/i2c/imx214.c
1433
ret = imx214_identify_module(imx214);
drivers/media/i2c/imx214.c
1437
ret = imx214_ctrls_init(imx214);
drivers/media/i2c/imx214.c
1441
imx214->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx214.c
1442
imx214->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx214.c
1443
imx214->sd.dev = &client->dev;
drivers/media/i2c/imx214.c
1444
imx214->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx214.c
1446
ret = media_entity_pads_init(&imx214->sd.entity, 1, &imx214->pad);
drivers/media/i2c/imx214.c
1452
imx214->sd.state_lock = imx214->ctrls.lock;
drivers/media/i2c/imx214.c
1453
ret = v4l2_subdev_init_finalize(&imx214->sd);
drivers/media/i2c/imx214.c
1459
pm_runtime_set_active(imx214->dev);
drivers/media/i2c/imx214.c
1460
pm_runtime_enable(imx214->dev);
drivers/media/i2c/imx214.c
1462
ret = v4l2_async_register_subdev_sensor(&imx214->sd);
drivers/media/i2c/imx214.c
1469
pm_runtime_idle(imx214->dev);
drivers/media/i2c/imx214.c
1474
pm_runtime_disable(imx214->dev);
drivers/media/i2c/imx214.c
1476
v4l2_subdev_cleanup(&imx214->sd);
drivers/media/i2c/imx214.c
1479
media_entity_cleanup(&imx214->sd.entity);
drivers/media/i2c/imx214.c
1482
v4l2_ctrl_handler_free(&imx214->ctrls);
drivers/media/i2c/imx214.c
1485
imx214_power_off(imx214->dev);
drivers/media/i2c/imx214.c
1488
v4l2_fwnode_endpoint_free(&imx214->bus_cfg);
drivers/media/i2c/imx214.c
1496
struct imx214 *imx214 = to_imx214(sd);
drivers/media/i2c/imx214.c
1498
v4l2_async_unregister_subdev(&imx214->sd);
drivers/media/i2c/imx214.c
1500
media_entity_cleanup(&imx214->sd.entity);
drivers/media/i2c/imx214.c
1501
v4l2_ctrl_handler_free(&imx214->ctrls);
drivers/media/i2c/imx214.c
1502
v4l2_fwnode_endpoint_free(&imx214->bus_cfg);
drivers/media/i2c/imx214.c
1506
imx214_power_off(imx214->dev);
drivers/media/i2c/imx214.c
524
static inline struct imx214 *to_imx214(struct v4l2_subdev *sd)
drivers/media/i2c/imx214.c
526
return container_of(sd, struct imx214, sd);
drivers/media/i2c/imx214.c
533
struct imx214 *imx214 = to_imx214(sd);
drivers/media/i2c/imx214.c
536
ret = regulator_bulk_enable(IMX214_NUM_SUPPLIES, imx214->supplies);
drivers/media/i2c/imx214.c
538
dev_err(imx214->dev, "failed to enable regulators: %d\n", ret);
drivers/media/i2c/imx214.c
544
ret = clk_prepare_enable(imx214->xclk);
drivers/media/i2c/imx214.c
546
regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
drivers/media/i2c/imx214.c
547
dev_err(imx214->dev, "clk prepare enable failed\n");
drivers/media/i2c/imx214.c
551
gpiod_set_value_cansleep(imx214->enable_gpio, 1);
drivers/media/i2c/imx214.c
561
struct imx214 *imx214 = to_imx214(sd);
drivers/media/i2c/imx214.c
563
gpiod_set_value_cansleep(imx214->enable_gpio, 0);
drivers/media/i2c/imx214.c
565
clk_disable_unprepare(imx214->xclk);
drivers/media/i2c/imx214.c
567
regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
drivers/media/i2c/imx214.c
574
static u32 imx214_get_format_code(struct imx214 *imx214)
drivers/media/i2c/imx214.c
578
i = (imx214->vflip->val ? 2 : 0) | (imx214->hflip->val ? 1 : 0);
drivers/media/i2c/imx214.c
583
static void imx214_update_pad_format(struct imx214 *imx214,
drivers/media/i2c/imx214.c
587
fmt->code = imx214_get_format_code(imx214);
drivers/media/i2c/imx214.c
603
struct imx214 *imx214 = to_imx214(sd);
drivers/media/i2c/imx214.c
608
code->code = imx214_get_format_code(imx214);
drivers/media/i2c/imx214.c
617
struct imx214 *imx214 = to_imx214(subdev);
drivers/media/i2c/imx214.c
620
code = imx214_get_format_code(imx214);
drivers/media/i2c/imx214.c
637
struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
drivers/media/i2c/imx214.c
639
return regmap_write(imx214->regmap, reg->reg, reg->val);
drivers/media/i2c/imx214.c
645
struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
drivers/media/i2c/imx214.c
650
ret = regmap_read(imx214->regmap, reg->reg, &aux);
drivers/media/i2c/imx214.c
668
struct imx214 *imx214 = to_imx214(sd);
drivers/media/i2c/imx214.c
678
imx214_update_pad_format(imx214, mode, &format->format,
drivers/media/i2c/imx214.c
694
__v4l2_ctrl_modify_range(imx214->vblank, IMX214_VBLANK_MIN,
drivers/media/i2c/imx214.c
701
__v4l2_ctrl_modify_range(imx214->exposure,
drivers/media/i2c/imx214.c
702
imx214->exposure->minimum,
drivers/media/i2c/imx214.c
703
exposure_max, imx214->exposure->step,
drivers/media/i2c/imx214.c
712
__v4l2_ctrl_modify_range(imx214->hblank, hblank, hblank, 1,
drivers/media/i2c/imx214.c
762
static int imx214_configure_pll(struct imx214 *imx214)
drivers/media/i2c/imx214.c
766
cci_write(imx214->regmap, IMX214_REG_VTPXCK_DIV,
drivers/media/i2c/imx214.c
767
imx214->pll.vt_bk.pix_clk_div, &ret);
drivers/media/i2c/imx214.c
768
cci_write(imx214->regmap, IMX214_REG_VTSYCK_DIV,
drivers/media/i2c/imx214.c
769
imx214->pll.vt_bk.sys_clk_div, &ret);
drivers/media/i2c/imx214.c
770
cci_write(imx214->regmap, IMX214_REG_PREPLLCK_VT_DIV,
drivers/media/i2c/imx214.c
771
imx214->pll.vt_fr.pre_pll_clk_div, &ret);
drivers/media/i2c/imx214.c
772
cci_write(imx214->regmap, IMX214_REG_PLL_VT_MPY,
drivers/media/i2c/imx214.c
773
imx214->pll.vt_fr.pll_multiplier, &ret);
drivers/media/i2c/imx214.c
774
cci_write(imx214->regmap, IMX214_REG_OPPXCK_DIV,
drivers/media/i2c/imx214.c
775
imx214->pll.op_bk.pix_clk_div, &ret);
drivers/media/i2c/imx214.c
776
cci_write(imx214->regmap, IMX214_REG_OPSYCK_DIV,
drivers/media/i2c/imx214.c
777
imx214->pll.op_bk.sys_clk_div, &ret);
drivers/media/i2c/imx214.c
778
cci_write(imx214->regmap, IMX214_REG_PLL_MULT_DRIV,
drivers/media/i2c/imx214.c
780
cci_write(imx214->regmap, IMX214_REG_EXCK_FREQ,
drivers/media/i2c/imx214.c
781
IMX214_EXCK_FREQ(imx214->pll.ext_clk_freq_hz / 1000000), &ret);
drivers/media/i2c/imx214.c
786
static int imx214_update_digital_gain(struct imx214 *imx214, u32 val)
drivers/media/i2c/imx214.c
790
cci_write(imx214->regmap, IMX214_REG_DIG_GAIN_GREENR, val, &ret);
drivers/media/i2c/imx214.c
791
cci_write(imx214->regmap, IMX214_REG_DIG_GAIN_RED, val, &ret);
drivers/media/i2c/imx214.c
792
cci_write(imx214->regmap, IMX214_REG_DIG_GAIN_BLUE, val, &ret);
drivers/media/i2c/imx214.c
793
cci_write(imx214->regmap, IMX214_REG_DIG_GAIN_GREENB, val, &ret);
drivers/media/i2c/imx214.c
800
struct imx214 *imx214 = container_of(ctrl->handler,
drivers/media/i2c/imx214.c
801
struct imx214, ctrls);
drivers/media/i2c/imx214.c
809
state = v4l2_subdev_get_locked_active_state(&imx214->sd);
drivers/media/i2c/imx214.c
816
__v4l2_ctrl_modify_range(imx214->exposure,
drivers/media/i2c/imx214.c
817
imx214->exposure->minimum,
drivers/media/i2c/imx214.c
818
exposure_max, imx214->exposure->step,
drivers/media/i2c/imx214.c
826
if (!pm_runtime_get_if_in_use(imx214->dev))
drivers/media/i2c/imx214.c
831
cci_write(imx214->regmap, IMX214_REG_ANALOG_GAIN,
drivers/media/i2c/imx214.c
833
cci_write(imx214->regmap, IMX214_REG_SHORT_ANALOG_GAIN,
drivers/media/i2c/imx214.c
837
ret = imx214_update_digital_gain(imx214, ctrl->val);
drivers/media/i2c/imx214.c
840
cci_write(imx214->regmap, IMX214_REG_EXPOSURE, ctrl->val, &ret);
drivers/media/i2c/imx214.c
844
cci_write(imx214->regmap, IMX214_REG_ORIENTATION,
drivers/media/i2c/imx214.c
845
imx214->hflip->val | imx214->vflip->val << 1, &ret);
drivers/media/i2c/imx214.c
848
cci_write(imx214->regmap, IMX214_REG_FRM_LENGTH_LINES,
drivers/media/i2c/imx214.c
852
cci_write(imx214->regmap, IMX214_REG_TEST_PATTERN,
drivers/media/i2c/imx214.c
856
cci_write(imx214->regmap, IMX214_REG_TESTP_RED,
drivers/media/i2c/imx214.c
860
cci_write(imx214->regmap, IMX214_REG_TESTP_GREENR,
drivers/media/i2c/imx214.c
864
cci_write(imx214->regmap, IMX214_REG_TESTP_BLUE,
drivers/media/i2c/imx214.c
868
cci_write(imx214->regmap, IMX214_REG_TESTP_GREENB,
drivers/media/i2c/imx214.c
875
pm_runtime_put(imx214->dev);
drivers/media/i2c/imx214.c
884
static int imx214_pll_calculate(struct imx214 *imx214, struct ccs_pll *pll,
drivers/media/i2c/imx214.c
923
unsigned int num_lanes = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes;
drivers/media/i2c/imx214.c
960
pll->ext_clk_freq_hz = clk_get_rate(imx214->xclk);
drivers/media/i2c/imx214.c
962
return ccs_pll_calculate(imx214->dev, &limits, pll);
drivers/media/i2c/imx214.c
965
static int imx214_pll_update(struct imx214 *imx214)
drivers/media/i2c/imx214.c
970
link_freq = imx214->bus_cfg.link_frequencies[imx214->link_freq->val];
drivers/media/i2c/imx214.c
971
ret = imx214_pll_calculate(imx214, &imx214->pll, link_freq);
drivers/media/i2c/imx214.c
973
dev_err(imx214->dev, "PLL calculations failed: %d\n", ret);
drivers/media/i2c/imx214.c
977
ret = v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate,
drivers/media/i2c/imx214.c
978
imx214->pll.pixel_rate_pixel_array);
drivers/media/i2c/imx214.c
980
dev_err(imx214->dev, "failed to set pixel rate\n");
drivers/media/i2c/imx214.c
987
static int imx214_ctrls_init(struct imx214 *imx214)