On Sat, May 20, 2017 at 02:00:22AM +0800, Icenowy Zheng wrote: > > > 于 2017年5月20日 GMT+08:00 上午1:57:53, Maxime Ripard 写到: > >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 > >> --- > >> 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? > > Mixers are TCONs' input, not output... Then why are they even parsed? The whole parsing logic in the driver only searches for output nodes. Maxime -- Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com