media: v4l: vsp1: Store pipeline pointer in vsp1_entity
Various types of objects subclassing vsp1_entity currently store a pointer to the pipeline. Move the pointer to vsp1_entity to simplify the code and avoid storing the pipeline in more entity subclasses later. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Родитель
7a7810878e
Коммит
1ccbb32cb8
|
@ -120,6 +120,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
|
||||||
* inputs.
|
* inputs.
|
||||||
*/
|
*/
|
||||||
WARN_ON(list_empty(&rpf->entity.list_pipe));
|
WARN_ON(list_empty(&rpf->entity.list_pipe));
|
||||||
|
rpf->entity.pipe = NULL;
|
||||||
list_del_init(&rpf->entity.list_pipe);
|
list_del_init(&rpf->entity.list_pipe);
|
||||||
pipe->inputs[i] = NULL;
|
pipe->inputs[i] = NULL;
|
||||||
|
|
||||||
|
@ -536,8 +537,10 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_empty(&rpf->entity.list_pipe))
|
if (list_empty(&rpf->entity.list_pipe)) {
|
||||||
|
rpf->entity.pipe = pipe;
|
||||||
list_add_tail(&rpf->entity.list_pipe, &pipe->entities);
|
list_add_tail(&rpf->entity.list_pipe, &pipe->entities);
|
||||||
|
}
|
||||||
|
|
||||||
bru->inputs[i].rpf = rpf;
|
bru->inputs[i].rpf = rpf;
|
||||||
rpf->bru_input = i;
|
rpf->bru_input = i;
|
||||||
|
@ -562,6 +565,7 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
|
||||||
vsp1_dl_list_write(dl, entity->route->reg,
|
vsp1_dl_list_write(dl, entity->route->reg,
|
||||||
VI6_DPR_NODE_UNUSED);
|
VI6_DPR_NODE_UNUSED);
|
||||||
|
|
||||||
|
entity->pipe = NULL;
|
||||||
list_del_init(&entity->list_pipe);
|
list_del_init(&entity->list_pipe);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
@ -625,24 +629,28 @@ int vsp1_drm_init(struct vsp1_device *vsp1)
|
||||||
|
|
||||||
vsp1_pipeline_init(pipe);
|
vsp1_pipeline_init(pipe);
|
||||||
|
|
||||||
|
pipe->frame_end = vsp1_du_pipeline_frame_end;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The DRM pipeline is static, add entities manually. The first
|
* The DRM pipeline is static, add entities manually. The first
|
||||||
* pipeline uses the BRU and the second pipeline the BRS.
|
* pipeline uses the BRU and the second pipeline the BRS.
|
||||||
*/
|
*/
|
||||||
pipe->bru = i == 0 ? &vsp1->bru->entity : &vsp1->brs->entity;
|
pipe->bru = i == 0 ? &vsp1->bru->entity : &vsp1->brs->entity;
|
||||||
pipe->lif = &vsp1->lif[i]->entity;
|
|
||||||
pipe->output = vsp1->wpf[i];
|
pipe->output = vsp1->wpf[i];
|
||||||
pipe->output->pipe = pipe;
|
pipe->lif = &vsp1->lif[i]->entity;
|
||||||
pipe->frame_end = vsp1_du_pipeline_frame_end;
|
|
||||||
|
|
||||||
|
pipe->bru->pipe = pipe;
|
||||||
pipe->bru->sink = &pipe->output->entity;
|
pipe->bru->sink = &pipe->output->entity;
|
||||||
pipe->bru->sink_pad = 0;
|
pipe->bru->sink_pad = 0;
|
||||||
|
list_add_tail(&pipe->bru->list_pipe, &pipe->entities);
|
||||||
|
|
||||||
|
pipe->output->entity.pipe = pipe;
|
||||||
pipe->output->entity.sink = pipe->lif;
|
pipe->output->entity.sink = pipe->lif;
|
||||||
pipe->output->entity.sink_pad = 0;
|
pipe->output->entity.sink_pad = 0;
|
||||||
|
|
||||||
list_add_tail(&pipe->bru->list_pipe, &pipe->entities);
|
|
||||||
list_add_tail(&pipe->lif->list_pipe, &pipe->entities);
|
|
||||||
list_add_tail(&pipe->output->entity.list_pipe, &pipe->entities);
|
list_add_tail(&pipe->output->entity.list_pipe, &pipe->entities);
|
||||||
|
|
||||||
|
pipe->lif->pipe = pipe;
|
||||||
|
list_add_tail(&pipe->lif->list_pipe, &pipe->entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable all RPFs initially. */
|
/* Disable all RPFs initially. */
|
||||||
|
|
|
@ -63,7 +63,7 @@ static irqreturn_t vsp1_irq_handler(int irq, void *data)
|
||||||
vsp1_write(vsp1, VI6_WPF_IRQ_STA(i), ~status & mask);
|
vsp1_write(vsp1, VI6_WPF_IRQ_STA(i), ~status & mask);
|
||||||
|
|
||||||
if (status & VI6_WFP_IRQ_STA_DFE) {
|
if (status & VI6_WFP_IRQ_STA_DFE) {
|
||||||
vsp1_pipeline_frame_end(wpf->pipe);
|
vsp1_pipeline_frame_end(wpf->entity.pipe);
|
||||||
ret = IRQ_HANDLED;
|
ret = IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,8 @@ struct vsp1_entity {
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
const struct vsp1_route *route;
|
const struct vsp1_route *route;
|
||||||
|
|
||||||
|
struct vsp1_pipeline *pipe;
|
||||||
|
|
||||||
struct list_head list_dev;
|
struct list_head list_dev;
|
||||||
struct list_head list_pipe;
|
struct list_head list_pipe;
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo,
|
||||||
struct vsp1_histogram_buffer *buf,
|
struct vsp1_histogram_buffer *buf,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
struct vsp1_pipeline *pipe = histo->pipe;
|
struct vsp1_pipeline *pipe = histo->entity.pipe;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include "vsp1_entity.h"
|
#include "vsp1_entity.h"
|
||||||
|
|
||||||
struct vsp1_device;
|
struct vsp1_device;
|
||||||
struct vsp1_pipeline;
|
|
||||||
|
|
||||||
#define HISTO_PAD_SINK 0
|
#define HISTO_PAD_SINK 0
|
||||||
#define HISTO_PAD_SOURCE 1
|
#define HISTO_PAD_SOURCE 1
|
||||||
|
@ -37,8 +36,6 @@ struct vsp1_histogram_buffer {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vsp1_histogram {
|
struct vsp1_histogram {
|
||||||
struct vsp1_pipeline *pipe;
|
|
||||||
|
|
||||||
struct vsp1_entity entity;
|
struct vsp1_entity entity;
|
||||||
struct video_device video;
|
struct video_device video;
|
||||||
struct media_pad pad;
|
struct media_pad pad;
|
||||||
|
|
|
@ -185,6 +185,7 @@ const struct vsp1_format_info *vsp1_get_format_info(struct vsp1_device *vsp1,
|
||||||
|
|
||||||
void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
|
void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
|
||||||
{
|
{
|
||||||
|
struct vsp1_entity *entity;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (pipe->bru) {
|
if (pipe->bru) {
|
||||||
|
@ -194,29 +195,13 @@ void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
|
||||||
bru->inputs[i].rpf = NULL;
|
bru->inputs[i].rpf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i) {
|
for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i)
|
||||||
if (pipe->inputs[i]) {
|
pipe->inputs[i] = NULL;
|
||||||
pipe->inputs[i]->pipe = NULL;
|
|
||||||
pipe->inputs[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipe->output) {
|
pipe->output = NULL;
|
||||||
pipe->output->pipe = NULL;
|
|
||||||
pipe->output = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipe->hgo) {
|
list_for_each_entry(entity, &pipe->entities, list_pipe)
|
||||||
struct vsp1_hgo *hgo = to_hgo(&pipe->hgo->subdev);
|
entity->pipe = NULL;
|
||||||
|
|
||||||
hgo->histo.pipe = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipe->hgt) {
|
|
||||||
struct vsp1_hgt *hgt = to_hgt(&pipe->hgt->subdev);
|
|
||||||
|
|
||||||
hgt->histo.pipe = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&pipe->entities);
|
INIT_LIST_HEAD(&pipe->entities);
|
||||||
pipe->state = VSP1_PIPELINE_STOPPED;
|
pipe->state = VSP1_PIPELINE_STOPPED;
|
||||||
|
@ -423,7 +408,7 @@ void vsp1_pipelines_suspend(struct vsp1_device *vsp1)
|
||||||
if (wpf == NULL)
|
if (wpf == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pipe = wpf->pipe;
|
pipe = wpf->entity.pipe;
|
||||||
if (pipe == NULL)
|
if (pipe == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -440,7 +425,7 @@ void vsp1_pipelines_suspend(struct vsp1_device *vsp1)
|
||||||
if (wpf == NULL)
|
if (wpf == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pipe = wpf->pipe;
|
pipe = wpf->entity.pipe;
|
||||||
if (pipe == NULL)
|
if (pipe == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -465,7 +450,7 @@ void vsp1_pipelines_resume(struct vsp1_device *vsp1)
|
||||||
if (wpf == NULL)
|
if (wpf == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pipe = wpf->pipe;
|
pipe = wpf->entity.pipe;
|
||||||
if (pipe == NULL)
|
if (pipe == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
struct v4l2_ctrl;
|
struct v4l2_ctrl;
|
||||||
struct vsp1_dl_manager;
|
struct vsp1_dl_manager;
|
||||||
struct vsp1_pipeline;
|
|
||||||
struct vsp1_rwpf;
|
struct vsp1_rwpf;
|
||||||
struct vsp1_video;
|
struct vsp1_video;
|
||||||
|
|
||||||
|
@ -39,7 +38,6 @@ struct vsp1_rwpf {
|
||||||
struct vsp1_entity entity;
|
struct vsp1_entity entity;
|
||||||
struct v4l2_ctrl_handler ctrls;
|
struct v4l2_ctrl_handler ctrls;
|
||||||
|
|
||||||
struct vsp1_pipeline *pipe;
|
|
||||||
struct vsp1_video *video;
|
struct vsp1_video *video;
|
||||||
|
|
||||||
unsigned int max_width;
|
unsigned int max_width;
|
||||||
|
|
|
@ -324,7 +324,7 @@ static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
|
||||||
static struct vsp1_vb2_buffer *
|
static struct vsp1_vb2_buffer *
|
||||||
vsp1_video_complete_buffer(struct vsp1_video *video)
|
vsp1_video_complete_buffer(struct vsp1_video *video)
|
||||||
{
|
{
|
||||||
struct vsp1_pipeline *pipe = video->rwpf->pipe;
|
struct vsp1_pipeline *pipe = video->rwpf->entity.pipe;
|
||||||
struct vsp1_vb2_buffer *next = NULL;
|
struct vsp1_vb2_buffer *next = NULL;
|
||||||
struct vsp1_vb2_buffer *done;
|
struct vsp1_vb2_buffer *done;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -598,20 +598,19 @@ static int vsp1_video_pipeline_build(struct vsp1_pipeline *pipe,
|
||||||
subdev = media_entity_to_v4l2_subdev(entity);
|
subdev = media_entity_to_v4l2_subdev(entity);
|
||||||
e = to_vsp1_entity(subdev);
|
e = to_vsp1_entity(subdev);
|
||||||
list_add_tail(&e->list_pipe, &pipe->entities);
|
list_add_tail(&e->list_pipe, &pipe->entities);
|
||||||
|
e->pipe = pipe;
|
||||||
|
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case VSP1_ENTITY_RPF:
|
case VSP1_ENTITY_RPF:
|
||||||
rwpf = to_rwpf(subdev);
|
rwpf = to_rwpf(subdev);
|
||||||
pipe->inputs[rwpf->entity.index] = rwpf;
|
pipe->inputs[rwpf->entity.index] = rwpf;
|
||||||
rwpf->video->pipe_index = ++pipe->num_inputs;
|
rwpf->video->pipe_index = ++pipe->num_inputs;
|
||||||
rwpf->pipe = pipe;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VSP1_ENTITY_WPF:
|
case VSP1_ENTITY_WPF:
|
||||||
rwpf = to_rwpf(subdev);
|
rwpf = to_rwpf(subdev);
|
||||||
pipe->output = rwpf;
|
pipe->output = rwpf;
|
||||||
rwpf->video->pipe_index = 0;
|
rwpf->video->pipe_index = 0;
|
||||||
rwpf->pipe = pipe;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VSP1_ENTITY_LIF:
|
case VSP1_ENTITY_LIF:
|
||||||
|
@ -625,12 +624,10 @@ static int vsp1_video_pipeline_build(struct vsp1_pipeline *pipe,
|
||||||
|
|
||||||
case VSP1_ENTITY_HGO:
|
case VSP1_ENTITY_HGO:
|
||||||
pipe->hgo = e;
|
pipe->hgo = e;
|
||||||
to_hgo(subdev)->histo.pipe = pipe;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VSP1_ENTITY_HGT:
|
case VSP1_ENTITY_HGT:
|
||||||
pipe->hgt = e;
|
pipe->hgt = e;
|
||||||
to_hgt(subdev)->histo.pipe = pipe;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -682,7 +679,7 @@ static struct vsp1_pipeline *vsp1_video_pipeline_get(struct vsp1_video *video)
|
||||||
* Otherwise allocate a new pipeline and initialize it, it will be freed
|
* Otherwise allocate a new pipeline and initialize it, it will be freed
|
||||||
* when the last reference is released.
|
* when the last reference is released.
|
||||||
*/
|
*/
|
||||||
if (!video->rwpf->pipe) {
|
if (!video->rwpf->entity.pipe) {
|
||||||
pipe = kzalloc(sizeof(*pipe), GFP_KERNEL);
|
pipe = kzalloc(sizeof(*pipe), GFP_KERNEL);
|
||||||
if (!pipe)
|
if (!pipe)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
@ -694,7 +691,7 @@ static struct vsp1_pipeline *vsp1_video_pipeline_get(struct vsp1_video *video)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pipe = video->rwpf->pipe;
|
pipe = video->rwpf->entity.pipe;
|
||||||
kref_get(&pipe->kref);
|
kref_get(&pipe->kref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -777,7 +774,7 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb)
|
||||||
{
|
{
|
||||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||||
struct vsp1_video *video = vb2_get_drv_priv(vb->vb2_queue);
|
struct vsp1_video *video = vb2_get_drv_priv(vb->vb2_queue);
|
||||||
struct vsp1_pipeline *pipe = video->rwpf->pipe;
|
struct vsp1_pipeline *pipe = video->rwpf->entity.pipe;
|
||||||
struct vsp1_vb2_buffer *buf = to_vsp1_vb2_buffer(vbuf);
|
struct vsp1_vb2_buffer *buf = to_vsp1_vb2_buffer(vbuf);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
bool empty;
|
bool empty;
|
||||||
|
@ -872,7 +869,7 @@ static void vsp1_video_cleanup_pipeline(struct vsp1_pipeline *pipe)
|
||||||
static int vsp1_video_start_streaming(struct vb2_queue *vq, unsigned int count)
|
static int vsp1_video_start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||||
{
|
{
|
||||||
struct vsp1_video *video = vb2_get_drv_priv(vq);
|
struct vsp1_video *video = vb2_get_drv_priv(vq);
|
||||||
struct vsp1_pipeline *pipe = video->rwpf->pipe;
|
struct vsp1_pipeline *pipe = video->rwpf->entity.pipe;
|
||||||
bool start_pipeline = false;
|
bool start_pipeline = false;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -913,7 +910,7 @@ static int vsp1_video_start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||||
static void vsp1_video_stop_streaming(struct vb2_queue *vq)
|
static void vsp1_video_stop_streaming(struct vb2_queue *vq)
|
||||||
{
|
{
|
||||||
struct vsp1_video *video = vb2_get_drv_priv(vq);
|
struct vsp1_video *video = vb2_get_drv_priv(vq);
|
||||||
struct vsp1_pipeline *pipe = video->rwpf->pipe;
|
struct vsp1_pipeline *pipe = video->rwpf->entity.pipe;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче