imx355 1062 drivers/media/i2c/imx355.c static inline struct imx355 *to_imx355(struct v4l2_subdev *_sd) imx355 1064 drivers/media/i2c/imx355.c return container_of(_sd, struct imx355, sd); imx355 1068 drivers/media/i2c/imx355.c static u32 imx355_get_format_code(struct imx355 *imx355) imx355 1080 drivers/media/i2c/imx355.c lockdep_assert_held(&imx355->mutex); imx355 1081 drivers/media/i2c/imx355.c code = codes[imx355->vflip->val][imx355->hflip->val]; imx355 1087 drivers/media/i2c/imx355.c static int imx355_read_reg(struct imx355 *imx355, u16 reg, u32 len, u32 *val) imx355 1089 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1121 drivers/media/i2c/imx355.c static int imx355_write_reg(struct imx355 *imx355, u16 reg, u32 len, u32 val) imx355 1123 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1138 drivers/media/i2c/imx355.c static int imx355_write_regs(struct imx355 *imx355, imx355 1141 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1146 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, regs[i].address, 1, regs[i].val); imx355 1162 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1166 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1169 drivers/media/i2c/imx355.c try_fmt->width = imx355->cur_mode->width; imx355 1170 drivers/media/i2c/imx355.c try_fmt->height = imx355->cur_mode->height; imx355 1171 drivers/media/i2c/imx355.c try_fmt->code = imx355_get_format_code(imx355); imx355 1174 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1181 drivers/media/i2c/imx355.c struct imx355 *imx355 = container_of(ctrl->handler, imx355 1182 drivers/media/i2c/imx355.c struct imx355, ctrl_handler); imx355 1183 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1191 drivers/media/i2c/imx355.c max = imx355->cur_mode->height + ctrl->val - 10; imx355 1192 drivers/media/i2c/imx355.c __v4l2_ctrl_modify_range(imx355->exposure, imx355 1193 drivers/media/i2c/imx355.c imx355->exposure->minimum, imx355 1194 drivers/media/i2c/imx355.c max, imx355->exposure->step, max); imx355 1208 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_ANALOG_GAIN, 2, imx355 1212 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_DIG_GAIN_GLOBAL, 2, imx355 1216 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_EXPOSURE, 2, imx355 1221 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_FLL, 2, imx355 1222 drivers/media/i2c/imx355.c imx355->cur_mode->height + ctrl->val); imx355 1225 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_TEST_PATTERN, imx355 1230 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_ORIENTATION, 1, imx355 1231 drivers/media/i2c/imx355.c imx355->hflip->val | imx355 1232 drivers/media/i2c/imx355.c imx355->vflip->val << 1); imx355 1254 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1259 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1260 drivers/media/i2c/imx355.c code->code = imx355_get_format_code(imx355); imx355 1261 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1270 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1275 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1276 drivers/media/i2c/imx355.c if (fse->code != imx355_get_format_code(imx355)) { imx355 1277 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1280 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1290 drivers/media/i2c/imx355.c static void imx355_update_pad_format(struct imx355 *imx355, imx355 1296 drivers/media/i2c/imx355.c fmt->format.code = imx355_get_format_code(imx355); imx355 1300 drivers/media/i2c/imx355.c static int imx355_do_get_pad_format(struct imx355 *imx355, imx355 1305 drivers/media/i2c/imx355.c struct v4l2_subdev *sd = &imx355->sd; imx355 1311 drivers/media/i2c/imx355.c imx355_update_pad_format(imx355, imx355->cur_mode, fmt); imx355 1321 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1324 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1325 drivers/media/i2c/imx355.c ret = imx355_do_get_pad_format(imx355, cfg, fmt); imx355 1326 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1336 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1345 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1351 drivers/media/i2c/imx355.c fmt->format.code = imx355_get_format_code(imx355); imx355 1357 drivers/media/i2c/imx355.c imx355_update_pad_format(imx355, mode, fmt); imx355 1362 drivers/media/i2c/imx355.c imx355->cur_mode = mode; imx355 1363 drivers/media/i2c/imx355.c pixel_rate = imx355->link_def_freq * 2 * 4; imx355 1365 drivers/media/i2c/imx355.c __v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate); imx355 1367 drivers/media/i2c/imx355.c height = imx355->cur_mode->height; imx355 1368 drivers/media/i2c/imx355.c vblank_def = imx355->cur_mode->fll_def - height; imx355 1369 drivers/media/i2c/imx355.c vblank_min = imx355->cur_mode->fll_min - height; imx355 1371 drivers/media/i2c/imx355.c __v4l2_ctrl_modify_range(imx355->vblank, vblank_min, height, 1, imx355 1373 drivers/media/i2c/imx355.c __v4l2_ctrl_s_ctrl(imx355->vblank, vblank_def); imx355 1374 drivers/media/i2c/imx355.c h_blank = mode->llp - imx355->cur_mode->width; imx355 1379 drivers/media/i2c/imx355.c __v4l2_ctrl_modify_range(imx355->hblank, h_blank, imx355 1383 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1389 drivers/media/i2c/imx355.c static int imx355_start_streaming(struct imx355 *imx355) imx355 1391 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1397 drivers/media/i2c/imx355.c ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs); imx355 1404 drivers/media/i2c/imx355.c reg_list = &imx355->cur_mode->reg_list; imx355 1405 drivers/media/i2c/imx355.c ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs); imx355 1412 drivers/media/i2c/imx355.c ret = imx355_write_reg(imx355, IMX355_REG_DPGA_USE_GLOBAL_GAIN, 1, 1); imx355 1417 drivers/media/i2c/imx355.c ret = __v4l2_ctrl_handler_setup(imx355->sd.ctrl_handler); imx355 1421 drivers/media/i2c/imx355.c return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT, imx355 1426 drivers/media/i2c/imx355.c static int imx355_stop_streaming(struct imx355 *imx355) imx355 1428 drivers/media/i2c/imx355.c return imx355_write_reg(imx355, IMX355_REG_MODE_SELECT, imx355 1434 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1438 drivers/media/i2c/imx355.c mutex_lock(&imx355->mutex); imx355 1439 drivers/media/i2c/imx355.c if (imx355->streaming == enable) { imx355 1440 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1455 drivers/media/i2c/imx355.c ret = imx355_start_streaming(imx355); imx355 1459 drivers/media/i2c/imx355.c imx355_stop_streaming(imx355); imx355 1463 drivers/media/i2c/imx355.c imx355->streaming = enable; imx355 1466 drivers/media/i2c/imx355.c __v4l2_ctrl_grab(imx355->vflip, enable); imx355 1467 drivers/media/i2c/imx355.c __v4l2_ctrl_grab(imx355->hflip, enable); imx355 1469 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1476 drivers/media/i2c/imx355.c mutex_unlock(&imx355->mutex); imx355 1485 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1487 drivers/media/i2c/imx355.c if (imx355->streaming) imx355 1488 drivers/media/i2c/imx355.c imx355_stop_streaming(imx355); imx355 1497 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1500 drivers/media/i2c/imx355.c if (imx355->streaming) { imx355 1501 drivers/media/i2c/imx355.c ret = imx355_start_streaming(imx355); imx355 1509 drivers/media/i2c/imx355.c imx355_stop_streaming(imx355); imx355 1510 drivers/media/i2c/imx355.c imx355->streaming = 0; imx355 1515 drivers/media/i2c/imx355.c static int imx355_identify_module(struct imx355 *imx355) imx355 1517 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1521 drivers/media/i2c/imx355.c ret = imx355_read_reg(imx355, IMX355_REG_CHIP_ID, 2, &val); imx355 1564 drivers/media/i2c/imx355.c static int imx355_init_controls(struct imx355 *imx355) imx355 1566 drivers/media/i2c/imx355.c struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); imx355 1577 drivers/media/i2c/imx355.c ctrl_hdlr = &imx355->ctrl_handler; imx355 1582 drivers/media/i2c/imx355.c ctrl_hdlr->lock = &imx355->mutex; imx355 1584 drivers/media/i2c/imx355.c imx355->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx355_ctrl_ops, imx355 1587 drivers/media/i2c/imx355.c if (imx355->link_freq) imx355 1588 drivers/media/i2c/imx355.c imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; imx355 1591 drivers/media/i2c/imx355.c pixel_rate = imx355->link_def_freq * 2 * 4; imx355 1594 drivers/media/i2c/imx355.c imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1599 drivers/media/i2c/imx355.c mode = imx355->cur_mode; imx355 1602 drivers/media/i2c/imx355.c imx355->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1608 drivers/media/i2c/imx355.c imx355->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1611 drivers/media/i2c/imx355.c if (imx355->hblank) imx355 1612 drivers/media/i2c/imx355.c imx355->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; imx355 1616 drivers/media/i2c/imx355.c imx355->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1622 drivers/media/i2c/imx355.c imx355->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1624 drivers/media/i2c/imx355.c imx355->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, imx355 1646 drivers/media/i2c/imx355.c imx355->sd.ctrl_handler = ctrl_hdlr; imx355 1726 drivers/media/i2c/imx355.c struct imx355 *imx355; imx355 1730 drivers/media/i2c/imx355.c imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL); imx355 1731 drivers/media/i2c/imx355.c if (!imx355) imx355 1734 drivers/media/i2c/imx355.c mutex_init(&imx355->mutex); imx355 1737 drivers/media/i2c/imx355.c v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops); imx355 1740 drivers/media/i2c/imx355.c ret = imx355_identify_module(imx355); imx355 1746 drivers/media/i2c/imx355.c imx355->hwcfg = imx355_get_hwcfg(&client->dev); imx355 1747 drivers/media/i2c/imx355.c if (!imx355->hwcfg) { imx355 1753 drivers/media/i2c/imx355.c imx355->link_def_freq = link_freq_menu_items[IMX355_LINK_FREQ_INDEX]; imx355 1754 drivers/media/i2c/imx355.c for (i = 0; i < imx355->hwcfg->nr_of_link_freqs; i++) { imx355 1755 drivers/media/i2c/imx355.c if (imx355->hwcfg->link_freqs[i] == imx355->link_def_freq) { imx355 1761 drivers/media/i2c/imx355.c if (i == imx355->hwcfg->nr_of_link_freqs) { imx355 1768 drivers/media/i2c/imx355.c imx355->cur_mode = &supported_modes[0]; imx355 1770 drivers/media/i2c/imx355.c ret = imx355_init_controls(imx355); imx355 1777 drivers/media/i2c/imx355.c imx355->sd.internal_ops = &imx355_internal_ops; imx355 1778 drivers/media/i2c/imx355.c imx355->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | imx355 1780 drivers/media/i2c/imx355.c imx355->sd.entity.ops = &imx355_subdev_entity_ops; imx355 1781 drivers/media/i2c/imx355.c imx355->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; imx355 1784 drivers/media/i2c/imx355.c imx355->pad.flags = MEDIA_PAD_FL_SOURCE; imx355 1785 drivers/media/i2c/imx355.c ret = media_entity_pads_init(&imx355->sd.entity, 1, &imx355->pad); imx355 1791 drivers/media/i2c/imx355.c ret = v4l2_async_register_subdev_sensor_common(&imx355->sd); imx355 1806 drivers/media/i2c/imx355.c media_entity_cleanup(&imx355->sd.entity); imx355 1809 drivers/media/i2c/imx355.c v4l2_ctrl_handler_free(imx355->sd.ctrl_handler); imx355 1812 drivers/media/i2c/imx355.c mutex_destroy(&imx355->mutex); imx355 1820 drivers/media/i2c/imx355.c struct imx355 *imx355 = to_imx355(sd); imx355 1829 drivers/media/i2c/imx355.c mutex_destroy(&imx355->mutex);