Skip to content

Commit 6b49c65

Browse files
author
Jyri Sarha
committed
drm/tilcdc: Enable and disable interrupts in crtc start() and stop()
commit afaf833 upstream. Enable and disable interrupts in crtc start() and stop(). None of the interrupts can fire if CRTC is disabled, so it is cleaner - when considering suspend/resume code etc. - to enable the interrupts when CRTC is turned on and to disable them when CRTC is turned off. Signed-off-by: Jyri Sarha <[email protected]>
1 parent f63f2c8 commit 6b49c65

File tree

2 files changed

+39
-48
lines changed

2 files changed

+39
-48
lines changed

drivers/gpu/drm/tilcdc/tilcdc_crtc.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,41 @@ static void set_scanout(struct drm_crtc *crtc, struct drm_framebuffer *fb)
8989
tilcdc_crtc->curr_fb = fb;
9090
}
9191

92+
static void tilcdc_crtc_enable_irqs(struct drm_device *dev)
93+
{
94+
struct tilcdc_drm_private *priv = dev->dev_private;
95+
96+
tilcdc_clear_irqstatus(dev, 0xffffffff);
97+
98+
if (priv->rev == 1) {
99+
tilcdc_set(dev, LCDC_RASTER_CTRL_REG,
100+
LCDC_V1_UNDERFLOW_INT_ENA);
101+
} else {
102+
tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
103+
LCDC_V2_UNDERFLOW_INT_ENA |
104+
LCDC_V2_END_OF_FRAME0_INT_ENA |
105+
LCDC_FRAME_DONE | LCDC_SYNC_LOST);
106+
}
107+
}
108+
109+
static void tilcdc_crtc_disable_irqs(struct drm_device *dev)
110+
{
111+
struct tilcdc_drm_private *priv = dev->dev_private;
112+
113+
/* disable irqs that we might have enabled: */
114+
if (priv->rev == 1) {
115+
tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
116+
LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_PL_INT_ENA);
117+
tilcdc_clear(dev, LCDC_DMA_CTRL_REG,
118+
LCDC_V1_END_OF_FRAME_INT_ENA);
119+
} else {
120+
tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
121+
LCDC_V2_UNDERFLOW_INT_ENA | LCDC_V2_PL_INT_ENA |
122+
LCDC_V2_END_OF_FRAME0_INT_ENA |
123+
LCDC_FRAME_DONE | LCDC_SYNC_LOST);
124+
}
125+
}
126+
92127
static void reset(struct drm_crtc *crtc)
93128
{
94129
struct drm_device *dev = crtc->dev;
@@ -108,6 +143,8 @@ static void start(struct drm_crtc *crtc)
108143

109144
reset(crtc);
110145

146+
tilcdc_crtc_enable_irqs(dev);
147+
111148
tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_DUAL_FRAME_BUFFER_ENABLE);
112149
tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_PALETTE_LOAD_MODE(DATA_ONLY));
113150
tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
@@ -138,6 +175,8 @@ static void stop(struct drm_crtc *crtc)
138175
}
139176

140177
drm_crtc_vblank_off(crtc);
178+
179+
tilcdc_crtc_disable_irqs(dev);
141180
}
142181

143182
static void tilcdc_crtc_destroy(struct drm_crtc *crtc)

drivers/gpu/drm/tilcdc/tilcdc_drv.c

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,7 @@ static int tilcdc_unload(struct drm_device *dev)
192192
drm_mode_config_cleanup(dev);
193193
drm_vblank_cleanup(dev);
194194

195-
pm_runtime_get_sync(dev->dev);
196195
drm_irq_uninstall(dev);
197-
pm_runtime_put_sync(dev->dev);
198196

199197
#ifdef CONFIG_CPU_FREQ
200198
cpufreq_unregister_notifier(&priv->freq_transition,
@@ -350,9 +348,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
350348
goto fail_external_cleanup;
351349
}
352350

353-
pm_runtime_get_sync(dev->dev);
354351
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
355-
pm_runtime_put_sync(dev->dev);
356352
if (ret < 0) {
357353
dev_err(dev->dev, "failed to install IRQ handler\n");
358354
goto fail_vblank_cleanup;
@@ -380,9 +376,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
380376
return 0;
381377

382378
fail_irq_uninstall:
383-
pm_runtime_get_sync(dev->dev);
384379
drm_irq_uninstall(dev);
385-
pm_runtime_put_sync(dev->dev);
386380

387381
fail_vblank_cleanup:
388382
drm_vblank_cleanup(dev);
@@ -440,45 +434,6 @@ static irqreturn_t tilcdc_irq(int irq, void *arg)
440434
return tilcdc_crtc_irq(priv->crtc);
441435
}
442436

443-
static void tilcdc_irq_preinstall(struct drm_device *dev)
444-
{
445-
tilcdc_clear_irqstatus(dev, 0xffffffff);
446-
}
447-
448-
static int tilcdc_irq_postinstall(struct drm_device *dev)
449-
{
450-
struct tilcdc_drm_private *priv = dev->dev_private;
451-
452-
/* enable FIFO underflow irq: */
453-
if (priv->rev == 1) {
454-
tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_V1_UNDERFLOW_INT_ENA);
455-
} else {
456-
tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
457-
LCDC_V2_UNDERFLOW_INT_ENA |
458-
LCDC_V2_END_OF_FRAME0_INT_ENA |
459-
LCDC_FRAME_DONE | LCDC_SYNC_LOST);
460-
}
461-
462-
return 0;
463-
}
464-
465-
static void tilcdc_irq_uninstall(struct drm_device *dev)
466-
{
467-
struct tilcdc_drm_private *priv = dev->dev_private;
468-
469-
/* disable irqs that we might have enabled: */
470-
if (priv->rev == 1) {
471-
tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
472-
LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_PL_INT_ENA);
473-
tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_V1_END_OF_FRAME_INT_ENA);
474-
} else {
475-
tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
476-
LCDC_V2_UNDERFLOW_INT_ENA | LCDC_V2_PL_INT_ENA |
477-
LCDC_V2_END_OF_FRAME0_INT_ENA |
478-
LCDC_FRAME_DONE | LCDC_SYNC_LOST);
479-
}
480-
}
481-
482437
static int tilcdc_enable_vblank(struct drm_device *dev, unsigned int pipe)
483438
{
484439
return 0;
@@ -623,9 +578,6 @@ static struct drm_driver tilcdc_driver = {
623578
.lastclose = tilcdc_lastclose,
624579
.set_busid = drm_platform_set_busid,
625580
.irq_handler = tilcdc_irq,
626-
.irq_preinstall = tilcdc_irq_preinstall,
627-
.irq_postinstall = tilcdc_irq_postinstall,
628-
.irq_uninstall = tilcdc_irq_uninstall,
629581
.get_vblank_counter = drm_vblank_no_hw_counter,
630582
.enable_vblank = tilcdc_enable_vblank,
631583
.disable_vblank = tilcdc_disable_vblank,

0 commit comments

Comments
 (0)