]> err.no Git - linux-2.6/blobdiff - drivers/pnp/interface.c
PNP: check for conflicts with all resources, not just earlier ones
[linux-2.6] / drivers / pnp / interface.c
index 982658477a58b4695df2ac979b00090cba9b1101..1801df3db1e83f16c8d73fd32ce711dd5bf86fac 100644 (file)
@@ -323,6 +323,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                          const char *ubuf, size_t count)
 {
        struct pnp_dev *dev = to_pnp_dev(dmdev);
+       struct resource *res;
        char *buf = (void *)ubuf;
        int retval = 0;
 
@@ -351,20 +352,20 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
        if (!strnicmp(buf, "auto", 4)) {
                if (dev->active)
                        goto done;
-               pnp_init_resource_table(&dev->res);
+               pnp_init_resources(dev);
                retval = pnp_auto_config_dev(dev);
                goto done;
        }
        if (!strnicmp(buf, "clear", 5)) {
                if (dev->active)
                        goto done;
-               pnp_init_resource_table(&dev->res);
+               pnp_init_resources(dev);
                goto done;
        }
        if (!strnicmp(buf, "get", 3)) {
                mutex_lock(&pnp_res_mutex);
                if (pnp_can_read(dev))
-                       dev->protocol->get(dev, &dev->res);
+                       dev->protocol->get(dev);
                mutex_unlock(&pnp_res_mutex);
                goto done;
        }
@@ -373,7 +374,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                if (dev->active)
                        goto done;
                buf += 3;
-               pnp_init_resource_table(&dev->res);
+               pnp_init_resources(dev);
                mutex_lock(&pnp_res_mutex);
                while (1) {
                        while (isspace(*buf))
@@ -382,21 +383,18 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                                buf += 2;
                                while (isspace(*buf))
                                        ++buf;
-                               dev->res.port_resource[nport].start =
-                                   simple_strtoul(buf, &buf, 0);
+                               res = &dev->res.port_resource[nport];
+                               res->start = simple_strtoul(buf, &buf, 0);
                                while (isspace(*buf))
                                        ++buf;
                                if (*buf == '-') {
                                        buf += 1;
                                        while (isspace(*buf))
                                                ++buf;
-                                       dev->res.port_resource[nport].end =
-                                           simple_strtoul(buf, &buf, 0);
+                                       res->end = simple_strtoul(buf, &buf, 0);
                                } else
-                                       dev->res.port_resource[nport].end =
-                                           dev->res.port_resource[nport].start;
-                               dev->res.port_resource[nport].flags =
-                                   IORESOURCE_IO;
+                                       res->end = res->start;
+                               res->flags = IORESOURCE_IO;
                                nport++;
                                if (nport >= PNP_MAX_PORT)
                                        break;
@@ -406,21 +404,18 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                                buf += 3;
                                while (isspace(*buf))
                                        ++buf;
-                               dev->res.mem_resource[nmem].start =
-                                   simple_strtoul(buf, &buf, 0);
+                               res = &dev->res.mem_resource[nmem];
+                               res->start = simple_strtoul(buf, &buf, 0);
                                while (isspace(*buf))
                                        ++buf;
                                if (*buf == '-') {
                                        buf += 1;
                                        while (isspace(*buf))
                                                ++buf;
-                                       dev->res.mem_resource[nmem].end =
-                                           simple_strtoul(buf, &buf, 0);
+                                       res->end = simple_strtoul(buf, &buf, 0);
                                } else
-                                       dev->res.mem_resource[nmem].end =
-                                           dev->res.mem_resource[nmem].start;
-                               dev->res.mem_resource[nmem].flags =
-                                   IORESOURCE_MEM;
+                                       res->end = res->start;
+                               res->flags = IORESOURCE_MEM;
                                nmem++;
                                if (nmem >= PNP_MAX_MEM)
                                        break;
@@ -430,11 +425,10 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                                buf += 3;
                                while (isspace(*buf))
                                        ++buf;
-                               dev->res.irq_resource[nirq].start =
-                                   dev->res.irq_resource[nirq].end =
+                               res = &dev->res.irq_resource[nirq];
+                               res->start = res->end =
                                    simple_strtoul(buf, &buf, 0);
-                               dev->res.irq_resource[nirq].flags =
-                                   IORESOURCE_IRQ;
+                               res->flags = IORESOURCE_IRQ;
                                nirq++;
                                if (nirq >= PNP_MAX_IRQ)
                                        break;
@@ -444,11 +438,10 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
                                buf += 3;
                                while (isspace(*buf))
                                        ++buf;
-                               dev->res.dma_resource[ndma].start =
-                                   dev->res.dma_resource[ndma].end =
+                               res = &dev->res.dma_resource[ndma];
+                               res->start = res->end =
                                    simple_strtoul(buf, &buf, 0);
-                               dev->res.dma_resource[ndma].flags =
-                                   IORESOURCE_DMA;
+                               res->flags = IORESOURCE_DMA;
                                ndma++;
                                if (ndma >= PNP_MAX_DMA)
                                        break;