diff options
Diffstat (limited to 'drivers/gpu/drm/rcar-du/rcar_lvds.c')
| -rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_lvds.c | 22 | 
1 files changed, 17 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c index 8ffa4fbbdeb3..ab0d49618cf9 100644 --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c @@ -23,6 +23,7 @@  #include <drm/drm_bridge.h>  #include <drm/drm_of.h>  #include <drm/drm_panel.h> +#include <drm/drm_print.h>  #include <drm/drm_probe_helper.h>  #include "rcar_lvds.h" @@ -590,8 +591,9 @@ static void __rcar_lvds_atomic_enable(struct drm_bridge *bridge,  }  static void rcar_lvds_atomic_enable(struct drm_bridge *bridge, -				    struct drm_atomic_state *state) +				    struct drm_bridge_state *old_bridge_state)  { +	struct drm_atomic_state *state = old_bridge_state->base.state;  	struct drm_connector *connector;  	struct drm_crtc *crtc; @@ -603,7 +605,7 @@ static void rcar_lvds_atomic_enable(struct drm_bridge *bridge,  }  static void rcar_lvds_atomic_disable(struct drm_bridge *bridge, -				     struct drm_atomic_state *state) +				     struct drm_bridge_state *old_bridge_state)  {  	struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); @@ -618,7 +620,8 @@ static void rcar_lvds_atomic_disable(struct drm_bridge *bridge,  	/* Disable the companion LVDS encoder in dual-link mode. */  	if (lvds->link_type != RCAR_LVDS_SINGLE_LINK && lvds->companion) -		lvds->companion->funcs->atomic_disable(lvds->companion, state); +		lvds->companion->funcs->atomic_disable(lvds->companion, +						       old_bridge_state);  	clk_disable_unprepare(lvds->clocks.mod);  } @@ -641,7 +644,8 @@ static bool rcar_lvds_mode_fixup(struct drm_bridge *bridge,  	return true;  } -static int rcar_lvds_attach(struct drm_bridge *bridge) +static int rcar_lvds_attach(struct drm_bridge *bridge, +			    enum drm_bridge_attach_flags flags)  {  	struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);  	struct drm_connector *connector = &lvds->connector; @@ -651,7 +655,12 @@ static int rcar_lvds_attach(struct drm_bridge *bridge)  	/* If we have a next bridge just attach it. */  	if (lvds->next_bridge)  		return drm_bridge_attach(bridge->encoder, lvds->next_bridge, -					 bridge); +					 bridge, flags); + +	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) { +		DRM_ERROR("Fix bridge driver to make connector optional!"); +		return -EINVAL; +	}  	/* Otherwise if we have a panel, create a connector. */  	if (!lvds->panel) @@ -682,6 +691,9 @@ static void rcar_lvds_detach(struct drm_bridge *bridge)  static const struct drm_bridge_funcs rcar_lvds_bridge_ops = {  	.attach = rcar_lvds_attach,  	.detach = rcar_lvds_detach, +	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, +	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, +	.atomic_reset = drm_atomic_helper_bridge_reset,  	.atomic_enable = rcar_lvds_atomic_enable,  	.atomic_disable = rcar_lvds_atomic_disable,  	.mode_fixup = rcar_lvds_mode_fixup, |