diff options
Diffstat (limited to 'drivers/pcmcia/rsrc_mgr.c')
| -rw-r--r-- | drivers/pcmcia/rsrc_mgr.c | 150 |
1 files changed, 28 insertions, 122 deletions
diff --git a/drivers/pcmcia/rsrc_mgr.c b/drivers/pcmcia/rsrc_mgr.c index 0668384ebc8..aa628ed0e9f 100644 --- a/drivers/pcmcia/rsrc_mgr.c +++ b/drivers/pcmcia/rsrc_mgr.c @@ -12,143 +12,46 @@ * (C) 1999 David A. Hinds */ -#include <linux/config.h> +#include <linux/slab.h> #include <linux/module.h> #include <linux/kernel.h> -#include <pcmcia/cs_types.h> #include <pcmcia/ss.h> -#include <pcmcia/cs.h> +#include <pcmcia/cistpl.h> #include "cs_internal.h" - -#ifdef CONFIG_PCMCIA_PROBE - -static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) +int static_init(struct pcmcia_socket *s) { - int irq; - u32 mask; - - irq = adj->resource.irq.IRQ; - if ((irq < 0) || (irq > 15)) - return CS_BAD_IRQ; - - if (adj->Action != REMOVE_MANAGED_RESOURCE) - return 0; - - mask = 1 << irq; - - if (!(s->irq_mask & mask)) - return 0; + /* the good thing about SS_CAP_STATIC_MAP sockets is + * that they don't need a resource database */ - s->irq_mask &= ~mask; + s->resource_setup_done = 1; return 0; } -#else - -static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) { - return CS_SUCCESS; -} - -#endif - - -int pcmcia_adjust_resource_info(adjust_t *adj) +struct resource *pcmcia_make_resource(unsigned long start, unsigned long end, + int flags, const char *name) { - struct pcmcia_socket *s; - int ret = CS_UNSUPPORTED_FUNCTION; - unsigned long flags; - - down_read(&pcmcia_socket_list_rwsem); - list_for_each_entry(s, &pcmcia_socket_list, socket_list) { - - if (adj->Resource == RES_IRQ) - ret = adjust_irq(s, adj); + struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); - else if (s->resource_ops->adjust_resource) { - - /* you can't use the old interface if the new - * one was used before */ - spin_lock_irqsave(&s->lock, flags); - if ((s->resource_setup_new) && - !(s->resource_setup_old)) { - spin_unlock_irqrestore(&s->lock, flags); - continue; - } else if (!(s->resource_setup_old)) - s->resource_setup_old = 1; - spin_unlock_irqrestore(&s->lock, flags); - - ret = s->resource_ops->adjust_resource(s, adj); - if (!ret) { - /* as there's no way we know this is the - * last call to adjust_resource_info, we - * always need to assume this is the latest - * one... */ - spin_lock_irqsave(&s->lock, flags); - s->resource_setup_done = 1; - spin_unlock_irqrestore(&s->lock, flags); - } - } + if (res) { + res->name = name; + res->start = start; + res->end = start + end - 1; + res->flags = flags; } - up_read(&pcmcia_socket_list_rwsem); - - return (ret); -} -EXPORT_SYMBOL(pcmcia_adjust_resource_info); - -void pcmcia_validate_mem(struct pcmcia_socket *s) -{ - if (s->resource_ops->validate_mem) - s->resource_ops->validate_mem(s); -} -EXPORT_SYMBOL(pcmcia_validate_mem); - -int pcmcia_adjust_io_region(struct resource *res, unsigned long r_start, - unsigned long r_end, struct pcmcia_socket *s) -{ - if (s->resource_ops->adjust_io_region) - return s->resource_ops->adjust_io_region(res, r_start, r_end, s); - return -ENOMEM; + return res; } -EXPORT_SYMBOL(pcmcia_adjust_io_region); -struct resource *pcmcia_find_io_region(unsigned long base, int num, - unsigned long align, struct pcmcia_socket *s) +static int static_find_io(struct pcmcia_socket *s, unsigned int attr, + unsigned int *base, unsigned int num, + unsigned int align, struct resource **parent) { - if (s->resource_ops->find_io) - return s->resource_ops->find_io(base, num, align, s); - return NULL; -} -EXPORT_SYMBOL(pcmcia_find_io_region); - -struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align, - int low, struct pcmcia_socket *s) -{ - if (s->resource_ops->find_mem) - return s->resource_ops->find_mem(base, num, align, low, s); - return NULL; -} -EXPORT_SYMBOL(pcmcia_find_mem_region); - -void release_resource_db(struct pcmcia_socket *s) -{ - if (s->resource_ops->exit) - s->resource_ops->exit(s); -} - - -static int static_init(struct pcmcia_socket *s) -{ - unsigned long flags; - - /* the good thing about SS_CAP_STATIC_MAP sockets is - * that they don't need a resource database */ - - spin_lock_irqsave(&s->lock, flags); - s->resource_setup_done = 1; - spin_unlock_irqrestore(&s->lock, flags); + if (!s->io_offset) + return -EINVAL; + *base = s->io_offset | (*base & 0x0fff); + *parent = NULL; return 0; } @@ -156,11 +59,14 @@ static int static_init(struct pcmcia_socket *s) struct pccard_resource_ops pccard_static_ops = { .validate_mem = NULL, - .adjust_io_region = NULL, - .find_io = NULL, + .find_io = static_find_io, .find_mem = NULL, - .adjust_resource = NULL, .init = static_init, .exit = NULL, }; EXPORT_SYMBOL(pccard_static_ops); + + +MODULE_AUTHOR("David A. Hinds, Dominik Brodowski"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("rsrc_nonstatic"); |
