Symbol: imx355
drivers/media/i2c/imx355.c
1080
static inline struct imx355 *to_imx355(struct v4l2_subdev *_sd)
drivers/media/i2c/imx355.c
1082
return container_of(_sd, struct imx355, sd);
drivers/media/i2c/imx355.c
1086
static u32 imx355_get_format_code(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1098
lockdep_assert_held(&imx355->mutex);
drivers/media/i2c/imx355.c
1099
code = codes[imx355->vflip->val][imx355->hflip->val];
drivers/media/i2c/imx355.c
1105
static int imx355_read_reg(struct imx355 *imx355, u16 reg, u32 len, u32 *val)
drivers/media/i2c/imx355.c
1107
struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
drivers/media/i2c/imx355.c
1139
static int imx355_write_reg(struct imx355 *imx355, u16 reg, u32 len, u32 val)
drivers/media/i2c/imx355.c
1141
struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
drivers/media/i2c/imx355.c
1156
static int imx355_write_regs(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1163
ret = imx355_write_reg(imx355, regs[i].address, 1, regs[i].val);
drivers/media/i2c/imx355.c
1165
dev_err_ratelimited(imx355->dev,
drivers/media/i2c/imx355.c
1179
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1183
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1186
try_fmt->width = imx355->cur_mode->width;
drivers/media/i2c/imx355.c
1187
try_fmt->height = imx355->cur_mode->height;
drivers/media/i2c/imx355.c
1188
try_fmt->code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1191
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1198
struct imx355 *imx355 = container_of(ctrl->handler,
drivers/media/i2c/imx355.c
1199
struct imx355, ctrl_handler);
drivers/media/i2c/imx355.c
1207
max = imx355->cur_mode->height + ctrl->val - 10;
drivers/media/i2c/imx355.c
1208
__v4l2_ctrl_modify_range(imx355->exposure,
drivers/media/i2c/imx355.c
1209
imx355->exposure->minimum,
drivers/media/i2c/imx355.c
1210
max, imx355->exposure->step, max);
drivers/media/i2c/imx355.c
1218
if (!pm_runtime_get_if_in_use(imx355->dev))
drivers/media/i2c/imx355.c
1224
ret = imx355_write_reg(imx355, IMX355_REG_ANALOG_GAIN, 2,
drivers/media/i2c/imx355.c
1228
ret = imx355_write_reg(imx355, IMX355_REG_DIG_GAIN_GLOBAL, 2,
drivers/media/i2c/imx355.c
1232
ret = imx355_write_reg(imx355, IMX355_REG_EXPOSURE, 2,
drivers/media/i2c/imx355.c
1237
ret = imx355_write_reg(imx355, IMX355_REG_FLL, 2,
drivers/media/i2c/imx355.c
1238
imx355->cur_mode->height + ctrl->val);
drivers/media/i2c/imx355.c
1241
ret = imx355_write_reg(imx355, IMX355_REG_TEST_PATTERN,
drivers/media/i2c/imx355.c
1246
ret = imx355_write_reg(imx355, IMX355_REG_ORIENTATION, 1,
drivers/media/i2c/imx355.c
1247
imx355->hflip->val |
drivers/media/i2c/imx355.c
1248
imx355->vflip->val << 1);
drivers/media/i2c/imx355.c
1252
dev_info(imx355->dev, "ctrl(id:0x%x,val:0x%x) is not handled",
drivers/media/i2c/imx355.c
1257
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1270
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1275
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1276
code->code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1277
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1286
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1291
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1292
if (fse->code != imx355_get_format_code(imx355)) {
drivers/media/i2c/imx355.c
1293
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1296
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1306
static void imx355_update_pad_format(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1312
fmt->format.code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1316
static int imx355_do_get_pad_format(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1326
imx355_update_pad_format(imx355, imx355->cur_mode, fmt);
drivers/media/i2c/imx355.c
1336
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1339
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1340
ret = imx355_do_get_pad_format(imx355, sd_state, fmt);
drivers/media/i2c/imx355.c
1341
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1351
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1360
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1366
fmt->format.code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1372
imx355_update_pad_format(imx355, mode, fmt);
drivers/media/i2c/imx355.c
1377
imx355->cur_mode = mode;
drivers/media/i2c/imx355.c
1380
__v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate);
drivers/media/i2c/imx355.c
1382
height = imx355->cur_mode->height;
drivers/media/i2c/imx355.c
1383
vblank_def = imx355->cur_mode->fll_def - height;
drivers/media/i2c/imx355.c
1384
vblank_min = imx355->cur_mode->fll_min - height;
drivers/media/i2c/imx355.c
1386
__v4l2_ctrl_modify_range(imx355->vblank, vblank_min, height, 1,
drivers/media/i2c/imx355.c
1388
__v4l2_ctrl_s_ctrl(imx355->vblank, vblank_def);
drivers/media/i2c/imx355.c
1389
h_blank = mode->llp - imx355->cur_mode->width;
drivers/media/i2c/imx355.c
1394
__v4l2_ctrl_modify_range(imx355->hblank, h_blank,
drivers/media/i2c/imx355.c
1398
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1404
static int imx355_start_streaming(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1411
ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx355.c
1413
dev_err(imx355->dev, "failed to set global settings");
drivers/media/i2c/imx355.c
1418
reg_list = &imx355->cur_mode->reg_list;
drivers/media/i2c/imx355.c
1419
ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx355.c
1421
dev_err(imx355->dev, "failed to set mode");
drivers/media/i2c/imx355.c
1426
ret = imx355_write_reg(imx355, IMX355_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
drivers/media/i2c/imx355.c
1431
ret = __v4l2_ctrl_handler_setup(imx355->sd.ctrl_handler);
drivers/media/i2c/imx355.c
1435
return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
drivers/media/i2c/imx355.c
1440
static int imx355_stop_streaming(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1442
return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
drivers/media/i2c/imx355.c
1448
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1451
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1454
ret = pm_runtime_resume_and_get(imx355->dev);
drivers/media/i2c/imx355.c
1462
ret = imx355_start_streaming(imx355);
drivers/media/i2c/imx355.c
1466
imx355_stop_streaming(imx355);
drivers/media/i2c/imx355.c
1467
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1471
__v4l2_ctrl_grab(imx355->vflip, enable);
drivers/media/i2c/imx355.c
1472
__v4l2_ctrl_grab(imx355->hflip, enable);
drivers/media/i2c/imx355.c
1474
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1479
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1481
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1487
static int imx355_identify_module(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1492
ret = imx355_read_reg(imx355, IMX355_REG_CHIP_ID, 2, &val);
drivers/media/i2c/imx355.c
1497
dev_err(imx355->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/imx355.c
1538
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1540
gpiod_set_value_cansleep(imx355->reset_gpio, 1);
drivers/media/i2c/imx355.c
1542
regulator_bulk_disable(ARRAY_SIZE(imx355_supplies), imx355->supplies);
drivers/media/i2c/imx355.c
1543
clk_disable_unprepare(imx355->clk);
drivers/media/i2c/imx355.c
1552
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1555
ret = clk_prepare_enable(imx355->clk);
drivers/media/i2c/imx355.c
1560
imx355->supplies);
drivers/media/i2c/imx355.c
1567
gpiod_set_value_cansleep(imx355->reset_gpio, 0);
drivers/media/i2c/imx355.c
1573
clk_disable_unprepare(imx355->clk);
drivers/media/i2c/imx355.c
1581
static int imx355_init_controls(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1594
ctrl_hdlr = &imx355->ctrl_handler;
drivers/media/i2c/imx355.c
1599
ctrl_hdlr->lock = &imx355->mutex;
drivers/media/i2c/imx355.c
1601
imx355->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1604
if (imx355->link_freq)
drivers/media/i2c/imx355.c
1605
imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx355.c
1611
imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1616
mode = imx355->cur_mode;
drivers/media/i2c/imx355.c
1619
imx355->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1625
imx355->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1628
if (imx355->hblank)
drivers/media/i2c/imx355.c
1629
imx355->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx355.c
1633
imx355->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1639
imx355->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1641
if (imx355->hflip)
drivers/media/i2c/imx355.c
1642
imx355->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx355.c
1643
imx355->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1645
if (imx355->vflip)
drivers/media/i2c/imx355.c
1646
imx355->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx355.c
1663
dev_err(imx355->dev, "control init failed: %d", ret);
drivers/media/i2c/imx355.c
1667
ret = v4l2_fwnode_device_parse(imx355->dev, &props);
drivers/media/i2c/imx355.c
1676
imx355->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx355.c
1734
struct imx355 *imx355;
drivers/media/i2c/imx355.c
1738
imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL);
drivers/media/i2c/imx355.c
1739
if (!imx355)
drivers/media/i2c/imx355.c
1742
imx355->dev = &client->dev;
drivers/media/i2c/imx355.c
1744
mutex_init(&imx355->mutex);
drivers/media/i2c/imx355.c
1746
imx355->clk = devm_v4l2_sensor_clk_get(imx355->dev, NULL);
drivers/media/i2c/imx355.c
1747
if (IS_ERR(imx355->clk))
drivers/media/i2c/imx355.c
1748
return dev_err_probe(imx355->dev, PTR_ERR(imx355->clk),
drivers/media/i2c/imx355.c
1751
freq = clk_get_rate(imx355->clk);
drivers/media/i2c/imx355.c
1753
return dev_err_probe(imx355->dev, -EINVAL,
drivers/media/i2c/imx355.c
1757
ret = devm_regulator_bulk_get_const(imx355->dev,
drivers/media/i2c/imx355.c
1760
&imx355->supplies);
drivers/media/i2c/imx355.c
1762
dev_err_probe(imx355->dev, ret, "could not get regulators");
drivers/media/i2c/imx355.c
1766
imx355->reset_gpio = devm_gpiod_get_optional(imx355->dev, "reset",
drivers/media/i2c/imx355.c
1768
if (IS_ERR(imx355->reset_gpio)) {
drivers/media/i2c/imx355.c
1769
ret = dev_err_probe(imx355->dev, PTR_ERR(imx355->reset_gpio),
drivers/media/i2c/imx355.c
1775
v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
drivers/media/i2c/imx355.c
1777
imx355->hwcfg = imx355_get_hwcfg(imx355->dev);
drivers/media/i2c/imx355.c
1778
if (!imx355->hwcfg) {
drivers/media/i2c/imx355.c
1779
dev_err(imx355->dev, "failed to get hwcfg");
drivers/media/i2c/imx355.c
1784
ret = imx355_power_on(imx355->dev);
drivers/media/i2c/imx355.c
1789
ret = imx355_identify_module(imx355);
drivers/media/i2c/imx355.c
1791
dev_err(imx355->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/imx355.c
1796
imx355->cur_mode = &supported_modes[0];
drivers/media/i2c/imx355.c
1798
ret = imx355_init_controls(imx355);
drivers/media/i2c/imx355.c
1800
dev_err(imx355->dev, "failed to init controls: %d", ret);
drivers/media/i2c/imx355.c
1805
imx355->sd.internal_ops = &imx355_internal_ops;
drivers/media/i2c/imx355.c
1806
imx355->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/imx355.c
1808
imx355->sd.entity.ops = &imx355_subdev_entity_ops;
drivers/media/i2c/imx355.c
1809
imx355->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx355.c
1812
imx355->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx355.c
1813
ret = media_entity_pads_init(&imx355->sd.entity, 1, &imx355->pad);
drivers/media/i2c/imx355.c
1815
dev_err(imx355->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/imx355.c
1823
pm_runtime_set_active(imx355->dev);
drivers/media/i2c/imx355.c
1824
pm_runtime_enable(imx355->dev);
drivers/media/i2c/imx355.c
1825
pm_runtime_idle(imx355->dev);
drivers/media/i2c/imx355.c
1827
ret = v4l2_async_register_subdev_sensor(&imx355->sd);
drivers/media/i2c/imx355.c
1834
pm_runtime_disable(imx355->dev);
drivers/media/i2c/imx355.c
1835
pm_runtime_set_suspended(imx355->dev);
drivers/media/i2c/imx355.c
1836
media_entity_cleanup(&imx355->sd.entity);
drivers/media/i2c/imx355.c
1839
v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
drivers/media/i2c/imx355.c
1842
imx355_power_off(imx355->dev);
drivers/media/i2c/imx355.c
1845
mutex_destroy(&imx355->mutex);
drivers/media/i2c/imx355.c
1853
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1859
pm_runtime_disable(imx355->dev);
drivers/media/i2c/imx355.c
1861
if (!pm_runtime_status_suspended(imx355->dev)) {
drivers/media/i2c/imx355.c
1862
imx355_power_off(imx355->dev);
drivers/media/i2c/imx355.c
1863
pm_runtime_set_suspended(imx355->dev);
drivers/media/i2c/imx355.c
1866
mutex_destroy(&imx355->mutex);