drivers/media/i2c/imx319.c
1766
static inline struct imx319 *to_imx319(struct v4l2_subdev *_sd)
drivers/media/i2c/imx319.c
1768
return container_of(_sd, struct imx319, sd);
drivers/media/i2c/imx319.c
1772
static u32 imx319_get_format_code(struct imx319 *imx319)
drivers/media/i2c/imx319.c
1784
lockdep_assert_held(&imx319->mutex);
drivers/media/i2c/imx319.c
1785
code = codes[imx319->vflip->val][imx319->hflip->val];
drivers/media/i2c/imx319.c
1791
static int imx319_read_reg(struct imx319 *imx319, u16 reg, u32 len, u32 *val)
drivers/media/i2c/imx319.c
1793
struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
drivers/media/i2c/imx319.c
1825
static int imx319_write_reg(struct imx319 *imx319, u16 reg, u32 len, u32 val)
drivers/media/i2c/imx319.c
1827
struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
drivers/media/i2c/imx319.c
1842
static int imx319_write_regs(struct imx319 *imx319,
drivers/media/i2c/imx319.c
1849
ret = imx319_write_reg(imx319, regs[i].address, 1, regs[i].val);
drivers/media/i2c/imx319.c
1851
dev_err_ratelimited(imx319->dev,
drivers/media/i2c/imx319.c
1864
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
1868
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
1871
try_fmt->width = imx319->cur_mode->width;
drivers/media/i2c/imx319.c
1872
try_fmt->height = imx319->cur_mode->height;
drivers/media/i2c/imx319.c
1873
try_fmt->code = imx319_get_format_code(imx319);
drivers/media/i2c/imx319.c
1876
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
1883
struct imx319 *imx319 = container_of(ctrl->handler,
drivers/media/i2c/imx319.c
1884
struct imx319, ctrl_handler);
drivers/media/i2c/imx319.c
1892
max = imx319->cur_mode->height + ctrl->val - 18;
drivers/media/i2c/imx319.c
1893
__v4l2_ctrl_modify_range(imx319->exposure,
drivers/media/i2c/imx319.c
1894
imx319->exposure->minimum,
drivers/media/i2c/imx319.c
1895
max, imx319->exposure->step, max);
drivers/media/i2c/imx319.c
1903
if (!pm_runtime_get_if_in_use(imx319->dev))
drivers/media/i2c/imx319.c
1909
ret = imx319_write_reg(imx319, IMX319_REG_ANALOG_GAIN, 2,
drivers/media/i2c/imx319.c
1913
ret = imx319_write_reg(imx319, IMX319_REG_DIG_GAIN_GLOBAL, 2,
drivers/media/i2c/imx319.c
1917
ret = imx319_write_reg(imx319, IMX319_REG_EXPOSURE, 2,
drivers/media/i2c/imx319.c
1922
ret = imx319_write_reg(imx319, IMX319_REG_FLL, 2,
drivers/media/i2c/imx319.c
1923
imx319->cur_mode->height + ctrl->val);
drivers/media/i2c/imx319.c
1926
ret = imx319_write_reg(imx319, IMX319_REG_TEST_PATTERN,
drivers/media/i2c/imx319.c
1931
ret = imx319_write_reg(imx319, IMX319_REG_ORIENTATION, 1,
drivers/media/i2c/imx319.c
1932
imx319->hflip->val |
drivers/media/i2c/imx319.c
1933
imx319->vflip->val << 1);
drivers/media/i2c/imx319.c
1937
dev_info(imx319->dev, "ctrl(id:0x%x,val:0x%x) is not handled",
drivers/media/i2c/imx319.c
1942
pm_runtime_put(imx319->dev);
drivers/media/i2c/imx319.c
1955
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
1960
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
1961
code->code = imx319_get_format_code(imx319);
drivers/media/i2c/imx319.c
1962
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
1971
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
1976
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
1977
if (fse->code != imx319_get_format_code(imx319)) {
drivers/media/i2c/imx319.c
1978
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
1981
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
1991
static void imx319_update_pad_format(struct imx319 *imx319,
drivers/media/i2c/imx319.c
1997
fmt->format.code = imx319_get_format_code(imx319);
drivers/media/i2c/imx319.c
2001
static int imx319_do_get_pad_format(struct imx319 *imx319,
drivers/media/i2c/imx319.c
2011
imx319_update_pad_format(imx319, imx319->cur_mode, fmt);
drivers/media/i2c/imx319.c
2021
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
2024
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
2025
ret = imx319_do_get_pad_format(imx319, sd_state, fmt);
drivers/media/i2c/imx319.c
2026
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
2036
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
2045
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
2051
fmt->format.code = imx319_get_format_code(imx319);
drivers/media/i2c/imx319.c
2057
imx319_update_pad_format(imx319, mode, fmt);
drivers/media/i2c/imx319.c
2062
imx319->cur_mode = mode;
drivers/media/i2c/imx319.c
2065
__v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate);
drivers/media/i2c/imx319.c
2067
height = imx319->cur_mode->height;
drivers/media/i2c/imx319.c
2068
vblank_def = imx319->cur_mode->fll_def - height;
drivers/media/i2c/imx319.c
2069
vblank_min = imx319->cur_mode->fll_min - height;
drivers/media/i2c/imx319.c
2071
__v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1,
drivers/media/i2c/imx319.c
2073
__v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def);
drivers/media/i2c/imx319.c
2074
h_blank = mode->llp - imx319->cur_mode->width;
drivers/media/i2c/imx319.c
2079
__v4l2_ctrl_modify_range(imx319->hblank, h_blank,
drivers/media/i2c/imx319.c
2083
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
2089
static int imx319_identify_module(struct imx319 *imx319)
drivers/media/i2c/imx319.c
2094
if (imx319->identified)
drivers/media/i2c/imx319.c
2097
ret = imx319_read_reg(imx319, IMX319_REG_CHIP_ID, 2, &val);
drivers/media/i2c/imx319.c
2102
dev_err(imx319->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/imx319.c
2107
imx319->identified = true;
drivers/media/i2c/imx319.c
2113
static int imx319_start_streaming(struct imx319 *imx319)
drivers/media/i2c/imx319.c
2118
ret = imx319_identify_module(imx319);
drivers/media/i2c/imx319.c
2124
ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx319.c
2126
dev_err(imx319->dev, "failed to set global settings");
drivers/media/i2c/imx319.c
2131
reg_list = &imx319->cur_mode->reg_list;
drivers/media/i2c/imx319.c
2132
ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
drivers/media/i2c/imx319.c
2134
dev_err(imx319->dev, "failed to set mode");
drivers/media/i2c/imx319.c
2139
ret = imx319_write_reg(imx319, IMX319_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
drivers/media/i2c/imx319.c
2144
ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler);
drivers/media/i2c/imx319.c
2148
return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
drivers/media/i2c/imx319.c
2153
static int imx319_stop_streaming(struct imx319 *imx319)
drivers/media/i2c/imx319.c
2155
return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
drivers/media/i2c/imx319.c
2161
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
2164
mutex_lock(&imx319->mutex);
drivers/media/i2c/imx319.c
2167
ret = pm_runtime_resume_and_get(imx319->dev);
drivers/media/i2c/imx319.c
2175
ret = imx319_start_streaming(imx319);
drivers/media/i2c/imx319.c
2179
imx319_stop_streaming(imx319);
drivers/media/i2c/imx319.c
2180
pm_runtime_put(imx319->dev);
drivers/media/i2c/imx319.c
2184
__v4l2_ctrl_grab(imx319->vflip, enable);
drivers/media/i2c/imx319.c
2185
__v4l2_ctrl_grab(imx319->hflip, enable);
drivers/media/i2c/imx319.c
2187
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
2192
pm_runtime_put(imx319->dev);
drivers/media/i2c/imx319.c
2194
mutex_unlock(&imx319->mutex);
drivers/media/i2c/imx319.c
2230
static int imx319_init_controls(struct imx319 *imx319)
drivers/media/i2c/imx319.c
2242
ctrl_hdlr = &imx319->ctrl_handler;
drivers/media/i2c/imx319.c
2247
ctrl_hdlr->lock = &imx319->mutex;
drivers/media/i2c/imx319.c
2249
imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2252
if (imx319->link_freq)
drivers/media/i2c/imx319.c
2253
imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx319.c
2259
imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2264
mode = imx319->cur_mode;
drivers/media/i2c/imx319.c
2267
imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2273
imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2276
if (imx319->hblank)
drivers/media/i2c/imx319.c
2277
imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/imx319.c
2281
imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2287
imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2289
if (imx319->hflip)
drivers/media/i2c/imx319.c
2290
imx319->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx319.c
2291
imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
drivers/media/i2c/imx319.c
2293
if (imx319->vflip)
drivers/media/i2c/imx319.c
2294
imx319->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/imx319.c
2311
dev_err(imx319->dev, "control init failed: %d", ret);
drivers/media/i2c/imx319.c
2315
imx319->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/imx319.c
2370
struct imx319 *imx319;
drivers/media/i2c/imx319.c
2376
imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL);
drivers/media/i2c/imx319.c
2377
if (!imx319)
drivers/media/i2c/imx319.c
2380
imx319->dev = &client->dev;
drivers/media/i2c/imx319.c
2382
mutex_init(&imx319->mutex);
drivers/media/i2c/imx319.c
2384
clk = devm_v4l2_sensor_clk_get(imx319->dev, NULL);
drivers/media/i2c/imx319.c
2386
return dev_err_probe(imx319->dev, PTR_ERR(clk),
drivers/media/i2c/imx319.c
2391
return dev_err_probe(imx319->dev, -EINVAL,
drivers/media/i2c/imx319.c
2396
v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops);
drivers/media/i2c/imx319.c
2398
full_power = acpi_dev_state_d0(imx319->dev);
drivers/media/i2c/imx319.c
2401
ret = imx319_identify_module(imx319);
drivers/media/i2c/imx319.c
2403
dev_err(imx319->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/imx319.c
2408
imx319->hwcfg = imx319_get_hwcfg(imx319->dev);
drivers/media/i2c/imx319.c
2409
if (!imx319->hwcfg) {
drivers/media/i2c/imx319.c
2410
dev_err(imx319->dev, "failed to get hwcfg");
drivers/media/i2c/imx319.c
2416
imx319->cur_mode = &supported_modes[0];
drivers/media/i2c/imx319.c
2418
ret = imx319_init_controls(imx319);
drivers/media/i2c/imx319.c
2420
dev_err(imx319->dev, "failed to init controls: %d", ret);
drivers/media/i2c/imx319.c
2425
imx319->sd.internal_ops = &imx319_internal_ops;
drivers/media/i2c/imx319.c
2426
imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/imx319.c
2428
imx319->sd.entity.ops = &imx319_subdev_entity_ops;
drivers/media/i2c/imx319.c
2429
imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/imx319.c
2432
imx319->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/imx319.c
2433
ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad);
drivers/media/i2c/imx319.c
2435
dev_err(imx319->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/imx319.c
2441
pm_runtime_set_active(imx319->dev);
drivers/media/i2c/imx319.c
2442
pm_runtime_enable(imx319->dev);
drivers/media/i2c/imx319.c
2444
ret = v4l2_async_register_subdev_sensor(&imx319->sd);
drivers/media/i2c/imx319.c
2448
pm_runtime_idle(imx319->dev);
drivers/media/i2c/imx319.c
2453
pm_runtime_disable(imx319->dev);
drivers/media/i2c/imx319.c
2455
pm_runtime_set_suspended(imx319->dev);
drivers/media/i2c/imx319.c
2456
media_entity_cleanup(&imx319->sd.entity);
drivers/media/i2c/imx319.c
2459
v4l2_ctrl_handler_free(imx319->sd.ctrl_handler);
drivers/media/i2c/imx319.c
2462
mutex_destroy(&imx319->mutex);
drivers/media/i2c/imx319.c
2470
struct imx319 *imx319 = to_imx319(sd);
drivers/media/i2c/imx319.c
2476
pm_runtime_disable(imx319->dev);
drivers/media/i2c/imx319.c
2477
if (!pm_runtime_status_suspended(imx319->dev))
drivers/media/i2c/imx319.c
2478
pm_runtime_set_suspended(imx319->dev);
drivers/media/i2c/imx319.c
2480
mutex_destroy(&imx319->mutex);