imx258 615 drivers/media/i2c/imx258.c static inline struct imx258 *to_imx258(struct v4l2_subdev *_sd) imx258 617 drivers/media/i2c/imx258.c return container_of(_sd, struct imx258, sd); imx258 621 drivers/media/i2c/imx258.c static int imx258_read_reg(struct imx258 *imx258, u16 reg, u32 len, u32 *val) imx258 623 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 654 drivers/media/i2c/imx258.c static int imx258_write_reg(struct imx258 *imx258, u16 reg, u32 len, u32 val) imx258 656 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 671 drivers/media/i2c/imx258.c static int imx258_write_regs(struct imx258 *imx258, imx258 674 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 679 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, regs[i].address, 1, imx258 709 drivers/media/i2c/imx258.c static int imx258_update_digital_gain(struct imx258 *imx258, u32 len, u32 val) imx258 713 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_GR_DIGITAL_GAIN, imx258 718 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_GB_DIGITAL_GAIN, imx258 723 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_R_DIGITAL_GAIN, imx258 728 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_B_DIGITAL_GAIN, imx258 738 drivers/media/i2c/imx258.c struct imx258 *imx258 = imx258 739 drivers/media/i2c/imx258.c container_of(ctrl->handler, struct imx258, ctrl_handler); imx258 740 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 752 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_ANALOG_GAIN, imx258 757 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_EXPOSURE, imx258 762 drivers/media/i2c/imx258.c ret = imx258_update_digital_gain(imx258, IMX258_REG_VALUE_16BIT, imx258 766 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_TEST_PATTERN, imx258 769 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, REG_MIRROR_FLIP_CONTROL, imx258 831 drivers/media/i2c/imx258.c static int __imx258_get_pad_format(struct imx258 *imx258, imx258 836 drivers/media/i2c/imx258.c fmt->format = *v4l2_subdev_get_try_format(&imx258->sd, cfg, imx258 839 drivers/media/i2c/imx258.c imx258_update_pad_format(imx258->cur_mode, fmt); imx258 848 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 851 drivers/media/i2c/imx258.c mutex_lock(&imx258->mutex); imx258 852 drivers/media/i2c/imx258.c ret = __imx258_get_pad_format(imx258, cfg, fmt); imx258 853 drivers/media/i2c/imx258.c mutex_unlock(&imx258->mutex); imx258 862 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 871 drivers/media/i2c/imx258.c mutex_lock(&imx258->mutex); imx258 884 drivers/media/i2c/imx258.c imx258->cur_mode = mode; imx258 885 drivers/media/i2c/imx258.c __v4l2_ctrl_s_ctrl(imx258->link_freq, mode->link_freq_index); imx258 889 drivers/media/i2c/imx258.c __v4l2_ctrl_s_ctrl_int64(imx258->pixel_rate, pixel_rate); imx258 891 drivers/media/i2c/imx258.c vblank_def = imx258->cur_mode->vts_def - imx258 892 drivers/media/i2c/imx258.c imx258->cur_mode->height; imx258 893 drivers/media/i2c/imx258.c vblank_min = imx258->cur_mode->vts_min - imx258 894 drivers/media/i2c/imx258.c imx258->cur_mode->height; imx258 896 drivers/media/i2c/imx258.c imx258->vblank, vblank_min, imx258 897 drivers/media/i2c/imx258.c IMX258_VTS_MAX - imx258->cur_mode->height, 1, imx258 899 drivers/media/i2c/imx258.c __v4l2_ctrl_s_ctrl(imx258->vblank, vblank_def); imx258 902 drivers/media/i2c/imx258.c - imx258->cur_mode->width; imx258 903 drivers/media/i2c/imx258.c __v4l2_ctrl_modify_range(imx258->hblank, h_blank, imx258 907 drivers/media/i2c/imx258.c mutex_unlock(&imx258->mutex); imx258 913 drivers/media/i2c/imx258.c static int imx258_start_streaming(struct imx258 *imx258) imx258 915 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 920 drivers/media/i2c/imx258.c link_freq_index = imx258->cur_mode->link_freq_index; imx258 922 drivers/media/i2c/imx258.c ret = imx258_write_regs(imx258, reg_list->regs, reg_list->num_of_regs); imx258 929 drivers/media/i2c/imx258.c reg_list = &imx258->cur_mode->reg_list; imx258 930 drivers/media/i2c/imx258.c ret = imx258_write_regs(imx258, reg_list->regs, reg_list->num_of_regs); imx258 937 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, REG_MIRROR_FLIP_CONTROL, imx258 946 drivers/media/i2c/imx258.c ret = __v4l2_ctrl_handler_setup(imx258->sd.ctrl_handler); imx258 951 drivers/media/i2c/imx258.c return imx258_write_reg(imx258, IMX258_REG_MODE_SELECT, imx258 957 drivers/media/i2c/imx258.c static int imx258_stop_streaming(struct imx258 *imx258) imx258 959 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 963 drivers/media/i2c/imx258.c ret = imx258_write_reg(imx258, IMX258_REG_MODE_SELECT, imx258 977 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 981 drivers/media/i2c/imx258.c mutex_lock(&imx258->mutex); imx258 982 drivers/media/i2c/imx258.c if (imx258->streaming == enable) { imx258 983 drivers/media/i2c/imx258.c mutex_unlock(&imx258->mutex); imx258 998 drivers/media/i2c/imx258.c ret = imx258_start_streaming(imx258); imx258 1002 drivers/media/i2c/imx258.c imx258_stop_streaming(imx258); imx258 1006 drivers/media/i2c/imx258.c imx258->streaming = enable; imx258 1007 drivers/media/i2c/imx258.c mutex_unlock(&imx258->mutex); imx258 1014 drivers/media/i2c/imx258.c mutex_unlock(&imx258->mutex); imx258 1023 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 1025 drivers/media/i2c/imx258.c if (imx258->streaming) imx258 1026 drivers/media/i2c/imx258.c imx258_stop_streaming(imx258); imx258 1035 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 1038 drivers/media/i2c/imx258.c if (imx258->streaming) { imx258 1039 drivers/media/i2c/imx258.c ret = imx258_start_streaming(imx258); imx258 1047 drivers/media/i2c/imx258.c imx258_stop_streaming(imx258); imx258 1048 drivers/media/i2c/imx258.c imx258->streaming = 0; imx258 1053 drivers/media/i2c/imx258.c static int imx258_identify_module(struct imx258 *imx258) imx258 1055 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 1059 drivers/media/i2c/imx258.c ret = imx258_read_reg(imx258, IMX258_REG_CHIP_ID, imx258 1097 drivers/media/i2c/imx258.c static int imx258_init_controls(struct imx258 *imx258) imx258 1099 drivers/media/i2c/imx258.c struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); imx258 1107 drivers/media/i2c/imx258.c ctrl_hdlr = &imx258->ctrl_handler; imx258 1112 drivers/media/i2c/imx258.c mutex_init(&imx258->mutex); imx258 1113 drivers/media/i2c/imx258.c ctrl_hdlr->lock = &imx258->mutex; imx258 1114 drivers/media/i2c/imx258.c imx258->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, imx258 1121 drivers/media/i2c/imx258.c if (imx258->link_freq) imx258 1122 drivers/media/i2c/imx258.c imx258->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; imx258 1127 drivers/media/i2c/imx258.c imx258->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops, imx258 1133 drivers/media/i2c/imx258.c vblank_def = imx258->cur_mode->vts_def - imx258->cur_mode->height; imx258 1134 drivers/media/i2c/imx258.c vblank_min = imx258->cur_mode->vts_min - imx258->cur_mode->height; imx258 1135 drivers/media/i2c/imx258.c imx258->vblank = v4l2_ctrl_new_std( imx258 1138 drivers/media/i2c/imx258.c IMX258_VTS_MAX - imx258->cur_mode->height, 1, imx258 1141 drivers/media/i2c/imx258.c if (imx258->vblank) imx258 1142 drivers/media/i2c/imx258.c imx258->vblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; imx258 1144 drivers/media/i2c/imx258.c imx258->hblank = v4l2_ctrl_new_std( imx258 1146 drivers/media/i2c/imx258.c IMX258_PPL_DEFAULT - imx258->cur_mode->width, imx258 1147 drivers/media/i2c/imx258.c IMX258_PPL_DEFAULT - imx258->cur_mode->width, imx258 1149 drivers/media/i2c/imx258.c IMX258_PPL_DEFAULT - imx258->cur_mode->width); imx258 1151 drivers/media/i2c/imx258.c if (imx258->hblank) imx258 1152 drivers/media/i2c/imx258.c imx258->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; imx258 1154 drivers/media/i2c/imx258.c imx258->exposure = v4l2_ctrl_new_std( imx258 1181 drivers/media/i2c/imx258.c imx258->sd.ctrl_handler = ctrl_hdlr; imx258 1187 drivers/media/i2c/imx258.c mutex_destroy(&imx258->mutex); imx258 1192 drivers/media/i2c/imx258.c static void imx258_free_controls(struct imx258 *imx258) imx258 1194 drivers/media/i2c/imx258.c v4l2_ctrl_handler_free(imx258->sd.ctrl_handler); imx258 1195 drivers/media/i2c/imx258.c mutex_destroy(&imx258->mutex); imx258 1200 drivers/media/i2c/imx258.c struct imx258 *imx258; imx258 1216 drivers/media/i2c/imx258.c imx258 = devm_kzalloc(&client->dev, sizeof(*imx258), GFP_KERNEL); imx258 1217 drivers/media/i2c/imx258.c if (!imx258) imx258 1221 drivers/media/i2c/imx258.c v4l2_i2c_subdev_init(&imx258->sd, client, &imx258_subdev_ops); imx258 1224 drivers/media/i2c/imx258.c ret = imx258_identify_module(imx258); imx258 1229 drivers/media/i2c/imx258.c imx258->cur_mode = &supported_modes[0]; imx258 1231 drivers/media/i2c/imx258.c ret = imx258_init_controls(imx258); imx258 1236 drivers/media/i2c/imx258.c imx258->sd.internal_ops = &imx258_internal_ops; imx258 1237 drivers/media/i2c/imx258.c imx258->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; imx258 1238 drivers/media/i2c/imx258.c imx258->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; imx258 1241 drivers/media/i2c/imx258.c imx258->pad.flags = MEDIA_PAD_FL_SOURCE; imx258 1243 drivers/media/i2c/imx258.c ret = media_entity_pads_init(&imx258->sd.entity, 1, &imx258->pad); imx258 1247 drivers/media/i2c/imx258.c ret = v4l2_async_register_subdev_sensor_common(&imx258->sd); imx258 1258 drivers/media/i2c/imx258.c media_entity_cleanup(&imx258->sd.entity); imx258 1261 drivers/media/i2c/imx258.c imx258_free_controls(imx258); imx258 1269 drivers/media/i2c/imx258.c struct imx258 *imx258 = to_imx258(sd); imx258 1273 drivers/media/i2c/imx258.c imx258_free_controls(imx258);