fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / char / mwave / mwavedd.c
index f236538..8d14823 100644 (file)
@@ -57,6 +57,7 @@
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/delay.h>
+#include <linux/serial_8250.h>
 #include "smapi.h"
 #include "mwavedd.h"
 #include "3780i.h"
@@ -76,11 +77,11 @@ int mwave_3780i_irq = 0;
 int mwave_3780i_io = 0;
 int mwave_uart_irq = 0;
 int mwave_uart_io = 0;
-MODULE_PARM(mwave_debug, "i");
-MODULE_PARM(mwave_3780i_irq, "i");
-MODULE_PARM(mwave_3780i_io, "i");
-MODULE_PARM(mwave_uart_irq, "i");
-MODULE_PARM(mwave_uart_io, "i");
+module_param(mwave_debug, int, 0);
+module_param(mwave_3780i_irq, int, 0);
+module_param(mwave_3780i_io, int, 0);
+module_param(mwave_uart_irq, int, 0);
+module_param(mwave_uart_io, int, 0);
 
 static int mwave_open(struct inode *inode, struct file *file);
 static int mwave_close(struct inode *inode, struct file *file);
@@ -94,8 +95,8 @@ static int mwave_open(struct inode *inode, struct file *file)
        unsigned int retval = 0;
 
        PRINTK_3(TRACE_MWAVE,
-               "mwavedd::mwave_open, entry inode %x file %x\n",
-               (int) inode, (int) file);
+               "mwavedd::mwave_open, entry inode %p file %p\n",
+                inode, file);
        PRINTK_2(TRACE_MWAVE,
                "mwavedd::mwave_open, exit return retval %x\n", retval);
 
@@ -107,8 +108,8 @@ static int mwave_close(struct inode *inode, struct file *file)
        unsigned int retval = 0;
 
        PRINTK_3(TRACE_MWAVE,
-               "mwavedd::mwave_close, entry inode %x file %x\n",
-               (int) inode, (int) file);
+               "mwavedd::mwave_close, entry inode %p file %p\n",
+                inode,  file);
 
        PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_close, exit retval %x\n",
                retval);
@@ -121,10 +122,11 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
 {
        unsigned int retval = 0;
        pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;
+       void __user *arg = (void __user *)ioarg;
 
        PRINTK_5(TRACE_MWAVE,
-               "mwavedd::mwave_ioctl, entry inode %x file %x cmd %x arg %x\n",
-               (int) inode, (int) file, iocmd, (int) ioarg);
+               "mwavedd::mwave_ioctl, entry inode %p file %p cmd %x arg %x\n",
+                inode,  file, iocmd, (int) ioarg);
 
        switch (iocmd) {
 
@@ -164,8 +166,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                                " retval %x from tp3780I_QueryAbilities\n",
                                retval);
                        if (retval == 0) {
-                               if( copy_to_user((char *) ioarg,
-                                                       (char *) &rAbilities,
+                               if( copy_to_user(arg, &rAbilities,
                                                        sizeof(MW_ABILITIES)) )
                                        return -EFAULT;
                        }
@@ -179,13 +180,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                case IOCTL_MW_READ_DATA:
                case IOCTL_MW_READCLEAR_DATA: {
                        MW_READWRITE rReadData;
-                       unsigned short *pusBuffer = 0;
+                       unsigned short __user *pusBuffer = NULL;
        
-                       if( copy_from_user((char *) &rReadData,
-                                               (char *) ioarg,
+                       if( copy_from_user(&rReadData, arg,
                                                sizeof(MW_READWRITE)) )
                                return -EFAULT;
-                       pusBuffer = (unsigned short *) (rReadData.pBuf);
+                       pusBuffer = (unsigned short __user *) (rReadData.pBuf);
        
                        PRINTK_4(TRACE_MWAVE,
                                "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA,"
@@ -193,7 +193,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                                rReadData.ulDataLength, ioarg, pusBuffer);
                        retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
                                        iocmd,
-                                       (void *) pusBuffer,
+                                       pusBuffer,
                                        rReadData.ulDataLength,
                                        rReadData.usDspAddress);
                }
@@ -201,12 +201,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
        
                case IOCTL_MW_READ_INST: {
                        MW_READWRITE rReadData;
-                       unsigned short *pusBuffer = 0;
+                       unsigned short __user *pusBuffer = NULL;
        
-                       if( copy_from_user((char *) &rReadData, (char *) ioarg,
+                       if( copy_from_user(&rReadData, arg,
                                                sizeof(MW_READWRITE)) )
                                return -EFAULT;
-                       pusBuffer = (unsigned short *) (rReadData.pBuf);
+                       pusBuffer = (unsigned short __user *) (rReadData.pBuf);
        
                        PRINTK_4(TRACE_MWAVE,
                                "mwavedd::mwave_ioctl IOCTL_MW_READ_INST,"
@@ -222,13 +222,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
        
                case IOCTL_MW_WRITE_DATA: {
                        MW_READWRITE rWriteData;
-                       unsigned short *pusBuffer = 0;
+                       unsigned short __user *pusBuffer = NULL;
        
-                       if( copy_from_user((char *) &rWriteData,
-                                               (char *) ioarg,
+                       if( copy_from_user(&rWriteData, arg,
                                                sizeof(MW_READWRITE)) )
                                return -EFAULT;
-                       pusBuffer = (unsigned short *) (rWriteData.pBuf);
+                       pusBuffer = (unsigned short __user *) (rWriteData.pBuf);
        
                        PRINTK_4(TRACE_MWAVE,
                                "mwavedd::mwave_ioctl IOCTL_MW_WRITE_DATA,"
@@ -244,13 +243,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
        
                case IOCTL_MW_WRITE_INST: {
                        MW_READWRITE rWriteData;
-                       unsigned short *pusBuffer = 0;
+                       unsigned short __user *pusBuffer = NULL;
        
-                       if( copy_from_user((char *) &rWriteData,
-                                               (char *) ioarg,
+                       if( copy_from_user(&rWriteData, arg,
                                                sizeof(MW_READWRITE)) )
                                return -EFAULT;
-                       pusBuffer = (unsigned short *) (rWriteData.pBuf);
+                       pusBuffer = (unsigned short __user *)(rWriteData.pBuf);
        
                        PRINTK_4(TRACE_MWAVE,
                                "mwavedd::mwave_ioctl IOCTL_MW_WRITE_INST,"
@@ -273,7 +271,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                                ipcnum,
                                pDrvData->IPCs[ipcnum].usIntCount);
        
-                       if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+                       if (ipcnum >= ARRAY_SIZE(pDrvData->IPCs)) {
                                PRINTK_ERROR(KERN_ERR_MWAVE
                                                "mwavedd::mwave_ioctl:"
                                                " IOCTL_MW_REGISTER_IPC:"
@@ -299,7 +297,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                                " ipcnum %x, usIntCount %x\n",
                                ipcnum,
                                pDrvData->IPCs[ipcnum].usIntCount);
-                       if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+                       if (ipcnum >= ARRAY_SIZE(pDrvData->IPCs)) {
                                PRINTK_ERROR(KERN_ERR_MWAVE
                                                "mwavedd::mwave_ioctl:"
                                                " IOCTL_MW_GET_IPC: Error:"
@@ -357,7 +355,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
                                "mwavedd::mwave_ioctl IOCTL_MW_UNREGISTER_IPC"
                                " ipcnum %x\n",
                                ipcnum);
-                       if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+                       if (ipcnum >= ARRAY_SIZE(pDrvData->IPCs)) {
                                PRINTK_ERROR(KERN_ERR_MWAVE
                                                "mwavedd::mwave_ioctl:"
                                                " IOCTL_MW_UNREGISTER_IPC:"
@@ -388,23 +386,23 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
 }
 
 
-static ssize_t mwave_read(struct file *file, char *buf, size_t count,
+static ssize_t mwave_read(struct file *file, char __user *buf, size_t count,
                           loff_t * ppos)
 {
        PRINTK_5(TRACE_MWAVE,
-               "mwavedd::mwave_read entry file %p, buf %p, count %x ppos %p\n",
+               "mwavedd::mwave_read entry file %p, buf %p, count %zx ppos %p\n",
                file, buf, count, ppos);
 
        return -EINVAL;
 }
 
 
-static ssize_t mwave_write(struct file *file, const char *buf,
+static ssize_t mwave_write(struct file *file, const char __user *buf,
                            size_t count, loff_t * ppos)
 {
        PRINTK_5(TRACE_MWAVE,
                "mwavedd::mwave_write entry file %p, buf %p,"
-               " count %x ppos %p\n",
+               " count %zx ppos %p\n",
                file, buf, count, ppos);
 
        return -EINVAL;
@@ -413,8 +411,8 @@ static ssize_t mwave_write(struct file *file, const char *buf,
 
 static int register_serial_portandirq(unsigned int port, int irq)
 {
-       struct serial_struct serial;
-
+       struct uart_port uart;
+       
        switch ( port ) {
                case 0x3f8:
                case 0x2f8:
@@ -445,16 +443,18 @@ static int register_serial_portandirq(unsigned int port, int irq)
        } /* switch */
        /* irq is okay */
 
-       memset(&serial, 0, sizeof(serial));
-       serial.port = port;
-       serial.irq = irq;
-       serial.flags = ASYNC_SHARE_IRQ;
-
-       return register_serial(&serial);
+       memset(&uart, 0, sizeof(struct uart_port));
+       
+       uart.uartclk =  1843200;
+       uart.iobase = port;
+       uart.irq = irq;
+       uart.iotype = UPIO_PORT;
+       uart.flags =  UPF_SHARE_IRQ;
+       return serial8250_register_port(&uart);
 }
 
 
-static struct file_operations mwave_fops = {
+static const struct file_operations mwave_fops = {
        .owner          = THIS_MODULE,
        .read           = mwave_read,
        .write          = mwave_write,
@@ -475,7 +475,7 @@ struct device mwave_device;
 
 /* Prevent code redundancy, create a macro for mwave_show_* functions. */
 #define mwave_show_function(attr_name, format_string, field)           \
-static ssize_t mwave_show_##attr_name(struct device *dev, char *buf)   \
+static ssize_t mwave_show_##attr_name(struct device *dev, struct device_attribute *attr, char *buf)    \
 {                                                                      \
        DSP_3780I_CONFIG_SETTINGS *pSettings =                          \
                &mwave_s_mdd.rBDData.rDspSettings;                      \
@@ -526,7 +526,7 @@ static void mwave_exit(void)
 #endif
 
        if ( pDrvData->sLine >= 0 ) {
-               unregister_serial(pDrvData->sLine);
+               serial8250_unregister_port(pDrvData->sLine);
        }
        if (pDrvData->bMwaveDevRegistered) {
                misc_deregister(&mwave_misc_dev);