2  * rsrc_nonstatic.c -- Resource management routines for !SS_CAP_STATIC_MAP sockets
 
   4  * This program is free software; you can redistribute it and/or modify
 
   5  * it under the terms of the GNU General Public License version 2 as
 
   6  * published by the Free Software Foundation.
 
   8  * The initial developer of the original code is David A. Hinds
 
   9  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
 
  10  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 
  12  * (C) 1999             David A. Hinds
 
  15 #include <linux/module.h>
 
  16 #include <linux/moduleparam.h>
 
  17 #include <linux/init.h>
 
  18 #include <linux/interrupt.h>
 
  19 #include <linux/kernel.h>
 
  20 #include <linux/errno.h>
 
  21 #include <linux/types.h>
 
  22 #include <linux/slab.h>
 
  23 #include <linux/ioport.h>
 
  24 #include <linux/timer.h>
 
  25 #include <linux/pci.h>
 
  26 #include <linux/device.h>
 
  31 #include <pcmcia/cs_types.h>
 
  32 #include <pcmcia/ss.h>
 
  33 #include <pcmcia/cs.h>
 
  34 #include <pcmcia/bulkmem.h>
 
  35 #include <pcmcia/cistpl.h>
 
  36 #include "cs_internal.h"
 
  38 MODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
 
  39 MODULE_LICENSE("GPL");
 
  41 /* Parameters that can be set with 'insmod' */
 
  43 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
 
  45 INT_MODULE_PARM(probe_mem,      1);             /* memory probe? */
 
  46 #ifdef CONFIG_PCMCIA_PROBE
 
  47 INT_MODULE_PARM(probe_io,       1);             /* IO port probe? */
 
  48 INT_MODULE_PARM(mem_limit,      0x10000);
 
  51 /* for io_db and mem_db */
 
  54         struct resource_map     *next;
 
  58         struct resource_map             mem_db;
 
  59         struct resource_map             io_db;
 
  60         unsigned int                    rsrc_mem_probe;
 
  63 static DEFINE_MUTEX(rsrc_mutex);
 
  64 #define MEM_PROBE_LOW   (1 << 0)
 
  65 #define MEM_PROBE_HIGH  (1 << 1)
 
  68 /*======================================================================
 
  70     Linux resource management extensions
 
  72 ======================================================================*/
 
  74 static struct resource *
 
  75 make_resource(resource_size_t b, resource_size_t n, int flags, char *name)
 
  77         struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
 
  88 static struct resource *
 
  89 claim_region(struct pcmcia_socket *s, resource_size_t base,
 
  90                 resource_size_t size, int type, char *name)
 
  92         struct resource *res, *parent;
 
  94         parent = type & IORESOURCE_MEM ? &iomem_resource : &ioport_resource;
 
  95         res = make_resource(base, size, type | IORESOURCE_BUSY, name);
 
 100                         parent = pci_find_parent_resource(s->cb_dev, res);
 
 102                 if (!parent || request_resource(parent, res)) {
 
 110 static void free_region(struct resource *res)
 
 113                 release_resource(res);
 
 118 /*======================================================================
 
 120     These manage the internal databases of available resources.
 
 122 ======================================================================*/
 
 124 static int add_interval(struct resource_map *map, u_long base, u_long num)
 
 126     struct resource_map *p, *q;
 
 128     for (p = map; ; p = p->next) {
 
 129         if ((p != map) && (p->base+p->num-1 >= base))
 
 131         if ((p->next == map) || (p->next->base > base+num-1))
 
 134     q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
 
 135     if (!q) return CS_OUT_OF_RESOURCE;
 
 136     q->base = base; q->num = num;
 
 137     q->next = p->next; p->next = q;
 
 141 /*====================================================================*/
 
 143 static int sub_interval(struct resource_map *map, u_long base, u_long num)
 
 145     struct resource_map *p, *q;
 
 147     for (p = map; ; p = q) {
 
 151         if ((q->base+q->num > base) && (base+num > q->base)) {
 
 152             if (q->base >= base) {
 
 153                 if (q->base+q->num <= base+num) {
 
 154                     /* Delete whole block */
 
 157                     /* don't advance the pointer yet */
 
 160                     /* Cut off bit from the front */
 
 161                     q->num = q->base + q->num - base - num;
 
 162                     q->base = base + num;
 
 164             } else if (q->base+q->num <= base+num) {
 
 165                 /* Cut off bit from the end */
 
 166                 q->num = base - q->base;
 
 168                 /* Split the block into two pieces */
 
 169                 p = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
 
 170                 if (!p) return CS_OUT_OF_RESOURCE;
 
 172                 p->num = q->base+q->num - p->base;
 
 173                 q->num = base - q->base;
 
 174                 p->next = q->next ; q->next = p;
 
 181 /*======================================================================
 
 183     These routines examine a region of IO or memory addresses to
 
 184     determine what ranges might be genuinely available.
 
 186 ======================================================================*/
 
 188 #ifdef CONFIG_PCMCIA_PROBE
 
 189 static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
 
 192     struct resource *res;
 
 193     struct socket_data *s_data = s->resource_data;
 
 194     unsigned int i, j, bad;
 
 196     u_char *b, hole, most;
 
 198     printk(KERN_INFO "cs: IO port probe %#x-%#x:",
 
 201     /* First, what does a floating port look like? */
 
 202     b = kzalloc(256, GFP_KERNEL);
 
 204             printk(KERN_ERR "do_io_probe: unable to kmalloc 256 bytes");
 
 207     for (i = base, most = 0; i < base+num; i += 8) {
 
 208         res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
 
 212         for (j = 1; j < 8; j++)
 
 213             if (inb(i+j) != hole) break;
 
 215         if ((j == 8) && (++b[hole] > b[most]))
 
 217         if (b[most] == 127) break;
 
 222     for (i = base; i < base+num; i += 8) {
 
 223         res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
 
 226         for (j = 0; j < 8; j++)
 
 227             if (inb(i+j) != most) break;
 
 231                 printk(" excluding");
 
 236                 sub_interval(&s_data->io_db, bad, i-bad);
 
 237                 printk(" %#x-%#x", bad, i-1);
 
 243         if ((num > 16) && (bad == base) && (i == base+num)) {
 
 244             printk(" nothing: probe failed.\n");
 
 247             sub_interval(&s_data->io_db, bad, i-bad);
 
 248             printk(" %#x-%#x", bad, i-1);
 
 252     printk(any ? "\n" : " clean.\n");
 
 256 /*======================================================================
 
 258     This is tricky... when we set up CIS memory, we try to validate
 
 259     the memory window space allocations.
 
 261 ======================================================================*/
 
 263 /* Validation function for cards with a valid CIS */
 
 264 static int readable(struct pcmcia_socket *s, struct resource *res, cisinfo_t *info)
 
 268         s->cis_mem.res = res;
 
 269         s->cis_virt = ioremap(res->start, s->map_size);
 
 271                 ret = pccard_validate_cis(s, BIND_FN_ALL, info);
 
 272                 /* invalidate mapping and CIS cache */
 
 273                 iounmap(s->cis_virt);
 
 275                 destroy_cis_cache(s);
 
 277         s->cis_mem.res = NULL;
 
 278         if ((ret != 0) || (info->Chains == 0))
 
 283 /* Validation function for simple memory cards */
 
 284 static int checksum(struct pcmcia_socket *s, struct resource *res)
 
 287         int i, a = 0, b = -1, d;
 
 290         virt = ioremap(res->start, s->map_size);
 
 293                 map.flags = MAP_ACTIVE;
 
 297                 s->ops->set_mem_map(s, &map);
 
 299                 /* Don't bother checking every word... */
 
 300                 for (i = 0; i < s->map_size; i += 44) {
 
 307                 s->ops->set_mem_map(s, &map);
 
 312         return (b == -1) ? -1 : (a>>1);
 
 316 cis_readable(struct pcmcia_socket *s, unsigned long base, unsigned long size)
 
 318         struct resource *res1, *res2;
 
 319         cisinfo_t info1, info2;
 
 322         res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
 
 323         res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
 
 326                 ret = readable(s, res1, &info1);
 
 327                 ret += readable(s, res2, &info2);
 
 333         return (ret == 2) && (info1.Chains == info2.Chains);
 
 337 checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
 
 339         struct resource *res1, *res2;
 
 342         res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
 
 343         res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
 
 346                 a = checksum(s, res1);
 
 347                 b = checksum(s, res2);
 
 353         return (a == b) && (a >= 0);
 
 356 /*======================================================================
 
 358     The memory probe.  If the memory list includes a 64K-aligned block
 
 359     below 1MB, we probe in 64K chunks, and as soon as we accumulate at
 
 360     least mem_limit free space, we quit.
 
 362 ======================================================================*/
 
 364 static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s)
 
 366     struct socket_data *s_data = s->resource_data;
 
 367     u_long i, j, bad, fail, step;
 
 369     printk(KERN_INFO "cs: memory probe 0x%06lx-0x%06lx:",
 
 372     step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
 
 373     /* don't allow too large steps */
 
 376     /* cis_readable wants to map 2x map_size */
 
 377     if (step < 2 * s->map_size)
 
 378         step = 2 * s->map_size;
 
 379     for (i = j = base; i < base+num; i = j + step) {
 
 381             for (j = i; j < base+num; j += step) {
 
 382                 if (cis_readable(s, j, step))
 
 385             fail = ((i == base) && (j == base+num));
 
 388             for (j = i; j < base+num; j += 2*step)
 
 389                 if (checksum_match(s, j, step) &&
 
 390                     checksum_match(s, j + step, step))
 
 394             if (!bad) printk(" excluding");
 
 395             printk(" %#05lx-%#05lx", i, j-1);
 
 396             sub_interval(&s_data->mem_db, i, j-i);
 
 400     printk(bad ? "\n" : " clean.\n");
 
 404 #ifdef CONFIG_PCMCIA_PROBE
 
 406 static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s)
 
 408         struct socket_data *s_data = s->resource_data;
 
 410         if (m == &s_data->mem_db)
 
 412         ok = inv_probe(m->next, s);
 
 414                 if (m->base >= 0x100000)
 
 415                         sub_interval(&s_data->mem_db, m->base, m->num);
 
 418         if (m->base < 0x100000)
 
 420         return do_mem_probe(m->base, m->num, s);
 
 423 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
 
 425         struct resource_map *m, mm;
 
 426         static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 };
 
 427         unsigned long b, i, ok = 0;
 
 428         struct socket_data *s_data = s->resource_data;
 
 430         /* We do up to four passes through the list */
 
 431         if (probe_mask & MEM_PROBE_HIGH) {
 
 432                 if (inv_probe(s_data->mem_db.next, s) > 0)
 
 434                 printk(KERN_NOTICE "cs: warning: no high memory space "
 
 439         for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
 
 441                 /* Only probe < 1 MB */
 
 442                 if (mm.base >= 0x100000)
 
 444                 if ((mm.base | mm.num) & 0xffff) {
 
 445                         ok += do_mem_probe(mm.base, mm.num, s);
 
 448                 /* Special probe for 64K-aligned block */
 
 449                 for (i = 0; i < 4; i++) {
 
 451                         if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) {
 
 453                                         sub_interval(&s_data->mem_db, b, 0x10000);
 
 455                                         ok += do_mem_probe(b, 0x10000, s);
 
 466 #else /* CONFIG_PCMCIA_PROBE */
 
 468 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
 
 470         struct resource_map *m, mm;
 
 471         struct socket_data *s_data = s->resource_data;
 
 472         unsigned long ok = 0;
 
 474         for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
 
 476                 ok += do_mem_probe(mm.base, mm.num, s);
 
 483 #endif /* CONFIG_PCMCIA_PROBE */
 
 487  * Locking note: Must be called with skt_mutex held!
 
 489 static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
 
 491         struct socket_data *s_data = s->resource_data;
 
 492         unsigned int probe_mask = MEM_PROBE_LOW;
 
 498         mutex_lock(&rsrc_mutex);
 
 500         if (s->features & SS_CAP_PAGE_REGS)
 
 501                 probe_mask = MEM_PROBE_HIGH;
 
 503         if (probe_mask & ~s_data->rsrc_mem_probe) {
 
 504                 if (s->state & SOCKET_PRESENT)
 
 505                         ret = validate_mem(s, probe_mask);
 
 507                         s_data->rsrc_mem_probe |= probe_mask;
 
 510         mutex_unlock(&rsrc_mutex);
 
 515 struct pcmcia_align_data {
 
 517         unsigned long   offset;
 
 518         struct resource_map     *map;
 
 522 pcmcia_common_align(void *align_data, struct resource *res,
 
 523                         resource_size_t size, resource_size_t align)
 
 525         struct pcmcia_align_data *data = align_data;
 
 526         resource_size_t start;
 
 528          * Ensure that we have the correct start address
 
 530         start = (res->start & ~data->mask) + data->offset;
 
 531         if (start < res->start)
 
 532                 start += data->mask + 1;
 
 537 pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
 
 538                 resource_size_t align)
 
 540         struct pcmcia_align_data *data = align_data;
 
 541         struct resource_map *m;
 
 543         pcmcia_common_align(data, res, size, align);
 
 545         for (m = data->map->next; m != data->map; m = m->next) {
 
 546                 unsigned long start = m->base;
 
 547                 unsigned long end = m->base + m->num - 1;
 
 550                  * If the lower resources are not available, try aligning
 
 551                  * to this entry of the resource database to see if it'll
 
 554                 if (res->start < start) {
 
 556                         pcmcia_common_align(data, res, size, align);
 
 560                  * If we're above the area which was passed in, there's
 
 561                  * no point proceeding.
 
 563                 if (res->start >= res->end)
 
 566                 if ((res->start + size - 1) <= end)
 
 571          * If we failed to find something suitable, ensure we fail.
 
 574                 res->start = res->end;
 
 578  * Adjust an existing IO region allocation, but making sure that we don't
 
 579  * encroach outside the resources which the user supplied.
 
 581 static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_start,
 
 582                                       unsigned long r_end, struct pcmcia_socket *s)
 
 584         struct resource_map *m;
 
 585         struct socket_data *s_data = s->resource_data;
 
 588         mutex_lock(&rsrc_mutex);
 
 589         for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) {
 
 590                 unsigned long start = m->base;
 
 591                 unsigned long end = m->base + m->num - 1;
 
 593                 if (start > r_start || r_end > end)
 
 596                 ret = adjust_resource(res, r_start, r_end - r_start + 1);
 
 599         mutex_unlock(&rsrc_mutex);
 
 604 /*======================================================================
 
 606     These find ranges of I/O ports or memory addresses that are not
 
 607     currently allocated by other devices.
 
 609     The 'align' field should reflect the number of bits of address
 
 610     that need to be preserved from the initial value of *base.  It
 
 611     should be a power of two, greater than or equal to 'num'.  A value
 
 612     of 0 means that all bits of *base are significant.  *base should
 
 613     also be strictly less than 'align'.
 
 615 ======================================================================*/
 
 617 static struct resource *nonstatic_find_io_region(unsigned long base, int num,
 
 618                    unsigned long align, struct pcmcia_socket *s)
 
 620         struct resource *res = make_resource(0, num, IORESOURCE_IO, s->dev.bus_id);
 
 621         struct socket_data *s_data = s->resource_data;
 
 622         struct pcmcia_align_data data;
 
 623         unsigned long min = base;
 
 629         data.mask = align - 1;
 
 630         data.offset = base & data.mask;
 
 631         data.map = &s_data->io_db;
 
 633         mutex_lock(&rsrc_mutex);
 
 636                 ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
 
 637                                              min, 0, pcmcia_align, &data);
 
 640                 ret = allocate_resource(&ioport_resource, res, num, min, ~0UL,
 
 641                                         1, pcmcia_align, &data);
 
 642         mutex_unlock(&rsrc_mutex);
 
 651 static struct resource * nonstatic_find_mem_region(u_long base, u_long num,
 
 652                 u_long align, int low, struct pcmcia_socket *s)
 
 654         struct resource *res = make_resource(0, num, IORESOURCE_MEM, s->dev.bus_id);
 
 655         struct socket_data *s_data = s->resource_data;
 
 656         struct pcmcia_align_data data;
 
 657         unsigned long min, max;
 
 660         low = low || !(s->features & SS_CAP_PAGE_REGS);
 
 662         data.mask = align - 1;
 
 663         data.offset = base & data.mask;
 
 664         data.map = &s_data->mem_db;
 
 666         for (i = 0; i < 2; i++) {
 
 669                         min = base < max ? base : 0;
 
 672                         min = 0x100000UL + base;
 
 675                 mutex_lock(&rsrc_mutex);
 
 678                         ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
 
 680                                                      pcmcia_align, &data);
 
 683                         ret = allocate_resource(&iomem_resource, res, num, min,
 
 684                                                 max, 1, pcmcia_align, &data);
 
 685                 mutex_unlock(&rsrc_mutex);
 
 699 static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
 
 701         struct socket_data *data = s->resource_data;
 
 702         unsigned long size = end - start + 1;
 
 708         mutex_lock(&rsrc_mutex);
 
 710         case ADD_MANAGED_RESOURCE:
 
 711                 ret = add_interval(&data->mem_db, start, size);
 
 713         case REMOVE_MANAGED_RESOURCE:
 
 714                 ret = sub_interval(&data->mem_db, start, size);
 
 716                         struct pcmcia_socket *socket;
 
 717                         down_read(&pcmcia_socket_list_rwsem);
 
 718                         list_for_each_entry(socket, &pcmcia_socket_list, socket_list)
 
 719                                 release_cis_mem(socket);
 
 720                         up_read(&pcmcia_socket_list_rwsem);
 
 726         mutex_unlock(&rsrc_mutex);
 
 732 static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
 
 734         struct socket_data *data = s->resource_data;
 
 735         unsigned long size = end - start + 1;
 
 741         if (end > IO_SPACE_LIMIT)
 
 744         mutex_lock(&rsrc_mutex);
 
 746         case ADD_MANAGED_RESOURCE:
 
 747                 if (add_interval(&data->io_db, start, size) != 0) {
 
 751 #ifdef CONFIG_PCMCIA_PROBE
 
 753                         do_io_probe(s, start, size);
 
 756         case REMOVE_MANAGED_RESOURCE:
 
 757                 sub_interval(&data->io_db, start, size);
 
 763         mutex_unlock(&rsrc_mutex);
 
 769 static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj)
 
 773         switch (adj->Resource) {
 
 774         case RES_MEMORY_RANGE:
 
 775                 end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
 
 776                 return adjust_memory(s, adj->Action, adj->resource.memory.Base, end);
 
 778                 end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
 
 779                 return adjust_io(s, adj->Action, adj->resource.io.BasePort, end);
 
 781         return CS_UNSUPPORTED_FUNCTION;
 
 785 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
 
 787         struct resource *res;
 
 790         if (!s->cb_dev || !s->cb_dev->bus)
 
 793 #if defined(CONFIG_X86)
 
 794         /* If this is the root bus, the risk of hitting
 
 795          * some strange system devices which aren't protected
 
 796          * by either ACPI resource tables or properly requested
 
 797          * resources is too big. Therefore, don't do auto-adding
 
 798          * of resources at the moment.
 
 800         if (s->cb_dev->bus->number == 0)
 
 804         for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) {
 
 805                 res = s->cb_dev->bus->resource[i];
 
 809                 if (res->flags & IORESOURCE_IO) {
 
 810                         if (res == &ioport_resource)
 
 812                         printk(KERN_INFO "pcmcia: parent PCI bridge I/O "
 
 813                                 "window: 0x%llx - 0x%llx\n",
 
 814                                 (unsigned long long)res->start,
 
 815                                 (unsigned long long)res->end);
 
 816                         if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
 
 817                                 done |= IORESOURCE_IO;
 
 821                 if (res->flags & IORESOURCE_MEM) {
 
 822                         if (res == &iomem_resource)
 
 824                         printk(KERN_INFO "pcmcia: parent PCI bridge Memory "
 
 825                                 "window: 0x%llx - 0x%llx\n",
 
 826                                 (unsigned long long)res->start,
 
 827                                 (unsigned long long)res->end);
 
 828                         if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
 
 829                                 done |= IORESOURCE_MEM;
 
 833         /* if we got at least one of IO, and one of MEM, we can be glad and
 
 834          * activate the PCMCIA subsystem */
 
 835         if (done == (IORESOURCE_MEM | IORESOURCE_IO))
 
 836                 s->resource_setup_done = 1;
 
 843 static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
 
 851 static int nonstatic_init(struct pcmcia_socket *s)
 
 853         struct socket_data *data;
 
 855         data = kzalloc(sizeof(struct socket_data), GFP_KERNEL);
 
 859         data->mem_db.next = &data->mem_db;
 
 860         data->io_db.next = &data->io_db;
 
 862         s->resource_data = (void *) data;
 
 864         nonstatic_autoadd_resources(s);
 
 869 static void nonstatic_release_resource_db(struct pcmcia_socket *s)
 
 871         struct socket_data *data = s->resource_data;
 
 872         struct resource_map *p, *q;
 
 874         mutex_lock(&rsrc_mutex);
 
 875         for (p = data->mem_db.next; p != &data->mem_db; p = q) {
 
 879         for (p = data->io_db.next; p != &data->io_db; p = q) {
 
 883         mutex_unlock(&rsrc_mutex);
 
 887 struct pccard_resource_ops pccard_nonstatic_ops = {
 
 888         .validate_mem = pcmcia_nonstatic_validate_mem,
 
 889         .adjust_io_region = nonstatic_adjust_io_region,
 
 890         .find_io = nonstatic_find_io_region,
 
 891         .find_mem = nonstatic_find_mem_region,
 
 892         .adjust_resource = nonstatic_adjust_resource_info,
 
 893         .init = nonstatic_init,
 
 894         .exit = nonstatic_release_resource_db,
 
 896 EXPORT_SYMBOL(pccard_nonstatic_ops);
 
 899 /* sysfs interface to the resource database */
 
 901 static ssize_t show_io_db(struct device *dev,
 
 902                           struct device_attribute *attr, char *buf)
 
 904         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
 905         struct socket_data *data;
 
 906         struct resource_map *p;
 
 909         mutex_lock(&rsrc_mutex);
 
 910         data = s->resource_data;
 
 912         for (p = data->io_db.next; p != &data->io_db; p = p->next) {
 
 913                 if (ret > (PAGE_SIZE - 10))
 
 915                 ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
 
 916                                  "0x%08lx - 0x%08lx\n",
 
 917                                  ((unsigned long) p->base),
 
 918                                  ((unsigned long) p->base + p->num - 1));
 
 921         mutex_unlock(&rsrc_mutex);
 
 925 static ssize_t store_io_db(struct device *dev,
 
 926                            struct device_attribute *attr,
 
 927                            const char *buf, size_t count)
 
 929         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
 930         unsigned long start_addr, end_addr;
 
 931         unsigned int add = ADD_MANAGED_RESOURCE;
 
 934         ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
 
 936                 ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
 
 937                 add = REMOVE_MANAGED_RESOURCE;
 
 939                         ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
 
 940                         add = ADD_MANAGED_RESOURCE;
 
 945         if (end_addr < start_addr)
 
 948         ret = adjust_io(s, add, start_addr, end_addr);
 
 950                 s->resource_setup_new = 1;
 
 952         return ret ? ret : count;
 
 954 static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
 
 956 static ssize_t show_mem_db(struct device *dev,
 
 957                            struct device_attribute *attr, char *buf)
 
 959         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
 960         struct socket_data *data;
 
 961         struct resource_map *p;
 
 964         mutex_lock(&rsrc_mutex);
 
 965         data = s->resource_data;
 
 967         for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
 
 968                 if (ret > (PAGE_SIZE - 10))
 
 970                 ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
 
 971                                  "0x%08lx - 0x%08lx\n",
 
 972                                  ((unsigned long) p->base),
 
 973                                  ((unsigned long) p->base + p->num - 1));
 
 976         mutex_unlock(&rsrc_mutex);
 
 980 static ssize_t store_mem_db(struct device *dev,
 
 981                             struct device_attribute *attr,
 
 982                             const char *buf, size_t count)
 
 984         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
 985         unsigned long start_addr, end_addr;
 
 986         unsigned int add = ADD_MANAGED_RESOURCE;
 
 989         ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
 
 991                 ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
 
 992                 add = REMOVE_MANAGED_RESOURCE;
 
 994                         ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
 
 995                         add = ADD_MANAGED_RESOURCE;
 
1000         if (end_addr < start_addr)
 
1003         ret = adjust_memory(s, add, start_addr, end_addr);
 
1005                 s->resource_setup_new = 1;
 
1007         return ret ? ret : count;
 
1009 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
 
1011 static struct device_attribute *pccard_rsrc_attributes[] = {
 
1012         &dev_attr_available_resources_io,
 
1013         &dev_attr_available_resources_mem,
 
1017 static int __devinit pccard_sysfs_add_rsrc(struct device *dev,
 
1018                                            struct class_interface *class_intf)
 
1020         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
1021         struct device_attribute **attr;
 
1023         if (s->resource_ops != &pccard_nonstatic_ops)
 
1026         for (attr = pccard_rsrc_attributes; *attr; attr++) {
 
1027                 ret = device_create_file(dev, *attr);
 
1035 static void __devexit pccard_sysfs_remove_rsrc(struct device *dev,
 
1036                                                struct class_interface *class_intf)
 
1038         struct pcmcia_socket *s = dev_get_drvdata(dev);
 
1039         struct device_attribute **attr;
 
1041         if (s->resource_ops != &pccard_nonstatic_ops)
 
1044         for (attr = pccard_rsrc_attributes; *attr; attr++)
 
1045                 device_remove_file(dev, *attr);
 
1048 static struct class_interface pccard_rsrc_interface = {
 
1049         .class = &pcmcia_socket_class,
 
1050         .add_dev = &pccard_sysfs_add_rsrc,
 
1051         .remove_dev = __devexit_p(&pccard_sysfs_remove_rsrc),
 
1054 static int __init nonstatic_sysfs_init(void)
 
1056         return class_interface_register(&pccard_rsrc_interface);
 
1059 static void __exit nonstatic_sysfs_exit(void)
 
1061         class_interface_unregister(&pccard_rsrc_interface);
 
1064 module_init(nonstatic_sysfs_init);
 
1065 module_exit(nonstatic_sysfs_exit);