X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fpnp%2Fisapnp%2Fcore.c;h=a0b158704ca1f8f5eb5982f55477c96586d5692f;hb=refs%2Fheads%2Fvserver;hp=bf52990a8e9144c4d38d6295ca365cf866ef856b;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c index bf52990a8..a0b158704 100644 --- a/drivers/pnp/isapnp/core.c +++ b/drivers/pnp/isapnp/core.c @@ -34,7 +34,6 @@ * 2003-08-11 Resource Management Updates - Adam Belay */ -#include #include #include #include @@ -42,6 +41,7 @@ #include #include #include +#include #include #if 0 @@ -52,19 +52,19 @@ #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 "); 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);