drm: armada: use vblank hooks in struct drm_crtc_funcs
The vblank hooks in struct drm_driver are deprecated and only meant for legacy drivers. For modern drivers with DRIVER_MODESET flag, the hooks in struct drm_crtc_funcs should be used instead. As the result, functions armada_drm_crtc_enable[disable]_irq() can be static, although they are moved around a bit to save forward declaration. The armada_crtc pointer array in struct armada_private is still kept in there, because armada_debugfs.c still have reference to it. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Cc: Russell King <linux@armlinux.org.uk> Acked-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1486458995-31018-7-git-send-email-shawnguo@kernel.org
This commit is contained in:
@@ -418,6 +418,25 @@ static bool armada_drm_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
return true;
|
||||
}
|
||||
|
||||
/* These are locked by dev->vbl_lock */
|
||||
static void armada_drm_crtc_disable_irq(struct armada_crtc *dcrtc, u32 mask)
|
||||
{
|
||||
if (dcrtc->irq_ena & mask) {
|
||||
dcrtc->irq_ena &= ~mask;
|
||||
writel(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
|
||||
}
|
||||
}
|
||||
|
||||
static void armada_drm_crtc_enable_irq(struct armada_crtc *dcrtc, u32 mask)
|
||||
{
|
||||
if ((dcrtc->irq_ena & mask) != mask) {
|
||||
dcrtc->irq_ena |= mask;
|
||||
writel(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
|
||||
if (readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR) & mask)
|
||||
writel(0, dcrtc->base + LCD_SPU_IRQ_ISR);
|
||||
}
|
||||
}
|
||||
|
||||
static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat)
|
||||
{
|
||||
void __iomem *base = dcrtc->base;
|
||||
@@ -491,25 +510,6 @@ static irqreturn_t armada_drm_irq(int irq, void *arg)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* These are locked by dev->vbl_lock */
|
||||
void armada_drm_crtc_disable_irq(struct armada_crtc *dcrtc, u32 mask)
|
||||
{
|
||||
if (dcrtc->irq_ena & mask) {
|
||||
dcrtc->irq_ena &= ~mask;
|
||||
writel(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
|
||||
}
|
||||
}
|
||||
|
||||
void armada_drm_crtc_enable_irq(struct armada_crtc *dcrtc, u32 mask)
|
||||
{
|
||||
if ((dcrtc->irq_ena & mask) != mask) {
|
||||
dcrtc->irq_ena |= mask;
|
||||
writel(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
|
||||
if (readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR) & mask)
|
||||
writel(0, dcrtc->base + LCD_SPU_IRQ_ISR);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t armada_drm_crtc_calculate_csc(struct armada_crtc *dcrtc)
|
||||
{
|
||||
struct drm_display_mode *adj = &dcrtc->crtc.mode;
|
||||
@@ -1109,6 +1109,22 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* These are called under the vbl_lock. */
|
||||
static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc)
|
||||
{
|
||||
struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
|
||||
|
||||
armada_drm_crtc_enable_irq(dcrtc, VSYNC_IRQ_ENA);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc)
|
||||
{
|
||||
struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
|
||||
|
||||
armada_drm_crtc_disable_irq(dcrtc, VSYNC_IRQ_ENA);
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs armada_crtc_funcs = {
|
||||
.cursor_set = armada_drm_crtc_cursor_set,
|
||||
.cursor_move = armada_drm_crtc_cursor_move,
|
||||
@@ -1116,6 +1132,8 @@ static const struct drm_crtc_funcs armada_crtc_funcs = {
|
||||
.set_config = drm_crtc_helper_set_config,
|
||||
.page_flip = armada_drm_crtc_page_flip,
|
||||
.set_property = armada_drm_crtc_set_property,
|
||||
.enable_vblank = armada_drm_crtc_enable_vblank,
|
||||
.disable_vblank = armada_drm_crtc_disable_vblank,
|
||||
};
|
||||
|
||||
static const struct drm_plane_funcs armada_primary_plane_funcs = {
|
||||
|
Reference in New Issue
Block a user