Lines Matching refs:imx319

113 struct imx319 {
1763 static inline struct imx319 *to_imx319(struct v4l2_subdev *_sd)
1765 return container_of(_sd, struct imx319, sd);
1769 static u32 imx319_get_format_code(struct imx319 *imx319)
1781 lockdep_assert_held(&imx319->mutex);
1782 code = codes[imx319->vflip->val][imx319->hflip->val];
1788 static int imx319_read_reg(struct imx319 *imx319, u16 reg, u32 len, u32 *val)
1790 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1822 static int imx319_write_reg(struct imx319 *imx319, u16 reg, u32 len, u32 val)
1824 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1839 static int imx319_write_regs(struct imx319 *imx319,
1842 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1847 ret = imx319_write_reg(imx319, regs[i].address, 1, regs[i].val);
1862 struct imx319 *imx319 = to_imx319(sd);
1866 mutex_lock(&imx319->mutex);
1869 try_fmt->width = imx319->cur_mode->width;
1870 try_fmt->height = imx319->cur_mode->height;
1871 try_fmt->code = imx319_get_format_code(imx319);
1874 mutex_unlock(&imx319->mutex);
1881 struct imx319 *imx319 = container_of(ctrl->handler,
1882 struct imx319, ctrl_handler);
1883 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1891 max = imx319->cur_mode->height + ctrl->val - 18;
1892 __v4l2_ctrl_modify_range(imx319->exposure,
1893 imx319->exposure->minimum,
1894 max, imx319->exposure->step, max);
1908 ret = imx319_write_reg(imx319, IMX319_REG_ANALOG_GAIN, 2,
1912 ret = imx319_write_reg(imx319, IMX319_REG_DIG_GAIN_GLOBAL, 2,
1916 ret = imx319_write_reg(imx319, IMX319_REG_EXPOSURE, 2,
1921 ret = imx319_write_reg(imx319, IMX319_REG_FLL, 2,
1922 imx319->cur_mode->height + ctrl->val);
1925 ret = imx319_write_reg(imx319, IMX319_REG_TEST_PATTERN,
1930 ret = imx319_write_reg(imx319, IMX319_REG_ORIENTATION, 1,
1931 imx319->hflip->val |
1932 imx319->vflip->val << 1);
1954 struct imx319 *imx319 = to_imx319(sd);
1959 mutex_lock(&imx319->mutex);
1960 code->code = imx319_get_format_code(imx319);
1961 mutex_unlock(&imx319->mutex);
1970 struct imx319 *imx319 = to_imx319(sd);
1975 mutex_lock(&imx319->mutex);
1976 if (fse->code != imx319_get_format_code(imx319)) {
1977 mutex_unlock(&imx319->mutex);
1980 mutex_unlock(&imx319->mutex);
1990 static void imx319_update_pad_format(struct imx319 *imx319,
1996 fmt->format.code = imx319_get_format_code(imx319);
2000 static int imx319_do_get_pad_format(struct imx319 *imx319,
2010 imx319_update_pad_format(imx319, imx319->cur_mode, fmt);
2020 struct imx319 *imx319 = to_imx319(sd);
2023 mutex_lock(&imx319->mutex);
2024 ret = imx319_do_get_pad_format(imx319, sd_state, fmt);
2025 mutex_unlock(&imx319->mutex);
2035 struct imx319 *imx319 = to_imx319(sd);
2044 mutex_lock(&imx319->mutex);
2050 fmt->format.code = imx319_get_format_code(imx319);
2056 imx319_update_pad_format(imx319, mode, fmt);
2061 imx319->cur_mode = mode;
2064 __v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate);
2066 height = imx319->cur_mode->height;
2067 vblank_def = imx319->cur_mode->fll_def - height;
2068 vblank_min = imx319->cur_mode->fll_min - height;
2070 __v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1,
2072 __v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def);
2073 h_blank = mode->llp - imx319->cur_mode->width;
2078 __v4l2_ctrl_modify_range(imx319->hblank, h_blank,
2082 mutex_unlock(&imx319->mutex);
2088 static int imx319_identify_module(struct imx319 *imx319)
2090 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2094 if (imx319->identified)
2097 ret = imx319_read_reg(imx319, IMX319_REG_CHIP_ID, 2, &val);
2107 imx319->identified = true;
2113 static int imx319_start_streaming(struct imx319 *imx319)
2115 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2119 ret = imx319_identify_module(imx319);
2125 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
2132 reg_list = &imx319->cur_mode->reg_list;
2133 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
2140 ret = imx319_write_reg(imx319, IMX319_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
2145 ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler);
2149 return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
2154 static int imx319_stop_streaming(struct imx319 *imx319)
2156 return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
2162 struct imx319 *imx319 = to_imx319(sd);
2166 mutex_lock(&imx319->mutex);
2177 ret = imx319_start_streaming(imx319);
2181 imx319_stop_streaming(imx319);
2186 __v4l2_ctrl_grab(imx319->vflip, enable);
2187 __v4l2_ctrl_grab(imx319->hflip, enable);
2189 mutex_unlock(&imx319->mutex);
2196 mutex_unlock(&imx319->mutex);
2232 static int imx319_init_controls(struct imx319 *imx319)
2234 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2245 ctrl_hdlr = &imx319->ctrl_handler;
2250 ctrl_hdlr->lock = &imx319->mutex;
2252 imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops,
2255 if (imx319->link_freq)
2256 imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2262 imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2267 mode = imx319->cur_mode;
2270 imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2276 imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2279 if (imx319->hblank)
2280 imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2284 imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2290 imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2292 if (imx319->hflip)
2293 imx319->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2294 imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2296 if (imx319->vflip)
2297 imx319->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2318 imx319->sd.ctrl_handler = ctrl_hdlr;
2387 struct imx319 *imx319;
2391 imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL);
2392 if (!imx319)
2395 mutex_init(&imx319->mutex);
2398 v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops);
2403 ret = imx319_identify_module(imx319);
2410 imx319->hwcfg = imx319_get_hwcfg(&client->dev);
2411 if (!imx319->hwcfg) {
2418 imx319->cur_mode = &supported_modes[0];
2420 ret = imx319_init_controls(imx319);
2427 imx319->sd.internal_ops = &imx319_internal_ops;
2428 imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
2430 imx319->sd.entity.ops = &imx319_subdev_entity_ops;
2431 imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2434 imx319->pad.flags = MEDIA_PAD_FL_SOURCE;
2435 ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad);
2447 ret = v4l2_async_register_subdev_sensor(&imx319->sd);
2456 media_entity_cleanup(&imx319->sd.entity);
2459 v4l2_ctrl_handler_free(imx319->sd.ctrl_handler);
2462 mutex_destroy(&imx319->mutex);
2470 struct imx319 *imx319 = to_imx319(sd);
2479 mutex_destroy(&imx319->mutex);
2490 .name = "imx319",
2503 MODULE_DESCRIPTION("Sony imx319 sensor driver");