Lines Matching defs:hi846
1153 struct hi846 {
1175 static inline struct hi846 *to_hi846(struct v4l2_subdev *sd)
1177 return container_of(sd, struct hi846, sd);
1195 static inline u8 hi846_get_link_freq_index(struct hi846 *hi846)
1197 return hi846->cur_mode->link_freq_index;
1200 static u64 hi846_get_link_freq(struct hi846 *hi846)
1202 u8 index = hi846_get_link_freq_index(hi846);
1207 static u64 hi846_calc_pixel_rate(struct hi846 *hi846)
1209 u64 link_freq = hi846_get_link_freq(hi846);
1210 u64 pixel_rate = link_freq * 2 * hi846->nr_lanes;
1217 static int hi846_read_reg(struct hi846 *hi846, u16 reg, u8 *val)
1219 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1246 static int hi846_write_reg(struct hi846 *hi846, u16 reg, u8 val)
1248 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1265 static void hi846_write_reg_16(struct hi846 *hi846, u16 reg, u16 val, int *err)
1267 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1284 static int hi846_write_reg_list(struct hi846 *hi846,
1287 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1292 hi846_write_reg_16(hi846, r_list->regs[i].address,
1305 static int hi846_update_digital_gain(struct hi846 *hi846, u16 d_gain)
1309 hi846_write_reg_16(hi846, HI846_REG_MWB_GR_GAIN_H, d_gain, &ret);
1310 hi846_write_reg_16(hi846, HI846_REG_MWB_GB_GAIN_H, d_gain, &ret);
1311 hi846_write_reg_16(hi846, HI846_REG_MWB_R_GAIN_H, d_gain, &ret);
1312 hi846_write_reg_16(hi846, HI846_REG_MWB_B_GAIN_H, d_gain, &ret);
1317 static int hi846_test_pattern(struct hi846 *hi846, u32 pattern)
1323 ret = hi846_read_reg(hi846, HI846_REG_ISP, &val);
1327 ret = hi846_write_reg(hi846, HI846_REG_ISP,
1333 return hi846_write_reg(hi846, HI846_REG_TEST_PATTERN, pattern);
1338 struct hi846 *hi846 = container_of(ctrl->handler,
1339 struct hi846, ctrl_handler);
1340 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1348 exposure_max = hi846->cur_mode->height + ctrl->val -
1350 __v4l2_ctrl_modify_range(hi846->exposure,
1351 hi846->exposure->minimum,
1352 exposure_max, hi846->exposure->step,
1362 ret = hi846_write_reg(hi846, HI846_REG_ANALOG_GAIN, ctrl->val);
1366 ret = hi846_update_digital_gain(hi846, ctrl->val);
1371 frame_len = hi846->cur_mode->frame_len;
1385 hi846_write_reg_16(hi846, HI846_REG_FLL, frame_len, &ret);
1386 hi846_write_reg_16(hi846, HI846_REG_EXPOSURE, shutter, &ret);
1391 hi846_write_reg_16(hi846, HI846_REG_FLL,
1392 hi846->cur_mode->height + ctrl->val, &ret);
1395 ret = hi846_test_pattern(hi846, ctrl->val);
1412 static int hi846_init_controls(struct hi846 *hi846)
1417 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1420 ctrl_hdlr = &hi846->ctrl_handler;
1425 ctrl_hdlr->lock = &hi846->mutex;
1427 hi846->link_freq =
1432 if (hi846->link_freq)
1433 hi846->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1435 hi846->pixel_rate =
1438 hi846_calc_pixel_rate(hi846), 1,
1439 hi846_calc_pixel_rate(hi846));
1440 hi846->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
1442 hi846->cur_mode->frame_len -
1443 hi846->cur_mode->height,
1445 hi846->cur_mode->height, 1,
1446 hi846->cur_mode->frame_len -
1447 hi846->cur_mode->height);
1449 h_blank = hi846->cur_mode->llp - hi846->cur_mode->width;
1451 hi846->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
1454 if (hi846->hblank)
1455 hi846->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1463 exposure_max = hi846->cur_mode->frame_len - HI846_EXPOSURE_MAX_MARGIN;
1464 hi846->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi846_ctrl_ops,
1489 hi846->sd.ctrl_handler = ctrl_hdlr;
1498 static int hi846_set_video_mode(struct hi846 *hi846, int fps)
1500 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1504 u64 link_freq = hi846_get_link_freq(hi846);
1507 hi846_get_link_freq(hi846));
1513 dummy_lines = (frame_length > hi846->cur_mode->frame_len) ?
1514 (frame_length - hi846->cur_mode->frame_len) : 0;
1516 frame_length = hi846->cur_mode->frame_len + dummy_lines;
1521 hi846_write_reg_16(hi846, HI846_REG_FLL, frame_length & 0xFFFF, &ret);
1522 hi846_write_reg_16(hi846, HI846_REG_LLP,
1528 static int hi846_start_streaming(struct hi846 *hi846)
1530 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1534 if (hi846->nr_lanes == 2)
1535 ret = hi846_write_reg_list(hi846, &hi846_init_regs_list_2lane);
1537 ret = hi846_write_reg_list(hi846, &hi846_init_regs_list_4lane);
1543 ret = hi846_write_reg_list(hi846, &hi846->cur_mode->reg_list_config);
1549 if (hi846->nr_lanes == 2)
1550 ret = hi846_write_reg_list(hi846,
1551 &hi846->cur_mode->reg_list_2lane);
1553 ret = hi846_write_reg_list(hi846,
1554 &hi846->cur_mode->reg_list_4lane);
1560 hi846_set_video_mode(hi846, hi846->cur_mode->fps);
1562 ret = __v4l2_ctrl_handler_setup(hi846->sd.ctrl_handler);
1574 ret = hi846_read_reg(hi846, 0x0034, &val);
1580 ret = hi846_write_reg(hi846, HI846_REG_MODE_SELECT,
1587 hi846->streaming = 1;
1594 static void hi846_stop_streaming(struct hi846 *hi846)
1596 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1598 if (hi846_write_reg(hi846, HI846_REG_MODE_SELECT, HI846_MODE_STANDBY))
1601 hi846->streaming = 0;
1606 struct hi846 *hi846 = to_hi846(sd);
1610 if (hi846->streaming == enable)
1613 mutex_lock(&hi846->mutex);
1622 ret = hi846_start_streaming(hi846);
1626 hi846_stop_streaming(hi846);
1631 mutex_unlock(&hi846->mutex);
1636 static int hi846_power_on(struct hi846 *hi846)
1640 ret = regulator_bulk_enable(HI846_NUM_SUPPLIES, hi846->supplies);
1644 ret = clk_prepare_enable(hi846->clock);
1648 if (hi846->shutdown_gpio)
1649 gpiod_set_value_cansleep(hi846->shutdown_gpio, 0);
1653 if (hi846->rst_gpio)
1654 gpiod_set_value_cansleep(hi846->rst_gpio, 0);
1660 regulator_bulk_disable(HI846_NUM_SUPPLIES, hi846->supplies);
1665 static int hi846_power_off(struct hi846 *hi846)
1667 if (hi846->rst_gpio)
1668 gpiod_set_value_cansleep(hi846->rst_gpio, 1);
1670 if (hi846->shutdown_gpio)
1671 gpiod_set_value_cansleep(hi846->shutdown_gpio, 1);
1673 clk_disable_unprepare(hi846->clock);
1674 return regulator_bulk_disable(HI846_NUM_SUPPLIES, hi846->supplies);
1681 struct hi846 *hi846 = to_hi846(sd);
1683 if (hi846->streaming)
1684 hi846_stop_streaming(hi846);
1686 return hi846_power_off(hi846);
1693 struct hi846 *hi846 = to_hi846(sd);
1696 ret = hi846_power_on(hi846);
1700 if (hi846->streaming) {
1701 ret = hi846_start_streaming(hi846);
1712 hi846_power_off(hi846);
1720 struct hi846 *hi846 = to_hi846(sd);
1738 if (hi846->nr_lanes == 2) {
1739 if (!hi846->cur_mode->reg_list_2lane.num_of_regs) {
1745 if (!hi846->cur_mode->reg_list_4lane.num_of_regs) {
1752 mutex_lock(&hi846->mutex);
1754 if (hi846->streaming) {
1755 mutex_unlock(&hi846->mutex);
1759 hi846->fmt = fmt;
1761 hi846->cur_mode =
1766 hi846->cur_mode->width, hi846->cur_mode->height);
1768 tgt_fps = hi846->cur_mode->fps;
1771 mf->width = hi846->cur_mode->width;
1772 mf->height = hi846->cur_mode->height;
1776 __v4l2_ctrl_s_ctrl(hi846->link_freq, hi846_get_link_freq_index(hi846));
1777 __v4l2_ctrl_s_ctrl_int64(hi846->pixel_rate,
1778 hi846_calc_pixel_rate(hi846));
1781 vblank_def = hi846->cur_mode->frame_len - hi846->cur_mode->height;
1782 __v4l2_ctrl_modify_range(hi846->vblank,
1783 hi846->cur_mode->frame_len -
1784 hi846->cur_mode->height,
1785 HI846_FLL_MAX - hi846->cur_mode->height, 1,
1787 __v4l2_ctrl_s_ctrl(hi846->vblank, vblank_def);
1789 h_blank = hi846->cur_mode->llp - hi846->cur_mode->width;
1791 __v4l2_ctrl_modify_range(hi846->hblank, h_blank, h_blank, 1,
1798 mutex_unlock(&hi846->mutex);
1807 struct hi846 *hi846 = to_hi846(sd);
1812 format->format = *v4l2_subdev_get_try_format(&hi846->sd,
1818 mutex_lock(&hi846->mutex);
1822 mf->width = hi846->cur_mode->width;
1823 mf->height = hi846->cur_mode->height;
1824 mutex_unlock(&hi846->mutex);
1873 struct hi846 *hi846 = to_hi846(sd);
1878 mutex_lock(&hi846->mutex);
1884 sel->r = hi846->cur_mode->crop;
1887 mutex_unlock(&hi846->mutex);
1904 struct hi846 *hi846 = to_hi846(sd);
1909 mutex_lock(&hi846->mutex);
1913 mf->width = hi846->cur_mode->width;
1914 mf->height = hi846->cur_mode->height;
1915 mutex_unlock(&hi846->mutex);
1942 static int hi846_identify_module(struct hi846 *hi846)
1944 struct i2c_client *client = v4l2_get_subdevdata(&hi846->sd);
1948 ret = hi846_read_reg(hi846, HI846_REG_CHIP_ID_L, &lo);
1957 ret = hi846_read_reg(hi846, HI846_REG_CHIP_ID_H, &hi);
1967 hi, lo, hi846->nr_lanes);
1972 static s64 hi846_check_link_freqs(struct hi846 *hi846,
1990 static int hi846_parse_dt(struct hi846 *hi846, struct device *dev)
2021 hi846->nr_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
2030 fq = hi846_check_link_freqs(hi846, &bus_cfg);
2039 hi846->rst_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
2040 if (IS_ERR(hi846->rst_gpio)) {
2042 hi846->rst_gpio);
2043 return PTR_ERR(hi846->rst_gpio);
2046 hi846->shutdown_gpio = devm_gpiod_get_optional(dev, "shutdown",
2048 if (IS_ERR(hi846->shutdown_gpio)) {
2050 hi846->shutdown_gpio);
2051 return PTR_ERR(hi846->shutdown_gpio);
2063 struct hi846 *hi846;
2068 hi846 = devm_kzalloc(&client->dev, sizeof(*hi846), GFP_KERNEL);
2069 if (!hi846)
2072 ret = hi846_parse_dt(hi846, &client->dev);
2079 hi846->clock = devm_clk_get(&client->dev, NULL);
2080 if (IS_ERR(hi846->clock)) {
2082 hi846->clock);
2083 return PTR_ERR(hi846->clock);
2086 mclk_freq = clk_get_rate(hi846->clock);
2093 hi846->supplies[i].supply = hi846_supply_names[i];
2096 hi846->supplies);
2100 v4l2_i2c_subdev_init(&hi846->sd, client, &hi846_subdev_ops);
2102 mutex_init(&hi846->mutex);
2104 ret = hi846_power_on(hi846);
2108 ret = hi846_identify_module(hi846);
2112 hi846->cur_mode = &supported_modes[0];
2114 ret = hi846_init_controls(hi846);
2120 hi846->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2121 hi846->sd.entity.ops = &hi846_subdev_entity_ops;
2122 hi846->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2123 hi846->pad.flags = MEDIA_PAD_FL_SOURCE;
2124 ret = media_entity_pads_init(&hi846->sd.entity, 1, &hi846->pad);
2130 ret = v4l2_async_register_subdev_sensor(&hi846->sd);
2144 media_entity_cleanup(&hi846->sd.entity);
2147 v4l2_ctrl_handler_free(hi846->sd.ctrl_handler);
2150 hi846_power_off(hi846);
2153 mutex_destroy(&hi846->mutex);
2161 struct hi846 *hi846 = to_hi846(sd);
2172 mutex_destroy(&hi846->mutex);
2182 { .compatible = "hynix,hi846", },
2189 .name = "hi846",