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 mutex_lock(&s->ops_mutex);
278 s->cis_mem.res = res;
279 s->cis_virt = ioremap(res->start, s->map_size);
281 mutex_unlock(&s->ops_mutex);
282 /* as we're only called from pcmcia.c, we're safe */
283 if (s->callback->validate)
284 ret = s->callback->validate(s, count);
285 /* invalidate mapping */
286 mutex_lock(&s->ops_mutex);
287 iounmap(s->cis_virt);
290 s->cis_mem.res = NULL;
291 mutex_unlock(&s->ops_mutex);
292 if ((ret) || (*count == 0))
298 * checksum() - iomem validation function for simple memory cards
300 static int checksum(struct pcmcia_socket *s, struct resource *res,
304 int i, a = 0, b = -1, d;
307 mutex_lock(&s->ops_mutex);
309 virt = ioremap(res->start, s->map_size);
312 map.flags = MAP_ACTIVE;
316 s->ops->set_mem_map(s, &map);
318 /* Don't bother checking every word... */
319 for (i = 0; i < s->map_size; i += 44) {
326 s->ops->set_mem_map(s, &map);
331 mutex_unlock(&s->ops_mutex);
342 * do_validate_mem() - low level validate a memory region for PCMCIA use
343 * @s: PCMCIA socket to validate
344 * @base: start address of resource to check
345 * @size: size of resource to check
346 * @validate: validation function to use
348 * do_validate_mem() splits up the memory region which is to be checked
349 * into two parts. Both are passed to the @validate() function. If
350 * @validate() returns non-zero, or the value parameter to @validate()
351 * is zero, or the value parameter is different between both calls,
352 * the check fails, and -EINVAL is returned. Else, 0 is returned.
354 static int do_validate_mem(struct pcmcia_socket *s,
355 unsigned long base, unsigned long size,
356 int validate (struct pcmcia_socket *s,
357 struct resource *res,
358 unsigned int *value))
360 struct resource *res1, *res2;
361 unsigned int info1 = 1, info2 = 1;
364 res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
365 res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
371 ret = validate(s, res1, &info1);
372 ret += validate(s, res2, &info2);
379 dev_dbg(&s->dev, "cs: memory probe 0x%06lx-0x%06lx: %p %p %u %u %u",
380 base, base+size-1, res1, res2, ret, info1, info2);
382 if ((ret) || (info1 != info2) || (info1 == 0))
390 * do_mem_probe() - validate a memory region for PCMCIA use
391 * @s: PCMCIA socket to validate
392 * @base: start address of resource to check
393 * @num: size of resource to check
394 * @validate: validation function to use
395 * @fallback: validation function to use if validate fails
397 * do_mem_probe() checks a memory region for use by the PCMCIA subsystem.
398 * To do so, the area is split up into sensible parts, and then passed
399 * into the @validate() function. Only if @validate() and @fallback() fail,
400 * the area is marked as unavaibale for use by the PCMCIA subsystem. The
401 * function returns the size of the usable memory area.
403 static int do_mem_probe(struct pcmcia_socket *s, u_long base, u_long num,
404 int validate (struct pcmcia_socket *s,
405 struct resource *res,
406 unsigned int *value),
407 int fallback (struct pcmcia_socket *s,
408 struct resource *res,
409 unsigned int *value))
411 struct socket_data *s_data = s->resource_data;
412 u_long i, j, bad, fail, step;
414 dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
417 step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
418 /* don't allow too large steps */
421 /* cis_readable wants to map 2x map_size */
422 if (step < 2 * s->map_size)
423 step = 2 * s->map_size;
424 for (i = j = base; i < base+num; i = j + step) {
426 for (j = i; j < base+num; j += step) {
427 if (!do_validate_mem(s, j, step, validate))
430 fail = ((i == base) && (j == base+num));
432 if ((fail) && (fallback)) {
433 for (j = i; j < base+num; j += step)
434 if (!do_validate_mem(s, j, step, fallback))
439 printk(" excluding");
440 printk(" %#05lx-%#05lx", i, j-1);
441 sub_interval(&s_data->mem_db, i, j-i);
445 printk(bad ? "\n" : " clean.\n");
450 #ifdef CONFIG_PCMCIA_PROBE
453 * inv_probe() - top-to-bottom search for one usuable high memory area
454 * @s: PCMCIA socket to validate
455 * @m: resource_map to check
457 static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s)
459 struct socket_data *s_data = s->resource_data;
461 if (m == &s_data->mem_db)
463 ok = inv_probe(m->next, s);
465 if (m->base >= 0x100000)
466 sub_interval(&s_data->mem_db, m->base, m->num);
469 if (m->base < 0x100000)
471 return do_mem_probe(s, m->base, m->num, readable, checksum);
475 * validate_mem() - memory probe function
476 * @s: PCMCIA socket to validate
477 * @probe_mask: MEM_PROBE_LOW | MEM_PROBE_HIGH
479 * The memory probe. If the memory list includes a 64K-aligned block
480 * below 1MB, we probe in 64K chunks, and as soon as we accumulate at
481 * least mem_limit free space, we quit. Returns 0 on usuable ports.
483 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
485 struct resource_map *m, mm;
486 static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 };
487 unsigned long b, i, ok = 0;
488 struct socket_data *s_data = s->resource_data;
490 /* We do up to four passes through the list */
491 if (probe_mask & MEM_PROBE_HIGH) {
492 if (inv_probe(s_data->mem_db.next, s) > 0)
494 dev_printk(KERN_NOTICE, &s->dev,
495 "cs: warning: no high memory space available!\n");
499 for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
501 /* Only probe < 1 MB */
502 if (mm.base >= 0x100000)
504 if ((mm.base | mm.num) & 0xffff) {
505 ok += do_mem_probe(s, mm.base, mm.num, readable,
509 /* Special probe for 64K-aligned block */
510 for (i = 0; i < 4; i++) {
512 if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) {
514 sub_interval(&s_data->mem_db, b, 0x10000);
516 ok += do_mem_probe(s, b, 0x10000,
528 #else /* CONFIG_PCMCIA_PROBE */
531 * validate_mem() - memory probe function
532 * @s: PCMCIA socket to validate
533 * @probe_mask: ignored
535 * Returns 0 on usuable ports.
537 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
539 struct resource_map *m, mm;
540 struct socket_data *s_data = s->resource_data;
541 unsigned long ok = 0;
543 for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
545 ok += do_mem_probe(s, mm.base, mm.num, readable, checksum);
552 #endif /* CONFIG_PCMCIA_PROBE */
556 * pcmcia_nonstatic_validate_mem() - try to validate iomem for PCMCIA use
557 * @s: PCMCIA socket to validate
559 * This is tricky... when we set up CIS memory, we try to validate
560 * the memory window space allocations.
562 * Locking note: Must be called with skt_mutex held!
564 static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
566 struct socket_data *s_data = s->resource_data;
567 unsigned int probe_mask = MEM_PROBE_LOW;
573 mutex_lock(&rsrc_mutex);
575 if (s->features & SS_CAP_PAGE_REGS)
576 probe_mask = MEM_PROBE_HIGH;
578 if (probe_mask & ~s_data->rsrc_mem_probe) {
579 if (s->state & SOCKET_PRESENT) {
580 ret = validate_mem(s, probe_mask);
582 s_data->rsrc_mem_probe |= probe_mask;
586 mutex_unlock(&rsrc_mutex);
591 struct pcmcia_align_data {
593 unsigned long offset;
594 struct resource_map *map;
598 pcmcia_common_align(void *align_data, struct resource *res,
599 resource_size_t size, resource_size_t align)
601 struct pcmcia_align_data *data = align_data;
602 resource_size_t start;
604 * Ensure that we have the correct start address
606 start = (res->start & ~data->mask) + data->offset;
607 if (start < res->start)
608 start += data->mask + 1;
613 pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
614 resource_size_t align)
616 struct pcmcia_align_data *data = align_data;
617 struct resource_map *m;
619 pcmcia_common_align(data, res, size, align);
621 for (m = data->map->next; m != data->map; m = m->next) {
622 unsigned long start = m->base;
623 unsigned long end = m->base + m->num - 1;
626 * If the lower resources are not available, try aligning
627 * to this entry of the resource database to see if it'll
630 if (res->start < start) {
632 pcmcia_common_align(data, res, size, align);
636 * If we're above the area which was passed in, there's
637 * no point proceeding.
639 if (res->start >= res->end)
642 if ((res->start + size - 1) <= end)
647 * If we failed to find something suitable, ensure we fail.
650 res->start = res->end;
654 * Adjust an existing IO region allocation, but making sure that we don't
655 * encroach outside the resources which the user supplied.
657 static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_start,
658 unsigned long r_end, struct pcmcia_socket *s)
660 struct resource_map *m;
661 struct socket_data *s_data = s->resource_data;
664 mutex_lock(&rsrc_mutex);
665 for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) {
666 unsigned long start = m->base;
667 unsigned long end = m->base + m->num - 1;
669 if (start > r_start || r_end > end)
672 ret = adjust_resource(res, r_start, r_end - r_start + 1);
675 mutex_unlock(&rsrc_mutex);
680 /*======================================================================
682 These find ranges of I/O ports or memory addresses that are not
683 currently allocated by other devices.
685 The 'align' field should reflect the number of bits of address
686 that need to be preserved from the initial value of *base. It
687 should be a power of two, greater than or equal to 'num'. A value
688 of 0 means that all bits of *base are significant. *base should
689 also be strictly less than 'align'.
691 ======================================================================*/
693 static struct resource *nonstatic_find_io_region(unsigned long base, int num,
694 unsigned long align, struct pcmcia_socket *s)
696 struct resource *res = make_resource(0, num, IORESOURCE_IO, dev_name(&s->dev));
697 struct socket_data *s_data = s->resource_data;
698 struct pcmcia_align_data data;
699 unsigned long min = base;
705 data.mask = align - 1;
706 data.offset = base & data.mask;
707 data.map = &s_data->io_db;
709 mutex_lock(&rsrc_mutex);
712 ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
713 min, 0, pcmcia_align, &data);
716 ret = allocate_resource(&ioport_resource, res, num, min, ~0UL,
717 1, pcmcia_align, &data);
718 mutex_unlock(&rsrc_mutex);
727 static struct resource *nonstatic_find_mem_region(u_long base, u_long num,
728 u_long align, int low, struct pcmcia_socket *s)
730 struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
731 struct socket_data *s_data = s->resource_data;
732 struct pcmcia_align_data data;
733 unsigned long min, max;
736 low = low || !(s->features & SS_CAP_PAGE_REGS);
738 data.mask = align - 1;
739 data.offset = base & data.mask;
740 data.map = &s_data->mem_db;
742 for (i = 0; i < 2; i++) {
745 min = base < max ? base : 0;
748 min = 0x100000UL + base;
751 mutex_lock(&rsrc_mutex);
754 ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
756 pcmcia_align, &data);
759 ret = allocate_resource(&iomem_resource, res, num, min,
760 max, 1, pcmcia_align, &data);
761 mutex_unlock(&rsrc_mutex);
775 static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
777 struct socket_data *data = s->resource_data;
778 unsigned long size = end - start + 1;
784 mutex_lock(&rsrc_mutex);
786 case ADD_MANAGED_RESOURCE:
787 ret = add_interval(&data->mem_db, start, size);
789 do_mem_probe(s, start, size, NULL, NULL);
791 case REMOVE_MANAGED_RESOURCE:
792 ret = sub_interval(&data->mem_db, start, size);
797 mutex_unlock(&rsrc_mutex);
803 static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
805 struct socket_data *data = s->resource_data;
806 unsigned long size = end - start + 1;
812 if (end > IO_SPACE_LIMIT)
815 mutex_lock(&rsrc_mutex);
817 case ADD_MANAGED_RESOURCE:
818 if (add_interval(&data->io_db, start, size) != 0) {
822 #ifdef CONFIG_PCMCIA_PROBE
824 do_io_probe(s, start, size);
827 case REMOVE_MANAGED_RESOURCE:
828 sub_interval(&data->io_db, start, size);
834 mutex_unlock(&rsrc_mutex);
841 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
843 struct resource *res;
846 if (!s->cb_dev || !s->cb_dev->bus)
849 #if defined(CONFIG_X86)
850 /* If this is the root bus, the risk of hitting
851 * some strange system devices which aren't protected
852 * by either ACPI resource tables or properly requested
853 * resources is too big. Therefore, don't do auto-adding
854 * of resources at the moment.
856 if (s->cb_dev->bus->number == 0)
860 for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
861 res = s->cb_dev->bus->resource[i];
865 if (res->flags & IORESOURCE_IO) {
866 if (res == &ioport_resource)
868 dev_printk(KERN_INFO, &s->cb_dev->dev,
869 "pcmcia: parent PCI bridge I/O "
870 "window: 0x%llx - 0x%llx\n",
871 (unsigned long long)res->start,
872 (unsigned long long)res->end);
873 if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
874 done |= IORESOURCE_IO;
878 if (res->flags & IORESOURCE_MEM) {
879 if (res == &iomem_resource)
881 dev_printk(KERN_INFO, &s->cb_dev->dev,
882 "pcmcia: parent PCI bridge Memory "
883 "window: 0x%llx - 0x%llx\n",
884 (unsigned long long)res->start,
885 (unsigned long long)res->end);
886 if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
887 done |= IORESOURCE_MEM;
891 /* if we got at least one of IO, and one of MEM, we can be glad and
892 * activate the PCMCIA subsystem */
893 if (done == (IORESOURCE_MEM | IORESOURCE_IO))
894 s->resource_setup_done = 1;
901 static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
909 static int nonstatic_init(struct pcmcia_socket *s)
911 struct socket_data *data;
913 data = kzalloc(sizeof(struct socket_data), GFP_KERNEL);
917 data->mem_db.next = &data->mem_db;
918 data->io_db.next = &data->io_db;
920 s->resource_data = (void *) data;
922 nonstatic_autoadd_resources(s);
927 static void nonstatic_release_resource_db(struct pcmcia_socket *s)
929 struct socket_data *data = s->resource_data;
930 struct resource_map *p, *q;
932 mutex_lock(&rsrc_mutex);
933 for (p = data->mem_db.next; p != &data->mem_db; p = q) {
937 for (p = data->io_db.next; p != &data->io_db; p = q) {
941 mutex_unlock(&rsrc_mutex);
945 struct pccard_resource_ops pccard_nonstatic_ops = {
946 .validate_mem = pcmcia_nonstatic_validate_mem,
947 .adjust_io_region = nonstatic_adjust_io_region,
948 .find_io = nonstatic_find_io_region,
949 .find_mem = nonstatic_find_mem_region,
951 .add_mem = adjust_memory,
952 .init = nonstatic_init,
953 .exit = nonstatic_release_resource_db,
955 EXPORT_SYMBOL(pccard_nonstatic_ops);
958 /* sysfs interface to the resource database */
960 static ssize_t show_io_db(struct device *dev,
961 struct device_attribute *attr, char *buf)
963 struct pcmcia_socket *s = dev_get_drvdata(dev);
964 struct socket_data *data;
965 struct resource_map *p;
968 mutex_lock(&rsrc_mutex);
969 data = s->resource_data;
971 for (p = data->io_db.next; p != &data->io_db; p = p->next) {
972 if (ret > (PAGE_SIZE - 10))
974 ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
975 "0x%08lx - 0x%08lx\n",
976 ((unsigned long) p->base),
977 ((unsigned long) p->base + p->num - 1));
980 mutex_unlock(&rsrc_mutex);
984 static ssize_t store_io_db(struct device *dev,
985 struct device_attribute *attr,
986 const char *buf, size_t count)
988 struct pcmcia_socket *s = dev_get_drvdata(dev);
989 unsigned long start_addr, end_addr;
990 unsigned int add = ADD_MANAGED_RESOURCE;
993 ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
995 ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
996 add = REMOVE_MANAGED_RESOURCE;
998 ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
1000 add = ADD_MANAGED_RESOURCE;
1005 if (end_addr < start_addr)
1008 ret = adjust_io(s, add, start_addr, end_addr);
1010 s->resource_setup_new = 1;
1012 return ret ? ret : count;
1014 static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
1016 static ssize_t show_mem_db(struct device *dev,
1017 struct device_attribute *attr, char *buf)
1019 struct pcmcia_socket *s = dev_get_drvdata(dev);
1020 struct socket_data *data;
1021 struct resource_map *p;
1024 mutex_lock(&rsrc_mutex);
1025 data = s->resource_data;
1027 for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
1028 if (ret > (PAGE_SIZE - 10))
1030 ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
1031 "0x%08lx - 0x%08lx\n",
1032 ((unsigned long) p->base),
1033 ((unsigned long) p->base + p->num - 1));
1036 mutex_unlock(&rsrc_mutex);
1040 static ssize_t store_mem_db(struct device *dev,
1041 struct device_attribute *attr,
1042 const char *buf, size_t count)
1044 struct pcmcia_socket *s = dev_get_drvdata(dev);
1045 unsigned long start_addr, end_addr;
1046 unsigned int add = ADD_MANAGED_RESOURCE;
1049 ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
1051 ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
1052 add = REMOVE_MANAGED_RESOURCE;
1054 ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
1056 add = ADD_MANAGED_RESOURCE;
1061 if (end_addr < start_addr)
1064 ret = adjust_memory(s, add, start_addr, end_addr);
1066 s->resource_setup_new = 1;
1068 return ret ? ret : count;
1070 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
1072 static struct attribute *pccard_rsrc_attributes[] = {
1073 &dev_attr_available_resources_io.attr,
1074 &dev_attr_available_resources_mem.attr,
1078 static const struct attribute_group rsrc_attributes = {
1079 .attrs = pccard_rsrc_attributes,
1082 static int __devinit pccard_sysfs_add_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 return sysfs_create_group(&dev->kobj, &rsrc_attributes);
1092 static void __devexit pccard_sysfs_remove_rsrc(struct device *dev,
1093 struct class_interface *class_intf)
1095 struct pcmcia_socket *s = dev_get_drvdata(dev);
1097 if (s->resource_ops != &pccard_nonstatic_ops)
1099 sysfs_remove_group(&dev->kobj, &rsrc_attributes);
1102 static struct class_interface pccard_rsrc_interface __refdata = {
1103 .class = &pcmcia_socket_class,
1104 .add_dev = &pccard_sysfs_add_rsrc,
1105 .remove_dev = __devexit_p(&pccard_sysfs_remove_rsrc),
1108 static int __init nonstatic_sysfs_init(void)
1110 return class_interface_register(&pccard_rsrc_interface);
1113 static void __exit nonstatic_sysfs_exit(void)
1115 class_interface_unregister(&pccard_rsrc_interface);
1118 module_init(nonstatic_sysfs_init);
1119 module_exit(nonstatic_sysfs_exit);