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/cistpl.h>
35 #include "cs_internal.h"
37 MODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
38 MODULE_LICENSE("GPL");
40 /* Parameters that can be set with 'insmod' */
42 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
44 INT_MODULE_PARM(probe_mem, 1); /* memory probe? */
45 #ifdef CONFIG_PCMCIA_PROBE
46 INT_MODULE_PARM(probe_io, 1); /* IO port probe? */
47 INT_MODULE_PARM(mem_limit, 0x10000);
50 /* for io_db and mem_db */
53 struct resource_map *next;
57 struct resource_map mem_db;
58 struct resource_map io_db;
59 unsigned int rsrc_mem_probe;
62 static DEFINE_MUTEX(rsrc_mutex);
63 #define MEM_PROBE_LOW (1 << 0)
64 #define MEM_PROBE_HIGH (1 << 1)
67 /*======================================================================
69 Linux resource management extensions
71 ======================================================================*/
73 static struct resource *
74 make_resource(resource_size_t b, resource_size_t n, int flags, const char *name)
76 struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
87 static struct resource *
88 claim_region(struct pcmcia_socket *s, resource_size_t base,
89 resource_size_t size, int type, char *name)
91 struct resource *res, *parent;
93 parent = type & IORESOURCE_MEM ? &iomem_resource : &ioport_resource;
94 res = make_resource(base, size, type | IORESOURCE_BUSY, name);
99 parent = pci_find_parent_resource(s->cb_dev, res);
101 if (!parent || request_resource(parent, res)) {
109 static void free_region(struct resource *res)
112 release_resource(res);
117 /*======================================================================
119 These manage the internal databases of available resources.
121 ======================================================================*/
123 static int add_interval(struct resource_map *map, u_long base, u_long num)
125 struct resource_map *p, *q;
127 for (p = map; ; p = p->next) {
128 if ((p != map) && (p->base+p->num-1 >= base))
130 if ((p->next == map) || (p->next->base > base+num-1))
133 q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
135 printk(KERN_WARNING "out of memory to update resources\n");
138 q->base = base; q->num = num;
139 q->next = p->next; p->next = q;
143 /*====================================================================*/
145 static int sub_interval(struct resource_map *map, u_long base, u_long num)
147 struct resource_map *p, *q;
149 for (p = map; ; p = q) {
153 if ((q->base+q->num > base) && (base+num > q->base)) {
154 if (q->base >= base) {
155 if (q->base+q->num <= base+num) {
156 /* Delete whole block */
159 /* don't advance the pointer yet */
162 /* Cut off bit from the front */
163 q->num = q->base + q->num - base - num;
164 q->base = base + num;
166 } else if (q->base+q->num <= base+num) {
167 /* Cut off bit from the end */
168 q->num = base - q->base;
170 /* Split the block into two pieces */
171 p = kmalloc(sizeof(struct resource_map),
174 printk(KERN_WARNING "out of memory to update resources\n");
178 p->num = q->base+q->num - p->base;
179 q->num = base - q->base;
180 p->next = q->next ; q->next = p;
187 /*======================================================================
189 These routines examine a region of IO or memory addresses to
190 determine what ranges might be genuinely available.
192 ======================================================================*/
194 #ifdef CONFIG_PCMCIA_PROBE
195 static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
198 struct resource *res;
199 struct socket_data *s_data = s->resource_data;
200 unsigned int i, j, bad;
202 u_char *b, hole, most;
204 dev_printk(KERN_INFO, &s->dev, "cs: IO port probe %#x-%#x:",
207 /* First, what does a floating port look like? */
208 b = kzalloc(256, GFP_KERNEL);
211 dev_printk(KERN_ERR, &s->dev,
212 "do_io_probe: unable to kmalloc 256 bytes");
215 for (i = base, most = 0; i < base+num; i += 8) {
216 res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
220 for (j = 1; j < 8; j++)
221 if (inb(i+j) != hole)
224 if ((j == 8) && (++b[hole] > b[most]))
232 for (i = base; i < base+num; i += 8) {
233 res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
236 for (j = 0; j < 8; j++)
237 if (inb(i+j) != most)
242 printk(" excluding");
247 sub_interval(&s_data->io_db, bad, i-bad);
248 printk(" %#x-%#x", bad, i-1);
254 if ((num > 16) && (bad == base) && (i == base+num)) {
255 printk(" nothing: probe failed.\n");
258 sub_interval(&s_data->io_db, bad, i-bad);
259 printk(" %#x-%#x", bad, i-1);
263 printk(any ? "\n" : " clean.\n");
267 /*======================================================================*/
270 * readable() - iomem validation function for cards with a valid CIS
272 static int readable(struct pcmcia_socket *s, struct resource *res,
277 s->cis_mem.res = res;
278 s->cis_virt = ioremap(res->start, s->map_size);
280 ret = pccard_validate_cis(s, count);
281 /* invalidate mapping */
282 iounmap(s->cis_virt);
285 s->cis_mem.res = NULL;
286 if ((ret) || (*count == 0))
292 * checksum() - iomem validation function for simple memory cards
294 static int checksum(struct pcmcia_socket *s, struct resource *res,
298 int i, a = 0, b = -1, d;
301 virt = ioremap(res->start, s->map_size);
304 map.flags = MAP_ACTIVE;
308 s->ops->set_mem_map(s, &map);
310 /* Don't bother checking every word... */
311 for (i = 0; i < s->map_size; i += 44) {
318 s->ops->set_mem_map(s, &map);
332 * do_validate_mem() - low level validate a memory region for PCMCIA use
333 * @s: PCMCIA socket to validate
334 * @base: start address of resource to check
335 * @size: size of resource to check
336 * @validate: validation function to use
338 * do_validate_mem() splits up the memory region which is to be checked
339 * into two parts. Both are passed to the @validate() function. If
340 * @validate() returns non-zero, or the value parameter to @validate()
341 * is zero, or the value parameter is different between both calls,
342 * the check fails, and -EINVAL is returned. Else, 0 is returned.
344 static int do_validate_mem(struct pcmcia_socket *s,
345 unsigned long base, unsigned long size,
346 int validate (struct pcmcia_socket *s,
347 struct resource *res,
348 unsigned int *value))
350 struct resource *res1, *res2;
351 unsigned int info1 = 1, info2 = 1;
354 res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
355 res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
361 ret = validate(s, res1, &info1);
362 ret += validate(s, res2, &info2);
369 dev_dbg(&s->dev, "cs: memory probe 0x%06lx-0x%06lx: %p %p %u %u %u",
370 base, base+size-1, res1, res2, ret, info1, info2);
372 if ((ret) || (info1 != info2) || (info1 == 0))
380 * do_mem_probe() - validate a memory region for PCMCIA use
381 * @s: PCMCIA socket to validate
382 * @base: start address of resource to check
383 * @num: size of resource to check
384 * @validate: validation function to use
385 * @fallback: validation function to use if validate fails
387 * do_mem_probe() checks a memory region for use by the PCMCIA subsystem.
388 * To do so, the area is split up into sensible parts, and then passed
389 * into the @validate() function. Only if @validate() and @fallback() fail,
390 * the area is marked as unavaibale for use by the PCMCIA subsystem. The
391 * function returns the size of the usable memory area.
393 static int do_mem_probe(struct pcmcia_socket *s, u_long base, u_long num,
394 int validate (struct pcmcia_socket *s,
395 struct resource *res,
396 unsigned int *value),
397 int fallback (struct pcmcia_socket *s,
398 struct resource *res,
399 unsigned int *value))
401 struct socket_data *s_data = s->resource_data;
402 u_long i, j, bad, fail, step;
404 dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
407 step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
408 /* don't allow too large steps */
411 /* cis_readable wants to map 2x map_size */
412 if (step < 2 * s->map_size)
413 step = 2 * s->map_size;
414 for (i = j = base; i < base+num; i = j + step) {
416 for (j = i; j < base+num; j += step) {
417 if (!do_validate_mem(s, j, step, validate))
420 fail = ((i == base) && (j == base+num));
422 if ((fail) && (fallback)) {
423 for (j = i; j < base+num; j += step)
424 if (!do_validate_mem(s, j, step, fallback))
429 printk(" excluding");
430 printk(" %#05lx-%#05lx", i, j-1);
431 sub_interval(&s_data->mem_db, i, j-i);
435 printk(bad ? "\n" : " clean.\n");
440 #ifdef CONFIG_PCMCIA_PROBE
443 * inv_probe() - top-to-bottom search for one usuable high memory area
444 * @s: PCMCIA socket to validate
445 * @m: resource_map to check
447 static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s)
449 struct socket_data *s_data = s->resource_data;
451 if (m == &s_data->mem_db)
453 ok = inv_probe(m->next, s);
455 if (m->base >= 0x100000)
456 sub_interval(&s_data->mem_db, m->base, m->num);
459 if (m->base < 0x100000)
461 return do_mem_probe(s, m->base, m->num, readable, checksum);
465 * validate_mem() - memory probe function
466 * @s: PCMCIA socket to validate
467 * @probe_mask: MEM_PROBE_LOW | MEM_PROBE_HIGH
469 * The memory probe. If the memory list includes a 64K-aligned block
470 * below 1MB, we probe in 64K chunks, and as soon as we accumulate at
471 * least mem_limit free space, we quit. Returns 0 on usuable ports.
473 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
475 struct resource_map *m, mm;
476 static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 };
477 unsigned long b, i, ok = 0;
478 struct socket_data *s_data = s->resource_data;
480 /* We do up to four passes through the list */
481 if (probe_mask & MEM_PROBE_HIGH) {
482 if (inv_probe(s_data->mem_db.next, s) > 0)
484 dev_printk(KERN_NOTICE, &s->dev,
485 "cs: warning: no high memory space available!\n");
489 for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
491 /* Only probe < 1 MB */
492 if (mm.base >= 0x100000)
494 if ((mm.base | mm.num) & 0xffff) {
495 ok += do_mem_probe(s, mm.base, mm.num, readable,
499 /* Special probe for 64K-aligned block */
500 for (i = 0; i < 4; i++) {
502 if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) {
504 sub_interval(&s_data->mem_db, b, 0x10000);
506 ok += do_mem_probe(s, b, 0x10000,
518 #else /* CONFIG_PCMCIA_PROBE */
521 * validate_mem() - memory probe function
522 * @s: PCMCIA socket to validate
523 * @probe_mask: ignored
525 * Returns 0 on usuable ports.
527 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
529 struct resource_map *m, mm;
530 struct socket_data *s_data = s->resource_data;
531 unsigned long ok = 0;
533 for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
535 ok += do_mem_probe(s, mm.base, mm.num, readable, checksum);
542 #endif /* CONFIG_PCMCIA_PROBE */
546 * pcmcia_nonstatic_validate_mem() - try to validate iomem for PCMCIA use
547 * @s: PCMCIA socket to validate
549 * This is tricky... when we set up CIS memory, we try to validate
550 * the memory window space allocations.
552 * Locking note: Must be called with skt_mutex held!
554 static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
556 struct socket_data *s_data = s->resource_data;
557 unsigned int probe_mask = MEM_PROBE_LOW;
563 mutex_lock(&rsrc_mutex);
565 if (s->features & SS_CAP_PAGE_REGS)
566 probe_mask = MEM_PROBE_HIGH;
568 if (probe_mask & ~s_data->rsrc_mem_probe) {
569 if (s->state & SOCKET_PRESENT) {
570 ret = validate_mem(s, probe_mask);
572 s_data->rsrc_mem_probe |= probe_mask;
576 mutex_unlock(&rsrc_mutex);
581 struct pcmcia_align_data {
583 unsigned long offset;
584 struct resource_map *map;
588 pcmcia_common_align(void *align_data, struct resource *res,
589 resource_size_t size, resource_size_t align)
591 struct pcmcia_align_data *data = align_data;
592 resource_size_t start;
594 * Ensure that we have the correct start address
596 start = (res->start & ~data->mask) + data->offset;
597 if (start < res->start)
598 start += data->mask + 1;
603 pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
604 resource_size_t align)
606 struct pcmcia_align_data *data = align_data;
607 struct resource_map *m;
609 pcmcia_common_align(data, res, size, align);
611 for (m = data->map->next; m != data->map; m = m->next) {
612 unsigned long start = m->base;
613 unsigned long end = m->base + m->num - 1;
616 * If the lower resources are not available, try aligning
617 * to this entry of the resource database to see if it'll
620 if (res->start < start) {
622 pcmcia_common_align(data, res, size, align);
626 * If we're above the area which was passed in, there's
627 * no point proceeding.
629 if (res->start >= res->end)
632 if ((res->start + size - 1) <= end)
637 * If we failed to find something suitable, ensure we fail.
640 res->start = res->end;
644 * Adjust an existing IO region allocation, but making sure that we don't
645 * encroach outside the resources which the user supplied.
647 static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_start,
648 unsigned long r_end, struct pcmcia_socket *s)
650 struct resource_map *m;
651 struct socket_data *s_data = s->resource_data;
654 mutex_lock(&rsrc_mutex);
655 for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) {
656 unsigned long start = m->base;
657 unsigned long end = m->base + m->num - 1;
659 if (start > r_start || r_end > end)
662 ret = adjust_resource(res, r_start, r_end - r_start + 1);
665 mutex_unlock(&rsrc_mutex);
670 /*======================================================================
672 These find ranges of I/O ports or memory addresses that are not
673 currently allocated by other devices.
675 The 'align' field should reflect the number of bits of address
676 that need to be preserved from the initial value of *base. It
677 should be a power of two, greater than or equal to 'num'. A value
678 of 0 means that all bits of *base are significant. *base should
679 also be strictly less than 'align'.
681 ======================================================================*/
683 static struct resource *nonstatic_find_io_region(unsigned long base, int num,
684 unsigned long align, struct pcmcia_socket *s)
686 struct resource *res = make_resource(0, num, IORESOURCE_IO, dev_name(&s->dev));
687 struct socket_data *s_data = s->resource_data;
688 struct pcmcia_align_data data;
689 unsigned long min = base;
695 data.mask = align - 1;
696 data.offset = base & data.mask;
697 data.map = &s_data->io_db;
699 mutex_lock(&rsrc_mutex);
702 ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
703 min, 0, pcmcia_align, &data);
706 ret = allocate_resource(&ioport_resource, res, num, min, ~0UL,
707 1, pcmcia_align, &data);
708 mutex_unlock(&rsrc_mutex);
717 static struct resource *nonstatic_find_mem_region(u_long base, u_long num,
718 u_long align, int low, struct pcmcia_socket *s)
720 struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
721 struct socket_data *s_data = s->resource_data;
722 struct pcmcia_align_data data;
723 unsigned long min, max;
726 low = low || !(s->features & SS_CAP_PAGE_REGS);
728 data.mask = align - 1;
729 data.offset = base & data.mask;
730 data.map = &s_data->mem_db;
732 for (i = 0; i < 2; i++) {
735 min = base < max ? base : 0;
738 min = 0x100000UL + base;
741 mutex_lock(&rsrc_mutex);
744 ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
746 pcmcia_align, &data);
749 ret = allocate_resource(&iomem_resource, res, num, min,
750 max, 1, pcmcia_align, &data);
751 mutex_unlock(&rsrc_mutex);
765 static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
767 struct socket_data *data = s->resource_data;
768 unsigned long size = end - start + 1;
774 mutex_lock(&rsrc_mutex);
776 case ADD_MANAGED_RESOURCE:
777 ret = add_interval(&data->mem_db, start, size);
779 do_mem_probe(s, start, size, NULL, NULL);
781 case REMOVE_MANAGED_RESOURCE:
782 ret = sub_interval(&data->mem_db, start, size);
787 mutex_unlock(&rsrc_mutex);
793 static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
795 struct socket_data *data = s->resource_data;
796 unsigned long size = end - start + 1;
802 if (end > IO_SPACE_LIMIT)
805 mutex_lock(&rsrc_mutex);
807 case ADD_MANAGED_RESOURCE:
808 if (add_interval(&data->io_db, start, size) != 0) {
812 #ifdef CONFIG_PCMCIA_PROBE
814 do_io_probe(s, start, size);
817 case REMOVE_MANAGED_RESOURCE:
818 sub_interval(&data->io_db, start, size);
824 mutex_unlock(&rsrc_mutex);
831 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
833 struct resource *res;
836 if (!s->cb_dev || !s->cb_dev->bus)
839 #if defined(CONFIG_X86)
840 /* If this is the root bus, the risk of hitting
841 * some strange system devices which aren't protected
842 * by either ACPI resource tables or properly requested
843 * resources is too big. Therefore, don't do auto-adding
844 * of resources at the moment.
846 if (s->cb_dev->bus->number == 0)
850 for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
851 res = s->cb_dev->bus->resource[i];
855 if (res->flags & IORESOURCE_IO) {
856 if (res == &ioport_resource)
858 dev_printk(KERN_INFO, &s->cb_dev->dev,
859 "pcmcia: parent PCI bridge I/O "
860 "window: 0x%llx - 0x%llx\n",
861 (unsigned long long)res->start,
862 (unsigned long long)res->end);
863 if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
864 done |= IORESOURCE_IO;
868 if (res->flags & IORESOURCE_MEM) {
869 if (res == &iomem_resource)
871 dev_printk(KERN_INFO, &s->cb_dev->dev,
872 "pcmcia: parent PCI bridge Memory "
873 "window: 0x%llx - 0x%llx\n",
874 (unsigned long long)res->start,
875 (unsigned long long)res->end);
876 if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
877 done |= IORESOURCE_MEM;
881 /* if we got at least one of IO, and one of MEM, we can be glad and
882 * activate the PCMCIA subsystem */
883 if (done == (IORESOURCE_MEM | IORESOURCE_IO))
884 s->resource_setup_done = 1;
891 static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
899 static int nonstatic_init(struct pcmcia_socket *s)
901 struct socket_data *data;
903 data = kzalloc(sizeof(struct socket_data), GFP_KERNEL);
907 data->mem_db.next = &data->mem_db;
908 data->io_db.next = &data->io_db;
910 s->resource_data = (void *) data;
912 nonstatic_autoadd_resources(s);
917 static void nonstatic_release_resource_db(struct pcmcia_socket *s)
919 struct socket_data *data = s->resource_data;
920 struct resource_map *p, *q;
922 mutex_lock(&rsrc_mutex);
923 for (p = data->mem_db.next; p != &data->mem_db; p = q) {
927 for (p = data->io_db.next; p != &data->io_db; p = q) {
931 mutex_unlock(&rsrc_mutex);
935 struct pccard_resource_ops pccard_nonstatic_ops = {
936 .validate_mem = pcmcia_nonstatic_validate_mem,
937 .adjust_io_region = nonstatic_adjust_io_region,
938 .find_io = nonstatic_find_io_region,
939 .find_mem = nonstatic_find_mem_region,
941 .add_mem = adjust_memory,
942 .init = nonstatic_init,
943 .exit = nonstatic_release_resource_db,
945 EXPORT_SYMBOL(pccard_nonstatic_ops);
948 /* sysfs interface to the resource database */
950 static ssize_t show_io_db(struct device *dev,
951 struct device_attribute *attr, char *buf)
953 struct pcmcia_socket *s = dev_get_drvdata(dev);
954 struct socket_data *data;
955 struct resource_map *p;
958 mutex_lock(&rsrc_mutex);
959 data = s->resource_data;
961 for (p = data->io_db.next; p != &data->io_db; p = p->next) {
962 if (ret > (PAGE_SIZE - 10))
964 ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
965 "0x%08lx - 0x%08lx\n",
966 ((unsigned long) p->base),
967 ((unsigned long) p->base + p->num - 1));
970 mutex_unlock(&rsrc_mutex);
974 static ssize_t store_io_db(struct device *dev,
975 struct device_attribute *attr,
976 const char *buf, size_t count)
978 struct pcmcia_socket *s = dev_get_drvdata(dev);
979 unsigned long start_addr, end_addr;
980 unsigned int add = ADD_MANAGED_RESOURCE;
983 ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
985 ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
986 add = REMOVE_MANAGED_RESOURCE;
988 ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
990 add = ADD_MANAGED_RESOURCE;
995 if (end_addr < start_addr)
998 ret = adjust_io(s, add, start_addr, end_addr);
1000 s->resource_setup_new = 1;
1002 return ret ? ret : count;
1004 static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
1006 static ssize_t show_mem_db(struct device *dev,
1007 struct device_attribute *attr, char *buf)
1009 struct pcmcia_socket *s = dev_get_drvdata(dev);
1010 struct socket_data *data;
1011 struct resource_map *p;
1014 mutex_lock(&rsrc_mutex);
1015 data = s->resource_data;
1017 for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
1018 if (ret > (PAGE_SIZE - 10))
1020 ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
1021 "0x%08lx - 0x%08lx\n",
1022 ((unsigned long) p->base),
1023 ((unsigned long) p->base + p->num - 1));
1026 mutex_unlock(&rsrc_mutex);
1030 static ssize_t store_mem_db(struct device *dev,
1031 struct device_attribute *attr,
1032 const char *buf, size_t count)
1034 struct pcmcia_socket *s = dev_get_drvdata(dev);
1035 unsigned long start_addr, end_addr;
1036 unsigned int add = ADD_MANAGED_RESOURCE;
1039 ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
1041 ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
1042 add = REMOVE_MANAGED_RESOURCE;
1044 ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
1046 add = ADD_MANAGED_RESOURCE;
1051 if (end_addr < start_addr)
1054 ret = adjust_memory(s, add, start_addr, end_addr);
1056 s->resource_setup_new = 1;
1058 return ret ? ret : count;
1060 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
1062 static struct attribute *pccard_rsrc_attributes[] = {
1063 &dev_attr_available_resources_io.attr,
1064 &dev_attr_available_resources_mem.attr,
1068 static const struct attribute_group rsrc_attributes = {
1069 .attrs = pccard_rsrc_attributes,
1072 static int __devinit pccard_sysfs_add_rsrc(struct device *dev,
1073 struct class_interface *class_intf)
1075 struct pcmcia_socket *s = dev_get_drvdata(dev);
1077 if (s->resource_ops != &pccard_nonstatic_ops)
1079 return sysfs_create_group(&dev->kobj, &rsrc_attributes);
1082 static void __devexit pccard_sysfs_remove_rsrc(struct device *dev,
1083 struct class_interface *class_intf)
1085 struct pcmcia_socket *s = dev_get_drvdata(dev);
1087 if (s->resource_ops != &pccard_nonstatic_ops)
1089 sysfs_remove_group(&dev->kobj, &rsrc_attributes);
1092 static struct class_interface pccard_rsrc_interface __refdata = {
1093 .class = &pcmcia_socket_class,
1094 .add_dev = &pccard_sysfs_add_rsrc,
1095 .remove_dev = __devexit_p(&pccard_sysfs_remove_rsrc),
1098 static int __init nonstatic_sysfs_init(void)
1100 return class_interface_register(&pccard_rsrc_interface);
1103 static void __exit nonstatic_sysfs_exit(void)
1105 class_interface_unregister(&pccard_rsrc_interface);
1108 module_init(nonstatic_sysfs_init);
1109 module_exit(nonstatic_sysfs_exit);