svcrpc: treat uid's as unsigned
[safe/jmp/linux-2.6] / drivers / pcmcia / rsrc_nonstatic.c
index 0fcf763..9b0dc43 100644 (file)
 #include <linux/timer.h>
 #include <linux/pci.h>
 #include <linux/device.h>
+#include <linux/io.h>
 
 #include <asm/irq.h>
-#include <asm/io.h>
 
 #include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
-#include <pcmcia/bulkmem.h>
 #include <pcmcia/cistpl.h>
 #include "cs_internal.h"
 
@@ -72,7 +71,7 @@ static DEFINE_MUTEX(rsrc_mutex);
 ======================================================================*/
 
 static struct resource *
-make_resource(resource_size_t b, resource_size_t n, int flags, char *name)
+make_resource(resource_size_t b, resource_size_t n, int flags, const char *name)
 {
        struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
 
@@ -123,59 +122,66 @@ static void free_region(struct resource *res)
 
 static int add_interval(struct resource_map *map, u_long base, u_long num)
 {
-    struct resource_map *p, *q;
-
-    for (p = map; ; p = p->next) {
-       if ((p != map) && (p->base+p->num-1 >= base))
-           return -1;
-       if ((p->next == map) || (p->next->base > base+num-1))
-           break;
-    }
-    q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
-    if (!q) return CS_OUT_OF_RESOURCE;
-    q->base = base; q->num = num;
-    q->next = p->next; p->next = q;
-    return CS_SUCCESS;
+       struct resource_map *p, *q;
+
+       for (p = map; ; p = p->next) {
+               if ((p != map) && (p->base+p->num-1 >= base))
+                       return -1;
+               if ((p->next == map) || (p->next->base > base+num-1))
+                       break;
+       }
+       q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
+       if (!q) {
+               printk(KERN_WARNING "out of memory to update resources\n");
+               return -ENOMEM;
+       }
+       q->base = base; q->num = num;
+       q->next = p->next; p->next = q;
+       return 0;
 }
 
 /*====================================================================*/
 
 static int sub_interval(struct resource_map *map, u_long base, u_long num)
 {
-    struct resource_map *p, *q;
-
-    for (p = map; ; p = q) {
-       q = p->next;
-       if (q == map)
-           break;
-       if ((q->base+q->num > base) && (base+num > q->base)) {
-           if (q->base >= base) {
-               if (q->base+q->num <= base+num) {
-                   /* Delete whole block */
-                   p->next = q->next;
-                   kfree(q);
-                   /* don't advance the pointer yet */
-                   q = p;
-               } else {
-                   /* Cut off bit from the front */
-                   q->num = q->base + q->num - base - num;
-                   q->base = base + num;
+       struct resource_map *p, *q;
+
+       for (p = map; ; p = q) {
+               q = p->next;
+               if (q == map)
+                       break;
+               if ((q->base+q->num > base) && (base+num > q->base)) {
+                       if (q->base >= base) {
+                               if (q->base+q->num <= base+num) {
+                                       /* Delete whole block */
+                                       p->next = q->next;
+                                       kfree(q);
+                                       /* don't advance the pointer yet */
+                                       q = p;
+                               } else {
+                                       /* Cut off bit from the front */
+                                       q->num = q->base + q->num - base - num;
+                                       q->base = base + num;
+                               }
+                       } else if (q->base+q->num <= base+num) {
+                               /* Cut off bit from the end */
+                               q->num = base - q->base;
+                       } else {
+                               /* Split the block into two pieces */
+                               p = kmalloc(sizeof(struct resource_map),
+                                       GFP_KERNEL);
+                               if (!p) {
+                                       printk(KERN_WARNING "out of memory to update resources\n");
+                                       return -ENOMEM;
+                               }
+                               p->base = base+num;
+                               p->num = q->base+q->num - p->base;
+                               q->num = base - q->base;
+                               p->next = q->next ; q->next = p;
+                       }
                }
-           } else if (q->base+q->num <= base+num) {
-               /* Cut off bit from the end */
-               q->num = base - q->base;
-           } else {
-               /* Split the block into two pieces */
-               p = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
-               if (!p) return CS_OUT_OF_RESOURCE;
-               p->base = base+num;
-               p->num = q->base+q->num - p->base;
-               q->num = base - q->base;
-               p->next = q->next ; q->next = p;
-           }
        }
-    }
-    return CS_SUCCESS;
+       return 0;
 }
 
 /*======================================================================
@@ -189,67 +195,72 @@ static int sub_interval(struct resource_map *map, u_long base, u_long num)
 static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
                        unsigned int num)
 {
-    struct resource *res;
-    struct socket_data *s_data = s->resource_data;
-    unsigned int i, j, bad;
-    int any;
-    u_char *b, hole, most;
-
-    printk(KERN_INFO "cs: IO port probe %#x-%#x:",
-          base, base+num-1);
-
-    /* First, what does a floating port look like? */
-    b = kzalloc(256, GFP_KERNEL);
-    if (!b) {
-            printk(KERN_ERR "do_io_probe: unable to kmalloc 256 bytes");
-            return;
-    }
-    for (i = base, most = 0; i < base+num; i += 8) {
-       res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
-       if (!res)
-           continue;
-       hole = inb(i);
-       for (j = 1; j < 8; j++)
-           if (inb(i+j) != hole) break;
-       free_region(res);
-       if ((j == 8) && (++b[hole] > b[most]))
-           most = hole;
-       if (b[most] == 127) break;
-    }
-    kfree(b);
-
-    bad = any = 0;
-    for (i = base; i < base+num; i += 8) {
-       res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
-       if (!res)
-           continue;
-       for (j = 0; j < 8; j++)
-           if (inb(i+j) != most) break;
-       free_region(res);
-       if (j < 8) {
-           if (!any)
-               printk(" excluding");
-           if (!bad)
-               bad = any = i;
-       } else {
-           if (bad) {
-               sub_interval(&s_data->io_db, bad, i-bad);
-               printk(" %#x-%#x", bad, i-1);
-               bad = 0;
-           }
+       struct resource *res;
+       struct socket_data *s_data = s->resource_data;
+       unsigned int i, j, bad;
+       int any;
+       u_char *b, hole, most;
+
+       dev_printk(KERN_INFO, &s->dev, "cs: IO port probe %#x-%#x:",
+               base, base+num-1);
+
+       /* First, what does a floating port look like? */
+       b = kzalloc(256, GFP_KERNEL);
+       if (!b) {
+               printk("\n");
+               dev_printk(KERN_ERR, &s->dev,
+                       "do_io_probe: unable to kmalloc 256 bytes");
+               return;
        }
-    }
-    if (bad) {
-       if ((num > 16) && (bad == base) && (i == base+num)) {
-           printk(" nothing: probe failed.\n");
-           return;
-       } else {
-           sub_interval(&s_data->io_db, bad, i-bad);
-           printk(" %#x-%#x", bad, i-1);
+       for (i = base, most = 0; i < base+num; i += 8) {
+               res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
+               if (!res)
+                       continue;
+               hole = inb(i);
+               for (j = 1; j < 8; j++)
+                       if (inb(i+j) != hole)
+                               break;
+               free_region(res);
+               if ((j == 8) && (++b[hole] > b[most]))
+                       most = hole;
+               if (b[most] == 127)
+                       break;
        }
-    }
+       kfree(b);
 
-    printk(any ? "\n" : " clean.\n");
+       bad = any = 0;
+       for (i = base; i < base+num; i += 8) {
+               res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
+               if (!res)
+                       continue;
+               for (j = 0; j < 8; j++)
+                       if (inb(i+j) != most)
+                               break;
+               free_region(res);
+               if (j < 8) {
+                       if (!any)
+                               printk(" excluding");
+                       if (!bad)
+                               bad = any = i;
+               } else {
+                       if (bad) {
+                               sub_interval(&s_data->io_db, bad, i-bad);
+                               printk(" %#x-%#x", bad, i-1);
+                               bad = 0;
+                       }
+               }
+       }
+       if (bad) {
+               if ((num > 16) && (bad == base) && (i == base+num)) {
+                       printk(" nothing: probe failed.\n");
+                       return;
+               } else {
+                       sub_interval(&s_data->io_db, bad, i-bad);
+                       printk(" %#x-%#x", bad, i-1);
+               }
+       }
+
+       printk(any ? "\n" : " clean.\n");
 }
 #endif
 
@@ -261,21 +272,22 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
 ======================================================================*/
 
 /* Validation function for cards with a valid CIS */
-static int readable(struct pcmcia_socket *s, struct resource *res, cisinfo_t *info)
+static int readable(struct pcmcia_socket *s, struct resource *res,
+                   unsigned int *count)
 {
        int ret = -1;
 
        s->cis_mem.res = res;
        s->cis_virt = ioremap(res->start, s->map_size);
        if (s->cis_virt) {
-               ret = pccard_validate_cis(s, BIND_FN_ALL, info);
+               ret = pccard_validate_cis(s, count);
                /* invalidate mapping and CIS cache */
                iounmap(s->cis_virt);
                s->cis_virt = NULL;
                destroy_cis_cache(s);
        }
        s->cis_mem.res = NULL;
-       if ((ret != 0) || (info->Chains == 0))
+       if ((ret != 0) || (*count == 0))
                return 0;
        return 1;
 }
@@ -316,11 +328,12 @@ static int
 cis_readable(struct pcmcia_socket *s, unsigned long base, unsigned long size)
 {
        struct resource *res1, *res2;
-       cisinfo_t info1, info2;
+       unsigned int info1, info2;
        int ret = 0;
 
-       res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
-       res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
+       res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
+       res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
+                       "PCMCIA memprobe");
 
        if (res1 && res2) {
                ret = readable(s, res1, &info1);
@@ -330,7 +343,7 @@ cis_readable(struct pcmcia_socket *s, unsigned long base, unsigned long size)
        free_region(res2);
        free_region(res1);
 
-       return (ret == 2) && (info1.Chains == info2.Chains);
+       return (ret == 2) && (info1 == info2);
 }
 
 static int
@@ -339,8 +352,9 @@ checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
        struct resource *res1, *res2;
        int a = -1, b = -1;
 
-       res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
-       res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
+       res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
+       res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
+                       "PCMCIA memprobe");
 
        if (res1 && res2) {
                a = checksum(s, res1);
@@ -363,42 +377,43 @@ checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
 
 static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s)
 {
-    struct socket_data *s_data = s->resource_data;
-    u_long i, j, bad, fail, step;
-
-    printk(KERN_INFO "cs: memory probe 0x%06lx-0x%06lx:",
-          base, base+num-1);
-    bad = fail = 0;
-    step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
-    /* don't allow too large steps */
-    if (step > 0x800000)
-       step = 0x800000;
-    /* cis_readable wants to map 2x map_size */
-    if (step < 2 * s->map_size)
-       step = 2 * s->map_size;
-    for (i = j = base; i < base+num; i = j + step) {
-       if (!fail) {
-           for (j = i; j < base+num; j += step) {
-               if (cis_readable(s, j, step))
-                   break;
-           }
-           fail = ((i == base) && (j == base+num));
-       }
-       if (fail) {
-           for (j = i; j < base+num; j += 2*step)
-               if (checksum_match(s, j, step) &&
-                   checksum_match(s, j + step, step))
-                   break;
-       }
-       if (i != j) {
-           if (!bad) printk(" excluding");
-           printk(" %#05lx-%#05lx", i, j-1);
-           sub_interval(&s_data->mem_db, i, j-i);
-           bad += j-i;
+       struct socket_data *s_data = s->resource_data;
+       u_long i, j, bad, fail, step;
+
+       dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
+               base, base+num-1);
+       bad = fail = 0;
+       step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
+       /* don't allow too large steps */
+       if (step > 0x800000)
+               step = 0x800000;
+       /* cis_readable wants to map 2x map_size */
+       if (step < 2 * s->map_size)
+               step = 2 * s->map_size;
+       for (i = j = base; i < base+num; i = j + step) {
+               if (!fail) {
+                       for (j = i; j < base+num; j += step) {
+                               if (cis_readable(s, j, step))
+                                       break;
+                       }
+                       fail = ((i == base) && (j == base+num));
+               }
+               if (fail) {
+                       for (j = i; j < base+num; j += 2*step)
+                               if (checksum_match(s, j, step) &&
+                                       checksum_match(s, j + step, step))
+                                       break;
+               }
+               if (i != j) {
+                       if (!bad)
+                               printk(" excluding");
+                       printk(" %#05lx-%#05lx", i, j-1);
+                       sub_interval(&s_data->mem_db, i, j-i);
+                       bad += j-i;
+               }
        }
-    }
-    printk(bad ? "\n" : " clean.\n");
-    return (num - bad);
+       printk(bad ? "\n" : " clean.\n");
+       return num - bad;
 }
 
 #ifdef CONFIG_PCMCIA_PROBE
@@ -431,8 +446,8 @@ static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
        if (probe_mask & MEM_PROBE_HIGH) {
                if (inv_probe(s_data->mem_db.next, s) > 0)
                        return 0;
-               printk(KERN_NOTICE "cs: warning: no high memory space "
-                      "available!\n");
+               dev_printk(KERN_NOTICE, &s->dev,
+                          "cs: warning: no high memory space available!\n");
                return -ENODEV;
        }
 
@@ -617,7 +632,7 @@ static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_star
 static struct resource *nonstatic_find_io_region(unsigned long base, int num,
                   unsigned long align, struct pcmcia_socket *s)
 {
-       struct resource *res = make_resource(0, num, IORESOURCE_IO, s->dev.bus_id);
+       struct resource *res = make_resource(0, num, IORESOURCE_IO, dev_name(&s->dev));
        struct socket_data *s_data = s->resource_data;
        struct pcmcia_align_data data;
        unsigned long min = base;
@@ -648,10 +663,10 @@ static struct resource *nonstatic_find_io_region(unsigned long base, int num,
        return res;
 }
 
-static struct resource * nonstatic_find_mem_region(u_long base, u_long num,
+static struct resource *nonstatic_find_mem_region(u_long base, u_long num,
                u_long align, int low, struct pcmcia_socket *s)
 {
-       struct resource *res = make_resource(0, num, IORESOURCE_MEM, s->dev.bus_id);
+       struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
        struct socket_data *s_data = s->resource_data;
        struct pcmcia_align_data data;
        unsigned long min, max;
@@ -766,21 +781,6 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
 }
 
 
-static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj)
-{
-       unsigned long end;
-
-       switch (adj->Resource) {
-       case RES_MEMORY_RANGE:
-               end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
-               return adjust_memory(s, adj->Action, adj->resource.memory.Base, end);
-       case RES_IO_RANGE:
-               end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
-               return adjust_io(s, adj->Action, adj->resource.io.BasePort, end);
-       }
-       return CS_UNSUPPORTED_FUNCTION;
-}
-
 #ifdef CONFIG_PCI
 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
 {
@@ -801,7 +801,7 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
                return -EINVAL;
 #endif
 
-       for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) {
+       for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
                res = s->cb_dev->bus->resource[i];
                if (!res)
                        continue;
@@ -809,10 +809,11 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
                if (res->flags & IORESOURCE_IO) {
                        if (res == &ioport_resource)
                                continue;
-                       printk(KERN_INFO "pcmcia: parent PCI bridge I/O "
-                               "window: 0x%llx - 0x%llx\n",
-                               (unsigned long long)res->start,
-                               (unsigned long long)res->end);
+                       dev_printk(KERN_INFO, &s->cb_dev->dev,
+                                  "pcmcia: parent PCI bridge I/O "
+                                  "window: 0x%llx - 0x%llx\n",
+                                  (unsigned long long)res->start,
+                                  (unsigned long long)res->end);
                        if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
                                done |= IORESOURCE_IO;
 
@@ -821,10 +822,11 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
                if (res->flags & IORESOURCE_MEM) {
                        if (res == &iomem_resource)
                                continue;
-                       printk(KERN_INFO "pcmcia: parent PCI bridge Memory "
-                               "window: 0x%llx - 0x%llx\n",
-                               (unsigned long long)res->start,
-                               (unsigned long long)res->end);
+                       dev_printk(KERN_INFO, &s->cb_dev->dev,
+                                  "pcmcia: parent PCI bridge Memory "
+                                  "window: 0x%llx - 0x%llx\n",
+                                  (unsigned long long)res->start,
+                                  (unsigned long long)res->end);
                        if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
                                done |= IORESOURCE_MEM;
                }
@@ -889,7 +891,8 @@ struct pccard_resource_ops pccard_nonstatic_ops = {
        .adjust_io_region = nonstatic_adjust_io_region,
        .find_io = nonstatic_find_io_region,
        .find_mem = nonstatic_find_mem_region,
-       .adjust_resource = nonstatic_adjust_resource_info,
+       .add_io = adjust_io,
+       .add_mem = adjust_memory,
        .init = nonstatic_init,
        .exit = nonstatic_release_resource_db,
 };
@@ -912,14 +915,14 @@ static ssize_t show_io_db(struct device *dev,
        for (p = data->io_db.next; p != &data->io_db; p = p->next) {
                if (ret > (PAGE_SIZE - 10))
                        continue;
-               ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
-                                "0x%08lx - 0x%08lx\n",
-                                ((unsigned long) p->base),
-                                ((unsigned long) p->base + p->num - 1));
+               ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
+                               "0x%08lx - 0x%08lx\n",
+                               ((unsigned long) p->base),
+                               ((unsigned long) p->base + p->num - 1));
        }
 
        mutex_unlock(&rsrc_mutex);
-       return (ret);
+       return ret;
 }
 
 static ssize_t store_io_db(struct device *dev,
@@ -931,12 +934,13 @@ static ssize_t store_io_db(struct device *dev,
        unsigned int add = ADD_MANAGED_RESOURCE;
        ssize_t ret = 0;
 
-       ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
+       ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
        if (ret != 2) {
-               ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
+               ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
                add = REMOVE_MANAGED_RESOURCE;
                if (ret != 2) {
-                       ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
+                       ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
+                               &end_addr);
                        add = ADD_MANAGED_RESOURCE;
                        if (ret != 2)
                                return -EINVAL;
@@ -967,14 +971,14 @@ static ssize_t show_mem_db(struct device *dev,
        for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
                if (ret > (PAGE_SIZE - 10))
                        continue;
-               ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
-                                "0x%08lx - 0x%08lx\n",
-                                ((unsigned long) p->base),
-                                ((unsigned long) p->base + p->num - 1));
+               ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
+                               "0x%08lx - 0x%08lx\n",
+                               ((unsigned long) p->base),
+                               ((unsigned long) p->base + p->num - 1));
        }
 
        mutex_unlock(&rsrc_mutex);
-       return (ret);
+       return ret;
 }
 
 static ssize_t store_mem_db(struct device *dev,
@@ -986,12 +990,13 @@ static ssize_t store_mem_db(struct device *dev,
        unsigned int add = ADD_MANAGED_RESOURCE;
        ssize_t ret = 0;
 
-       ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
+       ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
        if (ret != 2) {
-               ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
+               ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
                add = REMOVE_MANAGED_RESOURCE;
                if (ret != 2) {
-                       ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
+                       ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
+                               &end_addr);
                        add = ADD_MANAGED_RESOURCE;
                        if (ret != 2)
                                return -EINVAL;
@@ -1008,41 +1013,34 @@ static ssize_t store_mem_db(struct device *dev,
 }
 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
 
-static struct device_attribute *pccard_rsrc_attributes[] = {
-       &dev_attr_available_resources_io,
-       &dev_attr_available_resources_mem,
+static struct attribute *pccard_rsrc_attributes[] = {
+       &dev_attr_available_resources_io.attr,
+       &dev_attr_available_resources_mem.attr,
        NULL,
 };
 
+static const struct attribute_group rsrc_attributes = {
+       .attrs = pccard_rsrc_attributes,
+};
+
 static int __devinit pccard_sysfs_add_rsrc(struct device *dev,
                                           struct class_interface *class_intf)
 {
        struct pcmcia_socket *s = dev_get_drvdata(dev);
-       struct device_attribute **attr;
-       int ret = 0;
+
        if (s->resource_ops != &pccard_nonstatic_ops)
                return 0;
-
-       for (attr = pccard_rsrc_attributes; *attr; attr++) {
-               ret = device_create_file(dev, *attr);
-               if (ret)
-                       break;
-       }
-
-       return ret;
+       return sysfs_create_group(&dev->kobj, &rsrc_attributes);
 }
 
 static void __devexit pccard_sysfs_remove_rsrc(struct device *dev,
                                               struct class_interface *class_intf)
 {
        struct pcmcia_socket *s = dev_get_drvdata(dev);
-       struct device_attribute **attr;
 
        if (s->resource_ops != &pccard_nonstatic_ops)
                return;
-
-       for (attr = pccard_rsrc_attributes; *attr; attr++)
-               device_remove_file(dev, *attr);
+       sysfs_remove_group(&dev->kobj, &rsrc_attributes);
 }
 
 static struct class_interface pccard_rsrc_interface __refdata = {