Skip to content

Commit f026e43

Browse files
author
Thomas Zimmermann
committed
drm/msm: Convert to Linux IRQ interfaces
Drop the DRM IRQ midlayer in favor of Linux IRQ interfaces. DRM's IRQ helpers are mostly useful for UMS drivers. Modern KMS drivers don't benefit from using it. DRM IRQ callbacks are now being called directly or inlined. Signed-off-by: Thomas Zimmermann <[email protected]> Reviewed-by: Dmitry Baryshkov <[email protected]> Reviewed-by: Abhinav Kumar <[email protected]> Acked-by: Rob Clark <[email protected]> Acked-by: Sam Ravnborg <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 58889cd commit f026e43

File tree

2 files changed

+69
-46
lines changed

2 files changed

+69
-46
lines changed

drivers/gpu/drm/msm/msm_drv.c

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <drm/drm_drv.h>
1515
#include <drm/drm_file.h>
1616
#include <drm/drm_ioctl.h>
17-
#include <drm/drm_irq.h>
1817
#include <drm/drm_prime.h>
1918
#include <drm/drm_of.h>
2019
#include <drm/drm_vblank.h>
@@ -201,6 +200,71 @@ void msm_rmw(void __iomem *addr, u32 mask, u32 or)
201200
msm_writel(val | or, addr);
202201
}
203202

203+
static irqreturn_t msm_irq(int irq, void *arg)
204+
{
205+
struct drm_device *dev = arg;
206+
struct msm_drm_private *priv = dev->dev_private;
207+
struct msm_kms *kms = priv->kms;
208+
209+
BUG_ON(!kms);
210+
211+
return kms->funcs->irq(kms);
212+
}
213+
214+
static void msm_irq_preinstall(struct drm_device *dev)
215+
{
216+
struct msm_drm_private *priv = dev->dev_private;
217+
struct msm_kms *kms = priv->kms;
218+
219+
BUG_ON(!kms);
220+
221+
kms->funcs->irq_preinstall(kms);
222+
}
223+
224+
static int msm_irq_postinstall(struct drm_device *dev)
225+
{
226+
struct msm_drm_private *priv = dev->dev_private;
227+
struct msm_kms *kms = priv->kms;
228+
229+
BUG_ON(!kms);
230+
231+
if (kms->funcs->irq_postinstall)
232+
return kms->funcs->irq_postinstall(kms);
233+
234+
return 0;
235+
}
236+
237+
static int msm_irq_install(struct drm_device *dev, unsigned int irq)
238+
{
239+
int ret;
240+
241+
if (irq == IRQ_NOTCONNECTED)
242+
return -ENOTCONN;
243+
244+
msm_irq_preinstall(dev);
245+
246+
ret = request_irq(irq, msm_irq, 0, dev->driver->name, dev);
247+
if (ret)
248+
return ret;
249+
250+
ret = msm_irq_postinstall(dev);
251+
if (ret) {
252+
free_irq(irq, dev);
253+
return ret;
254+
}
255+
256+
return 0;
257+
}
258+
259+
static void msm_irq_uninstall(struct drm_device *dev)
260+
{
261+
struct msm_drm_private *priv = dev->dev_private;
262+
struct msm_kms *kms = priv->kms;
263+
264+
kms->funcs->irq_uninstall(kms);
265+
free_irq(kms->irq, dev);
266+
}
267+
204268
struct msm_vblank_work {
205269
struct work_struct work;
206270
int crtc_id;
@@ -265,7 +329,7 @@ static int msm_drm_uninit(struct device *dev)
265329
}
266330

267331
/* We must cancel and cleanup any pending vblank enable/disable
268-
* work before drm_irq_uninstall() to avoid work re-enabling an
332+
* work before msm_irq_uninstall() to avoid work re-enabling an
269333
* irq after uninstall has disabled it.
270334
*/
271335

@@ -294,7 +358,7 @@ static int msm_drm_uninit(struct device *dev)
294358
drm_mode_config_cleanup(ddev);
295359

296360
pm_runtime_get_sync(dev);
297-
drm_irq_uninstall(ddev);
361+
msm_irq_uninstall(ddev);
298362
pm_runtime_put_sync(dev);
299363

300364
if (kms && kms->funcs)
@@ -553,7 +617,7 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
553617

554618
if (kms) {
555619
pm_runtime_get_sync(dev);
556-
ret = drm_irq_install(ddev, kms->irq);
620+
ret = msm_irq_install(ddev, kms->irq);
557621
pm_runtime_put_sync(dev);
558622
if (ret < 0) {
559623
DRM_DEV_ERROR(dev, "failed to install IRQ handler\n");
@@ -662,43 +726,6 @@ static void msm_postclose(struct drm_device *dev, struct drm_file *file)
662726
context_close(ctx);
663727
}
664728

665-
static irqreturn_t msm_irq(int irq, void *arg)
666-
{
667-
struct drm_device *dev = arg;
668-
struct msm_drm_private *priv = dev->dev_private;
669-
struct msm_kms *kms = priv->kms;
670-
BUG_ON(!kms);
671-
return kms->funcs->irq(kms);
672-
}
673-
674-
static void msm_irq_preinstall(struct drm_device *dev)
675-
{
676-
struct msm_drm_private *priv = dev->dev_private;
677-
struct msm_kms *kms = priv->kms;
678-
BUG_ON(!kms);
679-
kms->funcs->irq_preinstall(kms);
680-
}
681-
682-
static int msm_irq_postinstall(struct drm_device *dev)
683-
{
684-
struct msm_drm_private *priv = dev->dev_private;
685-
struct msm_kms *kms = priv->kms;
686-
BUG_ON(!kms);
687-
688-
if (kms->funcs->irq_postinstall)
689-
return kms->funcs->irq_postinstall(kms);
690-
691-
return 0;
692-
}
693-
694-
static void msm_irq_uninstall(struct drm_device *dev)
695-
{
696-
struct msm_drm_private *priv = dev->dev_private;
697-
struct msm_kms *kms = priv->kms;
698-
BUG_ON(!kms);
699-
kms->funcs->irq_uninstall(kms);
700-
}
701-
702729
int msm_crtc_enable_vblank(struct drm_crtc *crtc)
703730
{
704731
struct drm_device *dev = crtc->dev;
@@ -1051,10 +1078,6 @@ static const struct drm_driver msm_driver = {
10511078
.open = msm_open,
10521079
.postclose = msm_postclose,
10531080
.lastclose = drm_fb_helper_lastclose,
1054-
.irq_handler = msm_irq,
1055-
.irq_preinstall = msm_irq_preinstall,
1056-
.irq_postinstall = msm_irq_postinstall,
1057-
.irq_uninstall = msm_irq_uninstall,
10581081
.dumb_create = msm_gem_dumb_create,
10591082
.dumb_map_offset = msm_gem_dumb_map_offset,
10601083
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,

drivers/gpu/drm/msm/msm_kms.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ struct msm_kms {
150150
const struct msm_kms_funcs *funcs;
151151
struct drm_device *dev;
152152

153-
/* irq number to be passed on to drm_irq_install */
153+
/* irq number to be passed on to msm_irq_install */
154154
int irq;
155155

156156
/* mapper-id used to request GEM buffer mapped for scanout: */

0 commit comments

Comments
 (0)