aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/tilcdc
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2016-06-21 09:00:44 -0400
committerJyri Sarha <jsarha@ti.com>2016-08-08 16:05:15 -0400
commitafaf833dd5d7793e9441f122bbe3e37a09a0c743 (patch)
treec56baf55c9c6dfdbcd820d28047390e4a7384427 /drivers/gpu/drm/tilcdc
parent018cfbde63a4b1cb7ca4cb0c0b1d4286f7708236 (diff)
drm/tilcdc: Enable and disable interrupts in crtc start() and stop()
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 <jsarha@ti.com>
Diffstat (limited to 'drivers/gpu/drm/tilcdc')
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_crtc.c39
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_drv.c48
2 files changed, 39 insertions, 48 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index 3d6000cd5048..773bee27a2d0 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -89,6 +89,41 @@ static void set_scanout(struct drm_crtc *crtc, struct drm_framebuffer *fb)
89 tilcdc_crtc->curr_fb = fb; 89 tilcdc_crtc->curr_fb = fb;
90} 90}
91 91
92static 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
109static 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
92static void reset(struct drm_crtc *crtc) 127static void reset(struct drm_crtc *crtc)
93{ 128{
94 struct drm_device *dev = crtc->dev; 129 struct drm_device *dev = crtc->dev;
@@ -108,6 +143,8 @@ static void start(struct drm_crtc *crtc)
108 143
109 reset(crtc); 144 reset(crtc);
110 145
146 tilcdc_crtc_enable_irqs(dev);
147
111 tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_DUAL_FRAME_BUFFER_ENABLE); 148 tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_DUAL_FRAME_BUFFER_ENABLE);
112 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_PALETTE_LOAD_MODE(DATA_ONLY)); 149 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_PALETTE_LOAD_MODE(DATA_ONLY));
113 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE); 150 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
@@ -138,6 +175,8 @@ static void stop(struct drm_crtc *crtc)
138 } 175 }
139 176
140 drm_crtc_vblank_off(crtc); 177 drm_crtc_vblank_off(crtc);
178
179 tilcdc_crtc_disable_irqs(dev);
141} 180}
142 181
143static void tilcdc_crtc_destroy(struct drm_crtc *crtc) 182static void tilcdc_crtc_destroy(struct drm_crtc *crtc)
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 576e4e1c17e4..d612d03460ae 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -192,9 +192,7 @@ static int tilcdc_unload(struct drm_device *dev)
192 drm_mode_config_cleanup(dev); 192 drm_mode_config_cleanup(dev);
193 drm_vblank_cleanup(dev); 193 drm_vblank_cleanup(dev);
194 194
195 pm_runtime_get_sync(dev->dev);
196 drm_irq_uninstall(dev); 195 drm_irq_uninstall(dev);
197 pm_runtime_put_sync(dev->dev);
198 196
199#ifdef CONFIG_CPU_FREQ 197#ifdef CONFIG_CPU_FREQ
200 cpufreq_unregister_notifier(&priv->freq_transition, 198 cpufreq_unregister_notifier(&priv->freq_transition,
@@ -350,9 +348,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
350 goto fail_external_cleanup; 348 goto fail_external_cleanup;
351 } 349 }
352 350
353 pm_runtime_get_sync(dev->dev);
354 ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0)); 351 ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
355 pm_runtime_put_sync(dev->dev);
356 if (ret < 0) { 352 if (ret < 0) {
357 dev_err(dev->dev, "failed to install IRQ handler\n"); 353 dev_err(dev->dev, "failed to install IRQ handler\n");
358 goto fail_vblank_cleanup; 354 goto fail_vblank_cleanup;
@@ -382,9 +378,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
382 return 0; 378 return 0;
383 379
384fail_irq_uninstall: 380fail_irq_uninstall:
385 pm_runtime_get_sync(dev->dev);
386 drm_irq_uninstall(dev); 381 drm_irq_uninstall(dev);
387 pm_runtime_put_sync(dev->dev);
388 382
389fail_vblank_cleanup: 383fail_vblank_cleanup:
390 drm_vblank_cleanup(dev); 384 drm_vblank_cleanup(dev);
@@ -435,45 +429,6 @@ static irqreturn_t tilcdc_irq(int irq, void *arg)
435 return tilcdc_crtc_irq(priv->crtc); 429 return tilcdc_crtc_irq(priv->crtc);
436} 430}
437 431
438static void tilcdc_irq_preinstall(struct drm_device *dev)
439{
440 tilcdc_clear_irqstatus(dev, 0xffffffff);
441}
442
443static int tilcdc_irq_postinstall(struct drm_device *dev)
444{
445 struct tilcdc_drm_private *priv = dev->dev_private;
446
447 /* enable FIFO underflow irq: */
448 if (priv->rev == 1) {
449 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_V1_UNDERFLOW_INT_ENA);
450 } else {
451 tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
452 LCDC_V2_UNDERFLOW_INT_ENA |
453 LCDC_V2_END_OF_FRAME0_INT_ENA |
454 LCDC_FRAME_DONE | LCDC_SYNC_LOST);
455 }
456
457 return 0;
458}
459
460static void tilcdc_irq_uninstall(struct drm_device *dev)
461{
462 struct tilcdc_drm_private *priv = dev->dev_private;
463
464 /* disable irqs that we might have enabled: */
465 if (priv->rev == 1) {
466 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
467 LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_PL_INT_ENA);
468 tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_V1_END_OF_FRAME_INT_ENA);
469 } else {
470 tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
471 LCDC_V2_UNDERFLOW_INT_ENA | LCDC_V2_PL_INT_ENA |
472 LCDC_V2_END_OF_FRAME0_INT_ENA |
473 LCDC_FRAME_DONE | LCDC_SYNC_LOST);
474 }
475}
476
477static int tilcdc_enable_vblank(struct drm_device *dev, unsigned int pipe) 432static int tilcdc_enable_vblank(struct drm_device *dev, unsigned int pipe)
478{ 433{
479 return 0; 434 return 0;
@@ -616,9 +571,6 @@ static struct drm_driver tilcdc_driver = {
616 .unload = tilcdc_unload, 571 .unload = tilcdc_unload,
617 .lastclose = tilcdc_lastclose, 572 .lastclose = tilcdc_lastclose,
618 .irq_handler = tilcdc_irq, 573 .irq_handler = tilcdc_irq,
619 .irq_preinstall = tilcdc_irq_preinstall,
620 .irq_postinstall = tilcdc_irq_postinstall,
621 .irq_uninstall = tilcdc_irq_uninstall,
622 .get_vblank_counter = drm_vblank_no_hw_counter, 574 .get_vblank_counter = drm_vblank_no_hw_counter,
623 .enable_vblank = tilcdc_enable_vblank, 575 .enable_vblank = tilcdc_enable_vblank,
624 .disable_vblank = tilcdc_disable_vblank, 576 .disable_vblank = tilcdc_disable_vblank,