Commit cebd8c53 authored by Laurent Pinchart's avatar Laurent Pinchart

v4l: vsp1: Add pipe index argument to the VSP-DU API

In the H3 ES2.0 SoC the VSP2-DL instance has two connections to DU
channels that need to be configured independently. Extend the VSP-DU API
with a pipeline index to identify which pipeline the caller wants to
operate on.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Acked-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 650651b7
...@@ -81,22 +81,22 @@ void rcar_du_vsp_enable(struct rcar_du_crtc *crtc) ...@@ -81,22 +81,22 @@ void rcar_du_vsp_enable(struct rcar_du_crtc *crtc)
*/ */
crtc->group->need_restart = true; crtc->group->need_restart = true;
vsp1_du_setup_lif(crtc->vsp->vsp, &cfg); vsp1_du_setup_lif(crtc->vsp->vsp, 0, &cfg);
} }
void rcar_du_vsp_disable(struct rcar_du_crtc *crtc) void rcar_du_vsp_disable(struct rcar_du_crtc *crtc)
{ {
vsp1_du_setup_lif(crtc->vsp->vsp, NULL); vsp1_du_setup_lif(crtc->vsp->vsp, 0, NULL);
} }
void rcar_du_vsp_atomic_begin(struct rcar_du_crtc *crtc) void rcar_du_vsp_atomic_begin(struct rcar_du_crtc *crtc)
{ {
vsp1_du_atomic_begin(crtc->vsp->vsp); vsp1_du_atomic_begin(crtc->vsp->vsp, 0);
} }
void rcar_du_vsp_atomic_flush(struct rcar_du_crtc *crtc) void rcar_du_vsp_atomic_flush(struct rcar_du_crtc *crtc)
{ {
vsp1_du_atomic_flush(crtc->vsp->vsp); vsp1_du_atomic_flush(crtc->vsp->vsp, 0);
} }
/* Keep the two tables in sync. */ /* Keep the two tables in sync. */
...@@ -192,7 +192,7 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) ...@@ -192,7 +192,7 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
} }
} }
vsp1_du_atomic_update(plane->vsp->vsp, plane->index, &cfg); vsp1_du_atomic_update(plane->vsp->vsp, 0, plane->index, &cfg);
} }
static int rcar_du_vsp_plane_prepare_fb(struct drm_plane *plane, static int rcar_du_vsp_plane_prepare_fb(struct drm_plane *plane,
...@@ -292,7 +292,7 @@ static void rcar_du_vsp_plane_atomic_update(struct drm_plane *plane, ...@@ -292,7 +292,7 @@ static void rcar_du_vsp_plane_atomic_update(struct drm_plane *plane,
if (plane->state->crtc) if (plane->state->crtc)
rcar_du_vsp_plane_setup(rplane); rcar_du_vsp_plane_setup(rplane);
else else
vsp1_du_atomic_update(rplane->vsp->vsp, rplane->index, NULL); vsp1_du_atomic_update(rplane->vsp->vsp, 0, rplane->index, NULL);
} }
static const struct drm_plane_helper_funcs rcar_du_vsp_plane_helper_funcs = { static const struct drm_plane_helper_funcs rcar_du_vsp_plane_helper_funcs = {
......
...@@ -58,12 +58,16 @@ EXPORT_SYMBOL_GPL(vsp1_du_init); ...@@ -58,12 +58,16 @@ EXPORT_SYMBOL_GPL(vsp1_du_init);
/** /**
* vsp1_du_setup_lif - Setup the output part of the VSP pipeline * vsp1_du_setup_lif - Setup the output part of the VSP pipeline
* @dev: the VSP device * @dev: the VSP device
* @pipe_index: the DRM pipeline index
* @cfg: the LIF configuration * @cfg: the LIF configuration
* *
* Configure the output part of VSP DRM pipeline for the given frame @cfg.width * Configure the output part of VSP DRM pipeline for the given frame @cfg.width
* and @cfg.height. This sets up formats on the BRU source pad, the WPF0 sink * and @cfg.height. This sets up formats on the BRU source pad, the WPF0 sink
* and source pads, and the LIF sink pad. * and source pads, and the LIF sink pad.
* *
* The @pipe_index argument selects which DRM pipeline to setup. The number of
* available pipelines depend on the VSP instance.
*
* As the media bus code on the BRU source pad is conditioned by the * As the media bus code on the BRU source pad is conditioned by the
* configuration of the BRU sink 0 pad, we also set up the formats on all BRU * configuration of the BRU sink 0 pad, we also set up the formats on all BRU
* sinks, even if the configuration will be overwritten later by * sinks, even if the configuration will be overwritten later by
...@@ -72,7 +76,8 @@ EXPORT_SYMBOL_GPL(vsp1_du_init); ...@@ -72,7 +76,8 @@ EXPORT_SYMBOL_GPL(vsp1_du_init);
* *
* Return 0 on success or a negative error code on failure. * Return 0 on success or a negative error code on failure.
*/ */
int vsp1_du_setup_lif(struct device *dev, const struct vsp1_du_lif_config *cfg) int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
const struct vsp1_du_lif_config *cfg)
{ {
struct vsp1_device *vsp1 = dev_get_drvdata(dev); struct vsp1_device *vsp1 = dev_get_drvdata(dev);
struct vsp1_pipeline *pipe = &vsp1->drm->pipe; struct vsp1_pipeline *pipe = &vsp1->drm->pipe;
...@@ -81,6 +86,9 @@ int vsp1_du_setup_lif(struct device *dev, const struct vsp1_du_lif_config *cfg) ...@@ -81,6 +86,9 @@ int vsp1_du_setup_lif(struct device *dev, const struct vsp1_du_lif_config *cfg)
unsigned int i; unsigned int i;
int ret; int ret;
if (pipe_index > 0)
return -EINVAL;
if (!cfg) { if (!cfg) {
/* /*
* NULL configuration means the CRTC is being disabled, stop * NULL configuration means the CRTC is being disabled, stop
...@@ -232,8 +240,9 @@ EXPORT_SYMBOL_GPL(vsp1_du_setup_lif); ...@@ -232,8 +240,9 @@ EXPORT_SYMBOL_GPL(vsp1_du_setup_lif);
/** /**
* vsp1_du_atomic_begin - Prepare for an atomic update * vsp1_du_atomic_begin - Prepare for an atomic update
* @dev: the VSP device * @dev: the VSP device
* @pipe_index: the DRM pipeline index
*/ */
void vsp1_du_atomic_begin(struct device *dev) void vsp1_du_atomic_begin(struct device *dev, unsigned int pipe_index)
{ {
struct vsp1_device *vsp1 = dev_get_drvdata(dev); struct vsp1_device *vsp1 = dev_get_drvdata(dev);
struct vsp1_pipeline *pipe = &vsp1->drm->pipe; struct vsp1_pipeline *pipe = &vsp1->drm->pipe;
...@@ -245,6 +254,7 @@ EXPORT_SYMBOL_GPL(vsp1_du_atomic_begin); ...@@ -245,6 +254,7 @@ EXPORT_SYMBOL_GPL(vsp1_du_atomic_begin);
/** /**
* vsp1_du_atomic_update - Setup one RPF input of the VSP pipeline * vsp1_du_atomic_update - Setup one RPF input of the VSP pipeline
* @dev: the VSP device * @dev: the VSP device
* @pipe_index: the DRM pipeline index
* @rpf_index: index of the RPF to setup (0-based) * @rpf_index: index of the RPF to setup (0-based)
* @cfg: the RPF configuration * @cfg: the RPF configuration
* *
...@@ -271,7 +281,8 @@ EXPORT_SYMBOL_GPL(vsp1_du_atomic_begin); ...@@ -271,7 +281,8 @@ EXPORT_SYMBOL_GPL(vsp1_du_atomic_begin);
* *
* Return 0 on success or a negative error code on failure. * Return 0 on success or a negative error code on failure.
*/ */
int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index, int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index,
unsigned int rpf_index,
const struct vsp1_du_atomic_config *cfg) const struct vsp1_du_atomic_config *cfg)
{ {
struct vsp1_device *vsp1 = dev_get_drvdata(dev); struct vsp1_device *vsp1 = dev_get_drvdata(dev);
...@@ -437,8 +448,9 @@ static unsigned int rpf_zpos(struct vsp1_device *vsp1, struct vsp1_rwpf *rpf) ...@@ -437,8 +448,9 @@ static unsigned int rpf_zpos(struct vsp1_device *vsp1, struct vsp1_rwpf *rpf)
/** /**
* vsp1_du_atomic_flush - Commit an atomic update * vsp1_du_atomic_flush - Commit an atomic update
* @dev: the VSP device * @dev: the VSP device
* @pipe_index: the DRM pipeline index
*/ */
void vsp1_du_atomic_flush(struct device *dev) void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
{ {
struct vsp1_device *vsp1 = dev_get_drvdata(dev); struct vsp1_device *vsp1 = dev_get_drvdata(dev);
struct vsp1_pipeline *pipe = &vsp1->drm->pipe; struct vsp1_pipeline *pipe = &vsp1->drm->pipe;
......
...@@ -38,7 +38,8 @@ struct vsp1_du_lif_config { ...@@ -38,7 +38,8 @@ struct vsp1_du_lif_config {
void *callback_data; void *callback_data;
}; };
int vsp1_du_setup_lif(struct device *dev, const struct vsp1_du_lif_config *cfg); int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
const struct vsp1_du_lif_config *cfg);
struct vsp1_du_atomic_config { struct vsp1_du_atomic_config {
u32 pixelformat; u32 pixelformat;
...@@ -50,10 +51,11 @@ struct vsp1_du_atomic_config { ...@@ -50,10 +51,11 @@ struct vsp1_du_atomic_config {
unsigned int zpos; unsigned int zpos;
}; };
void vsp1_du_atomic_begin(struct device *dev); void vsp1_du_atomic_begin(struct device *dev, unsigned int pipe_index);
int vsp1_du_atomic_update(struct device *dev, unsigned int rpf, int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index,
unsigned int rpf,
const struct vsp1_du_atomic_config *cfg); const struct vsp1_du_atomic_config *cfg);
void vsp1_du_atomic_flush(struct device *dev); void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index);
int vsp1_du_map_sg(struct device *dev, struct sg_table *sgt); int vsp1_du_map_sg(struct device *dev, struct sg_table *sgt);
void vsp1_du_unmap_sg(struct device *dev, struct sg_table *sgt); void vsp1_du_unmap_sg(struct device *dev, struct sg_table *sgt);
......
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