|
14 | 14 | #include <drm/drm_drv.h>
|
15 | 15 | #include <drm/drm_file.h>
|
16 | 16 | #include <drm/drm_ioctl.h>
|
17 |
| -#include <drm/drm_irq.h> |
18 | 17 | #include <drm/drm_prime.h>
|
19 | 18 | #include <drm/drm_of.h>
|
20 | 19 | #include <drm/drm_vblank.h>
|
@@ -201,6 +200,71 @@ void msm_rmw(void __iomem *addr, u32 mask, u32 or)
|
201 | 200 | msm_writel(val | or, addr);
|
202 | 201 | }
|
203 | 202 |
|
| 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 | + |
204 | 268 | struct msm_vblank_work {
|
205 | 269 | struct work_struct work;
|
206 | 270 | int crtc_id;
|
@@ -265,7 +329,7 @@ static int msm_drm_uninit(struct device *dev)
|
265 | 329 | }
|
266 | 330 |
|
267 | 331 | /* 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 |
269 | 333 | * irq after uninstall has disabled it.
|
270 | 334 | */
|
271 | 335 |
|
@@ -294,7 +358,7 @@ static int msm_drm_uninit(struct device *dev)
|
294 | 358 | drm_mode_config_cleanup(ddev);
|
295 | 359 |
|
296 | 360 | pm_runtime_get_sync(dev);
|
297 |
| - drm_irq_uninstall(ddev); |
| 361 | + msm_irq_uninstall(ddev); |
298 | 362 | pm_runtime_put_sync(dev);
|
299 | 363 |
|
300 | 364 | if (kms && kms->funcs)
|
@@ -553,7 +617,7 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
|
553 | 617 |
|
554 | 618 | if (kms) {
|
555 | 619 | pm_runtime_get_sync(dev);
|
556 |
| - ret = drm_irq_install(ddev, kms->irq); |
| 620 | + ret = msm_irq_install(ddev, kms->irq); |
557 | 621 | pm_runtime_put_sync(dev);
|
558 | 622 | if (ret < 0) {
|
559 | 623 | 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)
|
662 | 726 | context_close(ctx);
|
663 | 727 | }
|
664 | 728 |
|
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 |
| - |
702 | 729 | int msm_crtc_enable_vblank(struct drm_crtc *crtc)
|
703 | 730 | {
|
704 | 731 | struct drm_device *dev = crtc->dev;
|
@@ -1051,10 +1078,6 @@ static const struct drm_driver msm_driver = {
|
1051 | 1078 | .open = msm_open,
|
1052 | 1079 | .postclose = msm_postclose,
|
1053 | 1080 | .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, |
1058 | 1081 | .dumb_create = msm_gem_dumb_create,
|
1059 | 1082 | .dumb_map_offset = msm_gem_dumb_map_offset,
|
1060 | 1083 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
|
|
0 commit comments