Symbol: hi846
drivers/media/i2c/hi846.c
1175
static inline struct hi846 *to_hi846(struct v4l2_subdev *sd)
drivers/media/i2c/hi846.c
1177
return container_of(sd, struct hi846, sd);
drivers/media/i2c/hi846.c
1195
static inline u8 hi846_get_link_freq_index(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1197
return hi846->cur_mode->link_freq_index;
drivers/media/i2c/hi846.c
1200
static u64 hi846_get_link_freq(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1202
u8 index = hi846_get_link_freq_index(hi846);
drivers/media/i2c/hi846.c
1207
static u64 hi846_calc_pixel_rate(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1209
u64 link_freq = hi846_get_link_freq(hi846);
drivers/media/i2c/hi846.c
1210
u64 pixel_rate = link_freq * 2 * hi846->nr_lanes;
drivers/media/i2c/hi846.c
1217
static int hi846_read_reg(struct hi846 *hi846, u16 reg, u8 *val)
drivers/media/i2c/hi846.c
1219
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1246
static int hi846_write_reg(struct hi846 *hi846, u16 reg, u8 val)
drivers/media/i2c/hi846.c
1248
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1265
static void hi846_write_reg_16(struct hi846 *hi846, u16 reg, u16 val, int *err)
drivers/media/i2c/hi846.c
1267
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1284
static int hi846_write_reg_list(struct hi846 *hi846,
drivers/media/i2c/hi846.c
1287
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1292
hi846_write_reg_16(hi846, r_list->regs[i].address,
drivers/media/i2c/hi846.c
1305
static int hi846_update_digital_gain(struct hi846 *hi846, u16 d_gain)
drivers/media/i2c/hi846.c
1309
hi846_write_reg_16(hi846, HI846_REG_MWB_GR_GAIN_H, d_gain, &ret);
drivers/media/i2c/hi846.c
1310
hi846_write_reg_16(hi846, HI846_REG_MWB_GB_GAIN_H, d_gain, &ret);
drivers/media/i2c/hi846.c
1311
hi846_write_reg_16(hi846, HI846_REG_MWB_R_GAIN_H, d_gain, &ret);
drivers/media/i2c/hi846.c
1312
hi846_write_reg_16(hi846, HI846_REG_MWB_B_GAIN_H, d_gain, &ret);
drivers/media/i2c/hi846.c
1317
static int hi846_test_pattern(struct hi846 *hi846, u32 pattern)
drivers/media/i2c/hi846.c
1323
ret = hi846_read_reg(hi846, HI846_REG_ISP, &val);
drivers/media/i2c/hi846.c
1327
ret = hi846_write_reg(hi846, HI846_REG_ISP,
drivers/media/i2c/hi846.c
1333
return hi846_write_reg(hi846, HI846_REG_TEST_PATTERN, pattern);
drivers/media/i2c/hi846.c
1338
struct hi846 *hi846 = container_of(ctrl->handler,
drivers/media/i2c/hi846.c
1339
struct hi846, ctrl_handler);
drivers/media/i2c/hi846.c
1340
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1348
exposure_max = hi846->cur_mode->height + ctrl->val -
drivers/media/i2c/hi846.c
1350
__v4l2_ctrl_modify_range(hi846->exposure,
drivers/media/i2c/hi846.c
1351
hi846->exposure->minimum,
drivers/media/i2c/hi846.c
1352
exposure_max, hi846->exposure->step,
drivers/media/i2c/hi846.c
1362
ret = hi846_write_reg(hi846, HI846_REG_ANALOG_GAIN, ctrl->val);
drivers/media/i2c/hi846.c
1366
ret = hi846_update_digital_gain(hi846, ctrl->val);
drivers/media/i2c/hi846.c
1371
frame_len = hi846->cur_mode->frame_len;
drivers/media/i2c/hi846.c
1385
hi846_write_reg_16(hi846, HI846_REG_FLL, frame_len, &ret);
drivers/media/i2c/hi846.c
1386
hi846_write_reg_16(hi846, HI846_REG_EXPOSURE, shutter, &ret);
drivers/media/i2c/hi846.c
1391
hi846_write_reg_16(hi846, HI846_REG_FLL,
drivers/media/i2c/hi846.c
1392
hi846->cur_mode->height + ctrl->val, &ret);
drivers/media/i2c/hi846.c
1395
ret = hi846_test_pattern(hi846, ctrl->val);
drivers/media/i2c/hi846.c
1412
static int hi846_init_controls(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1417
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1420
ctrl_hdlr = &hi846->ctrl_handler;
drivers/media/i2c/hi846.c
1425
ctrl_hdlr->lock = &hi846->mutex;
drivers/media/i2c/hi846.c
1427
hi846->link_freq =
drivers/media/i2c/hi846.c
1432
if (hi846->link_freq)
drivers/media/i2c/hi846.c
1433
hi846->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi846.c
1435
hi846->pixel_rate =
drivers/media/i2c/hi846.c
1438
hi846_calc_pixel_rate(hi846), 1,
drivers/media/i2c/hi846.c
1439
hi846_calc_pixel_rate(hi846));
drivers/media/i2c/hi846.c
1440
hi846->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
drivers/media/i2c/hi846.c
1442
hi846->cur_mode->frame_len -
drivers/media/i2c/hi846.c
1443
hi846->cur_mode->height,
drivers/media/i2c/hi846.c
1445
hi846->cur_mode->height, 1,
drivers/media/i2c/hi846.c
1446
hi846->cur_mode->frame_len -
drivers/media/i2c/hi846.c
1447
hi846->cur_mode->height);
drivers/media/i2c/hi846.c
1449
h_blank = hi846->cur_mode->llp - hi846->cur_mode->width;
drivers/media/i2c/hi846.c
1451
hi846->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
drivers/media/i2c/hi846.c
1454
if (hi846->hblank)
drivers/media/i2c/hi846.c
1455
hi846->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi846.c
1463
exposure_max = hi846->cur_mode->frame_len - HI846_EXPOSURE_MAX_MARGIN;
drivers/media/i2c/hi846.c
1464
hi846->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
drivers/media/i2c/hi846.c
1489
hi846->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/hi846.c
1498
static int hi846_set_video_mode(struct hi846 *hi846, int fps)
drivers/media/i2c/hi846.c
1500
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1504
u64 link_freq = hi846_get_link_freq(hi846);
drivers/media/i2c/hi846.c
1507
hi846_get_link_freq(hi846));
drivers/media/i2c/hi846.c
1513
dummy_lines = (frame_length > hi846->cur_mode->frame_len) ?
drivers/media/i2c/hi846.c
1514
(frame_length - hi846->cur_mode->frame_len) : 0;
drivers/media/i2c/hi846.c
1516
frame_length = hi846->cur_mode->frame_len + dummy_lines;
drivers/media/i2c/hi846.c
1521
hi846_write_reg_16(hi846, HI846_REG_FLL, frame_length & 0xFFFF, &ret);
drivers/media/i2c/hi846.c
1522
hi846_write_reg_16(hi846, HI846_REG_LLP,
drivers/media/i2c/hi846.c
1528
static int hi846_start_streaming(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1530
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1534
if (hi846->nr_lanes == 2)
drivers/media/i2c/hi846.c
1535
ret = hi846_write_reg_list(hi846, &hi846_init_regs_list_2lane);
drivers/media/i2c/hi846.c
1537
ret = hi846_write_reg_list(hi846, &hi846_init_regs_list_4lane);
drivers/media/i2c/hi846.c
1543
ret = hi846_write_reg_list(hi846, &hi846->cur_mode->reg_list_config);
drivers/media/i2c/hi846.c
1549
if (hi846->nr_lanes == 2)
drivers/media/i2c/hi846.c
1550
ret = hi846_write_reg_list(hi846,
drivers/media/i2c/hi846.c
1551
&hi846->cur_mode->reg_list_2lane);
drivers/media/i2c/hi846.c
1553
ret = hi846_write_reg_list(hi846,
drivers/media/i2c/hi846.c
1554
&hi846->cur_mode->reg_list_4lane);
drivers/media/i2c/hi846.c
1560
hi846_set_video_mode(hi846, hi846->cur_mode->fps);
drivers/media/i2c/hi846.c
1562
ret = __v4l2_ctrl_handler_setup(hi846->sd.ctrl_handler);
drivers/media/i2c/hi846.c
1574
ret = hi846_read_reg(hi846, 0x0034, &val);
drivers/media/i2c/hi846.c
1580
ret = hi846_write_reg(hi846, HI846_REG_MODE_SELECT,
drivers/media/i2c/hi846.c
1587
hi846->streaming = 1;
drivers/media/i2c/hi846.c
1594
static void hi846_stop_streaming(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1596
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1598
if (hi846_write_reg(hi846, HI846_REG_MODE_SELECT, HI846_MODE_STANDBY))
drivers/media/i2c/hi846.c
1601
hi846->streaming = 0;
drivers/media/i2c/hi846.c
1606
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1610
mutex_lock(&hi846->mutex);
drivers/media/i2c/hi846.c
1617
ret = hi846_start_streaming(hi846);
drivers/media/i2c/hi846.c
1621
hi846_stop_streaming(hi846);
drivers/media/i2c/hi846.c
1626
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1631
static int hi846_power_on(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1635
ret = regulator_bulk_enable(HI846_NUM_SUPPLIES, hi846->supplies);
drivers/media/i2c/hi846.c
1639
ret = clk_prepare_enable(hi846->clock);
drivers/media/i2c/hi846.c
1643
if (hi846->shutdown_gpio)
drivers/media/i2c/hi846.c
1644
gpiod_set_value_cansleep(hi846->shutdown_gpio, 0);
drivers/media/i2c/hi846.c
1648
if (hi846->rst_gpio)
drivers/media/i2c/hi846.c
1649
gpiod_set_value_cansleep(hi846->rst_gpio, 0);
drivers/media/i2c/hi846.c
1655
regulator_bulk_disable(HI846_NUM_SUPPLIES, hi846->supplies);
drivers/media/i2c/hi846.c
1660
static int hi846_power_off(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1662
if (hi846->rst_gpio)
drivers/media/i2c/hi846.c
1663
gpiod_set_value_cansleep(hi846->rst_gpio, 1);
drivers/media/i2c/hi846.c
1665
if (hi846->shutdown_gpio)
drivers/media/i2c/hi846.c
1666
gpiod_set_value_cansleep(hi846->shutdown_gpio, 1);
drivers/media/i2c/hi846.c
1668
clk_disable_unprepare(hi846->clock);
drivers/media/i2c/hi846.c
1669
return regulator_bulk_disable(HI846_NUM_SUPPLIES, hi846->supplies);
drivers/media/i2c/hi846.c
1676
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1678
return hi846_power_off(hi846);
drivers/media/i2c/hi846.c
1685
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1687
return hi846_power_on(hi846);
drivers/media/i2c/hi846.c
1694
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1712
if (hi846->nr_lanes == 2) {
drivers/media/i2c/hi846.c
1713
if (!hi846->cur_mode->reg_list_2lane.num_of_regs) {
drivers/media/i2c/hi846.c
1719
if (!hi846->cur_mode->reg_list_4lane.num_of_regs) {
drivers/media/i2c/hi846.c
1726
mutex_lock(&hi846->mutex);
drivers/media/i2c/hi846.c
1728
if (hi846->streaming) {
drivers/media/i2c/hi846.c
1729
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1733
hi846->fmt = fmt;
drivers/media/i2c/hi846.c
1735
hi846->cur_mode =
drivers/media/i2c/hi846.c
1740
hi846->cur_mode->width, hi846->cur_mode->height);
drivers/media/i2c/hi846.c
1742
tgt_fps = hi846->cur_mode->fps;
drivers/media/i2c/hi846.c
1745
mf->width = hi846->cur_mode->width;
drivers/media/i2c/hi846.c
1746
mf->height = hi846->cur_mode->height;
drivers/media/i2c/hi846.c
1750
__v4l2_ctrl_s_ctrl(hi846->link_freq, hi846_get_link_freq_index(hi846));
drivers/media/i2c/hi846.c
1751
__v4l2_ctrl_s_ctrl_int64(hi846->pixel_rate,
drivers/media/i2c/hi846.c
1752
hi846_calc_pixel_rate(hi846));
drivers/media/i2c/hi846.c
1755
vblank_def = hi846->cur_mode->frame_len - hi846->cur_mode->height;
drivers/media/i2c/hi846.c
1756
__v4l2_ctrl_modify_range(hi846->vblank,
drivers/media/i2c/hi846.c
1757
hi846->cur_mode->frame_len -
drivers/media/i2c/hi846.c
1758
hi846->cur_mode->height,
drivers/media/i2c/hi846.c
1759
HI846_FLL_MAX - hi846->cur_mode->height, 1,
drivers/media/i2c/hi846.c
1761
__v4l2_ctrl_s_ctrl(hi846->vblank, vblank_def);
drivers/media/i2c/hi846.c
1763
h_blank = hi846->cur_mode->llp - hi846->cur_mode->width;
drivers/media/i2c/hi846.c
1765
__v4l2_ctrl_modify_range(hi846->hblank, h_blank, h_blank, 1,
drivers/media/i2c/hi846.c
1772
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1781
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1791
mutex_lock(&hi846->mutex);
drivers/media/i2c/hi846.c
1795
mf->width = hi846->cur_mode->width;
drivers/media/i2c/hi846.c
1796
mf->height = hi846->cur_mode->height;
drivers/media/i2c/hi846.c
1797
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1846
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1851
mutex_lock(&hi846->mutex);
drivers/media/i2c/hi846.c
1857
sel->r = hi846->cur_mode->crop;
drivers/media/i2c/hi846.c
1860
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1877
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
1882
mutex_lock(&hi846->mutex);
drivers/media/i2c/hi846.c
1886
mf->width = hi846->cur_mode->width;
drivers/media/i2c/hi846.c
1887
mf->height = hi846->cur_mode->height;
drivers/media/i2c/hi846.c
1888
mutex_unlock(&hi846->mutex);
drivers/media/i2c/hi846.c
1918
static int hi846_identify_module(struct hi846 *hi846)
drivers/media/i2c/hi846.c
1920
struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
drivers/media/i2c/hi846.c
1924
ret = hi846_read_reg(hi846, HI846_REG_CHIP_ID_L, &lo);
drivers/media/i2c/hi846.c
1933
ret = hi846_read_reg(hi846, HI846_REG_CHIP_ID_H, &hi);
drivers/media/i2c/hi846.c
1943
hi, lo, hi846->nr_lanes);
drivers/media/i2c/hi846.c
1948
static s64 hi846_check_link_freqs(struct hi846 *hi846,
drivers/media/i2c/hi846.c
1966
static int hi846_parse_dt(struct hi846 *hi846, struct device *dev)
drivers/media/i2c/hi846.c
1997
hi846->nr_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
drivers/media/i2c/hi846.c
2006
fq = hi846_check_link_freqs(hi846, &bus_cfg);
drivers/media/i2c/hi846.c
2015
hi846->rst_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/hi846.c
2016
if (IS_ERR(hi846->rst_gpio)) {
drivers/media/i2c/hi846.c
2018
hi846->rst_gpio);
drivers/media/i2c/hi846.c
2019
return PTR_ERR(hi846->rst_gpio);
drivers/media/i2c/hi846.c
2022
hi846->shutdown_gpio = devm_gpiod_get_optional(dev, "shutdown",
drivers/media/i2c/hi846.c
2024
if (IS_ERR(hi846->shutdown_gpio)) {
drivers/media/i2c/hi846.c
2026
hi846->shutdown_gpio);
drivers/media/i2c/hi846.c
2027
return PTR_ERR(hi846->shutdown_gpio);
drivers/media/i2c/hi846.c
2039
struct hi846 *hi846;
drivers/media/i2c/hi846.c
2044
hi846 = devm_kzalloc(&client->dev, sizeof(*hi846), GFP_KERNEL);
drivers/media/i2c/hi846.c
2045
if (!hi846)
drivers/media/i2c/hi846.c
2048
ret = hi846_parse_dt(hi846, &client->dev);
drivers/media/i2c/hi846.c
2055
hi846->clock = devm_v4l2_sensor_clk_get(&client->dev, NULL);
drivers/media/i2c/hi846.c
2056
if (IS_ERR(hi846->clock))
drivers/media/i2c/hi846.c
2057
return dev_err_probe(&client->dev, PTR_ERR(hi846->clock),
drivers/media/i2c/hi846.c
2059
hi846->clock);
drivers/media/i2c/hi846.c
2061
mclk_freq = clk_get_rate(hi846->clock);
drivers/media/i2c/hi846.c
2068
hi846->supplies[i].supply = hi846_supply_names[i];
drivers/media/i2c/hi846.c
2071
hi846->supplies);
drivers/media/i2c/hi846.c
2075
v4l2_i2c_subdev_init(&hi846->sd, client, &hi846_subdev_ops);
drivers/media/i2c/hi846.c
2076
hi846->sd.internal_ops = &hi846_internal_ops;
drivers/media/i2c/hi846.c
2078
mutex_init(&hi846->mutex);
drivers/media/i2c/hi846.c
2080
ret = hi846_power_on(hi846);
drivers/media/i2c/hi846.c
2084
ret = hi846_identify_module(hi846);
drivers/media/i2c/hi846.c
2088
hi846->cur_mode = &supported_modes[0];
drivers/media/i2c/hi846.c
2090
ret = hi846_init_controls(hi846);
drivers/media/i2c/hi846.c
2096
hi846->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/hi846.c
2097
hi846->sd.entity.ops = &hi846_subdev_entity_ops;
drivers/media/i2c/hi846.c
2098
hi846->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/hi846.c
2099
hi846->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/hi846.c
2100
ret = media_entity_pads_init(&hi846->sd.entity, 1, &hi846->pad);
drivers/media/i2c/hi846.c
2106
ret = v4l2_async_register_subdev_sensor(&hi846->sd);
drivers/media/i2c/hi846.c
2120
media_entity_cleanup(&hi846->sd.entity);
drivers/media/i2c/hi846.c
2123
v4l2_ctrl_handler_free(hi846->sd.ctrl_handler);
drivers/media/i2c/hi846.c
2126
hi846_power_off(hi846);
drivers/media/i2c/hi846.c
2129
mutex_destroy(&hi846->mutex);
drivers/media/i2c/hi846.c
2137
struct hi846 *hi846 = to_hi846(sd);
drivers/media/i2c/hi846.c
2148
mutex_destroy(&hi846->mutex);