fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / pnp / isapnp / core.c
index bf52990..a0b1587 100644 (file)
@@ -34,7 +34,6 @@
  *  2003-08-11 Resource Management Updates - Adam Belay <ambx1@neo.rr.com>
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -42,6 +41,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/isapnp.h>
+#include <linux/mutex.h>
 #include <asm/io.h>
 
 #if 0
 #endif
 
 int isapnp_disable;                    /* Disable ISA PnP */
-int isapnp_rdp;                                /* Read Data Port */
-int isapnp_reset = 1;                  /* reset all PnP cards (deactivate) */
-int isapnp_verbose = 1;                        /* verbose mode */
+static int isapnp_rdp;                 /* Read Data Port */
+static int isapnp_reset = 1;           /* reset all PnP cards (deactivate) */
+static int isapnp_verbose = 1;         /* verbose mode */
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
 MODULE_DESCRIPTION("Generic ISA Plug & Play support");
-MODULE_PARM(isapnp_disable, "i");
+module_param(isapnp_disable, int, 0);
 MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
-MODULE_PARM(isapnp_rdp, "i");
+module_param(isapnp_rdp, int, 0);
 MODULE_PARM_DESC(isapnp_rdp, "ISA Plug & Play read data port");
-MODULE_PARM(isapnp_reset, "i");
+module_param(isapnp_reset, int, 0);
 MODULE_PARM_DESC(isapnp_reset, "ISA Plug & Play reset all cards");
-MODULE_PARM(isapnp_verbose, "i");
+module_param(isapnp_verbose, int, 0);
 MODULE_PARM_DESC(isapnp_verbose, "ISA Plug & Play verbose mode");
 MODULE_LICENSE("GPL");
 
@@ -92,7 +92,7 @@ MODULE_LICENSE("GPL");
 #define _LTAG_FIXEDMEM32RANGE  0x86
 
 static unsigned char isapnp_checksum_value;
-static DECLARE_MUTEX(isapnp_cfg_mutex);
+static DEFINE_MUTEX(isapnp_cfg_mutex);
 static int isapnp_detected;
 static int isapnp_csn_count;
 
@@ -121,7 +121,7 @@ unsigned char isapnp_read_byte(unsigned char idx)
        return read_data();
 }
 
-unsigned short isapnp_read_word(unsigned char idx)
+static unsigned short isapnp_read_word(unsigned char idx)
 {
        unsigned short val;
 
@@ -130,48 +130,18 @@ unsigned short isapnp_read_word(unsigned char idx)
        return val;
 }
 
-unsigned int isapnp_read_dword(unsigned char idx)
-{
-       unsigned int val;
-
-       val = isapnp_read_byte(idx);
-       val = (val << 8) + isapnp_read_byte(idx+1);
-       val = (val << 8) + isapnp_read_byte(idx+2);
-       val = (val << 8) + isapnp_read_byte(idx+3);
-       return val;
-}
-
 void isapnp_write_byte(unsigned char idx, unsigned char val)
 {
        write_address(idx);
        write_data(val);
 }
 
-void isapnp_write_word(unsigned char idx, unsigned short val)
+static void isapnp_write_word(unsigned char idx, unsigned short val)
 {
        isapnp_write_byte(idx, val >> 8);
        isapnp_write_byte(idx+1, val);
 }
 
-void isapnp_write_dword(unsigned char idx, unsigned int val)
-{
-       isapnp_write_byte(idx, val >> 24);
-       isapnp_write_byte(idx+1, val >> 16);
-       isapnp_write_byte(idx+2, val >> 8);
-       isapnp_write_byte(idx+3, val);
-}
-
-void *isapnp_alloc(long size)
-{
-       void *result;
-
-       result = kmalloc(size, GFP_KERNEL);
-       if (!result)
-               return NULL;
-       memset(result, 0, size);
-       return result;
-}
-
 static void isapnp_key(void)
 {
        unsigned char code = 0x6a, msb;
@@ -196,24 +166,24 @@ static void isapnp_wait(void)
        isapnp_write_byte(0x02, 0x02);
 }
 
-void isapnp_wake(unsigned char csn)
+static void isapnp_wake(unsigned char csn)
 {
        isapnp_write_byte(0x03, csn);
 }
 
-void isapnp_device(unsigned char logdev)
+static void isapnp_device(unsigned char logdev)
 {
        isapnp_write_byte(0x07, logdev);
 }
 
-void isapnp_activate(unsigned char logdev)
+static void isapnp_activate(unsigned char logdev)
 {
        isapnp_device(logdev);
        isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 1);
        udelay(250);
 }
 
-void isapnp_deactivate(unsigned char logdev)
+static void isapnp_deactivate(unsigned char logdev)
 {
        isapnp_device(logdev);
        isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 0);
@@ -425,7 +395,7 @@ static void isapnp_parse_id(struct pnp_dev * dev, unsigned short vendor, unsigne
        struct pnp_id * id;
        if (!dev)
                return;
-       id = isapnp_alloc(sizeof(struct pnp_id));
+       id = kzalloc(sizeof(struct pnp_id), GFP_KERNEL);
        if (!id)
                return;
        sprintf(id->id, "%c%c%c%x%x%x%x",
@@ -449,7 +419,7 @@ static struct pnp_dev * __init isapnp_parse_device(struct pnp_card *card, int si
        struct pnp_dev *dev;
 
        isapnp_peek(tmp, size);
-       dev = isapnp_alloc(sizeof(struct pnp_dev));
+       dev = kzalloc(sizeof(struct pnp_dev), GFP_KERNEL);
        if (!dev)
                return NULL;
        dev->number = number;
@@ -477,12 +447,14 @@ static void __init isapnp_parse_irq_resource(struct pnp_option *option,
 {
        unsigned char tmp[3];
        struct pnp_irq *irq;
+       unsigned long bits;
 
        isapnp_peek(tmp, size);
-       irq = isapnp_alloc(sizeof(struct pnp_irq));
+       irq = kzalloc(sizeof(struct pnp_irq), GFP_KERNEL);
        if (!irq)
                return;
-       irq->map = (tmp[1] << 8) | tmp[0];
+       bits = (tmp[1] << 8) | tmp[0];
+       bitmap_copy(irq->map, &bits, 16);
        if (size > 2)
                irq->flags = tmp[2];
        else
@@ -502,7 +474,7 @@ static void __init isapnp_parse_dma_resource(struct pnp_option *option,
        struct pnp_dma *dma;
 
        isapnp_peek(tmp, size);
-       dma = isapnp_alloc(sizeof(struct pnp_dma));
+       dma = kzalloc(sizeof(struct pnp_dma), GFP_KERNEL);
        if (!dma)
                return;
        dma->map = tmp[0];
@@ -522,7 +494,7 @@ static void __init isapnp_parse_port_resource(struct pnp_option *option,
        struct pnp_port *port;
 
        isapnp_peek(tmp, size);
-       port = isapnp_alloc(sizeof(struct pnp_port));
+       port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
        if (!port)
                return;
        port->min = (tmp[2] << 8) | tmp[1];
@@ -545,7 +517,7 @@ static void __init isapnp_parse_fixed_port_resource(struct pnp_option *option,
        struct pnp_port *port;
 
        isapnp_peek(tmp, size);
-       port = isapnp_alloc(sizeof(struct pnp_port));
+       port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
        if (!port)
                return;
        port->min = port->max = (tmp[1] << 8) | tmp[0];
@@ -567,7 +539,7 @@ static void __init isapnp_parse_mem_resource(struct pnp_option *option,
        struct pnp_mem *mem;
 
        isapnp_peek(tmp, size);
-       mem = isapnp_alloc(sizeof(struct pnp_mem));
+       mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
        mem->min = ((tmp[2] << 8) | tmp[1]) << 8;
@@ -590,7 +562,7 @@ static void __init isapnp_parse_mem32_resource(struct pnp_option *option,
        struct pnp_mem *mem;
 
        isapnp_peek(tmp, size);
-       mem = isapnp_alloc(sizeof(struct pnp_mem));
+       mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
        mem->min = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
@@ -612,7 +584,7 @@ static void __init isapnp_parse_fixed_mem32_resource(struct pnp_option *option,
        struct pnp_mem *mem;
 
        isapnp_peek(tmp, size);
-       mem = isapnp_alloc(sizeof(struct pnp_mem));
+       mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
        mem->min = mem->max = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
@@ -674,8 +646,10 @@ static int __init isapnp_create_device(struct pnp_card *card,
                                size = 0;
                                skip = 0;
                                option = pnp_register_independent_option(dev);
-                               if (!option)
+                               if (!option) {
+                                       kfree(dev);
                                        return 1;
+                               }
                                pnp_add_card_device(card,dev);
                        } else {
                                skip = 1;
@@ -855,7 +829,7 @@ static unsigned char __init isapnp_checksum(unsigned char *data)
 
 static void isapnp_parse_card_id(struct pnp_card * card, unsigned short vendor, unsigned short device)
 {
-       struct pnp_id * id = isapnp_alloc(sizeof(struct pnp_id));
+       struct pnp_id * id = kzalloc(sizeof(struct pnp_id), GFP_KERNEL);
        if (!id)
                return;
        sprintf(id->id, "%c%c%c%x%x%x%x",
@@ -891,7 +865,7 @@ static int __init isapnp_build_device_list(void)
                        header[4], header[5], header[6], header[7], header[8]);
                printk(KERN_DEBUG "checksum = 0x%x\n", checksum);
 #endif
-               if ((card = isapnp_alloc(sizeof(struct pnp_card))) == NULL)
+               if ((card = kzalloc(sizeof(struct pnp_card), GFP_KERNEL)) == NULL)
                        continue;
 
                card->number = csn;
@@ -929,7 +903,7 @@ int isapnp_cfg_begin(int csn, int logdev)
 {
        if (csn < 1 || csn > isapnp_csn_count || logdev > 10)
                return -EINVAL;
-       down(&isapnp_cfg_mutex);
+       mutex_lock(&isapnp_cfg_mutex);
        isapnp_wait();
        isapnp_key();
        isapnp_wake(csn);
@@ -955,7 +929,7 @@ int isapnp_cfg_begin(int csn, int logdev)
 int isapnp_cfg_end(void)
 {
        isapnp_wait();
-       up(&isapnp_cfg_mutex);
+       mutex_unlock(&isapnp_cfg_mutex);
        return 0;
 }
 
@@ -969,14 +943,10 @@ EXPORT_SYMBOL(isapnp_protocol);
 EXPORT_SYMBOL(isapnp_present);
 EXPORT_SYMBOL(isapnp_cfg_begin);
 EXPORT_SYMBOL(isapnp_cfg_end);
+#if 0
 EXPORT_SYMBOL(isapnp_read_byte);
-EXPORT_SYMBOL(isapnp_read_word);
-EXPORT_SYMBOL(isapnp_read_dword);
+#endif
 EXPORT_SYMBOL(isapnp_write_byte);
-EXPORT_SYMBOL(isapnp_write_word);
-EXPORT_SYMBOL(isapnp_write_dword);
-EXPORT_SYMBOL(isapnp_wake);
-EXPORT_SYMBOL(isapnp_device);
 
 static int isapnp_read_resources(struct pnp_dev *dev, struct pnp_resource_table *res)
 {
@@ -1068,7 +1038,7 @@ struct pnp_protocol isapnp_protocol = {
        .disable = isapnp_disable_resources,
 };
 
-int __init isapnp_init(void)
+static int __init isapnp_init(void)
 {
        int cards;
        struct pnp_card *card;
@@ -1079,6 +1049,10 @@ int __init isapnp_init(void)
                printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n");
                return 0;
        }
+#ifdef CONFIG_PPC_MERGE
+       if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP))
+               return -EINVAL;
+#endif
 #ifdef ISAPNP_REGION_OK
        if (!request_region(_PIDXR, 1, "isapnp index")) {
                printk(KERN_ERR "isapnp: Index Register 0x%x already used\n", _PIDXR);