Lines Matching defs:hi847
122 #define to_hi847(_sd) container_of(_sd, struct hi847, sd)
2168 struct hi847 {
2201 static int hi847_read_reg(struct hi847 *hi847, u16 reg, u16 len, u32 *val)
2203 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2231 static int hi847_write_reg(struct hi847 *hi847, u16 reg, u16 len, u32 val)
2233 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2247 static int hi847_write_reg_list(struct hi847 *hi847,
2250 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2255 ret = hi847_write_reg(hi847, r_list->regs[i].address,
2269 static int hi847_update_digital_gain(struct hi847 *hi847, u32 d_gain)
2273 ret = hi847_write_reg(hi847, HI847_REG_MWB_GR_GAIN,
2278 ret = hi847_write_reg(hi847, HI847_REG_MWB_GB_GAIN,
2283 ret = hi847_write_reg(hi847, HI847_REG_MWB_R_GAIN,
2288 return hi847_write_reg(hi847, HI847_REG_MWB_B_GAIN,
2292 static int hi847_test_pattern(struct hi847 *hi847, u32 pattern)
2298 ret = hi847_read_reg(hi847, HI847_REG_ISP,
2303 ret = hi847_write_reg(hi847, HI847_REG_ISP,
2310 ret = hi847_read_reg(hi847, HI847_REG_TEST_PATTERN,
2315 return hi847_write_reg(hi847, HI847_REG_TEST_PATTERN,
2319 static int hi847_grbg_shift(struct hi847 *hi847)
2346 hflip = hi847->hflip->val;
2347 vflip = hi847->vflip->val;
2349 if (hi847->cur_mode->width == 3264) {
2350 ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
2356 return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
2360 ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
2366 return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
2372 static int hi847_set_ctrl_hflip(struct hi847 *hi847, u32 ctrl_val)
2377 ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
2382 ret = hi847_grbg_shift(hi847);
2386 return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
2391 static int hi847_set_ctrl_vflip(struct hi847 *hi847, u8 ctrl_val)
2396 ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
2401 ret = hi847_grbg_shift(hi847);
2405 return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
2412 struct hi847 *hi847 = container_of(ctrl->handler,
2413 struct hi847, ctrl_handler);
2414 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2421 exposure_max = hi847->cur_mode->height + ctrl->val -
2423 __v4l2_ctrl_modify_range(hi847->exposure,
2424 hi847->exposure->minimum,
2425 exposure_max, hi847->exposure->step,
2435 ret = hi847_write_reg(hi847, HI847_REG_ANALOG_GAIN,
2440 ret = hi847_update_digital_gain(hi847, ctrl->val);
2444 ret = hi847_write_reg(hi847, HI847_REG_EXPOSURE,
2450 ret = hi847_write_reg(hi847, HI847_REG_FLL,
2452 hi847->cur_mode->height + ctrl->val);
2456 ret = hi847_test_pattern(hi847, ctrl->val);
2460 hi847_set_ctrl_hflip(hi847, ctrl->val);
2464 hi847_set_ctrl_vflip(hi847, ctrl->val);
2481 static int hi847_init_controls(struct hi847 *hi847)
2487 ctrl_hdlr = &hi847->ctrl_handler;
2492 ctrl_hdlr->lock = &hi847->mutex;
2493 hi847->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi847_ctrl_ops,
2497 if (hi847->link_freq)
2498 hi847->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2500 hi847->pixel_rate = v4l2_ctrl_new_std
2506 hi847->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2508 hi847->cur_mode->fll_min -
2509 hi847->cur_mode->height,
2511 hi847->cur_mode->height, 1,
2512 hi847->cur_mode->fll_def -
2513 hi847->cur_mode->height);
2515 h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
2517 hi847->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2520 if (hi847->hblank)
2521 hi847->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2529 exposure_max = hi847->cur_mode->fll_def - HI847_EXPOSURE_MAX_MARGIN;
2530 hi847->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2539 hi847->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2541 hi847->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2547 hi847->sd.ctrl_handler = ctrl_hdlr;
2561 static int hi847_start_streaming(struct hi847 *hi847)
2563 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2567 link_freq_index = hi847->cur_mode->link_freq_index;
2569 ret = hi847_write_reg_list(hi847, reg_list);
2575 reg_list = &hi847->cur_mode->reg_list;
2576 ret = hi847_write_reg_list(hi847, reg_list);
2582 ret = __v4l2_ctrl_handler_setup(hi847->sd.ctrl_handler);
2586 ret = hi847_write_reg(hi847, HI847_REG_MODE_TG,
2589 ret = hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
2600 static void hi847_stop_streaming(struct hi847 *hi847)
2602 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2604 if (hi847_write_reg(hi847, HI847_REG_MODE_TG,
2609 if (hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
2617 struct hi847 *hi847 = to_hi847(sd);
2621 if (hi847->streaming == enable)
2624 mutex_lock(&hi847->mutex);
2629 mutex_unlock(&hi847->mutex);
2633 ret = hi847_start_streaming(hi847);
2636 hi847_stop_streaming(hi847);
2640 hi847_stop_streaming(hi847);
2644 hi847->streaming = enable;
2645 mutex_unlock(&hi847->mutex);
2654 struct hi847 *hi847 = to_hi847(sd);
2656 mutex_lock(&hi847->mutex);
2657 if (hi847->streaming)
2658 hi847_stop_streaming(hi847);
2660 mutex_unlock(&hi847->mutex);
2669 struct hi847 *hi847 = to_hi847(sd);
2672 mutex_lock(&hi847->mutex);
2673 if (hi847->streaming) {
2674 ret = hi847_start_streaming(hi847);
2679 mutex_unlock(&hi847->mutex);
2684 hi847_stop_streaming(hi847);
2685 hi847->streaming = 0;
2686 mutex_unlock(&hi847->mutex);
2694 struct hi847 *hi847 = to_hi847(sd);
2703 mutex_lock(&hi847->mutex);
2709 hi847->cur_mode = mode;
2710 __v4l2_ctrl_s_ctrl(hi847->link_freq, mode->link_freq_index);
2711 __v4l2_ctrl_s_ctrl_int64(hi847->pixel_rate,
2716 __v4l2_ctrl_modify_range(hi847->vblank,
2720 __v4l2_ctrl_s_ctrl(hi847->vblank, vblank_def);
2722 h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
2724 __v4l2_ctrl_modify_range(hi847->hblank, h_blank, h_blank, 1,
2728 mutex_unlock(&hi847->mutex);
2737 struct hi847 *hi847 = to_hi847(sd);
2739 mutex_lock(&hi847->mutex);
2741 fmt->format = *v4l2_subdev_get_try_format(&hi847->sd,
2745 hi847_assign_pad_format(hi847->cur_mode, &fmt->format);
2747 mutex_unlock(&hi847->mutex);
2784 struct hi847 *hi847 = to_hi847(sd);
2786 mutex_lock(&hi847->mutex);
2789 mutex_unlock(&hi847->mutex);
2818 static int hi847_identify_module(struct hi847 *hi847)
2820 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2824 ret = hi847_read_reg(hi847, HI847_REG_CHIP_ID,
2909 struct hi847 *hi847 = to_hi847(sd);
2915 mutex_destroy(&hi847->mutex);
2920 struct hi847 *hi847;
2923 hi847 = devm_kzalloc(&client->dev, sizeof(*hi847), GFP_KERNEL);
2924 if (!hi847)
2934 v4l2_i2c_subdev_init(&hi847->sd, client, &hi847_subdev_ops);
2935 ret = hi847_identify_module(hi847);
2941 mutex_init(&hi847->mutex);
2942 hi847->cur_mode = &supported_modes[0];
2943 ret = hi847_init_controls(hi847);
2949 hi847->sd.internal_ops = &hi847_internal_ops;
2950 hi847->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2951 hi847->sd.entity.ops = &hi847_subdev_entity_ops;
2952 hi847->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2953 hi847->pad.flags = MEDIA_PAD_FL_SOURCE;
2954 ret = media_entity_pads_init(&hi847->sd.entity, 1, &hi847->pad);
2960 ret = v4l2_async_register_subdev_sensor(&hi847->sd);
2974 media_entity_cleanup(&hi847->sd.entity);
2977 v4l2_ctrl_handler_free(hi847->sd.ctrl_handler);
2978 mutex_destroy(&hi847->mutex);
2998 .name = "hi847",