• Archit Taneja's avatar
    drm: bridge: Allow daisy chaining of bridges · 862e686c
    Archit Taneja authored
    Allow drm_bridge objects to link to each other in order to form an encoder
    chain. The requirement for creating a chain of bridges comes because the
    MSM drm driver uses up its encoder and bridge objects for blocks within
    the SoC itself. There isn't anything left to use if the SoC display output
    is connected to an external encoder IC. Having an additional bridge
    connected to the existing bridge helps here. In general, it is possible for
    platforms to have  multiple devices between the encoder and the
    connector/panel that require some sort of configuration.
    
    We create drm bridge helper functions corresponding to each op in
    'drm_bridge_funcs'. These helpers call the corresponding
    'drm_bridge_funcs' op for the entire chain of bridges. These helpers are
    used internally by drm_atomic_helper.c and drm_crtc_helper.c.
    
    The drm_bridge_enable/pre_enable helpers execute enable/pre_enable ops of
    the bridge closet to the encoder, and proceed until the last bridge in the
    chain is enabled. The same holds for drm_bridge_mode_set/mode_fixup
    helpers. The drm_bridge_disable/post_disable helpers disable the last
    bridge in the chain first, and proceed until the first bridge in the chain
    is disabled.
    
    drm_bridge_attach() remains the same. As before, the driver calling this
    function should make sure it has set the links correctly. The order in
    which the bridges are connected to each other determines the order in which
    the calls are made. One requirement is that every bridge in the chain
    should point the parent encoder object. This is required since bridge
    drivers expect a valid encoder pointer in drm_bridge. For example, consider
    a chain where an encoder's output is connected to bridge1, and bridge1's
    output is connected to bridge2:
    
    	/* Like before, attach bridge to an encoder */
    	bridge1->encoder = encoder;
    	ret = drm_bridge_attach(dev, bridge1);
    	..
    
    	/*
    	 * set the first bridge's 'next' bridge to bridge2, set its encoder
    	 * as bridge1's encoder
    	 */
    	bridge1->next = bridge2
    	bridge2->encoder = bridge1->encoder;
    	ret = drm_bridge_attach(dev, bridge2);
    
    	...
    	...
    
    This method of bridge chaining isn't intrusive and existing drivers that
    use drm_bridge will behave the same way as before. The bridge helpers also
    cleans up the atomic and crtc helper files a bit.
    Reviewed-by: default avatarJani Nikula <jani.nikula@linux.intel.com>
    Reviewed-by: default avatarRob Clark <robdclark@gmail.com>
    Reviewed-by: default avatarDaniel Vetter <daniel@ffwll.ch>
    Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    862e686c
drm_bridge.c 6.5 KB