mirror of https://gitee.com/openkylin/linux.git
media: rcar-vin: Add control for alpha component
In preparation to adding support for RGB pixel formats with an alpha component add a control to allow the user to control which alpha value should be used. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
19ab1f649c
commit
5720c7331f
|
@ -389,6 +389,28 @@ static void rvin_group_put(struct rvin_dev *vin)
|
|||
kref_put(&group->refcount, rvin_group_release);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Controls
|
||||
*/
|
||||
|
||||
static int rvin_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct rvin_dev *vin =
|
||||
container_of(ctrl->handler, struct rvin_dev, ctrl_handler);
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_ALPHA_COMPONENT:
|
||||
rvin_set_alpha(vin, ctrl->val);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_ctrl_ops rvin_ctrl_ops = {
|
||||
.s_ctrl = rvin_s_ctrl,
|
||||
};
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Async notifier
|
||||
*/
|
||||
|
@ -478,6 +500,15 @@ static int rvin_parallel_subdevice_attach(struct rvin_dev *vin,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
v4l2_ctrl_new_std(&vin->ctrl_handler, &rvin_ctrl_ops,
|
||||
V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
|
||||
|
||||
if (vin->ctrl_handler.error) {
|
||||
ret = vin->ctrl_handler.error;
|
||||
v4l2_ctrl_handler_free(&vin->ctrl_handler);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = v4l2_ctrl_add_handler(&vin->ctrl_handler, subdev->ctrl_handler,
|
||||
NULL, true);
|
||||
if (ret < 0) {
|
||||
|
@ -870,6 +901,21 @@ static int rvin_mc_init(struct rvin_dev *vin)
|
|||
if (ret)
|
||||
rvin_group_put(vin);
|
||||
|
||||
ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
v4l2_ctrl_new_std(&vin->ctrl_handler, &rvin_ctrl_ops,
|
||||
V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
|
||||
|
||||
if (vin->ctrl_handler.error) {
|
||||
ret = vin->ctrl_handler.error;
|
||||
v4l2_ctrl_handler_free(&vin->ctrl_handler);
|
||||
return ret;
|
||||
}
|
||||
|
||||
vin->vdev.ctrl_handler = &vin->ctrl_handler;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1245,6 +1291,7 @@ static int rcar_vin_probe(struct platform_device *pdev)
|
|||
|
||||
vin->dev = &pdev->dev;
|
||||
vin->info = of_device_get_match_data(&pdev->dev);
|
||||
vin->alpha = 0xff;
|
||||
|
||||
/*
|
||||
* Special care is needed on r8a7795 ES1.x since it
|
||||
|
@ -1288,6 +1335,8 @@ static int rcar_vin_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
error_group_unregister:
|
||||
v4l2_ctrl_handler_free(&vin->ctrl_handler);
|
||||
|
||||
if (vin->info->use_mc) {
|
||||
mutex_lock(&vin->group->lock);
|
||||
if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
|
||||
|
@ -1323,10 +1372,10 @@ static int rcar_vin_remove(struct platform_device *pdev)
|
|||
}
|
||||
mutex_unlock(&vin->group->lock);
|
||||
rvin_group_put(vin);
|
||||
} else {
|
||||
v4l2_ctrl_handler_free(&vin->ctrl_handler);
|
||||
}
|
||||
|
||||
v4l2_ctrl_handler_free(&vin->ctrl_handler);
|
||||
|
||||
rvin_dma_unregister(vin);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1343,3 +1343,8 @@ int rvin_set_channel_routing(struct rvin_dev *vin, u8 chsel)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rvin_set_alpha(struct rvin_dev *vin, unsigned int alpha)
|
||||
{
|
||||
vin->alpha = alpha;
|
||||
}
|
||||
|
|
|
@ -178,6 +178,8 @@ struct rvin_info {
|
|||
* @compose: active composing
|
||||
* @source: active size of the video source
|
||||
* @std: active video standard of the video source
|
||||
*
|
||||
* @alpha: Alpha component to fill in for supported pixel formats
|
||||
*/
|
||||
struct rvin_dev {
|
||||
struct device *dev;
|
||||
|
@ -215,6 +217,8 @@ struct rvin_dev {
|
|||
struct v4l2_rect compose;
|
||||
struct v4l2_rect source;
|
||||
v4l2_std_id std;
|
||||
|
||||
unsigned int alpha;
|
||||
};
|
||||
|
||||
#define vin_to_source(vin) ((vin)->parallel->subdev)
|
||||
|
@ -268,5 +272,6 @@ const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin,
|
|||
void rvin_crop_scale_comp(struct rvin_dev *vin);
|
||||
|
||||
int rvin_set_channel_routing(struct rvin_dev *vin, u8 chsel);
|
||||
void rvin_set_alpha(struct rvin_dev *vin, unsigned int alpha);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue