Re: [RFC PATCH 03/11] drm: sun4i: ignore swapped mixer<->tcon connection for DE2

Maxime Ripard
2017-05-19T17:57:53Z

[-- Attachment #1: Type: text/plain, Size: 3652 bytes --]

On Thu, May 18, 2017 at 12:43:46AM +0800, Icenowy Zheng wrote:
> Some SoC's DE2 has two mixers. Defaultly the mixer0 is connected to
> tcon0 and mixer1 is connected to tcon1; however by setting a bit
> the connection can be swapped.
>
> As we now hardcode the default connection, ignore the bonus endpoint for
> the mixer's output and the TCON's input, as they stands for the swapped
> connection.
>
> Signed-off-by: Icenowy Zheng <icenowy-h8G6r0blFSE@public.gmane.org>
> ---
> drivers/gpu/drm/sun4i/sun4i_drv.c | 27 ++++++++++++++++++++++++++
> drivers/gpu/drm/sun4i/sun4i_tcon.c | 39 +++++++++++++++++++++++++++++---------
> drivers/gpu/drm/sun4i/sun4i_tcon.h | 2 ++
> 3 files changed, 59 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
> index 1dd1948025d2..29bf1325ded6 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_drv.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
> @@ -173,6 +173,13 @@ static bool sun4i_drv_node_is_frontend(struct device_node *node)
> of_device_is_compatible(node, "allwinner,sun8i-a33-display-frontend");
> }
>
> +static bool sun4i_drv_node_is_swappable_de2_mixer(struct device_node *node)
> +{
> + /* The V3s has only one mixer-tcon pair, so it's not listed here. */
> + return of_device_is_compatible(node, "allwinner,sun8i-h3-de2-mixer0") ||
> + of_device_is_compatible(node, "allwinner,sun8i-h3-de2-mixer1");
> +}
> +
> static bool sun4i_drv_node_is_tcon(struct device_node *node)
> {
> return of_device_is_compatible(node, "allwinner,sun5i-a13-tcon") ||
> @@ -249,6 +256,26 @@ static int sun4i_drv_add_endpoints(struct device *dev,
> }
> }
>
> + /*
> + * The second endpoint of the output of a swappable DE2 mixer
> + * is the TCON after connection swapping.
> + * Ignore it now, as we now hardcode mixer0->tcon0,
> + * mixer1->tcon1 connection.
> + */
> + if (sun4i_drv_node_is_swappable_de2_mixer(node)) {
> + struct of_endpoint endpoint;
> +
> + if (of_graph_parse_endpoint(ep, &endpoint)) {
> + DRM_DEBUG_DRIVER("Couldn't parse endpoint\n");
> + continue;
> + }
> +
> + if (endpoint.id) {
> + DRM_DEBUG_DRIVER("Endpoint is an unused connection for DE2 mixer... skipping\n");
> + continue;
> + }
> + }
> +
> /* Walk down our tree */
> count += sun4i_drv_add_endpoints(dev, match, remote);
>
> diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
> index f44a37a5993d..89a215ff2370 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
> @@ -425,7 +425,8 @@ static int sun4i_tcon_init_regmap(struct device *dev,
> * requested via the get_id function of the engine.
> */
> static struct sunxi_engine *sun4i_tcon_find_engine(struct sun4i_drv *drv,
> - struct device_node *node)
> + struct device_node *node,
> + bool skip_bonus_ep)
> {
> struct device_node *port, *ep, *remote;
> struct sunxi_engine *engine;
> @@ -439,6 +440,20 @@ static struct sunxi_engine *sun4i_tcon_find_engine(struct sun4i_drv *drv,
> if (!remote)
> continue;
>
> + if (skip_bonus_ep) {
> + struct of_endpoint endpoint;
> +
> + if (of_graph_parse_endpoint(ep, &endpoint)) {
> + DRM_DEBUG_DRIVER("Couldn't parse endpoint\n");
> + continue;
> + }
> +
> + if (endpoint.id) {
> + DRM_DEBUG_DRIVER("Skipping bonus mixer->TCON connection when searching engine\n");
> + continue;
> + }
> + }
> +

You don't list the mixers in the tcon's output, why do you need that
exactly?

Maxime

--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering