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: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> Acked-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
650651b7b5
commit
cebd8c532f
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
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);
|
||||||
/**
|
/**
|
||||||
* 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);
|
||||||
*
|
*
|
||||||
* 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)
|
||||||
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);
|
||||||
/**
|
/**
|
||||||
* 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);
|
||||||
/**
|
/**
|
||||||
* 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);
|
||||||
*
|
*
|
||||||
* 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)
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue