Symbol: imx283
drivers/media/i2c/imx283.c
1003
cci_multi_reg_write(imx283->cci, imx283->freq->regs,
drivers/media/i2c/imx283.c
1004
imx283->freq->reg_count, &ret);
drivers/media/i2c/imx283.c
1006
dev_dbg(imx283->dev, "Using clk freq %ld MHz",
drivers/media/i2c/imx283.c
1007
imx283->freq->mhz / HZ_PER_MHZ);
drivers/media/i2c/imx283.c
1010
cci_write(imx283->cci, IMX283_REG_PLSTMG08, IMX283_PLSTMG08_VAL, &ret);
drivers/media/i2c/imx283.c
1011
cci_write(imx283->cci, IMX283_REG_PLSTMG02, IMX283_PLSTMG02_VAL, &ret);
drivers/media/i2c/imx283.c
1014
cci_write(imx283->cci, IMX283_REG_STBPL, IMX283_STBPL_NORMAL, &ret);
drivers/media/i2c/imx283.c
1017
mipi_clk = imx283->mipi_clk_noncontinuous ? IMX283_MIPI_CLK_NONCONTINUOUS : 0;
drivers/media/i2c/imx283.c
1018
cci_write(imx283->cci, IMX283_REG_MIPI_CLK, mipi_clk, &ret);
drivers/media/i2c/imx283.c
1021
link_freq_idx = __ffs(imx283->link_freq_bitmap);
drivers/media/i2c/imx283.c
1022
cci_multi_reg_write(imx283->cci, link_freq_reglist[link_freq_idx].regs,
drivers/media/i2c/imx283.c
1030
cci_write(imx283->cci, IMX283_REG_STANDBY, IMX283_ACTIVE, &ret);
drivers/media/i2c/imx283.c
1035
cci_write(imx283->cci, IMX283_REG_CLAMP, IMX283_CLPSQRST, &ret);
drivers/media/i2c/imx283.c
1041
static int imx283_start_streaming(struct imx283 *imx283,
drivers/media/i2c/imx283.c
1060
ret = imx283_standby_cancel(imx283);
drivers/media/i2c/imx283.c
1062
dev_err(imx283->dev, "failed to cancel standby\n");
drivers/media/i2c/imx283.c
1071
cci_write(imx283->cci, IMX283_REG_MDSEL1, readout->mdsel1, &ret);
drivers/media/i2c/imx283.c
1072
cci_write(imx283->cci, IMX283_REG_MDSEL2, readout->mdsel2, &ret);
drivers/media/i2c/imx283.c
1073
cci_write(imx283->cci, IMX283_REG_MDSEL3,
drivers/media/i2c/imx283.c
1075
cci_write(imx283->cci, IMX283_REG_MDSEL4,
drivers/media/i2c/imx283.c
1080
cci_write(imx283->cci, IMX283_REG_MDSEL7, 0x01, &ret);
drivers/media/i2c/imx283.c
1081
cci_write(imx283->cci, IMX283_REG_MDSEL18, 0x1098, &ret);
drivers/media/i2c/imx283.c
1085
dev_err(imx283->dev, "failed to set readout\n");
drivers/media/i2c/imx283.c
1090
cci_write(imx283->cci, IMX283_REG_SVR, 0x00, &ret);
drivers/media/i2c/imx283.c
1092
dev_dbg(imx283->dev, "Mode: Size %d x %d\n", mode->width, mode->height);
drivers/media/i2c/imx283.c
1093
dev_dbg(imx283->dev, "Analogue Crop (in the mode) (%d,%d)/%ux%u\n",
drivers/media/i2c/imx283.c
1105
v_pos = imx283->vflip->val ?
drivers/media/i2c/imx283.c
1110
cci_write(imx283->cci, IMX283_REG_Y_OUT_SIZE, y_out_size, &ret);
drivers/media/i2c/imx283.c
1111
cci_write(imx283->cci, IMX283_REG_WRITE_VSIZE, write_v_size, &ret);
drivers/media/i2c/imx283.c
1112
cci_write(imx283->cci, IMX283_REG_VWIDCUT, v_widcut, &ret);
drivers/media/i2c/imx283.c
1113
cci_write(imx283->cci, IMX283_REG_VWINPOS, v_pos, &ret);
drivers/media/i2c/imx283.c
1115
cci_write(imx283->cci, IMX283_REG_OB_SIZE_V, mode->vertical_ob, &ret);
drivers/media/i2c/imx283.c
1118
cci_write(imx283->cci, IMX283_REG_HTRIMMING_START, mode->crop.left, &ret);
drivers/media/i2c/imx283.c
1119
cci_write(imx283->cci, IMX283_REG_HTRIMMING_END,
drivers/media/i2c/imx283.c
1123
cci_write(imx283->cci, IMX283_REG_EBD_X_OUT_SIZE, 0, &ret);
drivers/media/i2c/imx283.c
1126
ret = __v4l2_ctrl_handler_setup(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1129
cci_write(imx283->cci, IMX283_REG_XMSTA, IMX283_XMSTA_START, &ret);
drivers/media/i2c/imx283.c
1130
cci_write(imx283->cci, IMX283_REG_SYNCDRV, IMX283_SYNCDRV_XHS_XVS, &ret);
drivers/media/i2c/imx283.c
1139
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1145
ret = pm_runtime_get_sync(imx283->dev);
drivers/media/i2c/imx283.c
1147
pm_runtime_put_noidle(imx283->dev);
drivers/media/i2c/imx283.c
1151
ret = imx283_start_streaming(imx283, state);
drivers/media/i2c/imx283.c
1158
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1167
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1173
cci_write(imx283->cci, IMX283_REG_XMSTA, IMX283_XMSTA_STOP, &ret);
drivers/media/i2c/imx283.c
1174
cci_write(imx283->cci, IMX283_REG_STANDBY, IMX283_STANDBY, &ret);
drivers/media/i2c/imx283.c
1177
dev_err(imx283->dev, "Failed to stop stream\n");
drivers/media/i2c/imx283.c
1179
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1188
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1192
imx283->supplies);
drivers/media/i2c/imx283.c
1194
dev_err(imx283->dev, "failed to enable regulators\n");
drivers/media/i2c/imx283.c
1198
ret = clk_prepare_enable(imx283->xclk);
drivers/media/i2c/imx283.c
1200
dev_err(imx283->dev, "failed to enable clock\n");
drivers/media/i2c/imx283.c
1204
gpiod_set_value_cansleep(imx283->reset_gpio, 0);
drivers/media/i2c/imx283.c
1212
regulator_bulk_disable(ARRAY_SIZE(imx283_supply_name), imx283->supplies);
drivers/media/i2c/imx283.c
1219
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1221
gpiod_set_value_cansleep(imx283->reset_gpio, 1);
drivers/media/i2c/imx283.c
1222
regulator_bulk_disable(ARRAY_SIZE(imx283_supply_name), imx283->supplies);
drivers/media/i2c/imx283.c
1223
clk_disable_unprepare(imx283->xclk);
drivers/media/i2c/imx283.c
1228
static int imx283_get_regulators(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1233
imx283->supplies[i].supply = imx283_supply_name[i];
drivers/media/i2c/imx283.c
1235
return devm_regulator_bulk_get(imx283->dev,
drivers/media/i2c/imx283.c
1237
imx283->supplies);
drivers/media/i2c/imx283.c
1241
static int imx283_identify_module(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1246
ret = cci_read(imx283->cci, IMX283_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/imx283.c
1248
dev_err(imx283->dev, "failed to read chip id %x, with error %d\n",
drivers/media/i2c/imx283.c
1254
dev_err(imx283->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx283.c
1309
static int imx283_init_controls(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1319
ctrl_hdlr = &imx283->ctrl_handler;
drivers/media/i2c/imx283.c
1330
pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
1337
__fls(imx283->link_freq_bitmap),
drivers/media/i2c/imx283.c
1338
__ffs(imx283->link_freq_bitmap),
drivers/media/i2c/imx283.c
1344
imx283->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1353
imx283->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1357
imx283->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops,
drivers/media/i2c/imx283.c
1372
imx283->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx283_ctrl_ops, V4L2_CID_VFLIP,
drivers/media/i2c/imx283.c
1374
if (imx283->vflip)
drivers/media/i2c/imx283.c
1375
imx283->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx283.c
1384
dev_err(imx283->dev, "control init failed (%d)\n", ret);
drivers/media/i2c/imx283.c
1388
ret = v4l2_fwnode_device_parse(imx283->dev, &props);
drivers/media/i2c/imx283.c
1397
imx283->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx283.c
1399
mutex_lock(imx283->ctrl_handler.lock);
drivers/media/i2c/imx283.c
1402
imx283_set_framing_limits(imx283, mode);
drivers/media/i2c/imx283.c
1404
mutex_unlock(imx283->ctrl_handler.lock);
drivers/media/i2c/imx283.c
1414
static int imx283_parse_endpoint(struct imx283 *imx283)
drivers/media/i2c/imx283.c
1423
fwnode = dev_fwnode(imx283->dev);
drivers/media/i2c/imx283.c
1426
dev_err(imx283->dev, "Failed to get next endpoint\n");
drivers/media/i2c/imx283.c
1436
dev_err(imx283->dev,
drivers/media/i2c/imx283.c
1443
imx283->mipi_clk_noncontinuous =
drivers/media/i2c/imx283.c
1446
ret = v4l2_link_freq_to_bitmap(imx283->dev, bus_cfg.link_frequencies,
drivers/media/i2c/imx283.c
1449
&imx283->link_freq_bitmap);
drivers/media/i2c/imx283.c
1459
struct imx283 *imx283;
drivers/media/i2c/imx283.c
1464
imx283 = devm_kzalloc(&client->dev, sizeof(*imx283), GFP_KERNEL);
drivers/media/i2c/imx283.c
1465
if (!imx283)
drivers/media/i2c/imx283.c
1468
imx283->dev = &client->dev;
drivers/media/i2c/imx283.c
1470
v4l2_i2c_subdev_init(&imx283->sd, client, &imx283_subdev_ops);
drivers/media/i2c/imx283.c
1472
imx283->cci = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx283.c
1473
if (IS_ERR(imx283->cci)) {
drivers/media/i2c/imx283.c
1474
ret = PTR_ERR(imx283->cci);
drivers/media/i2c/imx283.c
1475
dev_err(imx283->dev, "failed to initialize CCI: %d\n", ret);
drivers/media/i2c/imx283.c
1480
imx283->xclk = devm_v4l2_sensor_clk_get(imx283->dev, NULL);
drivers/media/i2c/imx283.c
1481
if (IS_ERR(imx283->xclk))
drivers/media/i2c/imx283.c
1482
return dev_err_probe(imx283->dev, PTR_ERR(imx283->xclk),
drivers/media/i2c/imx283.c
1485
xclk_freq = clk_get_rate(imx283->xclk);
drivers/media/i2c/imx283.c
1488
imx283->freq = &imx283_frequencies[i];
drivers/media/i2c/imx283.c
1492
if (!imx283->freq) {
drivers/media/i2c/imx283.c
1493
dev_err(imx283->dev, "xclk frequency unsupported: %d Hz\n", xclk_freq);
drivers/media/i2c/imx283.c
1497
ret = imx283_get_regulators(imx283);
drivers/media/i2c/imx283.c
1499
return dev_err_probe(imx283->dev, ret,
drivers/media/i2c/imx283.c
1503
ret = imx283_parse_endpoint(imx283);
drivers/media/i2c/imx283.c
1505
dev_err(imx283->dev, "failed to parse endpoint configuration\n");
drivers/media/i2c/imx283.c
1510
imx283->reset_gpio = devm_gpiod_get_optional(imx283->dev, "reset",
drivers/media/i2c/imx283.c
1512
if (IS_ERR(imx283->reset_gpio))
drivers/media/i2c/imx283.c
1513
return dev_err_probe(imx283->dev, PTR_ERR(imx283->reset_gpio),
drivers/media/i2c/imx283.c
1520
ret = imx283_power_on(imx283->dev);
drivers/media/i2c/imx283.c
1524
ret = imx283_identify_module(imx283);
drivers/media/i2c/imx283.c
1533
pm_runtime_set_active(imx283->dev);
drivers/media/i2c/imx283.c
1534
pm_runtime_get_noresume(imx283->dev);
drivers/media/i2c/imx283.c
1535
pm_runtime_enable(imx283->dev);
drivers/media/i2c/imx283.c
1536
pm_runtime_set_autosuspend_delay(imx283->dev, 1000);
drivers/media/i2c/imx283.c
1537
pm_runtime_use_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1540
ret = imx283_init_controls(imx283);
drivers/media/i2c/imx283.c
1545
imx283->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx283.c
1546
imx283->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx283.c
1547
imx283->sd.internal_ops = &imx283_internal_ops;
drivers/media/i2c/imx283.c
1550
imx283->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx283.c
1552
ret = media_entity_pads_init(&imx283->sd.entity, 1, &imx283->pad);
drivers/media/i2c/imx283.c
1554
dev_err(imx283->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/imx283.c
1558
imx283->sd.state_lock = imx283->ctrl_handler.lock;
drivers/media/i2c/imx283.c
1559
ret = v4l2_subdev_init_finalize(&imx283->sd);
drivers/media/i2c/imx283.c
1561
dev_err(imx283->dev, "subdev init error: %d\n", ret);
drivers/media/i2c/imx283.c
1565
ret = v4l2_async_register_subdev_sensor(&imx283->sd);
drivers/media/i2c/imx283.c
1567
dev_err(imx283->dev, "failed to register sensor sub-device: %d\n", ret);
drivers/media/i2c/imx283.c
1575
pm_runtime_put_autosuspend(imx283->dev);
drivers/media/i2c/imx283.c
1580
v4l2_subdev_cleanup(&imx283->sd);
drivers/media/i2c/imx283.c
1583
media_entity_cleanup(&imx283->sd.entity);
drivers/media/i2c/imx283.c
1586
v4l2_ctrl_handler_free(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1589
pm_runtime_disable(imx283->dev);
drivers/media/i2c/imx283.c
1590
pm_runtime_set_suspended(imx283->dev);
drivers/media/i2c/imx283.c
1592
imx283_power_off(imx283->dev);
drivers/media/i2c/imx283.c
1600
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
1603
v4l2_subdev_cleanup(&imx283->sd);
drivers/media/i2c/imx283.c
1605
v4l2_ctrl_handler_free(imx283->sd.ctrl_handler);
drivers/media/i2c/imx283.c
1607
pm_runtime_disable(imx283->dev);
drivers/media/i2c/imx283.c
1608
if (!pm_runtime_status_suspended(imx283->dev))
drivers/media/i2c/imx283.c
1609
imx283_power_off(imx283->dev);
drivers/media/i2c/imx283.c
1610
pm_runtime_set_suspended(imx283->dev);
drivers/media/i2c/imx283.c
579
static inline struct imx283 *to_imx283(struct v4l2_subdev *sd)
drivers/media/i2c/imx283.c
581
return container_of_const(sd, struct imx283, sd);
drivers/media/i2c/imx283.c
612
static u64 imx283_pixel_rate(struct imx283 *imx283,
drivers/media/i2c/imx283.c
615
u64 link_frequency = link_frequencies[__ffs(imx283->link_freq_bitmap)];
drivers/media/i2c/imx283.c
665
static u32 imx283_exposure(struct imx283 *imx283,
drivers/media/i2c/imx283.c
674
numerator = (imx283->vmax * (svr + 1) - shr) * imx283->hmax + offset;
drivers/media/i2c/imx283.c
676
do_div(numerator, imx283->hmax);
drivers/media/i2c/imx283.c
681
static void imx283_exposure_limits(struct imx283 *imx283,
drivers/media/i2c/imx283.c
688
u64 max_shr = (svr + 1) * imx283->vmax - 4;
drivers/media/i2c/imx283.c
692
*min_exposure = imx283_exposure(imx283, mode, max_shr);
drivers/media/i2c/imx283.c
693
*max_exposure = imx283_exposure(imx283, mode, min_shr);
drivers/media/i2c/imx283.c
700
static u32 imx283_shr(struct imx283 *imx283, const struct imx283_mode *mode,
drivers/media/i2c/imx283.c
709
temp = ((u64)exposure * imx283->hmax - offset);
drivers/media/i2c/imx283.c
710
do_div(temp, imx283->hmax);
drivers/media/i2c/imx283.c
712
return (imx283->vmax * (svr + 1) - temp);
drivers/media/i2c/imx283.c
735
static int imx283_update_test_pattern(struct imx283 *imx283, u32 pattern_index)
drivers/media/i2c/imx283.c
743
return cci_write(imx283->cci, IMX283_REG_TPG_CTRL, 0x00, NULL);
drivers/media/i2c/imx283.c
745
ret = cci_write(imx283->cci, IMX283_REG_TPG_PAT,
drivers/media/i2c/imx283.c
750
return cci_write(imx283->cci, IMX283_REG_TPG_CTRL,
drivers/media/i2c/imx283.c
756
struct imx283 *imx283 = container_of(ctrl->handler, struct imx283,
drivers/media/i2c/imx283.c
766
state = v4l2_subdev_get_locked_active_state(&imx283->sd);
drivers/media/i2c/imx283.c
781
imx283->vmax = mode->height + ctrl->val;
drivers/media/i2c/imx283.c
783
imx283_exposure_limits(imx283, mode,
drivers/media/i2c/imx283.c
786
current_exposure = imx283->exposure->val;
drivers/media/i2c/imx283.c
790
__v4l2_ctrl_modify_range(imx283->exposure, min_exposure,
drivers/media/i2c/imx283.c
798
if (!pm_runtime_get_if_active(imx283->dev))
drivers/media/i2c/imx283.c
803
shr = imx283_shr(imx283, mode, ctrl->val);
drivers/media/i2c/imx283.c
804
dev_dbg(imx283->dev, "V4L2_CID_EXPOSURE : %d - SHR: %lld\n",
drivers/media/i2c/imx283.c
806
ret = cci_write(imx283->cci, IMX283_REG_SHR, shr, NULL);
drivers/media/i2c/imx283.c
810
pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
811
imx283->hmax = imx283_internal_clock(pixel_rate, mode->width + ctrl->val);
drivers/media/i2c/imx283.c
812
dev_dbg(imx283->dev, "V4L2_CID_HBLANK : %d HMAX : %u\n",
drivers/media/i2c/imx283.c
813
ctrl->val, imx283->hmax);
drivers/media/i2c/imx283.c
814
ret = cci_write(imx283->cci, IMX283_REG_HMAX, imx283->hmax, NULL);
drivers/media/i2c/imx283.c
818
imx283->vmax = mode->height + ctrl->val;
drivers/media/i2c/imx283.c
819
dev_dbg(imx283->dev, "V4L2_CID_VBLANK : %d VMAX : %u\n",
drivers/media/i2c/imx283.c
820
ctrl->val, imx283->vmax);
drivers/media/i2c/imx283.c
821
ret = cci_write(imx283->cci, IMX283_REG_VMAX, imx283->vmax, NULL);
drivers/media/i2c/imx283.c
825
ret = cci_write(imx283->cci, IMX283_REG_ANALOG_GAIN, ctrl->val, NULL);
drivers/media/i2c/imx283.c
829
ret = cci_write(imx283->cci, IMX283_REG_DIGITAL_GAIN, ctrl->val, NULL);
drivers/media/i2c/imx283.c
838
cci_write(imx283->cci, IMX283_REG_HTRIMMING,
drivers/media/i2c/imx283.c
841
cci_write(imx283->cci, IMX283_REG_HTRIMMING,
drivers/media/i2c/imx283.c
847
ret = imx283_update_test_pattern(imx283, ctrl->val);
drivers/media/i2c/imx283.c
851
dev_err(imx283->dev, "ctrl(id:0x%x, val:0x%x) is not handled\n",
drivers/media/i2c/imx283.c
856
pm_runtime_put(imx283->dev);
drivers/media/i2c/imx283.c
897
static void imx283_update_image_pad_format(struct imx283 *imx283,
drivers/media/i2c/imx283.c
913
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
923
imx283_update_image_pad_format(imx283, mode, format);
drivers/media/i2c/imx283.c
932
static void imx283_set_framing_limits(struct imx283 *imx283,
drivers/media/i2c/imx283.c
935
u64 pixel_rate = imx283_pixel_rate(imx283, mode);
drivers/media/i2c/imx283.c
939
imx283->hmax = imx283_internal_clock(pixel_rate, mode->default_hmax);
drivers/media/i2c/imx283.c
940
imx283->vmax = mode->default_vmax;
drivers/media/i2c/imx283.c
949
__v4l2_ctrl_modify_range(imx283->hblank, min_hblank, max_hblank, 1,
drivers/media/i2c/imx283.c
951
__v4l2_ctrl_s_ctrl(imx283->hblank, def_hblank);
drivers/media/i2c/imx283.c
954
__v4l2_ctrl_modify_range(imx283->vblank, mode->min_vmax - mode->height,
drivers/media/i2c/imx283.c
957
__v4l2_ctrl_s_ctrl(imx283->vblank, mode->default_vmax - mode->height);
drivers/media/i2c/imx283.c
966
struct imx283 *imx283 = to_imx283(sd);
drivers/media/i2c/imx283.c
986
imx283_set_framing_limits(imx283, mode);
drivers/media/i2c/imx283.c
993
static int imx283_standby_cancel(struct imx283 *imx283)
drivers/media/i2c/imx283.c
999
cci_write(imx283->cci, IMX283_REG_STANDBY,