diff options
author | Dave Airlie <airlied@redhat.com> | 2018-07-15 19:57:22 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-07-15 19:57:35 -0400 |
commit | a929b32537bc6800f7b54df56455ca942bcd3035 (patch) | |
tree | 01ce0cd1cb797647af277d1160b95d999850ce52 | |
parent | 990187537be1136ccd739efa550780ca4ee1a100 (diff) | |
parent | 92298c1cd8e8a6b56322b602ad72b54e6237631d (diff) |
Merge branch 'drm-armada-fixes' of git://git.armlinux.org.uk/~rmk/linux-arm into drm-fixes
Two armada fixes.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180713075427.GA16160@rmk-PC.armlinux.org.uk
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_hw.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_overlay.c | 30 |
3 files changed, 33 insertions, 10 deletions
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index 03eeee11dd5b..42a40daff132 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c | |||
@@ -519,8 +519,9 @@ static irqreturn_t armada_drm_irq(int irq, void *arg) | |||
519 | u32 v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR); | 519 | u32 v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR); |
520 | 520 | ||
521 | /* | 521 | /* |
522 | * This is rediculous - rather than writing bits to clear, we | 522 | * Reading the ISR appears to clear bits provided CLEAN_SPU_IRQ_ISR |
523 | * have to set the actual status register value. This is racy. | 523 | * is set. Writing has some other effect to acknowledge the IRQ - |
524 | * without this, we only get a single IRQ. | ||
524 | */ | 525 | */ |
525 | writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); | 526 | writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); |
526 | 527 | ||
@@ -1116,16 +1117,22 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc, | |||
1116 | static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc) | 1117 | static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc) |
1117 | { | 1118 | { |
1118 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); | 1119 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); |
1120 | unsigned long flags; | ||
1119 | 1121 | ||
1122 | spin_lock_irqsave(&dcrtc->irq_lock, flags); | ||
1120 | armada_drm_crtc_enable_irq(dcrtc, VSYNC_IRQ_ENA); | 1123 | armada_drm_crtc_enable_irq(dcrtc, VSYNC_IRQ_ENA); |
1124 | spin_unlock_irqrestore(&dcrtc->irq_lock, flags); | ||
1121 | return 0; | 1125 | return 0; |
1122 | } | 1126 | } |
1123 | 1127 | ||
1124 | static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc) | 1128 | static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc) |
1125 | { | 1129 | { |
1126 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); | 1130 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); |
1131 | unsigned long flags; | ||
1127 | 1132 | ||
1133 | spin_lock_irqsave(&dcrtc->irq_lock, flags); | ||
1128 | armada_drm_crtc_disable_irq(dcrtc, VSYNC_IRQ_ENA); | 1134 | armada_drm_crtc_disable_irq(dcrtc, VSYNC_IRQ_ENA); |
1135 | spin_unlock_irqrestore(&dcrtc->irq_lock, flags); | ||
1129 | } | 1136 | } |
1130 | 1137 | ||
1131 | static const struct drm_crtc_funcs armada_crtc_funcs = { | 1138 | static const struct drm_crtc_funcs armada_crtc_funcs = { |
@@ -1415,6 +1422,7 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, | |||
1415 | CFG_PDWN64x66, dcrtc->base + LCD_SPU_SRAM_PARA1); | 1422 | CFG_PDWN64x66, dcrtc->base + LCD_SPU_SRAM_PARA1); |
1416 | writel_relaxed(0x2032ff81, dcrtc->base + LCD_SPU_DMA_CTRL1); | 1423 | writel_relaxed(0x2032ff81, dcrtc->base + LCD_SPU_DMA_CTRL1); |
1417 | writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA); | 1424 | writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA); |
1425 | readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR); | ||
1418 | writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); | 1426 | writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); |
1419 | 1427 | ||
1420 | ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc", | 1428 | ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc", |
diff --git a/drivers/gpu/drm/armada/armada_hw.h b/drivers/gpu/drm/armada/armada_hw.h index 27319a8335e2..345dc4d0851e 100644 --- a/drivers/gpu/drm/armada/armada_hw.h +++ b/drivers/gpu/drm/armada/armada_hw.h | |||
@@ -160,6 +160,7 @@ enum { | |||
160 | CFG_ALPHAM_GRA = 0x1 << 16, | 160 | CFG_ALPHAM_GRA = 0x1 << 16, |
161 | CFG_ALPHAM_CFG = 0x2 << 16, | 161 | CFG_ALPHAM_CFG = 0x2 << 16, |
162 | CFG_ALPHA_MASK = 0xff << 8, | 162 | CFG_ALPHA_MASK = 0xff << 8, |
163 | #define CFG_ALPHA(x) ((x) << 8) | ||
163 | CFG_PIXCMD_MASK = 0xff, | 164 | CFG_PIXCMD_MASK = 0xff, |
164 | }; | 165 | }; |
165 | 166 | ||
diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c index c391955009d6..afa7ded3ae31 100644 --- a/drivers/gpu/drm/armada/armada_overlay.c +++ b/drivers/gpu/drm/armada/armada_overlay.c | |||
@@ -28,6 +28,7 @@ struct armada_ovl_plane_properties { | |||
28 | uint16_t contrast; | 28 | uint16_t contrast; |
29 | uint16_t saturation; | 29 | uint16_t saturation; |
30 | uint32_t colorkey_mode; | 30 | uint32_t colorkey_mode; |
31 | uint32_t colorkey_enable; | ||
31 | }; | 32 | }; |
32 | 33 | ||
33 | struct armada_ovl_plane { | 34 | struct armada_ovl_plane { |
@@ -54,11 +55,13 @@ armada_ovl_update_attr(struct armada_ovl_plane_properties *prop, | |||
54 | writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE); | 55 | writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE); |
55 | 56 | ||
56 | spin_lock_irq(&dcrtc->irq_lock); | 57 | spin_lock_irq(&dcrtc->irq_lock); |
57 | armada_updatel(prop->colorkey_mode | CFG_ALPHAM_GRA, | 58 | armada_updatel(prop->colorkey_mode, |
58 | CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK, | 59 | CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK, |
59 | dcrtc->base + LCD_SPU_DMA_CTRL1); | 60 | dcrtc->base + LCD_SPU_DMA_CTRL1); |
60 | 61 | if (dcrtc->variant->has_spu_adv_reg) | |
61 | armada_updatel(ADV_GRACOLORKEY, 0, dcrtc->base + LCD_SPU_ADV_REG); | 62 | armada_updatel(prop->colorkey_enable, |
63 | ADV_GRACOLORKEY | ADV_VIDCOLORKEY, | ||
64 | dcrtc->base + LCD_SPU_ADV_REG); | ||
62 | spin_unlock_irq(&dcrtc->irq_lock); | 65 | spin_unlock_irq(&dcrtc->irq_lock); |
63 | } | 66 | } |
64 | 67 | ||
@@ -321,8 +324,17 @@ static int armada_ovl_plane_set_property(struct drm_plane *plane, | |||
321 | dplane->prop.colorkey_vb |= K2B(val); | 324 | dplane->prop.colorkey_vb |= K2B(val); |
322 | update_attr = true; | 325 | update_attr = true; |
323 | } else if (property == priv->colorkey_mode_prop) { | 326 | } else if (property == priv->colorkey_mode_prop) { |
324 | dplane->prop.colorkey_mode &= ~CFG_CKMODE_MASK; | 327 | if (val == CKMODE_DISABLE) { |
325 | dplane->prop.colorkey_mode |= CFG_CKMODE(val); | 328 | dplane->prop.colorkey_mode = |
329 | CFG_CKMODE(CKMODE_DISABLE) | | ||
330 | CFG_ALPHAM_CFG | CFG_ALPHA(255); | ||
331 | dplane->prop.colorkey_enable = 0; | ||
332 | } else { | ||
333 | dplane->prop.colorkey_mode = | ||
334 | CFG_CKMODE(val) | | ||
335 | CFG_ALPHAM_GRA | CFG_ALPHA(0); | ||
336 | dplane->prop.colorkey_enable = ADV_GRACOLORKEY; | ||
337 | } | ||
326 | update_attr = true; | 338 | update_attr = true; |
327 | } else if (property == priv->brightness_prop) { | 339 | } else if (property == priv->brightness_prop) { |
328 | dplane->prop.brightness = val - 256; | 340 | dplane->prop.brightness = val - 256; |
@@ -453,7 +465,9 @@ int armada_overlay_plane_create(struct drm_device *dev, unsigned long crtcs) | |||
453 | dplane->prop.colorkey_yr = 0xfefefe00; | 465 | dplane->prop.colorkey_yr = 0xfefefe00; |
454 | dplane->prop.colorkey_ug = 0x01010100; | 466 | dplane->prop.colorkey_ug = 0x01010100; |
455 | dplane->prop.colorkey_vb = 0x01010100; | 467 | dplane->prop.colorkey_vb = 0x01010100; |
456 | dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB); | 468 | dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB) | |
469 | CFG_ALPHAM_GRA | CFG_ALPHA(0); | ||
470 | dplane->prop.colorkey_enable = ADV_GRACOLORKEY; | ||
457 | dplane->prop.brightness = 0; | 471 | dplane->prop.brightness = 0; |
458 | dplane->prop.contrast = 0x4000; | 472 | dplane->prop.contrast = 0x4000; |
459 | dplane->prop.saturation = 0x4000; | 473 | dplane->prop.saturation = 0x4000; |