diff options
Diffstat (limited to 'drivers/pnp/interface.c')
| -rw-r--r-- | drivers/pnp/interface.c | 105 | 
1 files changed, 68 insertions, 37 deletions
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index cfaf5b73540b..0c201317284b 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c @@ -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;  | 
