PNP: Simplify setting of resources
[linux-2.6-block.git] / drivers / pnp / interface.c
index cfaf5b73540bbc6b958ad7e5f15ea4822ab7c8d6..0c201317284b40e93014d0a574b3ef0ab9d81b9b 100644 (file)
@@ -298,6 +298,39 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,
        return ret;
 }
 
+static char *pnp_get_resource_value(char *buf,
+                                   unsigned long type,
+                                   resource_size_t *start,
+                                   resource_size_t *end,
+                                   unsigned long *flags)
+{
+       if (start)
+               *start = 0;
+       if (end)
+               *end = 0;
+       if (flags)
+               *flags = 0;
+
+       /* TBD: allow for disabled resources */
+
+       buf = skip_spaces(buf);
+       if (start) {
+               *start = simple_strtoull(buf, &buf, 0);
+               if (end) {
+                       buf = skip_spaces(buf);
+                       if (*buf == '-') {
+                               buf = skip_spaces(buf + 1);
+                               *end = simple_strtoull(buf, &buf, 0);
+                       } else
+                               *end = *start;
+               }
+       }
+
+       /* TBD: allow for additional flags, e.g., IORESOURCE_WINDOW */
+
+       return buf;
+}
+
 static ssize_t pnp_set_current_resources(struct device *dmdev,
                                         struct device_attribute *attr,
                                         const char *ubuf, size_t count)
@@ -305,7 +338,6 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
        struct pnp_dev *dev = to_pnp_dev(dmdev);
        char *buf = (void *)ubuf;
        int retval = 0;
-       resource_size_t start, end;
 
        if (dev->status & PNP_ATTACHED) {
                retval = -EBUSY;
@@ -349,6 +381,10 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
                goto done;
        }
        if (!strnicmp(buf, "set", 3)) {
+               resource_size_t start;
+               resource_size_t end;
+               unsigned long flags;
+
                if (dev->active)
                        goto done;
                buf += 3;
@@ -357,42 +393,37 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
                while (1) {
                        buf = skip_spaces(buf);
                        if (!strnicmp(buf, "io", 2)) {
-                               buf = skip_spaces(buf + 2);
-                               start = simple_strtoul(buf, &buf, 0);
-                               buf = skip_spaces(buf);
-                               if (*buf == '-') {
-                                       buf = skip_spaces(buf + 1);
-                                       end = simple_strtoul(buf, &buf, 0);
-                               } else
-                                       end = start;
-                               pnp_add_io_resource(dev, start, end, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "mem", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               buf = skip_spaces(buf);
-                               if (*buf == '-') {
-                                       buf = skip_spaces(buf + 1);
-                                       end = simple_strtoul(buf, &buf, 0);
-                               } else
-                                       end = start;
-                               pnp_add_mem_resource(dev, start, end, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "irq", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               pnp_add_irq_resource(dev, start, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "dma", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               pnp_add_dma_resource(dev, start, 0);
-                               continue;
-                       }
-                       break;
+                               buf = pnp_get_resource_value(buf + 2,
+                                                            IORESOURCE_IO,
+                                                            &start, &end,
+                                                            &flags);
+                               pnp_add_io_resource(dev, start, end, flags);
+                       } else if (!strnicmp(buf, "mem", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_MEM,
+                                                            &start, &end,
+                                                            &flags);
+                               pnp_add_mem_resource(dev, start, end, flags);
+                       } else if (!strnicmp(buf, "irq", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_IRQ,
+                                                            &start, NULL,
+                                                            &flags);
+                               pnp_add_irq_resource(dev, start, flags);
+                       } else if (!strnicmp(buf, "dma", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_DMA,
+                                                            &start, NULL,
+                                                            &flags);
+                               pnp_add_dma_resource(dev, start, flags);
+                       } else if (!strnicmp(buf, "bus", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_BUS,
+                                                            &start, &end,
+                                                            NULL);
+                               pnp_add_bus_resource(dev, start, end);
+                       } else
+                               break;
                }
                mutex_unlock(&pnp_res_mutex);
                goto done;