Lines Matching refs:mt9v032

184 struct mt9v032 {  struct
220 static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd) in to_mt9v032() argument
222 return container_of(sd, struct mt9v032, subdev); in to_mt9v032()
226 mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable) in mt9v032_update_aec_agc() argument
228 struct regmap *map = mt9v032->regmap; in mt9v032_update_aec_agc()
229 u16 value = mt9v032->aec_agc; in mt9v032_update_aec_agc()
241 mt9v032->aec_agc = value; in mt9v032_update_aec_agc()
246 mt9v032_update_hblank(struct mt9v032 *mt9v032) in mt9v032_update_hblank() argument
248 struct v4l2_rect *crop = &mt9v032->crop; in mt9v032_update_hblank()
249 unsigned int min_hblank = mt9v032->model->data->min_hblank; in mt9v032_update_hblank()
252 if (mt9v032->version->version == MT9V034_CHIP_ID_REV1) in mt9v032_update_hblank()
253 min_hblank += (mt9v032->hratio - 1) * 10; in mt9v032_update_hblank()
254 min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width, in mt9v032_update_hblank()
256 hblank = max_t(unsigned int, mt9v032->hblank, min_hblank); in mt9v032_update_hblank()
258 return regmap_write(mt9v032->regmap, MT9V032_HORIZONTAL_BLANKING, in mt9v032_update_hblank()
262 static int mt9v032_power_on(struct mt9v032 *mt9v032) in mt9v032_power_on() argument
264 struct regmap *map = mt9v032->regmap; in mt9v032_power_on()
267 gpiod_set_value_cansleep(mt9v032->reset_gpio, 1); in mt9v032_power_on()
269 ret = clk_set_rate(mt9v032->clk, mt9v032->sysclk); in mt9v032_power_on()
274 ret = clk_prepare_enable(mt9v032->clk); in mt9v032_power_on()
280 if (mt9v032->reset_gpio) { in mt9v032_power_on()
281 gpiod_set_value_cansleep(mt9v032->reset_gpio, 0); in mt9v032_power_on()
308 clk_disable_unprepare(mt9v032->clk); in mt9v032_power_on()
312 static void mt9v032_power_off(struct mt9v032 *mt9v032) in mt9v032_power_off() argument
314 clk_disable_unprepare(mt9v032->clk); in mt9v032_power_off()
317 static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on) in __mt9v032_set_power() argument
319 struct regmap *map = mt9v032->regmap; in __mt9v032_set_power()
323 mt9v032_power_off(mt9v032); in __mt9v032_set_power()
327 ret = mt9v032_power_on(mt9v032); in __mt9v032_set_power()
332 if (mt9v032->pdata && mt9v032->pdata->clk_pol) { in __mt9v032_set_power()
333 ret = regmap_write(map, mt9v032->model->data->pclk_reg, in __mt9v032_set_power()
344 return v4l2_ctrl_handler_setup(&mt9v032->ctrls); in __mt9v032_set_power()
352 __mt9v032_get_pad_format(struct mt9v032 *mt9v032, in __mt9v032_get_pad_format() argument
358 return v4l2_subdev_get_try_format(&mt9v032->subdev, sd_state, in __mt9v032_get_pad_format()
361 return &mt9v032->format; in __mt9v032_get_pad_format()
368 __mt9v032_get_pad_crop(struct mt9v032 *mt9v032, in __mt9v032_get_pad_crop() argument
374 return v4l2_subdev_get_try_crop(&mt9v032->subdev, sd_state, in __mt9v032_get_pad_crop()
377 return &mt9v032->crop; in __mt9v032_get_pad_crop()
387 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_s_stream() local
388 struct v4l2_rect *crop = &mt9v032->crop; in mt9v032_s_stream()
389 struct regmap *map = mt9v032->regmap; in mt9v032_s_stream()
398 hbin = fls(mt9v032->hratio) - 1; in mt9v032_s_stream()
399 vbin = fls(mt9v032->vratio) - 1; in mt9v032_s_stream()
423 ret = mt9v032_update_hblank(mt9v032); in mt9v032_s_stream()
435 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_enum_mbus_code() local
440 code->code = mt9v032->format.code; in mt9v032_enum_mbus_code()
448 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_enum_frame_size() local
452 if (mt9v032->format.code != fse->code) in mt9v032_enum_frame_size()
467 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_get_format() local
469 format->format = *__mt9v032_get_pad_format(mt9v032, sd_state, in mt9v032_get_format()
475 static void mt9v032_configure_pixel_rate(struct mt9v032 *mt9v032) in mt9v032_configure_pixel_rate() argument
477 struct i2c_client *client = v4l2_get_subdevdata(&mt9v032->subdev); in mt9v032_configure_pixel_rate()
480 ret = v4l2_ctrl_s_ctrl_int64(mt9v032->pixel_rate, in mt9v032_configure_pixel_rate()
481 mt9v032->sysclk / mt9v032->hratio); in mt9v032_configure_pixel_rate()
503 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_format() local
511 __crop = __mt9v032_get_pad_crop(mt9v032, sd_state, format->pad, in mt9v032_set_format()
527 __format = __mt9v032_get_pad_format(mt9v032, sd_state, format->pad, in mt9v032_set_format()
533 mt9v032->hratio = hratio; in mt9v032_set_format()
534 mt9v032->vratio = vratio; in mt9v032_set_format()
535 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_set_format()
547 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_get_selection() local
552 sel->r = *__mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad, in mt9v032_get_selection()
561 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_selection() local
590 __crop = __mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad, in mt9v032_set_selection()
597 __format = __mt9v032_get_pad_format(mt9v032, sd_state, in mt9v032_set_selection()
603 mt9v032->hratio = 1; in mt9v032_set_selection()
604 mt9v032->vratio = 1; in mt9v032_set_selection()
605 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_set_selection()
651 struct mt9v032 *mt9v032 = in mt9v032_s_ctrl() local
652 container_of(ctrl->handler, struct mt9v032, ctrls); in mt9v032_s_ctrl()
653 struct regmap *map = mt9v032->regmap; in mt9v032_s_ctrl()
659 return mt9v032_update_aec_agc(mt9v032, MT9V032_AGC_ENABLE, in mt9v032_s_ctrl()
666 return mt9v032_update_aec_agc(mt9v032, MT9V032_AEC_ENABLE, in mt9v032_s_ctrl()
674 mt9v032->hblank = ctrl->val; in mt9v032_s_ctrl()
675 return mt9v032_update_hblank(mt9v032); in mt9v032_s_ctrl()
683 if (mt9v032->link_freq == NULL) in mt9v032_s_ctrl()
686 freq = mt9v032->pdata->link_freqs[mt9v032->link_freq->val]; in mt9v032_s_ctrl()
687 *mt9v032->pixel_rate->p_new.p_s64 = freq; in mt9v032_s_ctrl()
688 mt9v032->sysclk = freq; in mt9v032_s_ctrl()
692 switch (mt9v032->test_pattern->val) { in mt9v032_s_ctrl()
709 data = (mt9v032->test_pattern_color->val << in mt9v032_s_ctrl()
737 mt9v032->model->data->aec_max_shutter_reg, in mt9v032_s_ctrl()
852 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_power() local
855 mutex_lock(&mt9v032->power_lock); in mt9v032_set_power()
860 if (mt9v032->power_count == !on) { in mt9v032_set_power()
861 ret = __mt9v032_set_power(mt9v032, !!on); in mt9v032_set_power()
867 mt9v032->power_count += on ? 1 : -1; in mt9v032_set_power()
868 WARN_ON(mt9v032->power_count < 0); in mt9v032_set_power()
871 mutex_unlock(&mt9v032->power_lock); in mt9v032_set_power()
882 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_registered() local
890 ret = mt9v032_power_on(mt9v032); in mt9v032_registered()
897 ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version); in mt9v032_registered()
899 mt9v032_power_off(mt9v032); in mt9v032_registered()
908 mt9v032->version = &mt9v032_versions[i]; in mt9v032_registered()
913 if (mt9v032->version == NULL) { in mt9v032_registered()
920 mt9v032->version->name, client->addr); in mt9v032_registered()
922 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_registered()
929 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_open() local
941 if (mt9v032->model->color) in mt9v032_open()
1051 struct mt9v032 *mt9v032; in mt9v032_probe() local
1055 mt9v032 = devm_kzalloc(&client->dev, sizeof(*mt9v032), GFP_KERNEL); in mt9v032_probe()
1056 if (!mt9v032) in mt9v032_probe()
1059 mt9v032->regmap = devm_regmap_init_i2c(client, &mt9v032_regmap_config); in mt9v032_probe()
1060 if (IS_ERR(mt9v032->regmap)) in mt9v032_probe()
1061 return PTR_ERR(mt9v032->regmap); in mt9v032_probe()
1063 mt9v032->clk = devm_clk_get(&client->dev, NULL); in mt9v032_probe()
1064 if (IS_ERR(mt9v032->clk)) in mt9v032_probe()
1065 return PTR_ERR(mt9v032->clk); in mt9v032_probe()
1067 mt9v032->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in mt9v032_probe()
1069 if (IS_ERR(mt9v032->reset_gpio)) in mt9v032_probe()
1070 return PTR_ERR(mt9v032->reset_gpio); in mt9v032_probe()
1072 mt9v032->standby_gpio = devm_gpiod_get_optional(&client->dev, "standby", in mt9v032_probe()
1074 if (IS_ERR(mt9v032->standby_gpio)) in mt9v032_probe()
1075 return PTR_ERR(mt9v032->standby_gpio); in mt9v032_probe()
1077 mutex_init(&mt9v032->power_lock); in mt9v032_probe()
1078 mt9v032->pdata = pdata; in mt9v032_probe()
1079 mt9v032->model = (const void *)did->driver_data; in mt9v032_probe()
1081 v4l2_ctrl_handler_init(&mt9v032->ctrls, 11 + in mt9v032_probe()
1084 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1086 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1089 v4l2_ctrl_new_std_menu(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1092 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1093 V4L2_CID_EXPOSURE, mt9v032->model->data->min_shutter, in mt9v032_probe()
1094 mt9v032->model->data->max_shutter, 1, in mt9v032_probe()
1096 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1097 V4L2_CID_HBLANK, mt9v032->model->data->min_hblank, in mt9v032_probe()
1100 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1101 V4L2_CID_VBLANK, mt9v032->model->data->min_vblank, in mt9v032_probe()
1102 mt9v032->model->data->max_vblank, 1, in mt9v032_probe()
1104 mt9v032->test_pattern = v4l2_ctrl_new_std_menu_items(&mt9v032->ctrls, in mt9v032_probe()
1108 mt9v032->test_pattern_color = v4l2_ctrl_new_custom(&mt9v032->ctrls, in mt9v032_probe()
1111 v4l2_ctrl_new_custom(&mt9v032->ctrls, in mt9v032_probe()
1112 mt9v032->model->data->aec_max_shutter_v4l2_ctrl, in mt9v032_probe()
1115 v4l2_ctrl_new_custom(&mt9v032->ctrls, &mt9v032_aegc_controls[i], in mt9v032_probe()
1118 v4l2_ctrl_cluster(2, &mt9v032->test_pattern); in mt9v032_probe()
1120 mt9v032->pixel_rate = in mt9v032_probe()
1121 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1132 mt9v032->link_freq = in mt9v032_probe()
1133 v4l2_ctrl_new_int_menu(&mt9v032->ctrls, in mt9v032_probe()
1137 v4l2_ctrl_cluster(2, &mt9v032->link_freq); in mt9v032_probe()
1141 mt9v032->subdev.ctrl_handler = &mt9v032->ctrls; in mt9v032_probe()
1143 if (mt9v032->ctrls.error) { in mt9v032_probe()
1145 mt9v032->ctrls.error); in mt9v032_probe()
1146 ret = mt9v032->ctrls.error; in mt9v032_probe()
1150 mt9v032->crop.left = MT9V032_COLUMN_START_DEF; in mt9v032_probe()
1151 mt9v032->crop.top = MT9V032_ROW_START_DEF; in mt9v032_probe()
1152 mt9v032->crop.width = MT9V032_WINDOW_WIDTH_DEF; in mt9v032_probe()
1153 mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF; in mt9v032_probe()
1155 if (mt9v032->model->color) in mt9v032_probe()
1156 mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10; in mt9v032_probe()
1158 mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10; in mt9v032_probe()
1160 mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF; in mt9v032_probe()
1161 mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF; in mt9v032_probe()
1162 mt9v032->format.field = V4L2_FIELD_NONE; in mt9v032_probe()
1163 mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB; in mt9v032_probe()
1165 mt9v032->hratio = 1; in mt9v032_probe()
1166 mt9v032->vratio = 1; in mt9v032_probe()
1168 mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE; in mt9v032_probe()
1169 mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF; in mt9v032_probe()
1170 mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF; in mt9v032_probe()
1172 v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops); in mt9v032_probe()
1173 mt9v032->subdev.internal_ops = &mt9v032_subdev_internal_ops; in mt9v032_probe()
1174 mt9v032->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in mt9v032_probe()
1176 mt9v032->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; in mt9v032_probe()
1177 mt9v032->pad.flags = MEDIA_PAD_FL_SOURCE; in mt9v032_probe()
1178 ret = media_entity_pads_init(&mt9v032->subdev.entity, 1, &mt9v032->pad); in mt9v032_probe()
1182 mt9v032->subdev.dev = &client->dev; in mt9v032_probe()
1183 ret = v4l2_async_register_subdev(&mt9v032->subdev); in mt9v032_probe()
1190 media_entity_cleanup(&mt9v032->subdev.entity); in mt9v032_probe()
1191 v4l2_ctrl_handler_free(&mt9v032->ctrls); in mt9v032_probe()
1198 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_remove() local
1201 v4l2_ctrl_handler_free(&mt9v032->ctrls); in mt9v032_remove()