Lines Matching refs:mt9v032
234 struct mt9v032 { struct
268 static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd) in to_mt9v032() argument
270 return container_of(sd, struct mt9v032, subdev); in to_mt9v032()
274 mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable) in mt9v032_update_aec_agc() argument
276 struct regmap *map = mt9v032->regmap; in mt9v032_update_aec_agc()
277 u16 value = mt9v032->aec_agc; in mt9v032_update_aec_agc()
289 mt9v032->aec_agc = value; in mt9v032_update_aec_agc()
294 mt9v032_update_hblank(struct mt9v032 *mt9v032) in mt9v032_update_hblank() argument
296 struct v4l2_rect *crop = &mt9v032->crop; in mt9v032_update_hblank()
297 unsigned int min_hblank = mt9v032->model->data->min_hblank; in mt9v032_update_hblank()
300 if (mt9v032->version->version == MT9V034_CHIP_ID_REV1) in mt9v032_update_hblank()
301 min_hblank += (mt9v032->hratio - 1) * 10; in mt9v032_update_hblank()
302 min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width, in mt9v032_update_hblank()
304 hblank = max_t(unsigned int, mt9v032->hblank, min_hblank); in mt9v032_update_hblank()
306 return regmap_write(mt9v032->regmap, MT9V032_HORIZONTAL_BLANKING, in mt9v032_update_hblank()
310 static int mt9v032_power_on(struct mt9v032 *mt9v032) in mt9v032_power_on() argument
312 struct regmap *map = mt9v032->regmap; in mt9v032_power_on()
315 ret = clk_set_rate(mt9v032->clk, mt9v032->sysclk); in mt9v032_power_on()
319 ret = clk_prepare_enable(mt9v032->clk); in mt9v032_power_on()
337 static void mt9v032_power_off(struct mt9v032 *mt9v032) in mt9v032_power_off() argument
339 clk_disable_unprepare(mt9v032->clk); in mt9v032_power_off()
342 static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on) in __mt9v032_set_power() argument
344 struct regmap *map = mt9v032->regmap; in __mt9v032_set_power()
348 mt9v032_power_off(mt9v032); in __mt9v032_set_power()
352 ret = mt9v032_power_on(mt9v032); in __mt9v032_set_power()
357 if (mt9v032->pdata && mt9v032->pdata->clk_pol) { in __mt9v032_set_power()
358 ret = regmap_write(map, mt9v032->model->data->pclk_reg, in __mt9v032_set_power()
369 return v4l2_ctrl_handler_setup(&mt9v032->ctrls); in __mt9v032_set_power()
377 __mt9v032_get_pad_format(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg, in __mt9v032_get_pad_format() argument
382 return v4l2_subdev_get_try_format(&mt9v032->subdev, cfg, pad); in __mt9v032_get_pad_format()
384 return &mt9v032->format; in __mt9v032_get_pad_format()
391 __mt9v032_get_pad_crop(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg, in __mt9v032_get_pad_crop() argument
396 return v4l2_subdev_get_try_crop(&mt9v032->subdev, cfg, pad); in __mt9v032_get_pad_crop()
398 return &mt9v032->crop; in __mt9v032_get_pad_crop()
409 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_s_stream() local
410 struct v4l2_rect *crop = &mt9v032->crop; in mt9v032_s_stream()
411 struct regmap *map = mt9v032->regmap; in mt9v032_s_stream()
420 hbin = fls(mt9v032->hratio) - 1; in mt9v032_s_stream()
421 vbin = fls(mt9v032->vratio) - 1; in mt9v032_s_stream()
445 ret = mt9v032_update_hblank(mt9v032); in mt9v032_s_stream()
483 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_get_format() local
485 format->format = *__mt9v032_get_pad_format(mt9v032, cfg, format->pad, in mt9v032_get_format()
490 static void mt9v032_configure_pixel_rate(struct mt9v032 *mt9v032) in mt9v032_configure_pixel_rate() argument
492 struct i2c_client *client = v4l2_get_subdevdata(&mt9v032->subdev); in mt9v032_configure_pixel_rate()
495 ret = v4l2_ctrl_s_ctrl_int64(mt9v032->pixel_rate, in mt9v032_configure_pixel_rate()
496 mt9v032->sysclk / mt9v032->hratio); in mt9v032_configure_pixel_rate()
518 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_format() local
526 __crop = __mt9v032_get_pad_crop(mt9v032, cfg, format->pad, in mt9v032_set_format()
542 __format = __mt9v032_get_pad_format(mt9v032, cfg, format->pad, in mt9v032_set_format()
548 mt9v032->hratio = hratio; in mt9v032_set_format()
549 mt9v032->vratio = vratio; in mt9v032_set_format()
550 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_set_format()
562 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_get_selection() local
567 sel->r = *__mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which); in mt9v032_get_selection()
575 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_selection() local
604 __crop = __mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which); in mt9v032_set_selection()
610 __format = __mt9v032_get_pad_format(mt9v032, cfg, sel->pad, in mt9v032_set_selection()
615 mt9v032->hratio = 1; in mt9v032_set_selection()
616 mt9v032->vratio = 1; in mt9v032_set_selection()
617 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_set_selection()
635 struct mt9v032 *mt9v032 = in mt9v032_s_ctrl() local
636 container_of(ctrl->handler, struct mt9v032, ctrls); in mt9v032_s_ctrl()
637 struct regmap *map = mt9v032->regmap; in mt9v032_s_ctrl()
643 return mt9v032_update_aec_agc(mt9v032, MT9V032_AGC_ENABLE, in mt9v032_s_ctrl()
650 return mt9v032_update_aec_agc(mt9v032, MT9V032_AEC_ENABLE, in mt9v032_s_ctrl()
658 mt9v032->hblank = ctrl->val; in mt9v032_s_ctrl()
659 return mt9v032_update_hblank(mt9v032); in mt9v032_s_ctrl()
667 if (mt9v032->link_freq == NULL) in mt9v032_s_ctrl()
670 freq = mt9v032->pdata->link_freqs[mt9v032->link_freq->val]; in mt9v032_s_ctrl()
671 *mt9v032->pixel_rate->p_new.p_s64 = freq; in mt9v032_s_ctrl()
672 mt9v032->sysclk = freq; in mt9v032_s_ctrl()
676 switch (mt9v032->test_pattern->val) { in mt9v032_s_ctrl()
693 data = (mt9v032->test_pattern_color->val << in mt9v032_s_ctrl()
736 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_set_power() local
739 mutex_lock(&mt9v032->power_lock); in mt9v032_set_power()
744 if (mt9v032->power_count == !on) { in mt9v032_set_power()
745 ret = __mt9v032_set_power(mt9v032, !!on); in mt9v032_set_power()
751 mt9v032->power_count += on ? 1 : -1; in mt9v032_set_power()
752 WARN_ON(mt9v032->power_count < 0); in mt9v032_set_power()
755 mutex_unlock(&mt9v032->power_lock); in mt9v032_set_power()
766 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_registered() local
774 ret = mt9v032_power_on(mt9v032); in mt9v032_registered()
781 ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version); in mt9v032_registered()
789 mt9v032->version = &mt9v032_versions[i]; in mt9v032_registered()
794 if (mt9v032->version == NULL) { in mt9v032_registered()
800 mt9v032_power_off(mt9v032); in mt9v032_registered()
803 mt9v032->version->name, client->addr); in mt9v032_registered()
805 mt9v032_configure_pixel_rate(mt9v032); in mt9v032_registered()
812 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_open() local
824 if (mt9v032->model->color) in mt9v032_open()
934 struct mt9v032 *mt9v032; in mt9v032_probe() local
945 mt9v032 = devm_kzalloc(&client->dev, sizeof(*mt9v032), GFP_KERNEL); in mt9v032_probe()
946 if (!mt9v032) in mt9v032_probe()
949 mt9v032->regmap = devm_regmap_init_i2c(client, &mt9v032_regmap_config); in mt9v032_probe()
950 if (IS_ERR(mt9v032->regmap)) in mt9v032_probe()
951 return PTR_ERR(mt9v032->regmap); in mt9v032_probe()
953 mt9v032->clk = devm_clk_get(&client->dev, NULL); in mt9v032_probe()
954 if (IS_ERR(mt9v032->clk)) in mt9v032_probe()
955 return PTR_ERR(mt9v032->clk); in mt9v032_probe()
957 mutex_init(&mt9v032->power_lock); in mt9v032_probe()
958 mt9v032->pdata = pdata; in mt9v032_probe()
959 mt9v032->model = (const void *)did->driver_data; in mt9v032_probe()
961 v4l2_ctrl_handler_init(&mt9v032->ctrls, 10); in mt9v032_probe()
963 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
965 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
968 v4l2_ctrl_new_std_menu(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
971 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
972 V4L2_CID_EXPOSURE, mt9v032->model->data->min_shutter, in mt9v032_probe()
973 mt9v032->model->data->max_shutter, 1, in mt9v032_probe()
975 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
976 V4L2_CID_HBLANK, mt9v032->model->data->min_hblank, in mt9v032_probe()
979 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
980 V4L2_CID_VBLANK, mt9v032->model->data->min_vblank, in mt9v032_probe()
981 mt9v032->model->data->max_vblank, 1, in mt9v032_probe()
983 mt9v032->test_pattern = v4l2_ctrl_new_std_menu_items(&mt9v032->ctrls, in mt9v032_probe()
987 mt9v032->test_pattern_color = v4l2_ctrl_new_custom(&mt9v032->ctrls, in mt9v032_probe()
990 v4l2_ctrl_cluster(2, &mt9v032->test_pattern); in mt9v032_probe()
992 mt9v032->pixel_rate = in mt9v032_probe()
993 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, in mt9v032_probe()
1004 mt9v032->link_freq = in mt9v032_probe()
1005 v4l2_ctrl_new_int_menu(&mt9v032->ctrls, in mt9v032_probe()
1009 v4l2_ctrl_cluster(2, &mt9v032->link_freq); in mt9v032_probe()
1013 mt9v032->subdev.ctrl_handler = &mt9v032->ctrls; in mt9v032_probe()
1015 if (mt9v032->ctrls.error) { in mt9v032_probe()
1017 mt9v032->ctrls.error); in mt9v032_probe()
1018 ret = mt9v032->ctrls.error; in mt9v032_probe()
1022 mt9v032->crop.left = MT9V032_COLUMN_START_DEF; in mt9v032_probe()
1023 mt9v032->crop.top = MT9V032_ROW_START_DEF; in mt9v032_probe()
1024 mt9v032->crop.width = MT9V032_WINDOW_WIDTH_DEF; in mt9v032_probe()
1025 mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF; in mt9v032_probe()
1027 if (mt9v032->model->color) in mt9v032_probe()
1028 mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10; in mt9v032_probe()
1030 mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10; in mt9v032_probe()
1032 mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF; in mt9v032_probe()
1033 mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF; in mt9v032_probe()
1034 mt9v032->format.field = V4L2_FIELD_NONE; in mt9v032_probe()
1035 mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB; in mt9v032_probe()
1037 mt9v032->hratio = 1; in mt9v032_probe()
1038 mt9v032->vratio = 1; in mt9v032_probe()
1040 mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE; in mt9v032_probe()
1041 mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF; in mt9v032_probe()
1042 mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF; in mt9v032_probe()
1044 v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops); in mt9v032_probe()
1045 mt9v032->subdev.internal_ops = &mt9v032_subdev_internal_ops; in mt9v032_probe()
1046 mt9v032->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in mt9v032_probe()
1048 mt9v032->pad.flags = MEDIA_PAD_FL_SOURCE; in mt9v032_probe()
1049 ret = media_entity_init(&mt9v032->subdev.entity, 1, &mt9v032->pad, 0); in mt9v032_probe()
1053 mt9v032->subdev.dev = &client->dev; in mt9v032_probe()
1054 ret = v4l2_async_register_subdev(&mt9v032->subdev); in mt9v032_probe()
1061 media_entity_cleanup(&mt9v032->subdev.entity); in mt9v032_probe()
1062 v4l2_ctrl_handler_free(&mt9v032->ctrls); in mt9v032_probe()
1069 struct mt9v032 *mt9v032 = to_mt9v032(subdev); in mt9v032_remove() local
1072 v4l2_ctrl_handler_free(&mt9v032->ctrls); in mt9v032_remove()