[Mplayer-cvslog] CVS: main/drivers Makefile, 1.6, 1.7 mga_vid.c, 1.55, 1.56
Alex Beregszaszi
syncmail at mplayerhq.hu
Sat Jun 26 16:03:08 CEST 2004
CVS change done by Alex Beregszaszi
Update of /cvsroot/mplayer/main/drivers
In directory mail:/var2/tmp/cvs-serv4268
Modified Files:
Makefile mga_vid.c
Log Message:
mga_vid under linux 2.6.x support written by F. O. Tempel, Ed Sweetman, Gergely Nagy among others
Index: Makefile
===================================================================
RCS file: /cvsroot/mplayer/main/drivers/Makefile,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Makefile 7 Mar 2003 18:42:08 -0000 1.6
+++ Makefile 26 Jun 2004 14:03:06 -0000 1.7
@@ -1,16 +1,30 @@
-
-KERNEL_INCLUDES = /usr/src/linux/include
-INCLUDES = -I$(KERNEL_INCLUDES)
-CFLAGS = -O2 -D__KERNEL__ -DMODULE -include $(KERNEL_INCLUDES)/linux/modversions.h -Wall
+KERNEL_DIR=/lib/modules/`uname -r`/build
+KERNEL_INCLUDES= $(KERNEL_DIR)/include
+INCLUDES = -I$(KERNEL_INCLUDES) -I$(KERNEL_INCLUDES)/asm
VERSION = $(shell grep UTS_RELEASE $(KERNEL_INCLUDES)/linux/version.h | cut -d '"' -f2)
MDIR = /lib/modules/$(VERSION)/misc
-all: mga_vid.o mga_vid_test
+ifneq (,$(findstring 2.6, $(VERSION)))
+obj-m += mga_vid.o
+CFLAGS = -O2 -D__KERNEL__ -DMODULE -include $(KERNEL_INCLUDES)/config/modversions.h -Wall
+else
+CFLAGS = -O2 -D__KERNEL__ -DMODULE -include $(KERNEL_INCLUDES)/linux/modversions.h -Wall
+endif
+
+all:
+ifneq (,$(findstring 2.6, $(VERSION)))
+ $(MAKE) mga_vid.ko mga_vid_test
+else
+ $(MAKE) mga_vid.o mga_vid_test
+endif
# sis_vid.o
mga_vid.o: mga_vid.c mga_vid.h
$(CC) $(CFLAGS) $(INCLUDES) -c $(basename $@).c
+mga_vid.ko: mga_vid.c mga_vid.h
+ $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
+
sis_vid.o: sis_vid.c sis_vid.h
$(CC) $(CFLAGS) $(INCLUDES) -c $(basename $@).c
@@ -25,13 +39,21 @@
install: mga_vid.o
if test ! -d $(MDIR) ; then mkdir -p $(MDIR) ; fi
+ifneq (,$(findstring 2.6, $(VERSION)))
+ install -m 644 mga_vid.ko $(MDIR)/mga_vid.ko
+else
install -m 644 mga_vid.o $(MDIR)/mga_vid.o
+endif
depmod -a
dep:
clean:
rm -f *.o *~
+ifneq (,$(findstring 2.6, $(VERSION)))
+ rm -f *.ko .mga* mga_vid.mod.c
+endif
distclean: clean
rm -f mga_vid_test
+
Index: mga_vid.c
===================================================================
RCS file: /cvsroot/mplayer/main/drivers/mga_vid.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- mga_vid.c 4 Oct 2003 17:28:54 -0000 1.55
+++ mga_vid.c 26 Jun 2004 14:03:06 -0000 1.56
@@ -1,9 +1,14 @@
+#define MODULENAME "mga_vid"
+
//#define CRTC2
// YUY2 support (see config.format) added by A'rpi/ESP-team
// double buffering added by A'rpi/ESP-team
// brightness/contrast introduced by eyck
// multiple card support by Attila Kinali <attila at kinali.ch>
+// ported to the 2.6 series kernels by F.O. Tempel
+// thankfully using the ground work done by Ed Sweetman (for the devfs work)
+// and Gergely Nagy for pushing into the right direction with his patch for 2.6.0-test1
// Set this value, if autodetection fails! (video ram size in megabytes)
// #define MGA_MEMORY_SIZE 16
@@ -36,6 +41,12 @@
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#include <linux/moduleparam.h>
+#include <linux/kobject.h>
+#include <linux/kobj_map.h>
+#include <linux/cdev.h>
+#endif
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
@@ -43,6 +54,10 @@
#include <linux/string.h>
#include <linux/errno.h>
+#ifdef MGA_ALLOW_IRQ
+#include <asm/mach-default/irq_vectors.h>
+#include <linux/interrupt.h>
+#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
#include <linux/malloc.h>
#else
@@ -117,7 +132,8 @@
#ifndef min
#define min(x,y) (((x)<(y))?(x):(y))
#endif
-
+// These functions are provided by the 2.6.0 kernel these days.
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
#include <linux/ctype.h>
@@ -155,7 +171,7 @@
return simple_strtoul(cp,endp,base);
}
#endif
-
+#endif // 2.6.0
typedef struct bes_registers_s
{
@@ -348,17 +364,30 @@
#define ICLEAR 0x1e18
#define STATUS 0x1e14
-
-// global devfs handle for /dev/mga_vid
+/* Global handles for cdev and devfs */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+static struct cdev *mga_vid_cdev;
+static dev_t mga_cdev_handle;
+#ifdef CONFIG_DEVFS_FS
+typedef struct devfs_entry *devfs_handle_t;
+devfs_handle_t dev_handle = NULL;
+#endif
+#else
#ifdef CONFIG_DEVFS_FS
-static devfs_handle_t dev_handle = NULL;
+ devfs_handle_t dev_handle = NULL;
+#endif
#endif
// card local config
typedef struct mga_card_s {
// local devfs handle for /dev/mga_vidX
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
#ifdef CONFIG_DEVFS_FS
+ struct devfs_entry *devfs_handle_t;
+#endif
+#endif
+#if CONFIG_DEVFS_FS
devfs_handle_t dev_handle;
#endif
@@ -397,6 +426,7 @@
int next_frame;
} mga_card_t;
+
#define MGA_MAX_CARDS 16
// this is used as init value for the parameter arrays
// it should have exactly MGA_MAX_CARDS elements
@@ -411,11 +441,19 @@
static int mga_contrast[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY;
static int mga_top_reserved[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+module_param(mga_ram_size, int, 0);
+module_param(mga_top_reserved, int, 0);
+module_param(mga_brightness, int, 0);
+module_param(mga_contrast, int, 0);
+module_param(major, int, 0);
+#else
MODULE_PARM(mga_ram_size, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i");
MODULE_PARM(mga_top_reserved, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i");
MODULE_PARM(mga_brightness, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i");
MODULE_PARM(mga_contrast, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i");
MODULE_PARM(major, "i");
+#endif
#ifdef CRTC2
static void crtc2_frame_sel(mga_card_t * card, int frame)
@@ -642,7 +680,7 @@
writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16),
card->mmio_base + BESGLOBCTL);
-#if 0
+#ifdef MP_DEBUG
printk(KERN_DEBUG "mga_vid: wrote BES registers\n");
printk(KERN_DEBUG "mga_vid: BESCTL = 0x%08x\n",
readl(card->mmio_base + BESCTL));
@@ -651,6 +689,7 @@
printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n",
readl(card->mmio_base + BESSTATUS));
#endif
+
#ifdef CRTC2
// printk("c2ctl:0x%08x c2datactl:0x%08x\n", readl(card->mmio_base + C2CTL), readl(card->mmio_base + C2DATACTL));
// printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC));
@@ -1100,7 +1139,7 @@
#ifdef MGA_ALLOW_IRQ
-static void enable_irq(mga_card_t * card){
+static void mga_enable_irq(mga_card_t * card){
long int cc;
cc = readl(card->mmio_base + IEN);
@@ -1116,16 +1155,18 @@
}
-static void disable_irq(mga_card_t * card){
+static void mga_disable_irq(mga_card_t * card){
writeb(0x11, card->mmio_base + CRTCX);
writeb(0x20, card->mmio_base + CRTCD); /* clear 0, enable off */
}
-static void mga_handle_irq(int irq, void *dev_id, struct pt_regs *pregs) {
+static int mga_handle_irq(int irq, void *dev_id, struct pt_regs *pregs) {
// static int frame=0;
-// static int counter=0;
+#ifdef MP_DEBUG
+ static int counter=0;
+#endif
long int cc;
mga_card_t * card = dev_id;
@@ -1136,7 +1177,7 @@
// check whether the interrupt is really for us (irq sharing)
if ( irq != -1 ) {
cc = readl(card->mmio_base + STATUS);
- if ( ! (cc & 0x10) ) return; /* vsyncpen */
+ if ( ! (cc & 0x10) ) return 0; /* vsyncpen */
// debug_irqcnt++;
}
@@ -1152,15 +1193,15 @@
// i han echt kei ahnig was das obe heisse söll
crtc2_frame_sel(card->next_frame);
#endif
-
-#if 0
+
+#ifdef MP_DEBUG
++counter;
if(!(counter&63)){
printk("mga irq counter = %d\n",counter);
}
#endif
-// } else {
+ // } else {
// debug_irqignore = 1;
// }
@@ -1173,7 +1214,7 @@
// writel( card->regs.besglobctl, card->mmio_base + BESGLOBCTL);
- return;
+ return 0;
}
@@ -1257,7 +1298,7 @@
mga_vid_write_regs(card, 0);
}
#ifdef MGA_ALLOW_IRQ
- if ( card->irq != -1 ) enable_irq(card);
+ if ( card->irq != -1 ) mga_enable_irq(card);
#endif
card->next_frame=0;
break;
@@ -1268,7 +1309,7 @@
#endif
card->vid_src_ready = 0;
#ifdef MGA_ALLOW_IRQ
- if ( card->irq != -1 ) disable_irq(card);
+ if (card->irq != -1 ) mga_disable_irq(card);
#endif
card->regs.besctl &= ~1;
card->regs.besglobctl &= ~(1<<6); // UYVY format selected
@@ -1317,6 +1358,11 @@
static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400);
// returns the number of found cards
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define PCI_DEV_NAME(d) (d)->name
+#else
+#define PCI_DEV_NAME(d) pci_name((d))
+#endif
static int mga_vid_find_card(void)
{
struct pci_dev *dev = NULL;
@@ -1347,27 +1393,27 @@
switch(dev->device) {
case PCI_DEVICE_ID_MATROX_G550:
mga_dev_name = "MGA G550";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev));
cards_init(card, dev, mga_cards_num - 1, 1);
break;
case PCI_DEVICE_ID_MATROX_G400:
mga_dev_name = "MGA G400/G450";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev));
cards_init(card, dev, mga_cards_num - 1, 1);
break;
case PCI_DEVICE_ID_MATROX_G200_AGP:
mga_dev_name = "MGA G200 AGP";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev));
cards_init(card, dev, mga_cards_num - 1, 0);
break;
case PCI_DEVICE_ID_MATROX_G200_PCI:
mga_dev_name = "MGA G200";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev));
cards_init(card, dev, mga_cards_num - 1, 0);
break;
default:
mga_cards_num--;
- printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, PCI_DEV_NAME(dev));
break;
}
}
@@ -1473,7 +1519,7 @@
return(-EAGAIN);
}
- return(0);
+ return 0;
}
static int mga_vid_release(struct inode *inode, struct file *file)
@@ -1493,8 +1539,9 @@
// card->config.colkey_on=0; //!!!
mga_vid_write_regs(card, 1);
card->vid_in_use = 0;
-
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
MOD_DEC_USE_COUNT;
+#endif
return 0;
}
@@ -1508,7 +1555,11 @@
mga_card_t * card;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+ int minor = iminor(inode);
+#else
int minor = MINOR(inode->i_rdev.value);
+#endif
#else
int minor = MINOR(inode->i_rdev);
#endif
@@ -1539,8 +1590,10 @@
return(-EBUSY);
card->vid_in_use = 1;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
MOD_INC_USE_COUNT;
- return(0);
+#endif
+ return 0;
}
#if LINUX_VERSION_CODE >= 0x020400
@@ -1573,10 +1626,6 @@
static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400)
{
unsigned int card_option;
-// temp buffer for device filename creation used only by devfs
-#ifdef CONFIG_DEVFS_FS
- char buffer[16];
-#endif
memset(card,0,sizeof(mga_card_t));
card->irq = -1;
@@ -1647,10 +1696,11 @@
// case 0x13: card->ram_size = 8; break;
default: card->ram_size = 8;
}
- }
+}
+
#if 0
// printk("List resources -----------\n");
- for(temp=0;temp<DEVICE_COUNT_RESOURCE;temp++){
+ for(int temp=0;temp<DEVICE_COUNT_RESOURCE;temp++){
struct resource *res=&dev->resource[temp];
if(res->flags){
int size=(1+res->end-res->start)>>20;
@@ -1665,7 +1715,6 @@
#endif
}
-
#ifdef MGA_ALLOW_IRQ
if ( card->irq != -1 ) {
int tmp = request_irq(card->irq, mga_handle_irq, SA_INTERRUPT | SA_SHIRQ, "Syncfb Time Base", card);
@@ -1683,16 +1732,15 @@
printk(KERN_INFO "syncfb (mga): IRQ disabled in mga_vid.c\n");
card->irq=-1;
#endif
-
- // register devfs, let the kernel give us major and minor numbers
-#ifdef CONFIG_DEVFS_FS
- snprintf(buffer, 16, "mga_vid%d", card_number);
+// register devfs, let the kernel give us major and minor numbers
+#if CONFIG_DEVFS_FS && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ char buffer[16];
+ snprintf(buffer, 16, "%s%d", MODULENAME, card_number);
card->dev_handle = devfs_register(NULL, buffer, DEVFS_FL_AUTO_DEVNUM,
0, 0,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR,
&mga_vid_fops, card);
#endif
-
}
/*
@@ -1701,71 +1749,96 @@
static int mga_vid_initialize(void)
{
- int i;
-
-// printk(KERN_INFO "Matrox MGA G200/G400 YUV Video interface v0.01 (c) Aaron Holtzman \n");
+ int i;
printk(KERN_INFO "Matrox MGA G200/G400/G450/G550 YUV Video interface v2.01 (c) Aaron Holtzman & A'rpi\n");
-
- for(i = 0; i < MGA_MAX_CARDS; i++)
+
+ if(mga_vid_find_card())
{
- if (mga_ram_size[i]) {
- if (mga_ram_size[i]<4 || mga_ram_size[i]>64) {
- printk(KERN_ERR "mga_vid: invalid RAMSIZE: %d MB\n", mga_ram_size[i]);
- return -EINVAL;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+ /* Have the kernel generate a major device number */
+ if(!alloc_chrdev_region(&mga_cdev_handle, 0, mga_cards_num, "mga_vid"))
+ major = MAJOR(mga_cdev_handle);
+ printk(KERN_INFO "mga_vid: using major: %d\n", major);
+ /* Allocate a cdev for this character device, and fill in some parameters it needs */
+ mga_vid_cdev = cdev_alloc();
+ mga_vid_cdev->owner = THIS_MODULE;
+ strcpy(mga_vid_cdev->kobj.name, MODULENAME);
+ mga_vid_cdev->ops = &mga_vid_fops;
+ /* Add this character device to the system */
+ cdev_add(mga_vid_cdev, mga_cdev_handle, mga_cards_num);
+#endif
+ for(i = 0; i < mga_cards_num; i++)
+ {
+#if CONFIG_DEVFS_FS && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+ /* Create the device, and register a symlink for the first card found.
+ * Lets not break default behaviour, eh? */
+ devfs_mk_cdev(MKDEV(major,i), S_IFCHR | S_IRUSR | S_IRGRP | S_IWUSR, "video/mga_vid%d", i);
+ if( i == 0 ) {
+ devfs_mk_symlink(MODULENAME,"video/mga_vid0");
+ }
+#endif
+ if (mga_ram_size[i]) {
+ if (mga_ram_size[i]<4 || mga_ram_size[i]>64) {
+ printk(KERN_ERR "mga_vid: invalid RAMSIZE: %d MB\n", mga_ram_size[i]);
+ return -EINVAL;
+ }
}
}
- }
- if(register_chrdev(major, "mga_vid", &mga_vid_fops))
- {
- printk(KERN_ERR "mga_vid: unable to get major: %d\n", major);
- return -EIO;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ if(register_chrdev(major, MODULENAME, &mga_vid_fops))
+ {
+ printk(KERN_ERR "mga_vid: unable to get major: %d\n", major);
+ return -EIO;
+ }
+#endif
+ return 0;
}
-
- if (!mga_vid_find_card())
+ else
{
- printk(KERN_ERR "mga_vid: no supported devices found\n");
- unregister_chrdev(major, "mga_vid");
- return -EINVAL;
- }
-#ifdef CONFIG_DEVFS_FS
- else {
- // we assume that this always succeedes
- dev_handle = devfs_register(NULL, "mga_vid", DEVFS_FL_AUTO_DEVNUM,
- 0,0,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR,
- &mga_vid_fops, mga_cards[0]);
+ return -EFAULT;
}
-#endif
-
- return(0);
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+module_init(mga_vid_initialize);
+#else
int init_module(void)
{
return mga_vid_initialize();
}
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+static void mga_cleanup_module(void)
+#else
void cleanup_module(void)
+#endif
{
int i;
mga_card_t * card;
+ printk(KERN_INFO "mga_vid: Cleaning up module\n");
for (i = 0; i < MGA_MAX_CARDS; i++)
{
card = mga_cards[i];
if(card)
{
#ifdef MGA_ALLOW_IRQ
- if (card->irq != -1)
- free_irq(card->irq, &(card->irq));
+ if ( card->irq != -1)
+// free_irq(card->irq, &(card->irq));
+ free_irq(card->irq, card);
#endif
if(card->mmio_base)
iounmap(card->mmio_base);
if(card->param_buff)
kfree(card->param_buff);
-#ifdef CONFIG_DEVFS_FS
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#ifdef CONFIG_DEVFS_FS
+ devfs_remove("video/%s%d",MODULENAME, i);
+#endif
+#else
if(card->dev_handle) devfs_unregister(card->dev_handle);
#endif
@@ -1775,9 +1848,20 @@
}
//FIXME turn off BES
- printk(KERN_INFO "mga_vid: Cleaning up module\n");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
#ifdef CONFIG_DEVFS_FS
- if(dev_handle) devfs_unregister(dev_handle);
+ devfs_unregister(dev_handle);
+#endif
+ unregister_chrdev(major, MODULENAME);
+#else
+#ifdef CONFIG_DEVFS_FS
+ devfs_remove(MODULENAME);
+#endif
+ cdev_del(mga_vid_cdev);
+ unregister_chrdev_region(mga_cdev_handle, mga_cards_num);
#endif
- unregister_chrdev(major, "mga_vid");
}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+module_exit(mga_cleanup_module);
+#endif
More information about the MPlayer-cvslog
mailing list