diff options
Diffstat (limited to 'drivers/gpu/drm/exynos')
| -rw-r--r-- | drivers/gpu/drm/exynos/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_connector.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.c | 33 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 2 | 
4 files changed, 20 insertions, 18 deletions
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 59a26e577b5..fc345d4ebb0 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig @@ -1,6 +1,6 @@  config DRM_EXYNOS  	tristate "DRM Support for Samsung SoC EXYNOS Series" -	depends on DRM && PLAT_SAMSUNG +	depends on DRM && (PLAT_SAMSUNG || ARCH_MULTIPLATFORM)  	select DRM_KMS_HELPER  	select FB_CFB_FILLRECT  	select FB_CFB_COPYAREA diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 18c271862ca..0f68a287267 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c @@ -374,6 +374,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,  	exynos_connector->encoder_id = encoder->base.id;  	exynos_connector->manager = manager;  	exynos_connector->dpms = DRM_MODE_DPMS_OFF; +	connector->dpms = DRM_MODE_DPMS_OFF;  	connector->encoder = encoder;  	err = drm_mode_connector_attach_encoder(connector, encoder); diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index e51503fbaf2..241ad1eeec6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c @@ -43,12 +43,14 @@   * @manager: specific encoder has its own manager to control a hardware   *	appropriately and we can access a hardware drawing on this manager.   * @dpms: store the encoder dpms value. + * @updated: indicate whether overlay data updating is needed or not.   */  struct exynos_drm_encoder {  	struct drm_crtc			*old_crtc;  	struct drm_encoder		drm_encoder;  	struct exynos_drm_manager	*manager; -	int dpms; +	int				dpms; +	bool				updated;  };  static void exynos_drm_connector_power(struct drm_encoder *encoder, int mode) @@ -85,7 +87,9 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)  	switch (mode) {  	case DRM_MODE_DPMS_ON:  		if (manager_ops && manager_ops->apply) -			manager_ops->apply(manager->dev); +			if (!exynos_encoder->updated) +				manager_ops->apply(manager->dev); +  		exynos_drm_connector_power(encoder, mode);  		exynos_encoder->dpms = mode;  		break; @@ -94,6 +98,7 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)  	case DRM_MODE_DPMS_OFF:  		exynos_drm_connector_power(encoder, mode);  		exynos_encoder->dpms = mode; +		exynos_encoder->updated = false;  		break;  	default:  		DRM_ERROR("unspecified mode %d\n", mode); @@ -205,13 +210,22 @@ static void exynos_drm_encoder_prepare(struct drm_encoder *encoder)  static void exynos_drm_encoder_commit(struct drm_encoder *encoder)  { -	struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder); +	struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); +	struct exynos_drm_manager *manager = exynos_encoder->manager;  	struct exynos_drm_manager_ops *manager_ops = manager->ops;  	DRM_DEBUG_KMS("%s\n", __FILE__);  	if (manager_ops && manager_ops->commit)  		manager_ops->commit(manager->dev); + +	/* +	 * this will avoid one issue that overlay data is updated to +	 * real hardware two times. +	 * And this variable will be used to check if the data was +	 * already updated or not by exynos_drm_encoder_dpms function. +	 */ +	exynos_encoder->updated = true;  }  static void exynos_drm_encoder_disable(struct drm_encoder *encoder) @@ -401,19 +415,6 @@ void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data)  		manager_ops->dpms(manager->dev, mode);  	/* -	 * set current mode to new one so that data aren't updated into -	 * registers by drm_helper_connector_dpms two times. -	 * -	 * in case that drm_crtc_helper_set_mode() is called, -	 * overlay_ops->commit() and manager_ops->commit() callbacks -	 * can be called two times, first at drm_crtc_helper_set_mode() -	 * and second at drm_helper_connector_dpms(). -	 * so with this setting, when drm_helper_connector_dpms() is called -	 * encoder->funcs->dpms() will be ignored. -	 */ -	exynos_encoder->dpms = mode; - -	/*  	 * if this condition is ok then it means that the crtc is already  	 * detached from encoder and last function for detaching is properly  	 * done, so clear pipe from manager to prevent repeated call. diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 614b2e9ac46..e7fbb823fd8 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -1142,7 +1142,7 @@ static int __devinit mixer_probe(struct platform_device *pdev)  		const struct of_device_id *match;  		match = of_match_node(of_match_ptr(mixer_match_types),  							  pdev->dev.of_node); -		drv = match->data; +		drv = (struct mixer_drv_data *)match->data;  	} else {  		drv = (struct mixer_drv_data *)  			platform_get_device_id(pdev)->driver_data;  |