Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cebd8c53 authored by Laurent Pinchart's avatar Laurent Pinchart
Browse files

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
Loading
Loading
Loading
Loading
+6 −6
Original line number Original line Diff line number Diff line
@@ -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 = {
+16 −4
Original line number Original line Diff line number Diff line
@@ -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;
+6 −4
Original line number Original line Diff line number Diff line
@@ -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);