Lines Matching defs:xtpg

131 static void __xtpg_update_pattern_control(struct xtpg_device *xtpg,
134 u32 pattern_mask = (1 << (xtpg->pattern->maximum + 1)) - 1;
140 if (xtpg->npads == 1 || !xtpg->has_input)
151 __v4l2_ctrl_modify_range(xtpg->pattern, 0, xtpg->pattern->maximum,
155 static void xtpg_update_pattern_control(struct xtpg_device *xtpg,
158 mutex_lock(xtpg->ctrl_handler.lock);
159 __xtpg_update_pattern_control(xtpg, passthrough, pattern);
160 mutex_unlock(xtpg->ctrl_handler.lock);
169 struct xtpg_device *xtpg = to_tpg(subdev);
170 unsigned int width = xtpg->formats[0].width;
171 unsigned int height = xtpg->formats[0].height;
176 xvip_stop(&xtpg->xvip);
177 if (xtpg->vtc)
178 xvtc_generator_stop(xtpg->vtc);
180 xtpg_update_pattern_control(xtpg, true, true);
181 xtpg->streaming = false;
185 xvip_set_frame_size(&xtpg->xvip, &xtpg->formats[0]);
187 if (xtpg->vtc) {
198 v4l2_ctrl_g_ctrl(xtpg->hblank) + width);
200 v4l2_ctrl_g_ctrl(xtpg->vblank) + height);
207 xvtc_generator_start(xtpg->vtc, &config);
216 mutex_lock(xtpg->ctrl_handler.lock);
218 xvip_clr_and_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
219 XTPG_PATTERN_MASK, xtpg->pattern->cur.val);
225 passthrough = xtpg->pattern->cur.val == 0;
226 __xtpg_update_pattern_control(xtpg, passthrough, !passthrough);
228 xtpg->streaming = true;
230 mutex_unlock(xtpg->ctrl_handler.lock);
237 : xtpg_get_bayer_phase(xtpg->formats[0].code);
238 xvip_write(&xtpg->xvip, XTPG_BAYER_PHASE, bayer_phase);
240 if (xtpg->vtmux_gpio)
241 gpiod_set_value_cansleep(xtpg->vtmux_gpio, !passthrough);
243 xvip_start(&xtpg->xvip);
253 __xtpg_get_pad_format(struct xtpg_device *xtpg,
259 return v4l2_subdev_get_try_format(&xtpg->xvip.subdev,
262 return &xtpg->formats[pad];
272 struct xtpg_device *xtpg = to_tpg(subdev);
274 fmt->format = *__xtpg_get_pad_format(xtpg, sd_state, fmt->pad,
284 struct xtpg_device *xtpg = to_tpg(subdev);
288 __format = __xtpg_get_pad_format(xtpg, sd_state, fmt->pad, fmt->which);
293 if (xtpg->npads == 2 && fmt->pad == 1) {
299 if (xtpg->bayer) {
310 if (xtpg->npads == 2) {
311 __format = __xtpg_get_pad_format(xtpg, sd_state, 1,
354 struct xtpg_device *xtpg = to_tpg(subdev);
358 *format = xtpg->default_format;
360 if (xtpg->npads == 2) {
362 *format = xtpg->default_format;
375 struct xtpg_device *xtpg = container_of(ctrl->handler,
380 xvip_clr_and_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
384 xvip_clr_or_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
388 xvip_clr_or_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
392 xvip_clr_and_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
398 xvip_clr_or_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
402 xvip_clr_or_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
406 xvip_clr_or_set(&xtpg->xvip, XTPG_PATTERN_CONTROL,
410 xvip_write(&xtpg->xvip, XTPG_MOTION_SPEED, ctrl->val);
413 xvip_clr_and_set(&xtpg->xvip, XTPG_CROSS_HAIRS,
418 xvip_clr_and_set(&xtpg->xvip, XTPG_CROSS_HAIRS,
423 xvip_clr_and_set(&xtpg->xvip, XTPG_ZPLATE_HOR_CONTROL,
428 xvip_clr_and_set(&xtpg->xvip, XTPG_ZPLATE_HOR_CONTROL,
433 xvip_clr_and_set(&xtpg->xvip, XTPG_ZPLATE_VER_CONTROL,
438 xvip_clr_and_set(&xtpg->xvip, XTPG_ZPLATE_VER_CONTROL,
443 xvip_write(&xtpg->xvip, XTPG_BOX_SIZE, ctrl->val);
446 xvip_write(&xtpg->xvip, XTPG_BOX_COLOR, ctrl->val);
449 xvip_write(&xtpg->xvip, XTPG_STUCK_PIXEL_THRESH, ctrl->val);
452 xvip_write(&xtpg->xvip, XTPG_NOISE_GAIN, ctrl->val);
691 struct xtpg_device *xtpg = dev_get_drvdata(dev);
693 xvip_suspend(&xtpg->xvip);
700 struct xtpg_device *xtpg = dev_get_drvdata(dev);
702 xvip_resume(&xtpg->xvip);
711 static int xtpg_parse_of(struct xtpg_device *xtpg)
713 struct device *dev = xtpg->xvip.dev;
714 struct device_node *node = xtpg->xvip.dev->of_node;
739 if (!xtpg->vip_format) {
740 xtpg->vip_format = format;
741 } else if (xtpg->vip_format != format) {
763 xtpg->npads = nports;
765 xtpg->has_input = true;
773 struct xtpg_device *xtpg;
777 xtpg = devm_kzalloc(&pdev->dev, sizeof(*xtpg), GFP_KERNEL);
778 if (!xtpg)
781 xtpg->xvip.dev = &pdev->dev;
783 ret = xtpg_parse_of(xtpg);
787 ret = xvip_init_resources(&xtpg->xvip);
791 xtpg->vtmux_gpio = devm_gpiod_get_optional(&pdev->dev, "timing",
793 if (IS_ERR(xtpg->vtmux_gpio)) {
794 ret = PTR_ERR(xtpg->vtmux_gpio);
798 xtpg->vtc = xvtc_of_get(pdev->dev.of_node);
799 if (IS_ERR(xtpg->vtc)) {
800 ret = PTR_ERR(xtpg->vtc);
805 xvip_reset(&xtpg->xvip);
810 if (xtpg->npads == 2) {
811 xtpg->pads[0].flags = MEDIA_PAD_FL_SINK;
812 xtpg->pads[1].flags = MEDIA_PAD_FL_SOURCE;
814 xtpg->pads[0].flags = MEDIA_PAD_FL_SOURCE;
818 xtpg->default_format.code = xtpg->vip_format->code;
819 xtpg->default_format.field = V4L2_FIELD_NONE;
820 xtpg->default_format.colorspace = V4L2_COLORSPACE_SRGB;
821 xvip_get_frame_size(&xtpg->xvip, &xtpg->default_format);
823 bayer_phase = xtpg_get_bayer_phase(xtpg->vip_format->code);
825 xtpg->bayer = true;
827 xtpg->formats[0] = xtpg->default_format;
828 if (xtpg->npads == 2)
829 xtpg->formats[1] = xtpg->default_format;
832 subdev = &xtpg->xvip.subdev;
837 v4l2_set_subdevdata(subdev, xtpg);
841 ret = media_entity_pads_init(&subdev->entity, xtpg->npads, xtpg->pads);
845 v4l2_ctrl_handler_init(&xtpg->ctrl_handler, 3 + ARRAY_SIZE(xtpg_ctrls));
847 xtpg->vblank = v4l2_ctrl_new_std(&xtpg->ctrl_handler, &xtpg_ctrl_ops,
850 xtpg->hblank = v4l2_ctrl_new_std(&xtpg->ctrl_handler, &xtpg_ctrl_ops,
853 xtpg->pattern = v4l2_ctrl_new_std_menu_items(&xtpg->ctrl_handler,
859 v4l2_ctrl_new_custom(&xtpg->ctrl_handler, &xtpg_ctrls[i], NULL);
861 if (xtpg->ctrl_handler.error) {
863 ret = xtpg->ctrl_handler.error;
866 subdev->ctrl_handler = &xtpg->ctrl_handler;
868 xtpg_update_pattern_control(xtpg, true, true);
870 ret = v4l2_ctrl_handler_setup(&xtpg->ctrl_handler);
876 platform_set_drvdata(pdev, xtpg);
878 xvip_print_version(&xtpg->xvip);
889 v4l2_ctrl_handler_free(&xtpg->ctrl_handler);
891 xvtc_put(xtpg->vtc);
893 xvip_cleanup_resources(&xtpg->xvip);
899 struct xtpg_device *xtpg = platform_get_drvdata(pdev);
900 struct v4l2_subdev *subdev = &xtpg->xvip.subdev;
903 v4l2_ctrl_handler_free(&xtpg->ctrl_handler);
906 xvip_cleanup_resources(&xtpg->xvip);