Symbol: ov8856
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
1890
struct i2c_client *client = v4l2_get_subdevdata(&ov8856->sd);
drivers/media/i2c/ov8856.c
1896
ctrl_hdlr = &ov8856->ctrl_handler;
drivers/media/i2c/ov8856.c
1901
ctrl_hdlr->lock = &ov8856->mutex;
drivers/media/i2c/ov8856.c
1902
ov8856->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1905
(ov8856->priv_lane->link_freq_menu_items)
drivers/media/i2c/ov8856.c
1907
0, ov8856->priv_lane->link_freq_menu_items);
drivers/media/i2c/ov8856.c
1908
if (ov8856->link_freq)
drivers/media/i2c/ov8856.c
1909
ov8856->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov8856.c
1911
ov8856->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1913
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1915
ov8856->cur_mode->data_lanes), 1,
drivers/media/i2c/ov8856.c
1916
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1918
ov8856->cur_mode->data_lanes));
drivers/media/i2c/ov8856.c
1919
ov8856->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1921
ov8856->cur_mode->vts_min - ov8856->cur_mode->height,
drivers/media/i2c/ov8856.c
1922
OV8856_VTS_MAX - ov8856->cur_mode->height, 1,
drivers/media/i2c/ov8856.c
1923
ov8856->cur_mode->vts_def -
drivers/media/i2c/ov8856.c
1924
ov8856->cur_mode->height);
drivers/media/i2c/ov8856.c
1925
h_blank = to_pixels_per_line(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
1926
ov8856->cur_mode->hts,
drivers/media/i2c/ov8856.c
1927
ov8856->cur_mode->link_freq_index,
drivers/media/i2c/ov8856.c
1928
ov8856->cur_mode->data_lanes) -
drivers/media/i2c/ov8856.c
1929
ov8856->cur_mode->width;
drivers/media/i2c/ov8856.c
1930
ov8856->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1933
if (ov8856->hblank)
drivers/media/i2c/ov8856.c
1934
ov8856->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov8856.c
1942
exposure_max = ov8856->cur_mode->vts_def - OV8856_EXPOSURE_MAX_MARGIN;
drivers/media/i2c/ov8856.c
1943
ov8856->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov8856_ctrl_ops,
drivers/media/i2c/ov8856.c
1970
ov8856->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov8856.c
1979
static void ov8856_update_pad_format(struct ov8856 *ov8856,
drivers/media/i2c/ov8856.c
1993
ov8856->cur_mbus_index = index;
drivers/media/i2c/ov8856.c
1997
static int ov8856_start_streaming(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
2002
ret = ov8856_identify_module(ov8856);
drivers/media/i2c/ov8856.c
2006
link_freq_index = ov8856->cur_mode->link_freq_index;
drivers/media/i2c/ov8856.c
2007
reg_list = &ov8856->priv_lane->link_freq_configs[link_freq_index].reg_list;
drivers/media/i2c/ov8856.c
2009
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
2011
dev_err(ov8856->dev, "failed to set plls");
drivers/media/i2c/ov8856.c
2015
reg_list = &ov8856->cur_mode->reg_list;
drivers/media/i2c/ov8856.c
2016
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
2018
dev_err(ov8856->dev, "failed to set mode");
drivers/media/i2c/ov8856.c
2022
reg_list = &bayer_offset_configs[ov8856->cur_mbus_index];
drivers/media/i2c/ov8856.c
2023
ret = ov8856_write_reg_list(ov8856, reg_list);
drivers/media/i2c/ov8856.c
2025
dev_err(ov8856->dev, "failed to set mbus format");
drivers/media/i2c/ov8856.c
2029
ret = __v4l2_ctrl_handler_setup(ov8856->sd.ctrl_handler);
drivers/media/i2c/ov8856.c
2033
ret = ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
drivers/media/i2c/ov8856.c
2036
dev_err(ov8856->dev, "failed to set stream");
drivers/media/i2c/ov8856.c
2043
static void ov8856_stop_streaming(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
2045
if (ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
drivers/media/i2c/ov8856.c
2047
dev_err(ov8856->dev, "failed to set stream");
drivers/media/i2c/ov8856.c
2052
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2055
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2057
ret = pm_runtime_resume_and_get(ov8856->dev);
drivers/media/i2c/ov8856.c
2059
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2063
ret = ov8856_start_streaming(ov8856);
drivers/media/i2c/ov8856.c
2066
ov8856_stop_streaming(ov8856);
drivers/media/i2c/ov8856.c
2067
pm_runtime_put(ov8856->dev);
drivers/media/i2c/ov8856.c
2070
ov8856_stop_streaming(ov8856);
drivers/media/i2c/ov8856.c
2071
pm_runtime_put(ov8856->dev);
drivers/media/i2c/ov8856.c
2074
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2082
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2088
ret = clk_prepare_enable(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2094
if (ov8856->reset_gpio) {
drivers/media/i2c/ov8856.c
2095
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2100
ov8856->supplies);
drivers/media/i2c/ov8856.c
2106
gpiod_set_value_cansleep(ov8856->reset_gpio, 0);
drivers/media/i2c/ov8856.c
2112
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2113
clk_disable_unprepare(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2121
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2126
gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
drivers/media/i2c/ov8856.c
2128
ov8856->supplies);
drivers/media/i2c/ov8856.c
2129
clk_disable_unprepare(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2138
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2142
mode = v4l2_find_nearest_size(ov8856->priv_lane->supported_modes,
drivers/media/i2c/ov8856.c
2143
ov8856->modes_size,
drivers/media/i2c/ov8856.c
2147
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2148
ov8856_update_pad_format(ov8856, mode, &fmt->format);
drivers/media/i2c/ov8856.c
2152
ov8856->cur_mode = mode;
drivers/media/i2c/ov8856.c
2153
__v4l2_ctrl_s_ctrl(ov8856->link_freq, mode->link_freq_index);
drivers/media/i2c/ov8856.c
2154
__v4l2_ctrl_s_ctrl_int64(ov8856->pixel_rate,
drivers/media/i2c/ov8856.c
2155
to_rate(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
2157
ov8856->cur_mode->data_lanes));
drivers/media/i2c/ov8856.c
2161
__v4l2_ctrl_modify_range(ov8856->vblank,
drivers/media/i2c/ov8856.c
2165
__v4l2_ctrl_s_ctrl(ov8856->vblank, vblank_def);
drivers/media/i2c/ov8856.c
2166
h_blank = to_pixels_per_line(ov8856->priv_lane->link_freq_menu_items,
drivers/media/i2c/ov8856.c
2169
ov8856->cur_mode->data_lanes)
drivers/media/i2c/ov8856.c
2171
__v4l2_ctrl_modify_range(ov8856->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov8856.c
2175
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2184
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2186
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2191
ov8856_update_pad_format(ov8856, ov8856->cur_mode, &fmt->format);
drivers/media/i2c/ov8856.c
2193
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2214
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2217
if (fse->index >= ov8856->modes_size)
drivers/media/i2c/ov8856.c
2226
fse->min_width = ov8856->priv_lane->supported_modes[fse->index].width;
drivers/media/i2c/ov8856.c
2228
fse->min_height = ov8856->priv_lane->supported_modes[fse->index].height;
drivers/media/i2c/ov8856.c
2236
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2238
mutex_lock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2239
ov8856_update_pad_format(ov8856, &ov8856->priv_lane->supported_modes[0],
drivers/media/i2c/ov8856.c
2241
mutex_unlock(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2271
static int ov8856_get_hwcfg(struct ov8856 *ov8856)
drivers/media/i2c/ov8856.c
2273
struct device *dev = ov8856->dev;
drivers/media/i2c/ov8856.c
2286
ov8856->xvclk = devm_v4l2_sensor_clk_get_legacy(dev, "xvclk", false, 0);
drivers/media/i2c/ov8856.c
2287
if (IS_ERR(ov8856->xvclk))
drivers/media/i2c/ov8856.c
2288
return dev_err_probe(dev, PTR_ERR(ov8856->xvclk),
drivers/media/i2c/ov8856.c
2291
xvclk_rate = clk_get_rate(ov8856->xvclk);
drivers/media/i2c/ov8856.c
2297
ov8856->reset_gpio = devm_gpiod_get_optional(dev, "reset",
drivers/media/i2c/ov8856.c
2299
if (IS_ERR(ov8856->reset_gpio))
drivers/media/i2c/ov8856.c
2300
return PTR_ERR(ov8856->reset_gpio);
drivers/media/i2c/ov8856.c
2303
ov8856->supplies[i].supply = ov8856_supply_names[i];
drivers/media/i2c/ov8856.c
2307
ov8856->supplies);
drivers/media/i2c/ov8856.c
2330
dev_dbg(dev, "Using %u data lanes\n", ov8856->cur_mode->data_lanes);
drivers/media/i2c/ov8856.c
2333
ov8856->priv_lane = &lane_cfg_2;
drivers/media/i2c/ov8856.c
2335
ov8856->priv_lane = &lane_cfg_4;
drivers/media/i2c/ov8856.c
2337
ov8856->modes_size = ov8856_modes_num(ov8856);
drivers/media/i2c/ov8856.c
2345
for (i = 0; i < ARRAY_SIZE(ov8856->priv_lane->link_freq_menu_items); i++) {
drivers/media/i2c/ov8856.c
2347
if (ov8856->priv_lane->link_freq_menu_items[i] ==
drivers/media/i2c/ov8856.c
2354
ov8856->priv_lane->link_freq_menu_items[i]);
drivers/media/i2c/ov8856.c
2369
struct ov8856 *ov8856 = to_ov8856(sd);
drivers/media/i2c/ov8856.c
2374
pm_runtime_disable(ov8856->dev);
drivers/media/i2c/ov8856.c
2375
mutex_destroy(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2377
ov8856_power_off(ov8856->dev);
drivers/media/i2c/ov8856.c
2382
struct ov8856 *ov8856;
drivers/media/i2c/ov8856.c
2386
ov8856 = devm_kzalloc(&client->dev, sizeof(*ov8856), GFP_KERNEL);
drivers/media/i2c/ov8856.c
2387
if (!ov8856)
drivers/media/i2c/ov8856.c
2390
ov8856->dev = &client->dev;
drivers/media/i2c/ov8856.c
2392
ret = ov8856_get_hwcfg(ov8856);
drivers/media/i2c/ov8856.c
2396
v4l2_i2c_subdev_init(&ov8856->sd, client, &ov8856_subdev_ops);
drivers/media/i2c/ov8856.c
2398
full_power = acpi_dev_state_d0(ov8856->dev);
drivers/media/i2c/ov8856.c
2400
ret = ov8856_power_on(ov8856->dev);
drivers/media/i2c/ov8856.c
2402
dev_err(ov8856->dev, "failed to power on\n");
drivers/media/i2c/ov8856.c
2406
ret = ov8856_identify_module(ov8856);
drivers/media/i2c/ov8856.c
2408
dev_err(ov8856->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov8856.c
2413
mutex_init(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2414
ov8856->cur_mode = &ov8856->priv_lane->supported_modes[0];
drivers/media/i2c/ov8856.c
2415
ov8856->cur_mbus_index = ov8856->cur_mode->default_mbus_index;
drivers/media/i2c/ov8856.c
2416
ret = ov8856_init_controls(ov8856);
drivers/media/i2c/ov8856.c
2418
dev_err(ov8856->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov8856.c
2422
ov8856->sd.internal_ops = &ov8856_internal_ops;
drivers/media/i2c/ov8856.c
2423
ov8856->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov8856.c
2424
ov8856->sd.entity.ops = &ov8856_subdev_entity_ops;
drivers/media/i2c/ov8856.c
2425
ov8856->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov8856.c
2426
ov8856->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov8856.c
2427
ret = media_entity_pads_init(&ov8856->sd.entity, 1, &ov8856->pad);
drivers/media/i2c/ov8856.c
2429
dev_err(ov8856->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov8856.c
2433
ret = v4l2_async_register_subdev_sensor(&ov8856->sd);
drivers/media/i2c/ov8856.c
2435
dev_err(ov8856->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov8856.c
2442
pm_runtime_set_active(ov8856->dev);
drivers/media/i2c/ov8856.c
2443
pm_runtime_enable(ov8856->dev);
drivers/media/i2c/ov8856.c
2444
pm_runtime_idle(ov8856->dev);
drivers/media/i2c/ov8856.c
2449
media_entity_cleanup(&ov8856->sd.entity);
drivers/media/i2c/ov8856.c
2452
v4l2_ctrl_handler_free(ov8856->sd.ctrl_handler);
drivers/media/i2c/ov8856.c
2453
mutex_destroy(&ov8856->mutex);
drivers/media/i2c/ov8856.c
2456
ov8856_power_off(ov8856->dev);