Lines Matching full:imx258
604 struct imx258 { struct
628 static inline struct imx258 *to_imx258(struct v4l2_subdev *_sd) in to_imx258() argument
630 return container_of(_sd, struct imx258, sd); in to_imx258()
634 static int imx258_read_reg(struct imx258 *imx258, u16 reg, u32 len, u32 *val) in imx258_read_reg() argument
636 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_read_reg()
667 static int imx258_write_reg(struct imx258 *imx258, u16 reg, u32 len, u32 val) in imx258_write_reg() argument
669 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_write_reg()
684 static int imx258_write_regs(struct imx258 *imx258, in imx258_write_regs() argument
687 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_write_regs()
692 ret = imx258_write_reg(imx258, regs[i].address, 1, in imx258_write_regs()
722 static int imx258_update_digital_gain(struct imx258 *imx258, u32 len, u32 val) in imx258_update_digital_gain() argument
726 ret = imx258_write_reg(imx258, IMX258_REG_GR_DIGITAL_GAIN, in imx258_update_digital_gain()
731 ret = imx258_write_reg(imx258, IMX258_REG_GB_DIGITAL_GAIN, in imx258_update_digital_gain()
736 ret = imx258_write_reg(imx258, IMX258_REG_R_DIGITAL_GAIN, in imx258_update_digital_gain()
741 ret = imx258_write_reg(imx258, IMX258_REG_B_DIGITAL_GAIN, in imx258_update_digital_gain()
751 struct imx258 *imx258 = in imx258_set_ctrl() local
752 container_of(ctrl->handler, struct imx258, ctrl_handler); in imx258_set_ctrl()
753 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_set_ctrl()
765 ret = imx258_write_reg(imx258, IMX258_REG_ANALOG_GAIN, in imx258_set_ctrl()
770 ret = imx258_write_reg(imx258, IMX258_REG_EXPOSURE, in imx258_set_ctrl()
775 ret = imx258_update_digital_gain(imx258, IMX258_REG_VALUE_16BIT, in imx258_set_ctrl()
779 ret = imx258_write_reg(imx258, IMX258_REG_TEST_PATTERN, in imx258_set_ctrl()
782 ret = imx258_write_reg(imx258, REG_MIRROR_FLIP_CONTROL, in imx258_set_ctrl()
789 ret = imx258_write_reg(imx258, IMX258_REG_HDR, in imx258_set_ctrl()
793 ret = imx258_write_reg(imx258, IMX258_REG_HDR, in imx258_set_ctrl()
798 ret = imx258_write_reg(imx258, IMX258_REG_HDR_RATIO, in imx258_set_ctrl()
860 static int __imx258_get_pad_format(struct imx258 *imx258, in __imx258_get_pad_format() argument
868 imx258_update_pad_format(imx258->cur_mode, fmt); in __imx258_get_pad_format()
877 struct imx258 *imx258 = to_imx258(sd); in imx258_get_pad_format() local
880 mutex_lock(&imx258->mutex); in imx258_get_pad_format()
881 ret = __imx258_get_pad_format(imx258, sd_state, fmt); in imx258_get_pad_format()
882 mutex_unlock(&imx258->mutex); in imx258_get_pad_format()
891 struct imx258 *imx258 = to_imx258(sd); in imx258_set_pad_format() local
900 mutex_lock(&imx258->mutex); in imx258_set_pad_format()
913 imx258->cur_mode = mode; in imx258_set_pad_format()
914 __v4l2_ctrl_s_ctrl(imx258->link_freq, mode->link_freq_index); in imx258_set_pad_format()
918 __v4l2_ctrl_s_ctrl_int64(imx258->pixel_rate, pixel_rate); in imx258_set_pad_format()
920 vblank_def = imx258->cur_mode->vts_def - in imx258_set_pad_format()
921 imx258->cur_mode->height; in imx258_set_pad_format()
922 vblank_min = imx258->cur_mode->vts_min - in imx258_set_pad_format()
923 imx258->cur_mode->height; in imx258_set_pad_format()
925 imx258->vblank, vblank_min, in imx258_set_pad_format()
926 IMX258_VTS_MAX - imx258->cur_mode->height, 1, in imx258_set_pad_format()
928 __v4l2_ctrl_s_ctrl(imx258->vblank, vblank_def); in imx258_set_pad_format()
931 - imx258->cur_mode->width; in imx258_set_pad_format()
932 __v4l2_ctrl_modify_range(imx258->hblank, h_blank, in imx258_set_pad_format()
936 mutex_unlock(&imx258->mutex); in imx258_set_pad_format()
942 static int imx258_start_streaming(struct imx258 *imx258) in imx258_start_streaming() argument
944 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_start_streaming()
949 link_freq_index = imx258->cur_mode->link_freq_index; in imx258_start_streaming()
951 ret = imx258_write_regs(imx258, reg_list->regs, reg_list->num_of_regs); in imx258_start_streaming()
958 reg_list = &imx258->cur_mode->reg_list; in imx258_start_streaming()
959 ret = imx258_write_regs(imx258, reg_list->regs, reg_list->num_of_regs); in imx258_start_streaming()
966 ret = imx258_write_reg(imx258, REG_MIRROR_FLIP_CONTROL, in imx258_start_streaming()
975 ret = __v4l2_ctrl_handler_setup(imx258->sd.ctrl_handler); in imx258_start_streaming()
980 return imx258_write_reg(imx258, IMX258_REG_MODE_SELECT, in imx258_start_streaming()
986 static int imx258_stop_streaming(struct imx258 *imx258) in imx258_stop_streaming() argument
988 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_stop_streaming()
992 ret = imx258_write_reg(imx258, IMX258_REG_MODE_SELECT, in imx258_stop_streaming()
1007 struct imx258 *imx258 = to_imx258(sd); in imx258_power_on() local
1010 ret = clk_prepare_enable(imx258->clk); in imx258_power_on()
1020 struct imx258 *imx258 = to_imx258(sd); in imx258_power_off() local
1022 clk_disable_unprepare(imx258->clk); in imx258_power_off()
1029 struct imx258 *imx258 = to_imx258(sd); in imx258_set_stream() local
1033 mutex_lock(&imx258->mutex); in imx258_set_stream()
1044 ret = imx258_start_streaming(imx258); in imx258_set_stream()
1048 imx258_stop_streaming(imx258); in imx258_set_stream()
1052 mutex_unlock(&imx258->mutex); in imx258_set_stream()
1059 mutex_unlock(&imx258->mutex); in imx258_set_stream()
1065 static int imx258_identify_module(struct imx258 *imx258) in imx258_identify_module() argument
1067 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_identify_module()
1071 ret = imx258_read_reg(imx258, IMX258_REG_CHIP_ID, in imx258_identify_module()
1109 static int imx258_init_controls(struct imx258 *imx258) in imx258_init_controls() argument
1111 struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd); in imx258_init_controls()
1121 ctrl_hdlr = &imx258->ctrl_handler; in imx258_init_controls()
1126 mutex_init(&imx258->mutex); in imx258_init_controls()
1127 ctrl_hdlr->lock = &imx258->mutex; in imx258_init_controls()
1128 imx258->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, in imx258_init_controls()
1135 if (imx258->link_freq) in imx258_init_controls()
1136 imx258->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx258_init_controls()
1152 imx258->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx258_ctrl_ops, in imx258_init_controls()
1158 vblank_def = imx258->cur_mode->vts_def - imx258->cur_mode->height; in imx258_init_controls()
1159 vblank_min = imx258->cur_mode->vts_min - imx258->cur_mode->height; in imx258_init_controls()
1160 imx258->vblank = v4l2_ctrl_new_std( in imx258_init_controls()
1163 IMX258_VTS_MAX - imx258->cur_mode->height, 1, in imx258_init_controls()
1166 if (imx258->vblank) in imx258_init_controls()
1167 imx258->vblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx258_init_controls()
1169 imx258->hblank = v4l2_ctrl_new_std( in imx258_init_controls()
1171 IMX258_PPL_DEFAULT - imx258->cur_mode->width, in imx258_init_controls()
1172 IMX258_PPL_DEFAULT - imx258->cur_mode->width, in imx258_init_controls()
1174 IMX258_PPL_DEFAULT - imx258->cur_mode->width); in imx258_init_controls()
1176 if (imx258->hblank) in imx258_init_controls()
1177 imx258->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx258_init_controls()
1179 imx258->exposure = v4l2_ctrl_new_std( in imx258_init_controls()
1218 imx258->sd.ctrl_handler = ctrl_hdlr; in imx258_init_controls()
1224 mutex_destroy(&imx258->mutex); in imx258_init_controls()
1229 static void imx258_free_controls(struct imx258 *imx258) in imx258_free_controls() argument
1231 v4l2_ctrl_handler_free(imx258->sd.ctrl_handler); in imx258_free_controls()
1232 mutex_destroy(&imx258->mutex); in imx258_free_controls()
1237 struct imx258 *imx258; in imx258_probe() local
1241 imx258 = devm_kzalloc(&client->dev, sizeof(*imx258), GFP_KERNEL); in imx258_probe()
1242 if (!imx258) in imx258_probe()
1245 imx258->clk = devm_clk_get_optional(&client->dev, NULL); in imx258_probe()
1246 if (IS_ERR(imx258->clk)) in imx258_probe()
1247 return dev_err_probe(&client->dev, PTR_ERR(imx258->clk), in imx258_probe()
1249 if (!imx258->clk) { in imx258_probe()
1255 val = clk_get_rate(imx258->clk); in imx258_probe()
1263 v4l2_i2c_subdev_init(&imx258->sd, client, &imx258_subdev_ops); in imx258_probe()
1271 ret = imx258_identify_module(imx258); in imx258_probe()
1276 imx258->cur_mode = &supported_modes[0]; in imx258_probe()
1278 ret = imx258_init_controls(imx258); in imx258_probe()
1283 imx258->sd.internal_ops = &imx258_internal_ops; in imx258_probe()
1284 imx258->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx258_probe()
1285 imx258->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx258_probe()
1288 imx258->pad.flags = MEDIA_PAD_FL_SOURCE; in imx258_probe()
1290 ret = media_entity_pads_init(&imx258->sd.entity, 1, &imx258->pad); in imx258_probe()
1294 ret = v4l2_async_register_subdev_sensor(&imx258->sd); in imx258_probe()
1305 media_entity_cleanup(&imx258->sd.entity); in imx258_probe()
1308 imx258_free_controls(imx258); in imx258_probe()
1319 struct imx258 *imx258 = to_imx258(sd); in imx258_remove() local
1323 imx258_free_controls(imx258); in imx258_remove()
1345 { .compatible = "sony,imx258" },
1352 .name = "imx258",
1366 MODULE_DESCRIPTION("Sony IMX258 sensor driver");