Commit a96c5fa4 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] v4l: vsp1: Make number of BRU inputs configurable

The R-Car Gen3 family has 5-inputs BRUs, support them by making the
number of BRU inputs configurable.

As the driver assumes that the number of BRU inputs is equal to the
number of RPFs, replace the BRU_MAX_INPUTS macro with VSP1_MAX_RPF to
make the assumption apparent.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 665b693c
...@@ -48,6 +48,7 @@ struct vsp1_platform_data { ...@@ -48,6 +48,7 @@ struct vsp1_platform_data {
unsigned int rpf_count; unsigned int rpf_count;
unsigned int uds_count; unsigned int uds_count;
unsigned int wpf_count; unsigned int wpf_count;
unsigned int num_bru_inputs;
}; };
struct vsp1_device { struct vsp1_device {
......
...@@ -79,7 +79,7 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable) ...@@ -79,7 +79,7 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable)
if (!enable) if (!enable)
return 0; return 0;
format = &bru->entity.formats[BRU_PAD_SOURCE]; format = &bru->entity.formats[bru->entity.source_pad];
/* The hardware is extremely flexible but we have no userspace API to /* The hardware is extremely flexible but we have no userspace API to
* expose all the parameters, nor is it clear whether we would have use * expose all the parameters, nor is it clear whether we would have use
...@@ -109,7 +109,7 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable) ...@@ -109,7 +109,7 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable)
VI6_BRU_ROP_CROP(VI6_ROP_NOP) | VI6_BRU_ROP_CROP(VI6_ROP_NOP) |
VI6_BRU_ROP_AROP(VI6_ROP_NOP)); VI6_BRU_ROP_AROP(VI6_ROP_NOP));
for (i = 0; i < 4; ++i) { for (i = 0; i < bru->entity.source_pad; ++i) {
bool premultiplied = false; bool premultiplied = false;
u32 ctrl = 0; u32 ctrl = 0;
...@@ -291,7 +291,7 @@ static int bru_set_format(struct v4l2_subdev *subdev, struct v4l2_subdev_pad_con ...@@ -291,7 +291,7 @@ static int bru_set_format(struct v4l2_subdev *subdev, struct v4l2_subdev_pad_con
*format = fmt->format; *format = fmt->format;
/* Reset the compose rectangle */ /* Reset the compose rectangle */
if (fmt->pad != BRU_PAD_SOURCE) { if (fmt->pad != bru->entity.source_pad) {
struct v4l2_rect *compose; struct v4l2_rect *compose;
compose = bru_get_compose(bru, cfg, fmt->pad, fmt->which); compose = bru_get_compose(bru, cfg, fmt->pad, fmt->which);
...@@ -305,7 +305,7 @@ static int bru_set_format(struct v4l2_subdev *subdev, struct v4l2_subdev_pad_con ...@@ -305,7 +305,7 @@ static int bru_set_format(struct v4l2_subdev *subdev, struct v4l2_subdev_pad_con
if (fmt->pad == BRU_PAD_SINK(0)) { if (fmt->pad == BRU_PAD_SINK(0)) {
unsigned int i; unsigned int i;
for (i = 0; i <= BRU_PAD_SOURCE; ++i) { for (i = 0; i <= bru->entity.source_pad; ++i) {
format = vsp1_entity_get_pad_format(&bru->entity, cfg, format = vsp1_entity_get_pad_format(&bru->entity, cfg,
i, fmt->which); i, fmt->which);
format->code = fmt->format.code; format->code = fmt->format.code;
...@@ -321,7 +321,7 @@ static int bru_get_selection(struct v4l2_subdev *subdev, ...@@ -321,7 +321,7 @@ static int bru_get_selection(struct v4l2_subdev *subdev,
{ {
struct vsp1_bru *bru = to_bru(subdev); struct vsp1_bru *bru = to_bru(subdev);
if (sel->pad == BRU_PAD_SOURCE) if (sel->pad == bru->entity.source_pad)
return -EINVAL; return -EINVAL;
switch (sel->target) { switch (sel->target) {
...@@ -349,7 +349,7 @@ static int bru_set_selection(struct v4l2_subdev *subdev, ...@@ -349,7 +349,7 @@ static int bru_set_selection(struct v4l2_subdev *subdev,
struct v4l2_mbus_framefmt *format; struct v4l2_mbus_framefmt *format;
struct v4l2_rect *compose; struct v4l2_rect *compose;
if (sel->pad == BRU_PAD_SOURCE) if (sel->pad == bru->entity.source_pad)
return -EINVAL; return -EINVAL;
if (sel->target != V4L2_SEL_TGT_COMPOSE) if (sel->target != V4L2_SEL_TGT_COMPOSE)
...@@ -358,8 +358,8 @@ static int bru_set_selection(struct v4l2_subdev *subdev, ...@@ -358,8 +358,8 @@ static int bru_set_selection(struct v4l2_subdev *subdev,
/* The compose rectangle top left corner must be inside the output /* The compose rectangle top left corner must be inside the output
* frame. * frame.
*/ */
format = vsp1_entity_get_pad_format(&bru->entity, cfg, BRU_PAD_SOURCE, format = vsp1_entity_get_pad_format(&bru->entity, cfg,
sel->which); bru->entity.source_pad, sel->which);
sel->r.left = clamp_t(unsigned int, sel->r.left, 0, format->width - 1); sel->r.left = clamp_t(unsigned int, sel->r.left, 0, format->width - 1);
sel->r.top = clamp_t(unsigned int, sel->r.top, 0, format->height - 1); sel->r.top = clamp_t(unsigned int, sel->r.top, 0, format->height - 1);
...@@ -415,7 +415,8 @@ struct vsp1_bru *vsp1_bru_create(struct vsp1_device *vsp1) ...@@ -415,7 +415,8 @@ struct vsp1_bru *vsp1_bru_create(struct vsp1_device *vsp1)
bru->entity.type = VSP1_ENTITY_BRU; bru->entity.type = VSP1_ENTITY_BRU;
ret = vsp1_entity_init(vsp1, &bru->entity, 5); ret = vsp1_entity_init(vsp1, &bru->entity,
vsp1->pdata.num_bru_inputs + 1);
if (ret < 0) if (ret < 0)
return ERR_PTR(ret); return ERR_PTR(ret);
......
...@@ -23,7 +23,6 @@ struct vsp1_device; ...@@ -23,7 +23,6 @@ struct vsp1_device;
struct vsp1_rwpf; struct vsp1_rwpf;
#define BRU_PAD_SINK(n) (n) #define BRU_PAD_SINK(n) (n)
#define BRU_PAD_SOURCE 4
struct vsp1_bru { struct vsp1_bru {
struct vsp1_entity entity; struct vsp1_entity entity;
...@@ -33,7 +32,7 @@ struct vsp1_bru { ...@@ -33,7 +32,7 @@ struct vsp1_bru {
struct { struct {
struct vsp1_rwpf *rpf; struct vsp1_rwpf *rpf;
struct v4l2_rect compose; struct v4l2_rect compose;
} inputs[4]; } inputs[VSP1_MAX_RPF];
}; };
static inline struct vsp1_bru *to_bru(struct v4l2_subdev *subdev) static inline struct vsp1_bru *to_bru(struct v4l2_subdev *subdev)
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
...@@ -540,6 +541,8 @@ static int vsp1_parse_dt(struct vsp1_device *vsp1) ...@@ -540,6 +541,8 @@ static int vsp1_parse_dt(struct vsp1_device *vsp1)
return -EINVAL; return -EINVAL;
} }
pdata->num_bru_inputs = 4;
return 0; return 0;
} }
......
...@@ -32,6 +32,8 @@ enum vsp1_entity_type { ...@@ -32,6 +32,8 @@ enum vsp1_entity_type {
VSP1_ENTITY_WPF, VSP1_ENTITY_WPF,
}; };
#define VSP1_ENTITY_MAX_INPUTS 5 /* For the BRU */
/* /*
* struct vsp1_route - Entity routing configuration * struct vsp1_route - Entity routing configuration
* @type: Entity type this routing entry is associated with * @type: Entity type this routing entry is associated with
...@@ -48,7 +50,7 @@ struct vsp1_route { ...@@ -48,7 +50,7 @@ struct vsp1_route {
enum vsp1_entity_type type; enum vsp1_entity_type type;
unsigned int index; unsigned int index;
unsigned int reg; unsigned int reg;
unsigned int inputs[4]; unsigned int inputs[VSP1_ENTITY_MAX_INPUTS];
}; };
struct vsp1_entity { struct vsp1_entity {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment