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

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: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 7a781087
...@@ -120,6 +120,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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->output->entity.list_pipe, &pipe->entities);
list_add_tail(&pipe->bru->list_pipe, &pipe->entities); pipe->lif->pipe = pipe;
list_add_tail(&pipe->lif->list_pipe, &pipe->entities); list_add_tail(&pipe->lif->list_pipe, &pipe->entities);
list_add_tail(&pipe->output->entity.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) ...@@ -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 { ...@@ -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, ...@@ -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 @@ ...@@ -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 { ...@@ -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, ...@@ -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) ...@@ -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->pipe = NULL;
pipe->output = NULL;
}
if (pipe->hgo) { pipe->output = NULL;
struct vsp1_hgo *hgo = to_hgo(&pipe->hgo->subdev);
hgo->histo.pipe = NULL; list_for_each_entry(entity, &pipe->entities, list_pipe)
} entity->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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
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