drivers/media/i2c/ov8856.c
104
#define to_ov8856(_sd) container_of(_sd, struct ov8856, sd)
drivers/media/i2c/ov8856.c
1592
static unsigned int ov8856_modes_num(const struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
1596
for (i = 0; i < ARRAY_SIZE(ov8856->priv_lane->supported_modes); i++) {
drivers/media/i2c/ov8856.c
1597
if (ov8856->priv_lane->supported_modes[i].width == 0)
drivers/media/i2c/ov8856.c
1625
static int ov8856_read_reg(struct ov8856 *ov8856, u16 reg, u16 len, u32 *val)
drivers/media/i2c/ov8856.c
1627
struct i2c_client *client = v4l2_get_subdevdata(&ov8856->sd);
drivers/media/i2c/ov8856.c
1655
static int ov8856_write_reg(struct ov8856 *ov8856, u16 reg, u16 len, u32 val)
drivers/media/i2c/ov8856.c
1657
struct i2c_client *client = v4l2_get_subdevdata(&ov8856->sd);
drivers/media/i2c/ov8856.c
1671
static int ov8856_write_reg_list(struct ov8856 *ov8856,
drivers/media/i2c/ov8856.c
1678
ret = ov8856_write_reg(ov8856, r_list->regs[i].address, 1,
drivers/media/i2c/ov8856.c
1681
dev_err_ratelimited(ov8856->dev,
drivers/media/i2c/ov8856.c
1691
static int ov8856_identify_module(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
1696
if (ov8856->identified)
drivers/media/i2c/ov8856.c
1699
ret = ov8856_read_reg(ov8856, OV8856_REG_CHIP_ID,
drivers/media/i2c/ov8856.c
1705
dev_err(ov8856->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/ov8856.c
1710
ov8856->identified = true;
drivers/media/i2c/ov8856.c
1715
static int ov8856_update_digital_gain(struct ov8856 *ov8856, u32 d_gain)
drivers/media/i2c/ov8856.c
1717
return ov8856_write_reg(ov8856, OV8856_REG_DIGITAL_GAIN,
drivers/media/i2c/ov8856.c
1721
static int ov8856_test_pattern(struct ov8856 *ov8856, u32 pattern)
drivers/media/i2c/ov8856.c
1727
return ov8856_write_reg(ov8856, OV8856_REG_TEST_PATTERN,
drivers/media/i2c/ov8856.c
1731
static int ov8856_set_ctrl_hflip(struct ov8856 *ov8856, u32 ctrl_val)
drivers/media/i2c/ov8856.c
1736
ret = ov8856_read_reg(ov8856, OV8856_REG_MIRROR_OPT_1,
drivers/media/i2c/ov8856.c
1741
ret = ov8856_write_reg(ov8856, OV8856_REG_MIRROR_OPT_1,
drivers/media/i2c/ov8856.c
1749
ret = ov8856_read_reg(ov8856, OV8856_REG_FORMAT2,
drivers/media/i2c/ov8856.c
1754
return ov8856_write_reg(ov8856, OV8856_REG_FORMAT2,
drivers/media/i2c/ov8856.c
1764
static int ov8856_set_ctrl_vflip(struct ov8856 *ov8856, u8 ctrl_val)
drivers/media/i2c/ov8856.c
1769
ret = ov8856_read_reg(ov8856, OV8856_REG_FLIP_OPT_1,
drivers/media/i2c/ov8856.c
1774
ret = ov8856_write_reg(ov8856, OV8856_REG_FLIP_OPT_1,
drivers/media/i2c/ov8856.c
1781
ret = ov8856_read_reg(ov8856, OV8856_REG_FLIP_OPT_2,
drivers/media/i2c/ov8856.c
1786
ret = ov8856_write_reg(ov8856, OV8856_REG_FLIP_OPT_2,
drivers/media/i2c/ov8856.c
1791
ret = ov8856_read_reg(ov8856, OV8856_REG_FLIP_OPT_3,
drivers/media/i2c/ov8856.c
1796
ret = ov8856_write_reg(ov8856, OV8856_REG_FLIP_OPT_3,
drivers/media/i2c/ov8856.c
1803
ret = ov8856_read_reg(ov8856, OV8856_REG_FORMAT1,
drivers/media/i2c/ov8856.c
1808
return ov8856_write_reg(ov8856, OV8856_REG_FORMAT1,
drivers/media/i2c/ov8856.c
1820
struct ov8856 *ov8856 = container_of(ctrl->handler,
drivers/media/i2c/ov8856.c
1821
struct ov8856, ctrl_handler);
drivers/media/i2c/ov8856.c
1828
exposure_max = ov8856->cur_mode->height + ctrl->val -
drivers/media/i2c/ov8856.c
1830
__v4l2_ctrl_modify_range(ov8856->exposure,
drivers/media/i2c/ov8856.c
1831
ov8856->exposure->minimum,
drivers/media/i2c/ov8856.c
1832
exposure_max, ov8856->exposure->step,
drivers/media/i2c/ov8856.c
1837
if (!pm_runtime_get_if_in_use(ov8856->dev))
drivers/media/i2c/ov8856.c
1842
ret = ov8856_write_reg(ov8856, OV8856_REG_ANALOG_GAIN,
drivers/media/i2c/ov8856.c
1847
ret = ov8856_update_digital_gain(ov8856, ctrl->val);
drivers/media/i2c/ov8856.c
1852
ret = ov8856_write_reg(ov8856, OV8856_REG_EXPOSURE,
drivers/media/i2c/ov8856.c
1857
ret = ov8856_write_reg(ov8856, OV8856_REG_VTS,
drivers/media/i2c/ov8856.c
1859
ov8856->cur_mode->height + ctrl->val);
drivers/media/i2c/ov8856.c
1863
ret = ov8856_test_pattern(ov8856, ctrl->val);
drivers/media/i2c/ov8856.c
1867
ret = ov8856_set_ctrl_hflip(ov8856, ctrl->val);
drivers/media/i2c/ov8856.c
1871
ret = ov8856_set_ctrl_vflip(ov8856, ctrl->val);
drivers/media/i2c/ov8856.c
1879
pm_runtime_put(ov8856->dev);
drivers/media/i2c/ov8856.c
1888
static int ov8856_init_controls(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
1894
ctrl_hdlr = &ov8856->ctrl_handler;
drivers/media/i2c/ov8856.c
1899
ctrl_hdlr->lock = &ov8856->mutex;
drivers/media/i2c/ov8856.c
1900
ov8856->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1903
(ov8856->priv_lane->link_freq_menu_items)
drivers/media/i2c/ov8856.c
1905
0, ov8856->priv_lane->link_freq_menu_items);
drivers/media/i2c/ov8856.c
1906
if (ov8856->link_freq)
drivers/media/i2c/ov8856.c
1907
ov8856->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov8856.c
1909
ov8856->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1911
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1913
ov8856->cur_mode->data_lanes), 1,
drivers/media/i2c/ov8856.c
1914
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1916
ov8856->cur_mode->data_lanes));
drivers/media/i2c/ov8856.c
1917
ov8856->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1919
ov8856->cur_mode->vts_min - ov8856->cur_mode->height,
drivers/media/i2c/ov8856.c
1920
OV8856_VTS_MAX - ov8856->cur_mode->height, 1,
drivers/media/i2c/ov8856.c
1921
ov8856->cur_mode->vts_def -
drivers/media/i2c/ov8856.c
1922
ov8856->cur_mode->height);
drivers/media/i2c/ov8856.c
1923
h_blank = to_pixels_per_line(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1924
ov8856->cur_mode->hts,
drivers/media/i2c/ov8856.c
1925
ov8856->cur_mode->link_freq_index,
drivers/media/i2c/ov8856.c
1926
ov8856->cur_mode->data_lanes) -
drivers/media/i2c/ov8856.c
1927
ov8856->cur_mode->width;
drivers/media/i2c/ov8856.c
1928
ov8856->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1931
if (ov8856->hblank)
drivers/media/i2c/ov8856.c
1932
ov8856->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov8856.c
1940
exposure_max = ov8856->cur_mode->vts_def - OV8856_EXPOSURE_MAX_MARGIN;
drivers/media/i2c/ov8856.c
1941
ov8856->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1957
ov8856->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov8856.c
1962
static void ov8856_update_pad_format(struct ov8856 *ov8856,
drivers/media/i2c/ov8856.c
1976
ov8856->cur_mbus_index = index;
drivers/media/i2c/ov8856.c
1980
static int ov8856_start_streaming(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
1985
ret = ov8856_identify_module(ov8856);
drivers/media/i2c/ov8856.c
1989
link_freq_index = ov8856->cur_mode->link_freq_index;
drivers/media/i2c/ov8856.c
1990
reg_list = &ov8856->priv_lane->link_freq_configs[link_freq_index].reg_list;
drivers/media/i2c/ov8856.c
1992
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
1994
dev_err(ov8856->dev, "failed to set plls");
drivers/media/i2c/ov8856.c
1998
reg_list = &ov8856->cur_mode->reg_list;
drivers/media/i2c/ov8856.c
1999
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
2001
dev_err(ov8856->dev, "failed to set mode");
drivers/media/i2c/ov8856.c
2005
reg_list = &bayer_offset_configs[ov8856->cur_mbus_index];
drivers/media/i2c/ov8856.c
2006
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
2008
dev_err(ov8856->dev, "failed to set mbus format");
drivers/media/i2c/ov8856.c
2012
ret = __v4l2_ctrl_handler_setup(ov8856->sd.ctrl_handler);
drivers/media/i2c/ov8856.c
2016
ret = ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
drivers/media/i2c/ov8856.c
2019
dev_err(ov8856->dev, "failed to set stream");
drivers/media/i2c/ov8856.c
2026
static void ov8856_stop_streaming(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
2028
if (ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
drivers/media/i2c/ov8856.c
2030
dev_err(ov8856->dev, "failed to set stream");
drivers/media/i2c/ov8856.c
2035
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2038
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2040
ret = pm_runtime_resume_and_get(ov8856->dev);
drivers/media/i2c/ov8856.c
2042
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2046
ret = ov8856_start_streaming(ov8856);
drivers/media/i2c/ov8856.c
2049
ov8856_stop_streaming(ov8856);
drivers/media/i2c/ov8856.c
2050
pm_runtime_put(ov8856->dev);
drivers/media/i2c/ov8856.c
2053
ov8856_stop_streaming(ov8856);
drivers/media/i2c/ov8856.c
2054
pm_runtime_put(ov8856->dev);
drivers/media/i2c/ov8856.c
2057
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2065
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2071
ret = clk_prepare_enable(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2077
if (ov8856->reset_gpio) {
drivers/media/i2c/ov8856.c
2078
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2083
ov8856->supplies);
drivers/media/i2c/ov8856.c
2089
gpiod_set_value_cansleep(ov8856->reset_gpio, 0);
drivers/media/i2c/ov8856.c
2095
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2096
clk_disable_unprepare(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2104
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2109
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2111
ov8856->supplies);
drivers/media/i2c/ov8856.c
2112
clk_disable_unprepare(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2121
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2125
mode = v4l2_find_nearest_size(ov8856->priv_lane->supported_modes,
drivers/media/i2c/ov8856.c
2126
ov8856->modes_size,
drivers/media/i2c/ov8856.c
2130
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2131
ov8856_update_pad_format(ov8856, mode, &fmt->format);
drivers/media/i2c/ov8856.c
2135
ov8856->cur_mode = mode;
drivers/media/i2c/ov8856.c
2136
__v4l2_ctrl_s_ctrl(ov8856->link_freq, mode->link_freq_index);
drivers/media/i2c/ov8856.c
2137
__v4l2_ctrl_s_ctrl_int64(ov8856->pixel_rate,
drivers/media/i2c/ov8856.c
2138
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
2140
ov8856->cur_mode->data_lanes));
drivers/media/i2c/ov8856.c
2144
__v4l2_ctrl_modify_range(ov8856->vblank,
drivers/media/i2c/ov8856.c
2148
__v4l2_ctrl_s_ctrl(ov8856->vblank, vblank_def);
drivers/media/i2c/ov8856.c
2149
h_blank = to_pixels_per_line(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
2152
ov8856->cur_mode->data_lanes)
drivers/media/i2c/ov8856.c
2154
__v4l2_ctrl_modify_range(ov8856->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov8856.c
2158
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2167
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2169
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2174
ov8856_update_pad_format(ov8856, ov8856->cur_mode, &fmt->format);
drivers/media/i2c/ov8856.c
2176
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2197
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2200
if (fse->index >= ov8856->modes_size)
drivers/media/i2c/ov8856.c
2209
fse->min_width = ov8856->priv_lane->supported_modes[fse->index].width;
drivers/media/i2c/ov8856.c
2211
fse->min_height = ov8856->priv_lane->supported_modes[fse->index].height;
drivers/media/i2c/ov8856.c
2219
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2221
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2222
ov8856_update_pad_format(ov8856, &ov8856->priv_lane->supported_modes[0],
drivers/media/i2c/ov8856.c
2224
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2254
static int ov8856_get_hwcfg(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
2256
struct device *dev = ov8856->dev;
drivers/media/i2c/ov8856.c
2269
ov8856->xvclk = devm_v4l2_sensor_clk_get_legacy(dev, "xvclk", false, 0);
drivers/media/i2c/ov8856.c
2270
if (IS_ERR(ov8856->xvclk))
drivers/media/i2c/ov8856.c
2271
return dev_err_probe(dev, PTR_ERR(ov8856->xvclk),
drivers/media/i2c/ov8856.c
2274
xvclk_rate = clk_get_rate(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2280
ov8856->reset_gpio = devm_gpiod_get_optional(dev, "reset",
drivers/media/i2c/ov8856.c
2282
if (IS_ERR(ov8856->reset_gpio))
drivers/media/i2c/ov8856.c
2283
return PTR_ERR(ov8856->reset_gpio);
drivers/media/i2c/ov8856.c
2286
ov8856->supplies[i].supply = ov8856_supply_names[i];
drivers/media/i2c/ov8856.c
2290
ov8856->supplies);
drivers/media/i2c/ov8856.c
2313
dev_dbg(dev, "Using %u data lanes\n", ov8856->cur_mode->data_lanes);
drivers/media/i2c/ov8856.c
2316
ov8856->priv_lane = &lane_cfg_2;
drivers/media/i2c/ov8856.c
2318
ov8856->priv_lane = &lane_cfg_4;
drivers/media/i2c/ov8856.c
2320
ov8856->modes_size = ov8856_modes_num(ov8856);
drivers/media/i2c/ov8856.c
2328
for (i = 0; i < ARRAY_SIZE(ov8856->priv_lane->link_freq_menu_items); i++) {
drivers/media/i2c/ov8856.c
2330
if (ov8856->priv_lane->link_freq_menu_items[i] ==
drivers/media/i2c/ov8856.c
2337
ov8856->priv_lane->link_freq_menu_items[i]);
drivers/media/i2c/ov8856.c
2352
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2357
pm_runtime_disable(ov8856->dev);
drivers/media/i2c/ov8856.c
2358
mutex_destroy(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2360
ov8856_power_off(ov8856->dev);
drivers/media/i2c/ov8856.c
2365
struct ov8856 *ov8856;
drivers/media/i2c/ov8856.c
2369
ov8856 = devm_kzalloc(&client->dev, sizeof(*ov8856), GFP_KERNEL);
drivers/media/i2c/ov8856.c
2370
if (!ov8856)
drivers/media/i2c/ov8856.c
2373
ov8856->dev = &client->dev;
drivers/media/i2c/ov8856.c
2375
ret = ov8856_get_hwcfg(ov8856);
drivers/media/i2c/ov8856.c
2379
v4l2_i2c_subdev_init(&ov8856->sd, client, &ov8856_subdev_ops);
drivers/media/i2c/ov8856.c
2381
full_power = acpi_dev_state_d0(ov8856->dev);
drivers/media/i2c/ov8856.c
2383
ret = ov8856_power_on(ov8856->dev);
drivers/media/i2c/ov8856.c
2385
dev_err(ov8856->dev, "failed to power on\n");
drivers/media/i2c/ov8856.c
2389
ret = ov8856_identify_module(ov8856);
drivers/media/i2c/ov8856.c
2391
dev_err(ov8856->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov8856.c
2396
mutex_init(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2397
ov8856->cur_mode = &ov8856->priv_lane->supported_modes[0];
drivers/media/i2c/ov8856.c
2398
ov8856->cur_mbus_index = ov8856->cur_mode->default_mbus_index;
drivers/media/i2c/ov8856.c
2399
ret = ov8856_init_controls(ov8856);
drivers/media/i2c/ov8856.c
2401
dev_err(ov8856->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov8856.c
2405
ov8856->sd.internal_ops = &ov8856_internal_ops;
drivers/media/i2c/ov8856.c
2406
ov8856->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov8856.c
2407
ov8856->sd.entity.ops = &ov8856_subdev_entity_ops;
drivers/media/i2c/ov8856.c
2408
ov8856->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov8856.c
2409
ov8856->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov8856.c
2410
ret = media_entity_pads_init(&ov8856->sd.entity, 1, &ov8856->pad);
drivers/media/i2c/ov8856.c
2412
dev_err(ov8856->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov8856.c
2416
ret = v4l2_async_register_subdev_sensor(&ov8856->sd);
drivers/media/i2c/ov8856.c
2418
dev_err(ov8856->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov8856.c
2425
pm_runtime_set_active(ov8856->dev);
drivers/media/i2c/ov8856.c
2426
pm_runtime_enable(ov8856->dev);
drivers/media/i2c/ov8856.c
2427
pm_runtime_idle(ov8856->dev);
drivers/media/i2c/ov8856.c
2432
media_entity_cleanup(&ov8856->sd.entity);
drivers/media/i2c/ov8856.c
2435
v4l2_ctrl_handler_free(ov8856->sd.ctrl_handler);
drivers/media/i2c/ov8856.c
2436
mutex_destroy(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2439
ov8856_power_off(ov8856->dev);