Thread (26 messages) 26 messages, 5 authors, 2005-03-16

Re: [patch] radeonfb: FB_WAITFORVSYNC implementation

From: Ville Syrjälä <syrjala@sci.fi>
Date: 2005-03-12 15:13:24

On Sat, Mar 12, 2005 at 02:06:45PM +0000, Torgeir Veimo wrote:
This is an implementation of the FB_WAITFORVSYNC ioctl for the radeonfb.
A small test application is attached at the end. This patch is against
vanilla 2.6.11.
Some comements below.

Also adding support for FB_ACTIVATE_VBL should be quite simple now.
quoted hunk ↗ jump to hunk
--- linux-2.6.11-orig/drivers/video/aty/radeonfb.h	2005-03-02 07:38:37.000000000 +0000
+++ linux-2.6.11/drivers/video/aty/radeonfb.h	2005-03-03 17:09:23.000000000 +0000
<snip>
quoted hunk ↗ jump to hunk
@@ -344,6 +349,11 @@
 	struct timer_list	lvds_timer;
 	u32			pending_lvds_gen_cntl;
 
+	int			open;
+	struct radeon_interrupt	vblank;
+	unsigned long		irq_flags;
+	spinlock_t		int_lock;
+
Unused spinlock.
quoted hunk ↗ jump to hunk
 #ifdef CONFIG_FB_RADEON_I2C
 	struct radeon_i2c_chan 	i2c[4];
 #endif
--- linux-2.6.11-orig/drivers/video/aty/radeon_base.c	2005-03-02 07:37:54.000000000 +0000
+++ linux-2.6.11/drivers/video/aty/radeon_base.c	2005-03-12 13:53:32.000000000 +0000
@@ -68,6 +68,9 @@
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
Unused spinlock so no need for the header.
quoted hunk ↗ jump to hunk
+#include <linux/wait.h>
 #include <linux/vmalloc.h>
 #include <linux/device.h>
 #include <linux/i2c.h>
@@ -863,6 +866,97 @@
 }
 
 
+static irqreturn_t radeon_irq(int irq, void *dev_id, struct pt_regs *fp)
+{
+	struct radeonfb_info *rinfo = dev_id;
+	u32 int_cntl = 0;
+	u32 stat = 0;
+
+	int_cntl = INREG(GEN_INT_CNTL);
+	stat = INREG(GEN_INT_STATUS) & (CRTC_VBLANK_MASK); 
+	if (!stat)
+		return IRQ_NONE;
+	if (stat) {
+		/* clear interrupt */
+		OUTREG(GEN_INT_STATUS, stat);
+
+		(rinfo->vblank.count)++;
Nitpick: Drop the parentheses.
+		wake_up_interruptible(&rinfo->vblank.wait);
+	}
+	return IRQ_HANDLED;
+}
+
+static int radeon_enable_irq(struct radeonfb_info *rinfo, int reenable)
+{
+	u32 int_cntl;
+
+	if (!test_and_set_bit(0, &rinfo->irq_flags)) {
+		if (request_irq(rinfo->pdev->irq, radeon_irq, SA_SHIRQ, 
+			"radeonfb", rinfo)) {
+			printk("radeonfb: request_irq failed..\n");
+			clear_bit(0, &rinfo->irq_flags);
+			return -EINVAL;
+		}
+		int_cntl = INREG(GEN_INT_CNTL) & CRTC_VBLANK_MASK;
+		/* clear interrupt */
+		//OUTREG(GEN_INT_CNTL, int_cntl | CRTC_VBLANK_STAT_ACK);
Why is this commented out?
+		/* enable interrupt */
+		OUTREG(GEN_INT_CNTL, int_cntl | CRTC_VBLANK_INT_EN);
+		printk("radeonfb: enabled IRQ\n");
+	} else if (reenable) {
+		int_cntl = INREG(GEN_INT_CNTL) & CRTC_VBLANK_MASK;
+		if (!(int_cntl & CRTC_VBLANK_INT_EN)) {
+			printk("radeonfb: someone disabled IRQ [%08x]\n", int_cntl);
+			/* re-enable interrupt */
+			OUTREG(GEN_INT_CNTL, int_cntl | CRTC_VBLANK_INT_EN);
+		}
+	}
+
+	return 0;
+}
+
<snip>
quoted hunk ↗ jump to hunk
@@ -2338,6 +2460,10 @@
 	radeon_create_i2c_busses(rinfo);
 #endif
 
+	rinfo->irq_flags = 0;
Nitpick: No need to set to 0. rinfo is memset() to 0 by 
framebuffer_alloc().
+	init_waitqueue_head(&rinfo->vblank.wait);
+	spin_lock_init(&(rinfo->int_lock));
+
Unused spinlock.
 	/* set all the vital stuff */
 	radeon_set_fbinfo (rinfo);
-- 
Ville Syrjälä
syrjala@sci.fi
http://www.sci.fi/~syrjala/


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_ide95&alloc_id396&op=click
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help