Lines Matching defs:hi556
118 #define to_hi556(_sd) container_of(_sd, struct hi556, sd)
562 struct hi556 {
596 static int hi556_read_reg(struct hi556 *hi556, u16 reg, u16 len, u32 *val)
598 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
626 static int hi556_write_reg(struct hi556 *hi556, u16 reg, u16 len, u32 val)
628 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
642 static int hi556_write_reg_list(struct hi556 *hi556,
645 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
650 ret = hi556_write_reg(hi556, r_list->regs[i].address,
664 static int hi556_update_digital_gain(struct hi556 *hi556, u32 d_gain)
668 ret = hi556_write_reg(hi556, HI556_REG_MWB_GR_GAIN,
673 ret = hi556_write_reg(hi556, HI556_REG_MWB_GB_GAIN,
678 ret = hi556_write_reg(hi556, HI556_REG_MWB_R_GAIN,
683 return hi556_write_reg(hi556, HI556_REG_MWB_B_GAIN,
687 static int hi556_test_pattern(struct hi556 *hi556, u32 pattern)
693 ret = hi556_read_reg(hi556, HI556_REG_ISP,
698 ret = hi556_write_reg(hi556, HI556_REG_ISP,
705 return hi556_write_reg(hi556, HI556_REG_TEST_PATTERN,
711 struct hi556 *hi556 = container_of(ctrl->handler,
712 struct hi556, ctrl_handler);
713 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
720 exposure_max = hi556->cur_mode->height + ctrl->val -
722 __v4l2_ctrl_modify_range(hi556->exposure,
723 hi556->exposure->minimum,
724 exposure_max, hi556->exposure->step,
734 ret = hi556_write_reg(hi556, HI556_REG_ANALOG_GAIN,
739 ret = hi556_update_digital_gain(hi556, ctrl->val);
743 ret = hi556_write_reg(hi556, HI556_REG_EXPOSURE,
749 ret = hi556_write_reg(hi556, HI556_REG_FLL,
751 hi556->cur_mode->height + ctrl->val);
755 ret = hi556_test_pattern(hi556, ctrl->val);
772 static int hi556_init_controls(struct hi556 *hi556)
778 ctrl_hdlr = &hi556->ctrl_handler;
783 ctrl_hdlr->lock = &hi556->mutex;
784 hi556->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi556_ctrl_ops,
788 if (hi556->link_freq)
789 hi556->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
791 hi556->pixel_rate = v4l2_ctrl_new_std
797 hi556->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
799 hi556->cur_mode->fll_min -
800 hi556->cur_mode->height,
802 hi556->cur_mode->height, 1,
803 hi556->cur_mode->fll_def -
804 hi556->cur_mode->height);
806 h_blank = hi556->cur_mode->llp - hi556->cur_mode->width;
808 hi556->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
811 if (hi556->hblank)
812 hi556->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
820 exposure_max = hi556->cur_mode->fll_def - HI556_EXPOSURE_MAX_MARGIN;
821 hi556->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
833 hi556->sd.ctrl_handler = ctrl_hdlr;
847 static int hi556_identify_module(struct hi556 *hi556)
849 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
853 if (hi556->identified)
856 ret = hi556_read_reg(hi556, HI556_REG_CHIP_ID,
867 hi556->identified = true;
873 __hi556_get_pad_crop(struct hi556 *hi556,
879 return v4l2_subdev_get_try_crop(&hi556->sd, sd_state, pad);
881 return &hi556->cur_mode->crop;
893 struct hi556 *hi556 = to_hi556(sd);
895 mutex_lock(&hi556->mutex);
896 sel->r = *__hi556_get_pad_crop(hi556, sd_state, sel->pad,
898 mutex_unlock(&hi556->mutex);
924 static int hi556_start_streaming(struct hi556 *hi556)
926 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
930 ret = hi556_identify_module(hi556);
934 link_freq_index = hi556->cur_mode->link_freq_index;
936 ret = hi556_write_reg_list(hi556, reg_list);
942 reg_list = &hi556->cur_mode->reg_list;
943 ret = hi556_write_reg_list(hi556, reg_list);
949 ret = __v4l2_ctrl_handler_setup(hi556->sd.ctrl_handler);
953 ret = hi556_write_reg(hi556, HI556_REG_MODE_SELECT,
964 static void hi556_stop_streaming(struct hi556 *hi556)
966 struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
968 if (hi556_write_reg(hi556, HI556_REG_MODE_SELECT,
975 struct hi556 *hi556 = to_hi556(sd);
979 if (hi556->streaming == enable)
982 mutex_lock(&hi556->mutex);
986 mutex_unlock(&hi556->mutex);
990 ret = hi556_start_streaming(hi556);
993 hi556_stop_streaming(hi556);
997 hi556_stop_streaming(hi556);
1001 hi556->streaming = enable;
1002 mutex_unlock(&hi556->mutex);
1010 struct hi556 *hi556 = to_hi556(sd);
1012 mutex_lock(&hi556->mutex);
1013 if (hi556->streaming)
1014 hi556_stop_streaming(hi556);
1016 mutex_unlock(&hi556->mutex);
1024 struct hi556 *hi556 = to_hi556(sd);
1027 mutex_lock(&hi556->mutex);
1028 if (hi556->streaming) {
1029 ret = hi556_start_streaming(hi556);
1034 mutex_unlock(&hi556->mutex);
1039 hi556_stop_streaming(hi556);
1040 hi556->streaming = 0;
1041 mutex_unlock(&hi556->mutex);
1049 struct hi556 *hi556 = to_hi556(sd);
1058 mutex_lock(&hi556->mutex);
1063 hi556->cur_mode = mode;
1064 __v4l2_ctrl_s_ctrl(hi556->link_freq, mode->link_freq_index);
1065 __v4l2_ctrl_s_ctrl_int64(hi556->pixel_rate,
1070 __v4l2_ctrl_modify_range(hi556->vblank,
1074 __v4l2_ctrl_s_ctrl(hi556->vblank, vblank_def);
1076 h_blank = hi556->cur_mode->llp - hi556->cur_mode->width;
1078 __v4l2_ctrl_modify_range(hi556->hblank, h_blank, h_blank, 1,
1082 mutex_unlock(&hi556->mutex);
1091 struct hi556 *hi556 = to_hi556(sd);
1093 mutex_lock(&hi556->mutex);
1095 fmt->format = *v4l2_subdev_get_try_format(&hi556->sd,
1099 hi556_assign_pad_format(hi556->cur_mode, &fmt->format);
1101 mutex_unlock(&hi556->mutex);
1138 struct hi556 *hi556 = to_hi556(sd);
1141 mutex_lock(&hi556->mutex);
1152 mutex_unlock(&hi556->mutex);
1253 struct hi556 *hi556 = to_hi556(sd);
1259 mutex_destroy(&hi556->mutex);
1264 struct hi556 *hi556;
1275 hi556 = devm_kzalloc(&client->dev, sizeof(*hi556), GFP_KERNEL);
1276 if (!hi556)
1279 v4l2_i2c_subdev_init(&hi556->sd, client, &hi556_subdev_ops);
1283 ret = hi556_identify_module(hi556);
1290 mutex_init(&hi556->mutex);
1291 hi556->cur_mode = &supported_modes[0];
1292 ret = hi556_init_controls(hi556);
1298 hi556->sd.internal_ops = &hi556_internal_ops;
1299 hi556->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1300 hi556->sd.entity.ops = &hi556_subdev_entity_ops;
1301 hi556->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1302 hi556->pad.flags = MEDIA_PAD_FL_SOURCE;
1303 ret = media_entity_pads_init(&hi556->sd.entity, 1, &hi556->pad);
1309 ret = v4l2_async_register_subdev_sensor(&hi556->sd);
1325 media_entity_cleanup(&hi556->sd.entity);
1328 v4l2_ctrl_handler_free(hi556->sd.ctrl_handler);
1329 mutex_destroy(&hi556->mutex);
1349 .name = "hi556",