root/drivers/gpu/drm/r128/r128_irq.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. r128_get_vblank_counter
  2. r128_driver_irq_handler
  3. r128_enable_vblank
  4. r128_disable_vblank
  5. r128_driver_irq_preinstall
  6. r128_driver_irq_postinstall
  7. r128_driver_irq_uninstall

   1 /* r128_irq.c -- IRQ handling for radeon -*- linux-c -*- */
   2 /*
   3  * Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
   4  *
   5  * The Weather Channel (TM) funded Tungsten Graphics to develop the
   6  * initial release of the Radeon 8500 driver under the XFree86 license.
   7  * This notice must be preserved.
   8  *
   9  * Permission is hereby granted, free of charge, to any person obtaining a
  10  * copy of this software and associated documentation files (the "Software"),
  11  * to deal in the Software without restriction, including without limitation
  12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13  * and/or sell copies of the Software, and to permit persons to whom the
  14  * Software is furnished to do so, subject to the following conditions:
  15  *
  16  * The above copyright notice and this permission notice (including the next
  17  * paragraph) shall be included in all copies or substantial portions of the
  18  * Software.
  19  *
  20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  23  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  24  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  25  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  26  * DEALINGS IN THE SOFTWARE.
  27  *
  28  * Authors:
  29  *    Keith Whitwell <keith@tungstengraphics.com>
  30  *    Eric Anholt <anholt@FreeBSD.org>
  31  */
  32 
  33 #include <drm/drm_device.h>
  34 #include <drm/drm_print.h>
  35 #include <drm/drm_vblank.h>
  36 #include <drm/r128_drm.h>
  37 
  38 #include "r128_drv.h"
  39 
  40 u32 r128_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
  41 {
  42         const drm_r128_private_t *dev_priv = dev->dev_private;
  43 
  44         if (pipe != 0)
  45                 return 0;
  46 
  47         return atomic_read(&dev_priv->vbl_received);
  48 }
  49 
  50 irqreturn_t r128_driver_irq_handler(int irq, void *arg)
  51 {
  52         struct drm_device *dev = (struct drm_device *) arg;
  53         drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
  54         int status;
  55 
  56         status = R128_READ(R128_GEN_INT_STATUS);
  57 
  58         /* VBLANK interrupt */
  59         if (status & R128_CRTC_VBLANK_INT) {
  60                 R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
  61                 atomic_inc(&dev_priv->vbl_received);
  62                 drm_handle_vblank(dev, 0);
  63                 return IRQ_HANDLED;
  64         }
  65         return IRQ_NONE;
  66 }
  67 
  68 int r128_enable_vblank(struct drm_device *dev, unsigned int pipe)
  69 {
  70         drm_r128_private_t *dev_priv = dev->dev_private;
  71 
  72         if (pipe != 0) {
  73                 DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
  74                 return -EINVAL;
  75         }
  76 
  77         R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
  78         return 0;
  79 }
  80 
  81 void r128_disable_vblank(struct drm_device *dev, unsigned int pipe)
  82 {
  83         if (pipe != 0)
  84                 DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
  85 
  86         /*
  87          * FIXME: implement proper interrupt disable by using the vblank
  88          * counter register (if available)
  89          *
  90          * R128_WRITE(R128_GEN_INT_CNTL,
  91          *            R128_READ(R128_GEN_INT_CNTL) & ~R128_CRTC_VBLANK_INT_EN);
  92          */
  93 }
  94 
  95 void r128_driver_irq_preinstall(struct drm_device *dev)
  96 {
  97         drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
  98 
  99         /* Disable *all* interrupts */
 100         R128_WRITE(R128_GEN_INT_CNTL, 0);
 101         /* Clear vblank bit if it's already high */
 102         R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
 103 }
 104 
 105 int r128_driver_irq_postinstall(struct drm_device *dev)
 106 {
 107         return 0;
 108 }
 109 
 110 void r128_driver_irq_uninstall(struct drm_device *dev)
 111 {
 112         drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
 113         if (!dev_priv)
 114                 return;
 115 
 116         /* Disable *all* interrupts */
 117         R128_WRITE(R128_GEN_INT_CNTL, 0);
 118 }

/* [<][>][^][v][top][bottom][index][help] */