|
@@ -187,7 +187,7 @@ void omap_irq_disable_vblank(struct drm_device *dev, int crtc_id)
|
|
|
dispc_runtime_put();
|
|
|
}
|
|
|
|
|
|
-irqreturn_t omap_irq_handler(int irq, void *arg)
|
|
|
+static irqreturn_t omap_irq_handler(int irq, void *arg)
|
|
|
{
|
|
|
struct drm_device *dev = (struct drm_device *) arg;
|
|
|
struct omap_drm_private *priv = dev->dev_private;
|
|
@@ -222,23 +222,29 @@ irqreturn_t omap_irq_handler(int irq, void *arg)
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
-void omap_irq_preinstall(struct drm_device *dev)
|
|
|
-{
|
|
|
- DBG("dev=%p", dev);
|
|
|
- dispc_runtime_get();
|
|
|
- dispc_clear_irqstatus(0xffffffff);
|
|
|
- dispc_runtime_put();
|
|
|
-}
|
|
|
+/*
|
|
|
+ * We need a special version, instead of just using drm_irq_install(),
|
|
|
+ * because we need to register the irq via omapdss. Once omapdss and
|
|
|
+ * omapdrm are merged together we can assign the dispc hwmod data to
|
|
|
+ * ourselves and drop these and just use drm_irq_{install,uninstall}()
|
|
|
+ */
|
|
|
|
|
|
-int omap_irq_postinstall(struct drm_device *dev)
|
|
|
+int omap_drm_irq_install(struct drm_device *dev)
|
|
|
{
|
|
|
struct omap_drm_private *priv = dev->dev_private;
|
|
|
struct omap_drm_irq *error_handler = &priv->error_handler;
|
|
|
-
|
|
|
- DBG("dev=%p", dev);
|
|
|
+ int ret;
|
|
|
|
|
|
INIT_LIST_HEAD(&priv->irq_list);
|
|
|
|
|
|
+ dispc_runtime_get();
|
|
|
+ dispc_clear_irqstatus(0xffffffff);
|
|
|
+ dispc_runtime_put();
|
|
|
+
|
|
|
+ ret = dispc_request_irq(omap_irq_handler, dev);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
error_handler->irq = omap_irq_error_handler;
|
|
|
error_handler->irqmask = DISPC_IRQ_OCP_ERR;
|
|
|
|
|
@@ -249,76 +255,22 @@ int omap_irq_postinstall(struct drm_device *dev)
|
|
|
|
|
|
omap_irq_register(dev, error_handler);
|
|
|
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-void omap_irq_uninstall(struct drm_device *dev)
|
|
|
-{
|
|
|
- DBG("dev=%p", dev);
|
|
|
- // TODO prolly need to call drm_irq_uninstall() somewhere too
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * We need a special version, instead of just using drm_irq_install(),
|
|
|
- * because we need to register the irq via omapdss. Once omapdss and
|
|
|
- * omapdrm are merged together we can assign the dispc hwmod data to
|
|
|
- * ourselves and drop these and just use drm_irq_{install,uninstall}()
|
|
|
- */
|
|
|
-
|
|
|
-int omap_drm_irq_install(struct drm_device *dev)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
-
|
|
|
- if (dev->irq_enabled) {
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
dev->irq_enabled = true;
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
-
|
|
|
- /* Before installing handler */
|
|
|
- if (dev->driver->irq_preinstall)
|
|
|
- dev->driver->irq_preinstall(dev);
|
|
|
-
|
|
|
- ret = dispc_request_irq(dev->driver->irq_handler, dev);
|
|
|
|
|
|
- if (ret < 0) {
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
- dev->irq_enabled = false;
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- /* After installing handler */
|
|
|
- if (dev->driver->irq_postinstall)
|
|
|
- ret = dev->driver->irq_postinstall(dev);
|
|
|
-
|
|
|
- if (ret < 0) {
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
- dev->irq_enabled = false;
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
- dispc_free_irq(dev);
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-int omap_drm_irq_uninstall(struct drm_device *dev)
|
|
|
+void omap_drm_irq_uninstall(struct drm_device *dev)
|
|
|
{
|
|
|
unsigned long irqflags;
|
|
|
- bool irq_enabled;
|
|
|
int i;
|
|
|
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
- irq_enabled = dev->irq_enabled;
|
|
|
+ if (!dev->irq_enabled)
|
|
|
+ return;
|
|
|
+
|
|
|
dev->irq_enabled = false;
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
|
|
|
- /*
|
|
|
- * Wake up any waiters so they don't hang.
|
|
|
- */
|
|
|
+ /* Wake up any waiters so they don't hang. */
|
|
|
if (dev->num_crtcs) {
|
|
|
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
|
|
for (i = 0; i < dev->num_crtcs; i++) {
|
|
@@ -330,13 +282,5 @@ int omap_drm_irq_uninstall(struct drm_device *dev)
|
|
|
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
|
|
|
}
|
|
|
|
|
|
- if (!irq_enabled)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if (dev->driver->irq_uninstall)
|
|
|
- dev->driver->irq_uninstall(dev);
|
|
|
-
|
|
|
dispc_free_irq(dev);
|
|
|
-
|
|
|
- return 0;
|
|
|
}
|