On Sat, May 20, 2017 at 02:00:22AM +0800, Icenowy Zheng wrote:
ä 2017å5æ20æ GMT+08:00 äå1:57:53, Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx> åå:
>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@xxxxxxx>
>> ---
>> 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