diff options
Diffstat (limited to 'drivers/gpu/drm/bridge/panel.c')
| -rw-r--r-- | drivers/gpu/drm/bridge/panel.c | 70 | 
1 files changed, 62 insertions, 8 deletions
diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index e8aae3cdc73d..9316384b4474 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -81,6 +81,8 @@ static int panel_bridge_attach(struct drm_bridge *bridge,  		return ret;  	} +	drm_panel_bridge_set_orientation(connector, bridge); +  	drm_connector_attach_encoder(&panel_bridge->connector,  					  bridge->encoder); @@ -109,30 +111,82 @@ static void panel_bridge_detach(struct drm_bridge *bridge)  		drm_connector_cleanup(connector);  } -static void panel_bridge_pre_enable(struct drm_bridge *bridge) +static void panel_bridge_atomic_pre_enable(struct drm_bridge *bridge, +				struct drm_bridge_state *old_bridge_state)  {  	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_encoder *encoder = bridge->encoder; +	struct drm_crtc *crtc; +	struct drm_crtc_state *old_crtc_state; + +	crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); +	if (!crtc) +		return; + +	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); +	if (old_crtc_state && old_crtc_state->self_refresh_active) +		return;  	drm_panel_prepare(panel_bridge->panel);  } -static void panel_bridge_enable(struct drm_bridge *bridge) +static void panel_bridge_atomic_enable(struct drm_bridge *bridge, +				struct drm_bridge_state *old_bridge_state)  {  	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_encoder *encoder = bridge->encoder; +	struct drm_crtc *crtc; +	struct drm_crtc_state *old_crtc_state; + +	crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); +	if (!crtc) +		return; + +	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); +	if (old_crtc_state && old_crtc_state->self_refresh_active) +		return;  	drm_panel_enable(panel_bridge->panel);  } -static void panel_bridge_disable(struct drm_bridge *bridge) +static void panel_bridge_atomic_disable(struct drm_bridge *bridge, +				struct drm_bridge_state *old_bridge_state)  {  	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_encoder *encoder = bridge->encoder; +	struct drm_crtc *crtc; +	struct drm_crtc_state *new_crtc_state; + +	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); +	if (!crtc) +		return; + +	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); +	if (new_crtc_state && new_crtc_state->self_refresh_active) +		return;  	drm_panel_disable(panel_bridge->panel);  } -static void panel_bridge_post_disable(struct drm_bridge *bridge) +static void panel_bridge_atomic_post_disable(struct drm_bridge *bridge, +				struct drm_bridge_state *old_bridge_state)  {  	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_encoder *encoder = bridge->encoder; +	struct drm_crtc *crtc; +	struct drm_crtc_state *new_crtc_state; + +	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); +	if (!crtc) +		return; + +	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); +	if (new_crtc_state && new_crtc_state->self_refresh_active) +		return;  	drm_panel_unprepare(panel_bridge->panel);  } @@ -159,10 +213,10 @@ static void panel_bridge_debugfs_init(struct drm_bridge *bridge,  static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {  	.attach = panel_bridge_attach,  	.detach = panel_bridge_detach, -	.pre_enable = panel_bridge_pre_enable, -	.enable = panel_bridge_enable, -	.disable = panel_bridge_disable, -	.post_disable = panel_bridge_post_disable, +	.atomic_pre_enable = panel_bridge_atomic_pre_enable, +	.atomic_enable = panel_bridge_atomic_enable, +	.atomic_disable = panel_bridge_atomic_disable, +	.atomic_post_disable = panel_bridge_atomic_post_disable,  	.get_modes = panel_bridge_get_modes,  	.atomic_reset = drm_atomic_helper_bridge_reset,  	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,  |