static int wpf_init_controls(struct vsp1_rwpf *wpf) { struct vsp1_device *vsp1 = wpf->entity.vsp1; unsigned int num_flip_ctrls; spin_lock_init(&wpf->flip.lock); if (wpf->entity.index != 0) { /* Only WPF0 supports flipping. */ num_flip_ctrls = 0; } else if (vsp1->info->features & VSP1_HAS_WPF_HFLIP) { /* When horizontal flip is supported the WPF implements two * controls (horizontal flip and vertical flip). */ num_flip_ctrls = 2; } else if (vsp1->info->features & VSP1_HAS_WPF_VFLIP) { /* When only vertical flip is supported the WPF implements a * single control (vertical flip). */ num_flip_ctrls = 1; } else { /* Otherwise flipping is not supported. */ num_flip_ctrls = 0; } vsp1_rwpf_init_ctrls(wpf, num_flip_ctrls); if (num_flip_ctrls >= 1) { wpf->flip.ctrls[WPF_CTRL_VFLIP] = v4l2_ctrl_new_std(&wpf->ctrls, &vsp1_wpf_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0); } if (num_flip_ctrls == 2) { wpf->flip.ctrls[WPF_CTRL_HFLIP] = v4l2_ctrl_new_std(&wpf->ctrls, &vsp1_wpf_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0); v4l2_ctrl_cluster(2, wpf->flip.ctrls); } if (wpf->ctrls.error) { dev_err(vsp1->dev, "wpf%u: failed to initialize controls\n", wpf->entity.index); return wpf->ctrls.error; } return 0; }
struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index) { struct vsp1_rwpf *wpf; char name[6]; int ret; wpf = devm_kzalloc(vsp1->dev, sizeof(*wpf), GFP_KERNEL); if (wpf == NULL) return ERR_PTR(-ENOMEM); if (vsp1->info->gen == 2) { wpf->max_width = WPF_GEN2_MAX_WIDTH; wpf->max_height = WPF_GEN2_MAX_HEIGHT; } else { wpf->max_width = WPF_GEN3_MAX_WIDTH; wpf->max_height = WPF_GEN3_MAX_HEIGHT; } wpf->entity.ops = &wpf_entity_ops; wpf->entity.type = VSP1_ENTITY_WPF; wpf->entity.index = index; sprintf(name, "wpf.%u", index); ret = vsp1_entity_init(vsp1, &wpf->entity, name, 2, &wpf_ops); if (ret < 0) return ERR_PTR(ret); /* Initialize the display list manager. */ wpf->dlm = vsp1_dlm_create(vsp1, index, 4); if (!wpf->dlm) { ret = -ENOMEM; goto error; } /* Initialize the control handler. */ ret = vsp1_rwpf_init_ctrls(wpf); if (ret < 0) { dev_err(vsp1->dev, "wpf%u: failed to initialize controls\n", index); goto error; } return wpf; error: vsp1_entity_destroy(&wpf->entity); return ERR_PTR(ret); }
struct vsp1_rwpf *vsp1_rpf_create(struct vsp1_device *vsp1, unsigned int index) { struct vsp1_rwpf *rpf; char name[6]; int ret; rpf = devm_kzalloc(vsp1->dev, sizeof(*rpf), GFP_KERNEL); if (rpf == NULL) return ERR_PTR(-ENOMEM); rpf->max_width = RPF_MAX_WIDTH; rpf->max_height = RPF_MAX_HEIGHT; rpf->entity.ops = &rpf_entity_ops; rpf->entity.type = VSP1_ENTITY_RPF; rpf->entity.index = index; sprintf(name, "rpf.%u", index); ret = vsp1_entity_init(vsp1, &rpf->entity, name, 2, &rpf_ops, MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER); if (ret < 0) return ERR_PTR(ret); /* Initialize the control handler. */ ret = vsp1_rwpf_init_ctrls(rpf, 0); if (ret < 0) { dev_err(vsp1->dev, "rpf%u: failed to initialize controls\n", index); goto error; } v4l2_ctrl_handler_setup(&rpf->ctrls); return rpf; error: vsp1_entity_destroy(&rpf->entity); return ERR_PTR(ret); }