drivers/media/i2c/imx355.c
1064
static inline struct imx355 *to_imx355(struct v4l2_subdev *_sd)
drivers/media/i2c/imx355.c
1066
return container_of(_sd, struct imx355, sd);
drivers/media/i2c/imx355.c
1070
static u32 imx355_get_format_code(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1082
lockdep_assert_held(&imx355->mutex);
drivers/media/i2c/imx355.c
1083
code = codes[imx355->vflip->val][imx355->hflip->val];
drivers/media/i2c/imx355.c
1089
static int imx355_read_reg(struct imx355 *imx355, u16 reg, u32 len, u32 *val)
drivers/media/i2c/imx355.c
1091
struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
drivers/media/i2c/imx355.c
1123
static int imx355_write_reg(struct imx355 *imx355, u16 reg, u32 len, u32 val)
drivers/media/i2c/imx355.c
1125
struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd);
drivers/media/i2c/imx355.c
1140
static int imx355_write_regs(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1147
ret = imx355_write_reg(imx355, regs[i].address, 1, regs[i].val);
drivers/media/i2c/imx355.c
1149
dev_err_ratelimited(imx355->dev,
drivers/media/i2c/imx355.c
1163
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1167
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1170
try_fmt->width = imx355->cur_mode->width;
drivers/media/i2c/imx355.c
1171
try_fmt->height = imx355->cur_mode->height;
drivers/media/i2c/imx355.c
1172
try_fmt->code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1175
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1182
struct imx355 *imx355 = container_of(ctrl->handler,
drivers/media/i2c/imx355.c
1183
struct imx355, ctrl_handler);
drivers/media/i2c/imx355.c
1191
max = imx355->cur_mode->height + ctrl->val - 10;
drivers/media/i2c/imx355.c
1192
__v4l2_ctrl_modify_range(imx355->exposure,
drivers/media/i2c/imx355.c
1193
imx355->exposure->minimum,
drivers/media/i2c/imx355.c
1194
max, imx355->exposure->step, max);
drivers/media/i2c/imx355.c
1202
if (!pm_runtime_get_if_in_use(imx355->dev))
drivers/media/i2c/imx355.c
1208
ret = imx355_write_reg(imx355, IMX355_REG_ANALOG_GAIN, 2,
drivers/media/i2c/imx355.c
1212
ret = imx355_write_reg(imx355, IMX355_REG_DIG_GAIN_GLOBAL, 2,
drivers/media/i2c/imx355.c
1216
ret = imx355_write_reg(imx355, IMX355_REG_EXPOSURE, 2,
drivers/media/i2c/imx355.c
1221
ret = imx355_write_reg(imx355, IMX355_REG_FLL, 2,
drivers/media/i2c/imx355.c
1222
imx355->cur_mode->height + ctrl->val);
drivers/media/i2c/imx355.c
1225
ret = imx355_write_reg(imx355, IMX355_REG_TEST_PATTERN,
drivers/media/i2c/imx355.c
1230
ret = imx355_write_reg(imx355, IMX355_REG_ORIENTATION, 1,
drivers/media/i2c/imx355.c
1231
imx355->hflip->val |
drivers/media/i2c/imx355.c
1232
imx355->vflip->val << 1);
drivers/media/i2c/imx355.c
1236
dev_info(imx355->dev, "ctrl(id:0x%x,val:0x%x) is not handled",
drivers/media/i2c/imx355.c
1241
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1254
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1259
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1260
code->code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1261
mutex_unlock(&imx355->mutex);
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
if (fse->code != imx355_get_format_code(imx355)) {
drivers/media/i2c/imx355.c
1277
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1280
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1290
static void imx355_update_pad_format(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1296
fmt->format.code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1300
static int imx355_do_get_pad_format(struct imx355 *imx355,
drivers/media/i2c/imx355.c
1310
imx355_update_pad_format(imx355, imx355->cur_mode, fmt);
drivers/media/i2c/imx355.c
1320
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1323
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1324
ret = imx355_do_get_pad_format(imx355, sd_state, fmt);
drivers/media/i2c/imx355.c
1325
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1335
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1344
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1350
fmt->format.code = imx355_get_format_code(imx355);
drivers/media/i2c/imx355.c
1356
imx355_update_pad_format(imx355, mode, fmt);
drivers/media/i2c/imx355.c
1361
imx355->cur_mode = mode;
drivers/media/i2c/imx355.c
1364
__v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate);
drivers/media/i2c/imx355.c
1366
height = imx355->cur_mode->height;
drivers/media/i2c/imx355.c
1367
vblank_def = imx355->cur_mode->fll_def - height;
drivers/media/i2c/imx355.c
1368
vblank_min = imx355->cur_mode->fll_min - height;
drivers/media/i2c/imx355.c
1370
__v4l2_ctrl_modify_range(imx355->vblank, vblank_min, height, 1,
drivers/media/i2c/imx355.c
1372
__v4l2_ctrl_s_ctrl(imx355->vblank, vblank_def);
drivers/media/i2c/imx355.c
1373
h_blank = mode->llp - imx355->cur_mode->width;
drivers/media/i2c/imx355.c
1378
__v4l2_ctrl_modify_range(imx355->hblank, h_blank,
drivers/media/i2c/imx355.c
1382
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1388
static int imx355_start_streaming(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1395
ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx355.c
1397
dev_err(imx355->dev, "failed to set global settings");
drivers/media/i2c/imx355.c
1402
reg_list = &imx355->cur_mode->reg_list;
drivers/media/i2c/imx355.c
1403
ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx355.c
1405
dev_err(imx355->dev, "failed to set mode");
drivers/media/i2c/imx355.c
1410
ret = imx355_write_reg(imx355, IMX355_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
drivers/media/i2c/imx355.c
1415
ret = __v4l2_ctrl_handler_setup(imx355->sd.ctrl_handler);
drivers/media/i2c/imx355.c
1419
return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
drivers/media/i2c/imx355.c
1424
static int imx355_stop_streaming(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1426
return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT,
drivers/media/i2c/imx355.c
1432
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1435
mutex_lock(&imx355->mutex);
drivers/media/i2c/imx355.c
1438
ret = pm_runtime_resume_and_get(imx355->dev);
drivers/media/i2c/imx355.c
1446
ret = imx355_start_streaming(imx355);
drivers/media/i2c/imx355.c
1450
imx355_stop_streaming(imx355);
drivers/media/i2c/imx355.c
1451
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1455
__v4l2_ctrl_grab(imx355->vflip, enable);
drivers/media/i2c/imx355.c
1456
__v4l2_ctrl_grab(imx355->hflip, enable);
drivers/media/i2c/imx355.c
1458
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1463
pm_runtime_put(imx355->dev);
drivers/media/i2c/imx355.c
1465
mutex_unlock(&imx355->mutex);
drivers/media/i2c/imx355.c
1471
static int imx355_identify_module(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1476
ret = imx355_read_reg(imx355, IMX355_REG_CHIP_ID, 2, &val);
drivers/media/i2c/imx355.c
1481
dev_err(imx355->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/imx355.c
1519
static int imx355_init_controls(struct imx355 *imx355)
drivers/media/i2c/imx355.c
1532
ctrl_hdlr = &imx355->ctrl_handler;
drivers/media/i2c/imx355.c
1537
ctrl_hdlr->lock = &imx355->mutex;
drivers/media/i2c/imx355.c
1539
imx355->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1542
if (imx355->link_freq)
drivers/media/i2c/imx355.c
1543
imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx355.c
1549
imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1554
mode = imx355->cur_mode;
drivers/media/i2c/imx355.c
1557
imx355->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1563
imx355->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1566
if (imx355->hblank)
drivers/media/i2c/imx355.c
1567
imx355->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx355.c
1571
imx355->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1577
imx355->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1579
if (imx355->hflip)
drivers/media/i2c/imx355.c
1580
imx355->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx355.c
1581
imx355->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
drivers/media/i2c/imx355.c
1583
if (imx355->vflip)
drivers/media/i2c/imx355.c
1584
imx355->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx355.c
1601
dev_err(imx355->dev, "control init failed: %d", ret);
drivers/media/i2c/imx355.c
1605
ret = v4l2_fwnode_device_parse(imx355->dev, &props);
drivers/media/i2c/imx355.c
1614
imx355->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx355.c
1669
struct imx355 *imx355;
drivers/media/i2c/imx355.c
1673
imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL);
drivers/media/i2c/imx355.c
1674
if (!imx355)
drivers/media/i2c/imx355.c
1677
imx355->dev = &client->dev;
drivers/media/i2c/imx355.c
1679
mutex_init(&imx355->mutex);
drivers/media/i2c/imx355.c
1681
imx355->clk = devm_v4l2_sensor_clk_get(imx355->dev, NULL);
drivers/media/i2c/imx355.c
1682
if (IS_ERR(imx355->clk))
drivers/media/i2c/imx355.c
1683
return dev_err_probe(imx355->dev, PTR_ERR(imx355->clk),
drivers/media/i2c/imx355.c
1686
freq = clk_get_rate(imx355->clk);
drivers/media/i2c/imx355.c
1688
return dev_err_probe(imx355->dev, -EINVAL,
drivers/media/i2c/imx355.c
1693
v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
drivers/media/i2c/imx355.c
1696
ret = imx355_identify_module(imx355);
drivers/media/i2c/imx355.c
1698
dev_err(imx355->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/imx355.c
1702
imx355->hwcfg = imx355_get_hwcfg(imx355->dev);
drivers/media/i2c/imx355.c
1703
if (!imx355->hwcfg) {
drivers/media/i2c/imx355.c
1704
dev_err(imx355->dev, "failed to get hwcfg");
drivers/media/i2c/imx355.c
1710
imx355->cur_mode = &supported_modes[0];
drivers/media/i2c/imx355.c
1712
ret = imx355_init_controls(imx355);
drivers/media/i2c/imx355.c
1714
dev_err(imx355->dev, "failed to init controls: %d", ret);
drivers/media/i2c/imx355.c
1719
imx355->sd.internal_ops = &imx355_internal_ops;
drivers/media/i2c/imx355.c
1720
imx355->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/imx355.c
1722
imx355->sd.entity.ops = &imx355_subdev_entity_ops;
drivers/media/i2c/imx355.c
1723
imx355->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx355.c
1726
imx355->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx355.c
1727
ret = media_entity_pads_init(&imx355->sd.entity, 1, &imx355->pad);
drivers/media/i2c/imx355.c
1729
dev_err(imx355->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/imx355.c
1737
pm_runtime_set_active(imx355->dev);
drivers/media/i2c/imx355.c
1738
pm_runtime_enable(imx355->dev);
drivers/media/i2c/imx355.c
1739
pm_runtime_idle(imx355->dev);
drivers/media/i2c/imx355.c
1741
ret = v4l2_async_register_subdev_sensor(&imx355->sd);
drivers/media/i2c/imx355.c
1748
pm_runtime_disable(imx355->dev);
drivers/media/i2c/imx355.c
1749
pm_runtime_set_suspended(imx355->dev);
drivers/media/i2c/imx355.c
1750
media_entity_cleanup(&imx355->sd.entity);
drivers/media/i2c/imx355.c
1753
v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
drivers/media/i2c/imx355.c
1756
mutex_destroy(&imx355->mutex);
drivers/media/i2c/imx355.c
1764
struct imx355 *imx355 = to_imx355(sd);
drivers/media/i2c/imx355.c
1770
pm_runtime_disable(imx355->dev);
drivers/media/i2c/imx355.c
1771
pm_runtime_set_suspended(imx355->dev);
drivers/media/i2c/imx355.c
1773
mutex_destroy(&imx355->mutex);