Lines Matching refs:imx319

114 struct imx319 {  struct
1762 static inline struct imx319 *to_imx319(struct v4l2_subdev *_sd) in to_imx319()
1764 return container_of(_sd, struct imx319, sd); in to_imx319()
1768 static u32 imx319_get_format_code(struct imx319 *imx319) in imx319_get_format_code() argument
1780 lockdep_assert_held(&imx319->mutex); in imx319_get_format_code()
1781 code = codes[imx319->vflip->val][imx319->hflip->val]; in imx319_get_format_code()
1787 static int imx319_read_reg(struct imx319 *imx319, u16 reg, u32 len, u32 *val) in imx319_read_reg() argument
1789 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_read_reg()
1821 static int imx319_write_reg(struct imx319 *imx319, u16 reg, u32 len, u32 val) in imx319_write_reg() argument
1823 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_write_reg()
1838 static int imx319_write_regs(struct imx319 *imx319, in imx319_write_regs() argument
1841 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_write_regs()
1846 ret = imx319_write_reg(imx319, regs[i].address, 1, regs[i].val); in imx319_write_regs()
1861 struct imx319 *imx319 = to_imx319(sd); in imx319_open() local
1865 mutex_lock(&imx319->mutex); in imx319_open()
1868 try_fmt->width = imx319->cur_mode->width; in imx319_open()
1869 try_fmt->height = imx319->cur_mode->height; in imx319_open()
1870 try_fmt->code = imx319_get_format_code(imx319); in imx319_open()
1873 mutex_unlock(&imx319->mutex); in imx319_open()
1880 struct imx319 *imx319 = container_of(ctrl->handler, in imx319_set_ctrl() local
1881 struct imx319, ctrl_handler); in imx319_set_ctrl()
1882 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_set_ctrl()
1890 max = imx319->cur_mode->height + ctrl->val - 18; in imx319_set_ctrl()
1891 __v4l2_ctrl_modify_range(imx319->exposure, in imx319_set_ctrl()
1892 imx319->exposure->minimum, in imx319_set_ctrl()
1893 max, imx319->exposure->step, max); in imx319_set_ctrl()
1907 ret = imx319_write_reg(imx319, IMX319_REG_ANALOG_GAIN, 2, in imx319_set_ctrl()
1911 ret = imx319_write_reg(imx319, IMX319_REG_DIG_GAIN_GLOBAL, 2, in imx319_set_ctrl()
1915 ret = imx319_write_reg(imx319, IMX319_REG_EXPOSURE, 2, in imx319_set_ctrl()
1920 ret = imx319_write_reg(imx319, IMX319_REG_FLL, 2, in imx319_set_ctrl()
1921 imx319->cur_mode->height + ctrl->val); in imx319_set_ctrl()
1924 ret = imx319_write_reg(imx319, IMX319_REG_TEST_PATTERN, in imx319_set_ctrl()
1929 ret = imx319_write_reg(imx319, IMX319_REG_ORIENTATION, 1, in imx319_set_ctrl()
1930 imx319->hflip->val | in imx319_set_ctrl()
1931 imx319->vflip->val << 1); in imx319_set_ctrl()
1953 struct imx319 *imx319 = to_imx319(sd); in imx319_enum_mbus_code() local
1958 mutex_lock(&imx319->mutex); in imx319_enum_mbus_code()
1959 code->code = imx319_get_format_code(imx319); in imx319_enum_mbus_code()
1960 mutex_unlock(&imx319->mutex); in imx319_enum_mbus_code()
1969 struct imx319 *imx319 = to_imx319(sd); in imx319_enum_frame_size() local
1974 mutex_lock(&imx319->mutex); in imx319_enum_frame_size()
1975 if (fse->code != imx319_get_format_code(imx319)) { in imx319_enum_frame_size()
1976 mutex_unlock(&imx319->mutex); in imx319_enum_frame_size()
1979 mutex_unlock(&imx319->mutex); in imx319_enum_frame_size()
1989 static void imx319_update_pad_format(struct imx319 *imx319, in imx319_update_pad_format() argument
1995 fmt->format.code = imx319_get_format_code(imx319); in imx319_update_pad_format()
1999 static int imx319_do_get_pad_format(struct imx319 *imx319, in imx319_do_get_pad_format() argument
2004 struct v4l2_subdev *sd = &imx319->sd; in imx319_do_get_pad_format()
2010 imx319_update_pad_format(imx319, imx319->cur_mode, fmt); in imx319_do_get_pad_format()
2020 struct imx319 *imx319 = to_imx319(sd); in imx319_get_pad_format() local
2023 mutex_lock(&imx319->mutex); in imx319_get_pad_format()
2024 ret = imx319_do_get_pad_format(imx319, cfg, fmt); in imx319_get_pad_format()
2025 mutex_unlock(&imx319->mutex); in imx319_get_pad_format()
2035 struct imx319 *imx319 = to_imx319(sd); in imx319_set_pad_format() local
2044 mutex_lock(&imx319->mutex); in imx319_set_pad_format()
2050 fmt->format.code = imx319_get_format_code(imx319); in imx319_set_pad_format()
2056 imx319_update_pad_format(imx319, mode, fmt); in imx319_set_pad_format()
2061 imx319->cur_mode = mode; in imx319_set_pad_format()
2062 pixel_rate = imx319->link_def_freq * 2 * 4; in imx319_set_pad_format()
2064 __v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate); in imx319_set_pad_format()
2066 height = imx319->cur_mode->height; in imx319_set_pad_format()
2067 vblank_def = imx319->cur_mode->fll_def - height; in imx319_set_pad_format()
2068 vblank_min = imx319->cur_mode->fll_min - height; in imx319_set_pad_format()
2070 __v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1, in imx319_set_pad_format()
2072 __v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def); in imx319_set_pad_format()
2073 h_blank = mode->llp - imx319->cur_mode->width; in imx319_set_pad_format()
2078 __v4l2_ctrl_modify_range(imx319->hblank, h_blank, in imx319_set_pad_format()
2082 mutex_unlock(&imx319->mutex); in imx319_set_pad_format()
2088 static int imx319_start_streaming(struct imx319 *imx319) in imx319_start_streaming() argument
2090 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_start_streaming()
2096 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs); in imx319_start_streaming()
2103 reg_list = &imx319->cur_mode->reg_list; in imx319_start_streaming()
2104 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs); in imx319_start_streaming()
2111 ret = imx319_write_reg(imx319, IMX319_REG_DPGA_USE_GLOBAL_GAIN, 1, 1); in imx319_start_streaming()
2116 ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler); in imx319_start_streaming()
2120 return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT, in imx319_start_streaming()
2125 static int imx319_stop_streaming(struct imx319 *imx319) in imx319_stop_streaming() argument
2127 return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT, in imx319_stop_streaming()
2133 struct imx319 *imx319 = to_imx319(sd); in imx319_set_stream() local
2137 mutex_lock(&imx319->mutex); in imx319_set_stream()
2138 if (imx319->streaming == enable) { in imx319_set_stream()
2139 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2154 ret = imx319_start_streaming(imx319); in imx319_set_stream()
2158 imx319_stop_streaming(imx319); in imx319_set_stream()
2162 imx319->streaming = enable; in imx319_set_stream()
2165 __v4l2_ctrl_grab(imx319->vflip, enable); in imx319_set_stream()
2166 __v4l2_ctrl_grab(imx319->hflip, enable); in imx319_set_stream()
2168 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2175 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2184 struct imx319 *imx319 = to_imx319(sd); in imx319_suspend() local
2186 if (imx319->streaming) in imx319_suspend()
2187 imx319_stop_streaming(imx319); in imx319_suspend()
2196 struct imx319 *imx319 = to_imx319(sd); in imx319_resume() local
2199 if (imx319->streaming) { in imx319_resume()
2200 ret = imx319_start_streaming(imx319); in imx319_resume()
2208 imx319_stop_streaming(imx319); in imx319_resume()
2209 imx319->streaming = 0; in imx319_resume()
2214 static int imx319_identify_module(struct imx319 *imx319) in imx319_identify_module() argument
2216 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_identify_module()
2220 ret = imx319_read_reg(imx319, IMX319_REG_CHIP_ID, 2, &val); in imx319_identify_module()
2264 static int imx319_init_controls(struct imx319 *imx319) in imx319_init_controls() argument
2266 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_init_controls()
2277 ctrl_hdlr = &imx319->ctrl_handler; in imx319_init_controls()
2282 ctrl_hdlr->lock = &imx319->mutex; in imx319_init_controls()
2284 imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2287 if (imx319->link_freq) in imx319_init_controls()
2288 imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx319_init_controls()
2291 pixel_rate = imx319->link_def_freq * 2 * 4; in imx319_init_controls()
2294 imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2299 mode = imx319->cur_mode; in imx319_init_controls()
2302 imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2308 imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2311 if (imx319->hblank) in imx319_init_controls()
2312 imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx319_init_controls()
2316 imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2322 imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2324 imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2346 imx319->sd.ctrl_handler = ctrl_hdlr; in imx319_init_controls()
2426 struct imx319 *imx319; in imx319_probe() local
2430 imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL); in imx319_probe()
2431 if (!imx319) in imx319_probe()
2434 mutex_init(&imx319->mutex); in imx319_probe()
2437 v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops); in imx319_probe()
2440 ret = imx319_identify_module(imx319); in imx319_probe()
2446 imx319->hwcfg = imx319_get_hwcfg(&client->dev); in imx319_probe()
2447 if (!imx319->hwcfg) { in imx319_probe()
2453 imx319->link_def_freq = link_freq_menu_items[IMX319_LINK_FREQ_INDEX]; in imx319_probe()
2454 for (i = 0; i < imx319->hwcfg->nr_of_link_freqs; i++) { in imx319_probe()
2455 if (imx319->hwcfg->link_freqs[i] == imx319->link_def_freq) { in imx319_probe()
2461 if (i == imx319->hwcfg->nr_of_link_freqs) { in imx319_probe()
2468 imx319->cur_mode = &supported_modes[0]; in imx319_probe()
2470 ret = imx319_init_controls(imx319); in imx319_probe()
2477 imx319->sd.internal_ops = &imx319_internal_ops; in imx319_probe()
2478 imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx319_probe()
2480 imx319->sd.entity.ops = &imx319_subdev_entity_ops; in imx319_probe()
2481 imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx319_probe()
2484 imx319->pad.flags = MEDIA_PAD_FL_SOURCE; in imx319_probe()
2485 ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad); in imx319_probe()
2491 ret = v4l2_async_register_subdev_sensor_common(&imx319->sd); in imx319_probe()
2506 media_entity_cleanup(&imx319->sd.entity); in imx319_probe()
2509 v4l2_ctrl_handler_free(imx319->sd.ctrl_handler); in imx319_probe()
2512 mutex_destroy(&imx319->mutex); in imx319_probe()
2520 struct imx319 *imx319 = to_imx319(sd); in imx319_remove() local
2529 mutex_destroy(&imx319->mutex); in imx319_remove()