Symbol: imx283
drivers/media/i2c/imx283.c
1000
dev_dbg(imx283->dev, "Using clk freq %ld MHz",
drivers/media/i2c/imx283.c
1001
imx283->freq->mhz / HZ_PER_MHZ);
drivers/media/i2c/imx283.c
1004
cci_write(imx283->cci, IMX283_REG_PLSTMG08, IMX283_PLSTMG08_VAL, &ret);
drivers/media/i2c/imx283.c
1005
cci_write(imx283->cci, IMX283_REG_PLSTMG02, IMX283_PLSTMG02_VAL, &ret);
drivers/media/i2c/imx283.c
1008
cci_write(imx283->cci, IMX283_REG_STBPL, IMX283_STBPL_NORMAL, &ret);
drivers/media/i2c/imx283.c
1011
link_freq_idx = __ffs(imx283->link_freq_bitmap);
drivers/media/i2c/imx283.c
1012
cci_multi_reg_write(imx283->cci, link_freq_reglist[link_freq_idx].regs,
drivers/media/i2c/imx283.c
1020
cci_write(imx283->cci, IMX283_REG_STANDBY, IMX283_ACTIVE, &ret);
drivers/media/i2c/imx283.c
1025
cci_write(imx283->cci, IMX283_REG_CLAMP, IMX283_CLPSQRST, &ret);
drivers/media/i2c/imx283.c
1026
cci_write(imx283->cci, IMX283_REG_XMSTA, 0, &ret);
drivers/media/i2c/imx283.c
1027
cci_write(imx283->cci, IMX283_REG_SYNCDRV, IMX283_SYNCDRV_XHS_XVS, &ret);
drivers/media/i2c/imx283.c
1033
static int imx283_start_streaming(struct imx283 *imx283,
drivers/media/i2c/imx283.c
1052
ret = imx283_standby_cancel(imx283);
drivers/media/i2c/imx283.c
1054
dev_err(imx283->dev, "failed to cancel standby\n");
drivers/media/i2c/imx283.c
1063
cci_write(imx283->cci, IMX283_REG_MDSEL1, readout->mdsel1, &ret);
drivers/media/i2c/imx283.c
1064
cci_write(imx283->cci, IMX283_REG_MDSEL2, readout->mdsel2, &ret);
drivers/media/i2c/imx283.c
1065
cci_write(imx283->cci, IMX283_REG_MDSEL3,
drivers/media/i2c/imx283.c
1067
cci_write(imx283->cci, IMX283_REG_MDSEL4,
drivers/media/i2c/imx283.c
1072
cci_write(imx283->cci, IMX283_REG_MDSEL7, 0x01, &ret);
drivers/media/i2c/imx283.c
1073
cci_write(imx283->cci, IMX283_REG_MDSEL18, 0x1098, &ret);
drivers/media/i2c/imx283.c
1077
dev_err(imx283->dev, "failed to set readout\n");
drivers/media/i2c/imx283.c
1082
cci_write(imx283->cci, IMX283_REG_SVR, 0x00, &ret);
drivers/media/i2c/imx283.c
1084
dev_dbg(imx283->dev, "Mode: Size %d x %d\n", mode->width, mode->height);
drivers/media/i2c/imx283.c
1085
dev_dbg(imx283->dev, "Analogue Crop (in the mode) (%d,%d)/%ux%u\n",
drivers/media/i2c/imx283.c
1097
v_pos = imx283->vflip->val ?
drivers/media/i2c/imx283.c
1102
cci_write(imx283->cci, IMX283_REG_Y_OUT_SIZE, y_out_size, &ret);
drivers/media/i2c/imx283.c
1103
cci_write(imx283->cci, IMX283_REG_WRITE_VSIZE, write_v_size, &ret);
drivers/media/i2c/imx283.c
1104
cci_write(imx283->cci, IMX283_REG_VWIDCUT, v_widcut, &ret);
drivers/media/i2c/imx283.c
1105
cci_write(imx283->cci, IMX283_REG_VWINPOS, v_pos, &ret);
drivers/media/i2c/imx283.c
1107
cci_write(imx283->cci, IMX283_REG_OB_SIZE_V, mode->vertical_ob, &ret);
drivers/media/i2c/imx283.c
1110
cci_write(imx283->cci, IMX283_REG_HTRIMMING_START, mode->crop.left, &ret);
drivers/media/i2c/imx283.c
1111
cci_write(imx283->cci, IMX283_REG_HTRIMMING_END,
drivers/media/i2c/imx283.c
1115
cci_write(imx283->cci, IMX283_REG_EBD_X_OUT_SIZE, 0, &ret);
drivers/media/i2c/imx283.c
1118
ret = __v4l2_ctrl_handler_setup(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1127
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1133
ret = pm_runtime_get_sync(imx283->dev);
drivers/media/i2c/imx283.c
1135
pm_runtime_put_noidle(imx283->dev);
drivers/media/i2c/imx283.c
1139
ret = imx283_start_streaming(imx283, state);
drivers/media/i2c/imx283.c
1146
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1155
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1161
ret = cci_write(imx283->cci, IMX283_REG_STANDBY, IMX283_STBLOGIC, NULL);
drivers/media/i2c/imx283.c
1163
dev_err(imx283->dev, "Failed to stop stream\n");
drivers/media/i2c/imx283.c
1165
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1174
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1178
imx283->supplies);
drivers/media/i2c/imx283.c
1180
dev_err(imx283->dev, "failed to enable regulators\n");
drivers/media/i2c/imx283.c
1184
ret = clk_prepare_enable(imx283->xclk);
drivers/media/i2c/imx283.c
1186
dev_err(imx283->dev, "failed to enable clock\n");
drivers/media/i2c/imx283.c
1190
gpiod_set_value_cansleep(imx283->reset_gpio, 0);
drivers/media/i2c/imx283.c
1198
regulator_bulk_disable(ARRAY_SIZE(imx283_supply_name), imx283->supplies);
drivers/media/i2c/imx283.c
1205
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1207
gpiod_set_value_cansleep(imx283->reset_gpio, 1);
drivers/media/i2c/imx283.c
1208
regulator_bulk_disable(ARRAY_SIZE(imx283_supply_name), imx283->supplies);
drivers/media/i2c/imx283.c
1209
clk_disable_unprepare(imx283->xclk);
drivers/media/i2c/imx283.c
1214
static int imx283_get_regulators(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1219
imx283->supplies[i].supply = imx283_supply_name[i];
drivers/media/i2c/imx283.c
1221
return devm_regulator_bulk_get(imx283->dev,
drivers/media/i2c/imx283.c
1223
imx283->supplies);
drivers/media/i2c/imx283.c
1227
static int imx283_identify_module(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1232
ret = cci_read(imx283->cci, IMX283_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/imx283.c
1234
dev_err(imx283->dev, "failed to read chip id %x, with error %d\n",
drivers/media/i2c/imx283.c
1240
dev_err(imx283->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx283.c
1295
static int imx283_init_controls(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1305
ctrl_hdlr = &imx283->ctrl_handler;
drivers/media/i2c/imx283.c
1316
pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
1323
__fls(imx283->link_freq_bitmap),
drivers/media/i2c/imx283.c
1324
__ffs(imx283->link_freq_bitmap),
drivers/media/i2c/imx283.c
1330
imx283->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1339
imx283->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1343
imx283->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1358
imx283->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops, V4L2_CID_VFLIP,
drivers/media/i2c/imx283.c
1360
if (imx283->vflip)
drivers/media/i2c/imx283.c
1361
imx283->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx283.c
1370
dev_err(imx283->dev, "control init failed (%d)\n", ret);
drivers/media/i2c/imx283.c
1374
ret = v4l2_fwnode_device_parse(imx283->dev, &props);
drivers/media/i2c/imx283.c
1383
imx283->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx283.c
1385
mutex_lock(imx283->ctrl_handler.lock);
drivers/media/i2c/imx283.c
1388
imx283_set_framing_limits(imx283, mode);
drivers/media/i2c/imx283.c
1390
mutex_unlock(imx283->ctrl_handler.lock);
drivers/media/i2c/imx283.c
1400
static int imx283_parse_endpoint(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1409
fwnode = dev_fwnode(imx283->dev);
drivers/media/i2c/imx283.c
1412
dev_err(imx283->dev, "Failed to get next endpoint\n");
drivers/media/i2c/imx283.c
1422
dev_err(imx283->dev,
drivers/media/i2c/imx283.c
1429
ret = v4l2_link_freq_to_bitmap(imx283->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx283.c
1432
&imx283->link_freq_bitmap);
drivers/media/i2c/imx283.c
1442
struct imx283 *imx283;
drivers/media/i2c/imx283.c
1447
imx283 = devm_kzalloc(&client->dev, sizeof(*imx283), GFP_KERNEL);
drivers/media/i2c/imx283.c
1448
if (!imx283)
drivers/media/i2c/imx283.c
1451
imx283->dev = &client->dev;
drivers/media/i2c/imx283.c
1453
v4l2_i2c_subdev_init(&imx283->sd, client, &imx283_subdev_ops);
drivers/media/i2c/imx283.c
1455
imx283->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx283.c
1456
if (IS_ERR(imx283->cci)) {
drivers/media/i2c/imx283.c
1457
ret = PTR_ERR(imx283->cci);
drivers/media/i2c/imx283.c
1458
dev_err(imx283->dev, "failed to initialize CCI: %d\n", ret);
drivers/media/i2c/imx283.c
1463
imx283->xclk = devm_v4l2_sensor_clk_get(imx283->dev, NULL);
drivers/media/i2c/imx283.c
1464
if (IS_ERR(imx283->xclk))
drivers/media/i2c/imx283.c
1465
return dev_err_probe(imx283->dev, PTR_ERR(imx283->xclk),
drivers/media/i2c/imx283.c
1468
xclk_freq = clk_get_rate(imx283->xclk);
drivers/media/i2c/imx283.c
1471
imx283->freq = &imx283_frequencies[i];
drivers/media/i2c/imx283.c
1475
if (!imx283->freq) {
drivers/media/i2c/imx283.c
1476
dev_err(imx283->dev, "xclk frequency unsupported: %d Hz\n", xclk_freq);
drivers/media/i2c/imx283.c
1480
ret = imx283_get_regulators(imx283);
drivers/media/i2c/imx283.c
1482
return dev_err_probe(imx283->dev, ret,
drivers/media/i2c/imx283.c
1486
ret = imx283_parse_endpoint(imx283);
drivers/media/i2c/imx283.c
1488
dev_err(imx283->dev, "failed to parse endpoint configuration\n");
drivers/media/i2c/imx283.c
1493
imx283->reset_gpio = devm_gpiod_get_optional(imx283->dev, "reset",
drivers/media/i2c/imx283.c
1495
if (IS_ERR(imx283->reset_gpio))
drivers/media/i2c/imx283.c
1496
return dev_err_probe(imx283->dev, PTR_ERR(imx283->reset_gpio),
drivers/media/i2c/imx283.c
1503
ret = imx283_power_on(imx283->dev);
drivers/media/i2c/imx283.c
1507
ret = imx283_identify_module(imx283);
drivers/media/i2c/imx283.c
1516
pm_runtime_set_active(imx283->dev);
drivers/media/i2c/imx283.c
1517
pm_runtime_get_noresume(imx283->dev);
drivers/media/i2c/imx283.c
1518
pm_runtime_enable(imx283->dev);
drivers/media/i2c/imx283.c
1519
pm_runtime_set_autosuspend_delay(imx283->dev, 1000);
drivers/media/i2c/imx283.c
1520
pm_runtime_use_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1523
ret = imx283_init_controls(imx283);
drivers/media/i2c/imx283.c
1528
imx283->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx283.c
1529
imx283->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx283.c
1530
imx283->sd.internal_ops = &imx283_internal_ops;
drivers/media/i2c/imx283.c
1533
imx283->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx283.c
1535
ret = media_entity_pads_init(&imx283->sd.entity, 1, &imx283->pad);
drivers/media/i2c/imx283.c
1537
dev_err(imx283->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx283.c
1541
imx283->sd.state_lock = imx283->ctrl_handler.lock;
drivers/media/i2c/imx283.c
1542
ret = v4l2_subdev_init_finalize(&imx283->sd);
drivers/media/i2c/imx283.c
1544
dev_err(imx283->dev, "subdev init error: %d\n", ret);
drivers/media/i2c/imx283.c
1548
ret = v4l2_async_register_subdev_sensor(&imx283->sd);
drivers/media/i2c/imx283.c
1550
dev_err(imx283->dev, "failed to register sensor sub-device: %d\n", ret);
drivers/media/i2c/imx283.c
1558
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1563
v4l2_subdev_cleanup(&imx283->sd);
drivers/media/i2c/imx283.c
1566
media_entity_cleanup(&imx283->sd.entity);
drivers/media/i2c/imx283.c
1569
v4l2_ctrl_handler_free(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1572
pm_runtime_disable(imx283->dev);
drivers/media/i2c/imx283.c
1573
pm_runtime_set_suspended(imx283->dev);
drivers/media/i2c/imx283.c
1575
imx283_power_off(imx283->dev);
drivers/media/i2c/imx283.c
1583
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1586
v4l2_subdev_cleanup(&imx283->sd);
drivers/media/i2c/imx283.c
1588
v4l2_ctrl_handler_free(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1590
pm_runtime_disable(imx283->dev);
drivers/media/i2c/imx283.c
1591
if (!pm_runtime_status_suspended(imx283->dev))
drivers/media/i2c/imx283.c
1592
imx283_power_off(imx283->dev);
drivers/media/i2c/imx283.c
1593
pm_runtime_set_suspended(imx283->dev);
drivers/media/i2c/imx283.c
574
static inline struct imx283 *to_imx283(struct v4l2_subdev *sd)
drivers/media/i2c/imx283.c
576
return container_of_const(sd, struct imx283, sd);
drivers/media/i2c/imx283.c
607
static u64 imx283_pixel_rate(struct imx283 *imx283,
drivers/media/i2c/imx283.c
610
u64 link_frequency = link_frequencies[__ffs(imx283->link_freq_bitmap)];
drivers/media/i2c/imx283.c
660
static u32 imx283_exposure(struct imx283 *imx283,
drivers/media/i2c/imx283.c
669
numerator = (imx283->vmax * (svr + 1) - shr) * imx283->hmax + offset;
drivers/media/i2c/imx283.c
671
do_div(numerator, imx283->hmax);
drivers/media/i2c/imx283.c
676
static void imx283_exposure_limits(struct imx283 *imx283,
drivers/media/i2c/imx283.c
683
u64 max_shr = (svr + 1) * imx283->vmax - 4;
drivers/media/i2c/imx283.c
687
*min_exposure = imx283_exposure(imx283, mode, max_shr);
drivers/media/i2c/imx283.c
688
*max_exposure = imx283_exposure(imx283, mode, min_shr);
drivers/media/i2c/imx283.c
695
static u32 imx283_shr(struct imx283 *imx283, const struct imx283_mode *mode,
drivers/media/i2c/imx283.c
704
temp = ((u64)exposure * imx283->hmax - offset);
drivers/media/i2c/imx283.c
705
do_div(temp, imx283->hmax);
drivers/media/i2c/imx283.c
707
return (imx283->vmax * (svr + 1) - temp);
drivers/media/i2c/imx283.c
730
static int imx283_update_test_pattern(struct imx283 *imx283, u32 pattern_index)
drivers/media/i2c/imx283.c
738
return cci_write(imx283->cci, IMX283_REG_TPG_CTRL, 0x00, NULL);
drivers/media/i2c/imx283.c
740
ret = cci_write(imx283->cci, IMX283_REG_TPG_PAT,
drivers/media/i2c/imx283.c
745
return cci_write(imx283->cci, IMX283_REG_TPG_CTRL,
drivers/media/i2c/imx283.c
751
struct imx283 *imx283 = container_of(ctrl->handler, struct imx283,
drivers/media/i2c/imx283.c
761
state = v4l2_subdev_get_locked_active_state(&imx283->sd);
drivers/media/i2c/imx283.c
776
imx283->vmax = mode->height + ctrl->val;
drivers/media/i2c/imx283.c
778
imx283_exposure_limits(imx283, mode,
drivers/media/i2c/imx283.c
781
current_exposure = imx283->exposure->val;
drivers/media/i2c/imx283.c
785
__v4l2_ctrl_modify_range(imx283->exposure, min_exposure,
drivers/media/i2c/imx283.c
793
if (!pm_runtime_get_if_active(imx283->dev))
drivers/media/i2c/imx283.c
798
shr = imx283_shr(imx283, mode, ctrl->val);
drivers/media/i2c/imx283.c
799
dev_dbg(imx283->dev, "V4L2_CID_EXPOSURE : %d - SHR: %lld\n",
drivers/media/i2c/imx283.c
801
ret = cci_write(imx283->cci, IMX283_REG_SHR, shr, NULL);
drivers/media/i2c/imx283.c
805
pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
806
imx283->hmax = imx283_internal_clock(pixel_rate, mode->width + ctrl->val);
drivers/media/i2c/imx283.c
807
dev_dbg(imx283->dev, "V4L2_CID_HBLANK : %d HMAX : %u\n",
drivers/media/i2c/imx283.c
808
ctrl->val, imx283->hmax);
drivers/media/i2c/imx283.c
809
ret = cci_write(imx283->cci, IMX283_REG_HMAX, imx283->hmax, NULL);
drivers/media/i2c/imx283.c
813
imx283->vmax = mode->height + ctrl->val;
drivers/media/i2c/imx283.c
814
dev_dbg(imx283->dev, "V4L2_CID_VBLANK : %d VMAX : %u\n",
drivers/media/i2c/imx283.c
815
ctrl->val, imx283->vmax);
drivers/media/i2c/imx283.c
816
ret = cci_write(imx283->cci, IMX283_REG_VMAX, imx283->vmax, NULL);
drivers/media/i2c/imx283.c
820
ret = cci_write(imx283->cci, IMX283_REG_ANALOG_GAIN, ctrl->val, NULL);
drivers/media/i2c/imx283.c
824
ret = cci_write(imx283->cci, IMX283_REG_DIGITAL_GAIN, ctrl->val, NULL);
drivers/media/i2c/imx283.c
833
cci_write(imx283->cci, IMX283_REG_HTRIMMING,
drivers/media/i2c/imx283.c
836
cci_write(imx283->cci, IMX283_REG_HTRIMMING,
drivers/media/i2c/imx283.c
842
ret = imx283_update_test_pattern(imx283, ctrl->val);
drivers/media/i2c/imx283.c
846
dev_err(imx283->dev, "ctrl(id:0x%x, val:0x%x) is not handled\n",
drivers/media/i2c/imx283.c
851
pm_runtime_put(imx283->dev);
drivers/media/i2c/imx283.c
892
static void imx283_update_image_pad_format(struct imx283 *imx283,
drivers/media/i2c/imx283.c
908
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
918
imx283_update_image_pad_format(imx283, mode, format);
drivers/media/i2c/imx283.c
927
static void imx283_set_framing_limits(struct imx283 *imx283,
drivers/media/i2c/imx283.c
930
u64 pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
934
imx283->hmax = imx283_internal_clock(pixel_rate, mode->default_hmax);
drivers/media/i2c/imx283.c
935
imx283->vmax = mode->default_vmax;
drivers/media/i2c/imx283.c
944
__v4l2_ctrl_modify_range(imx283->hblank, min_hblank, max_hblank, 1,
drivers/media/i2c/imx283.c
946
__v4l2_ctrl_s_ctrl(imx283->hblank, def_hblank);
drivers/media/i2c/imx283.c
949
__v4l2_ctrl_modify_range(imx283->vblank, mode->min_vmax - mode->height,
drivers/media/i2c/imx283.c
952
__v4l2_ctrl_s_ctrl(imx283->vblank, mode->default_vmax - mode->height);
drivers/media/i2c/imx283.c
961
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
981
imx283_set_framing_limits(imx283, mode);
drivers/media/i2c/imx283.c
988
static int imx283_standby_cancel(struct imx283 *imx283)
drivers/media/i2c/imx283.c
993
cci_write(imx283->cci, IMX283_REG_STANDBY,
drivers/media/i2c/imx283.c
997
cci_multi_reg_write(imx283->cci, imx283->freq->regs,
drivers/media/i2c/imx283.c
998
imx283->freq->reg_count, &ret);