Symbol: imx258
drivers/media/i2c/imx258.c
1001
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
1028
static int imx258_start_streaming(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1034
ret = cci_write(imx258->regmap, IMX258_REG_RESET, 0x01, NULL);
drivers/media/i2c/imx258.c
1036
dev_err(imx258->dev, "%s failed to reset sensor\n", __func__);
drivers/media/i2c/imx258.c
1044
link_freq_index = imx258->cur_mode->link_freq_index;
drivers/media/i2c/imx258.c
1045
link_freq_cfg = &imx258->link_freq_configs[link_freq_index];
drivers/media/i2c/imx258.c
1047
reg_list = &link_freq_cfg->link_cfg[imx258->lane_mode_idx].reg_list;
drivers/media/i2c/imx258.c
1048
ret = cci_multi_reg_write(imx258->regmap, reg_list->regs, reg_list->num_of_regs, NULL);
drivers/media/i2c/imx258.c
1050
dev_err(imx258->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/imx258.c
1054
ret = cci_multi_reg_write(imx258->regmap, mode_common_regs,
drivers/media/i2c/imx258.c
1057
dev_err(imx258->dev, "%s failed to set common regs\n", __func__);
drivers/media/i2c/imx258.c
1061
ret = cci_multi_reg_write(imx258->regmap, imx258->variant_cfg->regs,
drivers/media/i2c/imx258.c
1062
imx258->variant_cfg->num_regs, NULL);
drivers/media/i2c/imx258.c
1064
dev_err(imx258->dev, "%s failed to set variant config\n",
drivers/media/i2c/imx258.c
1069
ret = cci_write(imx258->regmap, IMX258_CLK_BLANK_STOP,
drivers/media/i2c/imx258.c
1070
!!(imx258->csi2_flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK),
drivers/media/i2c/imx258.c
1073
dev_err(imx258->dev, "%s failed to set clock lane mode\n", __func__);
drivers/media/i2c/imx258.c
1078
reg_list = &imx258->cur_mode->reg_list;
drivers/media/i2c/imx258.c
1079
ret = cci_multi_reg_write(imx258->regmap, reg_list->regs, reg_list->num_of_regs, NULL);
drivers/media/i2c/imx258.c
1081
dev_err(imx258->dev, "%s failed to set mode\n", __func__);
drivers/media/i2c/imx258.c
1086
ret = __v4l2_ctrl_handler_setup(imx258->sd.ctrl_handler);
drivers/media/i2c/imx258.c
1091
return cci_write(imx258->regmap, IMX258_REG_MODE_SELECT,
drivers/media/i2c/imx258.c
1096
static int imx258_stop_streaming(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1101
ret = cci_write(imx258->regmap, IMX258_REG_MODE_SELECT,
drivers/media/i2c/imx258.c
1104
dev_err(imx258->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/imx258.c
1116
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
1120
imx258->supplies);
drivers/media/i2c/imx258.c
1127
ret = clk_prepare_enable(imx258->clk);
drivers/media/i2c/imx258.c
1130
regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
drivers/media/i2c/imx258.c
1139
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
1141
clk_disable_unprepare(imx258->clk);
drivers/media/i2c/imx258.c
1142
regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
drivers/media/i2c/imx258.c
1149
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
1152
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
1155
ret = pm_runtime_resume_and_get(imx258->dev);
drivers/media/i2c/imx258.c
1163
ret = imx258_start_streaming(imx258);
drivers/media/i2c/imx258.c
1167
imx258_stop_streaming(imx258);
drivers/media/i2c/imx258.c
1168
pm_runtime_put(imx258->dev);
drivers/media/i2c/imx258.c
1171
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
1176
pm_runtime_put(imx258->dev);
drivers/media/i2c/imx258.c
1178
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
1184
static int imx258_identify_module(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1189
ret = cci_read(imx258->regmap, IMX258_REG_CHIP_ID,
drivers/media/i2c/imx258.c
1192
dev_err(imx258->dev, "failed to read chip id %x\n",
drivers/media/i2c/imx258.c
1198
dev_err(imx258->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/imx258.c
1228
static int imx258_init_controls(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1239
ctrl_hdlr = &imx258->ctrl_handler;
drivers/media/i2c/imx258.c
1244
mutex_init(&imx258->mutex);
drivers/media/i2c/imx258.c
1245
ctrl_hdlr->lock = &imx258->mutex;
drivers/media/i2c/imx258.c
1246
imx258->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/imx258.c
1251
imx258->link_freq_menu_items);
drivers/media/i2c/imx258.c
1253
if (imx258->link_freq)
drivers/media/i2c/imx258.c
1254
imx258->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx258.c
1256
imx258->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops,
drivers/media/i2c/imx258.c
1258
if (imx258->hflip)
drivers/media/i2c/imx258.c
1259
imx258->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx258.c
1261
imx258->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops,
drivers/media/i2c/imx258.c
1263
if (imx258->vflip)
drivers/media/i2c/imx258.c
1264
imx258->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx258.c
1266
link_freq_cfgs = &imx258->link_freq_configs[0];
drivers/media/i2c/imx258.c
1267
link_cfg = link_freq_cfgs[imx258->lane_mode_idx].link_cfg;
drivers/media/i2c/imx258.c
1268
pixel_rate = link_freq_to_pixel_rate(imx258->link_freq_menu_items[0],
drivers/media/i2c/imx258.c
1272
imx258->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops,
drivers/media/i2c/imx258.c
1277
vblank_def = imx258->cur_mode->vts_def - imx258->cur_mode->height;
drivers/media/i2c/imx258.c
1278
vblank_min = imx258->cur_mode->vts_min - imx258->cur_mode->height;
drivers/media/i2c/imx258.c
1279
imx258->vblank = v4l2_ctrl_new_std(
drivers/media/i2c/imx258.c
1282
IMX258_VTS_MAX - imx258->cur_mode->height, 1,
drivers/media/i2c/imx258.c
1285
imx258->hblank = v4l2_ctrl_new_std(
drivers/media/i2c/imx258.c
1287
IMX258_PPL_DEFAULT - imx258->cur_mode->width,
drivers/media/i2c/imx258.c
1288
IMX258_PPL_DEFAULT - imx258->cur_mode->width,
drivers/media/i2c/imx258.c
1290
IMX258_PPL_DEFAULT - imx258->cur_mode->width);
drivers/media/i2c/imx258.c
1292
if (imx258->hblank)
drivers/media/i2c/imx258.c
1293
imx258->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx258.c
1295
imx258->exposure = v4l2_ctrl_new_std(
drivers/media/i2c/imx258.c
1320
dev_err(imx258->dev, "%s control init failed (%d)\n",
drivers/media/i2c/imx258.c
1325
ret = v4l2_fwnode_device_parse(imx258->dev, &props);
drivers/media/i2c/imx258.c
1334
imx258->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx258.c
1340
mutex_destroy(&imx258->mutex);
drivers/media/i2c/imx258.c
1345
static void imx258_free_controls(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1347
v4l2_ctrl_handler_free(imx258->sd.ctrl_handler);
drivers/media/i2c/imx258.c
1348
mutex_destroy(&imx258->mutex);
drivers/media/i2c/imx258.c
1351
static int imx258_get_regulators(struct imx258 *imx258)
drivers/media/i2c/imx258.c
1356
imx258->supplies[i].supply = imx258_supply_name[i];
drivers/media/i2c/imx258.c
1358
return devm_regulator_bulk_get(imx258->dev,
drivers/media/i2c/imx258.c
1359
IMX258_NUM_SUPPLIES, imx258->supplies);
drivers/media/i2c/imx258.c
1364
struct imx258 *imx258;
drivers/media/i2c/imx258.c
1372
imx258 = devm_kzalloc(&client->dev, sizeof(*imx258), GFP_KERNEL);
drivers/media/i2c/imx258.c
1373
if (!imx258)
drivers/media/i2c/imx258.c
1376
imx258->dev = &client->dev;
drivers/media/i2c/imx258.c
1378
imx258->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/imx258.c
1379
if (IS_ERR(imx258->regmap)) {
drivers/media/i2c/imx258.c
1380
ret = PTR_ERR(imx258->regmap);
drivers/media/i2c/imx258.c
1381
dev_err(imx258->dev, "failed to initialize CCI: %d\n", ret);
drivers/media/i2c/imx258.c
1385
ret = imx258_get_regulators(imx258);
drivers/media/i2c/imx258.c
1387
return dev_err_probe(imx258->dev, ret,
drivers/media/i2c/imx258.c
1390
imx258->clk = devm_v4l2_sensor_clk_get_legacy(imx258->dev, NULL, false,
drivers/media/i2c/imx258.c
1392
if (IS_ERR(imx258->clk))
drivers/media/i2c/imx258.c
1393
return dev_err_probe(imx258->dev, PTR_ERR(imx258->clk),
drivers/media/i2c/imx258.c
1396
val = clk_get_rate(imx258->clk);
drivers/media/i2c/imx258.c
1400
imx258->link_freq_configs = link_freq_configs_19_2;
drivers/media/i2c/imx258.c
1401
imx258->link_freq_menu_items = link_freq_menu_items_19_2;
drivers/media/i2c/imx258.c
1404
imx258->link_freq_configs = link_freq_configs_24;
drivers/media/i2c/imx258.c
1405
imx258->link_freq_menu_items = link_freq_menu_items_24;
drivers/media/i2c/imx258.c
1408
dev_err(imx258->dev, "input clock frequency of %u not supported\n",
drivers/media/i2c/imx258.c
1413
endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx258->dev), NULL);
drivers/media/i2c/imx258.c
1415
dev_err(imx258->dev, "Endpoint node not found\n");
drivers/media/i2c/imx258.c
1422
dev_err(imx258->dev, "Parsing endpoint node failed\n");
drivers/media/i2c/imx258.c
1426
ret = v4l2_link_freq_to_bitmap(imx258->dev,
drivers/media/i2c/imx258.c
1429
imx258->link_freq_menu_items,
drivers/media/i2c/imx258.c
1431
&imx258->link_freq_bitmap);
drivers/media/i2c/imx258.c
1433
dev_err(imx258->dev, "Link frequency not supported\n");
drivers/media/i2c/imx258.c
1440
imx258->lane_mode_idx = IMX258_2_LANE_MODE;
drivers/media/i2c/imx258.c
1443
imx258->lane_mode_idx = IMX258_4_LANE_MODE;
drivers/media/i2c/imx258.c
1446
dev_err(imx258->dev, "Invalid data lanes: %u\n",
drivers/media/i2c/imx258.c
1452
imx258->csi2_flags = ep.bus.mipi_csi2.flags;
drivers/media/i2c/imx258.c
1454
imx258->variant_cfg = device_get_match_data(imx258->dev);
drivers/media/i2c/imx258.c
1455
if (!imx258->variant_cfg)
drivers/media/i2c/imx258.c
1456
imx258->variant_cfg = &imx258_cfg;
drivers/media/i2c/imx258.c
1459
v4l2_i2c_subdev_init(&imx258->sd, client, &imx258_subdev_ops);
drivers/media/i2c/imx258.c
1462
ret = imx258_power_on(imx258->dev);
drivers/media/i2c/imx258.c
1467
ret = imx258_identify_module(imx258);
drivers/media/i2c/imx258.c
1472
imx258->cur_mode = &supported_modes[0];
drivers/media/i2c/imx258.c
1474
ret = imx258_init_controls(imx258);
drivers/media/i2c/imx258.c
1479
imx258->sd.internal_ops = &imx258_internal_ops;
drivers/media/i2c/imx258.c
1480
imx258->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/imx258.c
1481
imx258->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx258.c
1484
imx258->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx258.c
1486
ret = media_entity_pads_init(&imx258->sd.entity, 1, &imx258->pad);
drivers/media/i2c/imx258.c
1490
ret = v4l2_async_register_subdev_sensor(&imx258->sd);
drivers/media/i2c/imx258.c
1494
pm_runtime_set_active(imx258->dev);
drivers/media/i2c/imx258.c
1495
pm_runtime_enable(imx258->dev);
drivers/media/i2c/imx258.c
1496
pm_runtime_idle(imx258->dev);
drivers/media/i2c/imx258.c
1502
media_entity_cleanup(&imx258->sd.entity);
drivers/media/i2c/imx258.c
1505
imx258_free_controls(imx258);
drivers/media/i2c/imx258.c
1508
imx258_power_off(imx258->dev);
drivers/media/i2c/imx258.c
1519
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
1523
imx258_free_controls(imx258);
drivers/media/i2c/imx258.c
1525
pm_runtime_disable(imx258->dev);
drivers/media/i2c/imx258.c
1526
if (!pm_runtime_status_suspended(imx258->dev))
drivers/media/i2c/imx258.c
1527
imx258_power_off(imx258->dev);
drivers/media/i2c/imx258.c
1528
pm_runtime_set_suspended(imx258->dev);
drivers/media/i2c/imx258.c
686
static inline struct imx258 *to_imx258(struct v4l2_subdev *_sd)
drivers/media/i2c/imx258.c
688
return container_of(_sd, struct imx258, sd);
drivers/media/i2c/imx258.c
692
static u32 imx258_get_format_code(const struct imx258 *imx258)
drivers/media/i2c/imx258.c
696
lockdep_assert_held(&imx258->mutex);
drivers/media/i2c/imx258.c
698
i = (imx258->vflip->val ? 2 : 0) |
drivers/media/i2c/imx258.c
699
(imx258->hflip->val ? 1 : 0);
drivers/media/i2c/imx258.c
707
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
712
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
717
try_fmt->code = imx258_get_format_code(imx258);
drivers/media/i2c/imx258.c
720
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
732
static int imx258_update_digital_gain(struct imx258 *imx258, u32 val)
drivers/media/i2c/imx258.c
736
cci_write(imx258->regmap, IMX258_REG_GR_DIGITAL_GAIN, val, &ret);
drivers/media/i2c/imx258.c
737
cci_write(imx258->regmap, IMX258_REG_GB_DIGITAL_GAIN, val, &ret);
drivers/media/i2c/imx258.c
738
cci_write(imx258->regmap, IMX258_REG_R_DIGITAL_GAIN, val, &ret);
drivers/media/i2c/imx258.c
739
cci_write(imx258->regmap, IMX258_REG_B_DIGITAL_GAIN, val, &ret);
drivers/media/i2c/imx258.c
744
static void imx258_adjust_exposure_range(struct imx258 *imx258)
drivers/media/i2c/imx258.c
749
exposure_max = imx258->cur_mode->height + imx258->vblank->val -
drivers/media/i2c/imx258.c
751
exposure_def = min(exposure_max, imx258->exposure->val);
drivers/media/i2c/imx258.c
752
__v4l2_ctrl_modify_range(imx258->exposure, imx258->exposure->minimum,
drivers/media/i2c/imx258.c
753
exposure_max, imx258->exposure->step,
drivers/media/i2c/imx258.c
759
struct imx258 *imx258 =
drivers/media/i2c/imx258.c
760
container_of(ctrl->handler, struct imx258, ctrl_handler);
drivers/media/i2c/imx258.c
768
imx258_adjust_exposure_range(imx258);
drivers/media/i2c/imx258.c
774
if (pm_runtime_get_if_in_use(imx258->dev) == 0)
drivers/media/i2c/imx258.c
779
ret = cci_write(imx258->regmap, IMX258_REG_ANALOG_GAIN,
drivers/media/i2c/imx258.c
783
ret = cci_write(imx258->regmap, IMX258_REG_EXPOSURE,
drivers/media/i2c/imx258.c
787
ret = imx258_update_digital_gain(imx258, ctrl->val);
drivers/media/i2c/imx258.c
790
ret = cci_write(imx258->regmap, IMX258_REG_TEST_PATTERN,
drivers/media/i2c/imx258.c
795
ret = cci_write(imx258->regmap, IMX258_REG_HDR,
drivers/media/i2c/imx258.c
798
ret = cci_write(imx258->regmap, IMX258_REG_HDR,
drivers/media/i2c/imx258.c
802
ret = cci_write(imx258->regmap, IMX258_REG_HDR_RATIO,
drivers/media/i2c/imx258.c
807
ret = cci_write(imx258->regmap, IMX258_REG_FRM_LENGTH_LINES,
drivers/media/i2c/imx258.c
808
imx258->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/imx258.c
812
ret = cci_write(imx258->regmap, REG_MIRROR_FLIP_CONTROL,
drivers/media/i2c/imx258.c
813
(imx258->hflip->val ?
drivers/media/i2c/imx258.c
815
(imx258->vflip->val ?
drivers/media/i2c/imx258.c
820
dev_info(imx258->dev,
drivers/media/i2c/imx258.c
827
pm_runtime_put(imx258->dev);
drivers/media/i2c/imx258.c
840
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
846
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
847
code->code = imx258_get_format_code(imx258);
drivers/media/i2c/imx258.c
848
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
857
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
863
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
864
code = imx258_get_format_code(imx258);
drivers/media/i2c/imx258.c
865
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
878
static void imx258_update_pad_format(struct imx258 *imx258,
drivers/media/i2c/imx258.c
884
fmt->format.code = imx258_get_format_code(imx258);
drivers/media/i2c/imx258.c
888
static int __imx258_get_pad_format(struct imx258 *imx258,
drivers/media/i2c/imx258.c
896
imx258_update_pad_format(imx258, imx258->cur_mode, fmt);
drivers/media/i2c/imx258.c
905
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
908
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
909
ret = __imx258_get_pad_format(imx258, sd_state, fmt);
drivers/media/i2c/imx258.c
910
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
919
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
930
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
932
fmt->format.code = imx258_get_format_code(imx258);
drivers/media/i2c/imx258.c
937
imx258_update_pad_format(imx258, mode, fmt);
drivers/media/i2c/imx258.c
942
imx258->cur_mode = mode;
drivers/media/i2c/imx258.c
943
__v4l2_ctrl_s_ctrl(imx258->link_freq, mode->link_freq_index);
drivers/media/i2c/imx258.c
945
link_freq = imx258->link_freq_menu_items[mode->link_freq_index];
drivers/media/i2c/imx258.c
947
&imx258->link_freq_configs[mode->link_freq_index];
drivers/media/i2c/imx258.c
949
link_cfg = &link_freq_cfgs->link_cfg[imx258->lane_mode_idx];
drivers/media/i2c/imx258.c
951
__v4l2_ctrl_modify_range(imx258->pixel_rate, pixel_rate,
drivers/media/i2c/imx258.c
954
vblank_def = imx258->cur_mode->vts_def -
drivers/media/i2c/imx258.c
955
imx258->cur_mode->height;
drivers/media/i2c/imx258.c
956
vblank_min = imx258->cur_mode->vts_min -
drivers/media/i2c/imx258.c
957
imx258->cur_mode->height;
drivers/media/i2c/imx258.c
959
imx258->vblank, vblank_min,
drivers/media/i2c/imx258.c
960
IMX258_VTS_MAX - imx258->cur_mode->height, 1,
drivers/media/i2c/imx258.c
962
__v4l2_ctrl_s_ctrl(imx258->vblank, vblank_def);
drivers/media/i2c/imx258.c
964
imx258->link_freq_configs[mode->link_freq_index].pixels_per_line
drivers/media/i2c/imx258.c
965
- imx258->cur_mode->width;
drivers/media/i2c/imx258.c
966
__v4l2_ctrl_modify_range(imx258->hblank, h_blank,
drivers/media/i2c/imx258.c
970
mutex_unlock(&imx258->mutex);
drivers/media/i2c/imx258.c
976
__imx258_get_pad_crop(struct imx258 *imx258,
drivers/media/i2c/imx258.c
984
return &imx258->cur_mode->crop;
drivers/media/i2c/imx258.c
996
struct imx258 *imx258 = to_imx258(sd);
drivers/media/i2c/imx258.c
998
mutex_lock(&imx258->mutex);
drivers/media/i2c/imx258.c
999
sel->r = *__imx258_get_pad_crop(imx258, sd_state, sel->pad,