| From foo@baz Wed Aug 22 09:42:09 CEST 2018 |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| Date: Sun, 24 Jun 2018 14:35:10 +0100 |
| Subject: drm/armada: fix colorkey mode property |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| [ Upstream commit d378859a667edc99e3473704847698cae97ca2b1 ] |
| |
| The colorkey mode property was not correctly disabling the colorkeying |
| when "disabled" mode was selected. Arrange for this to work as one |
| would expect. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/armada/armada_hw.h | 1 + |
| drivers/gpu/drm/armada/armada_overlay.c | 30 ++++++++++++++++++++++-------- |
| 2 files changed, 23 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/gpu/drm/armada/armada_hw.h |
| +++ b/drivers/gpu/drm/armada/armada_hw.h |
| @@ -160,6 +160,7 @@ enum { |
| CFG_ALPHAM_GRA = 0x1 << 16, |
| CFG_ALPHAM_CFG = 0x2 << 16, |
| CFG_ALPHA_MASK = 0xff << 8, |
| +#define CFG_ALPHA(x) ((x) << 8) |
| CFG_PIXCMD_MASK = 0xff, |
| }; |
| |
| --- a/drivers/gpu/drm/armada/armada_overlay.c |
| +++ b/drivers/gpu/drm/armada/armada_overlay.c |
| @@ -27,6 +27,7 @@ struct armada_ovl_plane_properties { |
| uint16_t contrast; |
| uint16_t saturation; |
| uint32_t colorkey_mode; |
| + uint32_t colorkey_enable; |
| }; |
| |
| struct armada_ovl_plane { |
| @@ -62,11 +63,13 @@ armada_ovl_update_attr(struct armada_ovl |
| writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE); |
| |
| spin_lock_irq(&dcrtc->irq_lock); |
| - armada_updatel(prop->colorkey_mode | CFG_ALPHAM_GRA, |
| - CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK, |
| - dcrtc->base + LCD_SPU_DMA_CTRL1); |
| - |
| - armada_updatel(ADV_GRACOLORKEY, 0, dcrtc->base + LCD_SPU_ADV_REG); |
| + armada_updatel(prop->colorkey_mode, |
| + CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK, |
| + dcrtc->base + LCD_SPU_DMA_CTRL1); |
| + if (dcrtc->variant->has_spu_adv_reg) |
| + armada_updatel(prop->colorkey_enable, |
| + ADV_GRACOLORKEY | ADV_VIDCOLORKEY, |
| + dcrtc->base + LCD_SPU_ADV_REG); |
| spin_unlock_irq(&dcrtc->irq_lock); |
| } |
| |
| @@ -340,8 +343,17 @@ static int armada_ovl_plane_set_property |
| dplane->prop.colorkey_vb |= K2B(val); |
| update_attr = true; |
| } else if (property == priv->colorkey_mode_prop) { |
| - dplane->prop.colorkey_mode &= ~CFG_CKMODE_MASK; |
| - dplane->prop.colorkey_mode |= CFG_CKMODE(val); |
| + if (val == CKMODE_DISABLE) { |
| + dplane->prop.colorkey_mode = |
| + CFG_CKMODE(CKMODE_DISABLE) | |
| + CFG_ALPHAM_CFG | CFG_ALPHA(255); |
| + dplane->prop.colorkey_enable = 0; |
| + } else { |
| + dplane->prop.colorkey_mode = |
| + CFG_CKMODE(val) | |
| + CFG_ALPHAM_GRA | CFG_ALPHA(0); |
| + dplane->prop.colorkey_enable = ADV_GRACOLORKEY; |
| + } |
| update_attr = true; |
| } else if (property == priv->brightness_prop) { |
| dplane->prop.brightness = val - 256; |
| @@ -470,7 +482,9 @@ int armada_overlay_plane_create(struct d |
| dplane->prop.colorkey_yr = 0xfefefe00; |
| dplane->prop.colorkey_ug = 0x01010100; |
| dplane->prop.colorkey_vb = 0x01010100; |
| - dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB); |
| + dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB) | |
| + CFG_ALPHAM_GRA | CFG_ALPHA(0); |
| + dplane->prop.colorkey_enable = ADV_GRACOLORKEY; |
| dplane->prop.brightness = 0; |
| dplane->prop.contrast = 0x4000; |
| dplane->prop.saturation = 0x4000; |