diff options
Diffstat (limited to 'drivers/pnp/interface.c')
| -rw-r--r-- | drivers/pnp/interface.c | 205 | 
1 files changed, 88 insertions, 117 deletions
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 5695a79f3a5..a876ecf7028 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c @@ -3,6 +3,8 @@   *   * Some code, especially possible resource dumping is based on isapnp_proc.c (c) Jaroslav Kysela <perex@perex.cz>   * Copyright 2002 Adam Belay <ambx1@neo.rr.com> + * Copyright (C) 2008 Hewlett-Packard Development Company, L.P. + *	Bjorn Helgaas <bjorn.helgaas@hp.com>   */  #include <linux/pnp.h> @@ -53,11 +55,13 @@ static int pnp_printf(pnp_info_buffer_t * buffer, char *fmt, ...)  static void pnp_print_port(pnp_info_buffer_t * buffer, char *space,  			   struct pnp_port *port)  { -	pnp_printf(buffer, -		   "%sport 0x%x-0x%x, align 0x%x, size 0x%x, %i-bit address decoding\n", -		   space, port->min, port->max, -		   port->align ? (port->align - 1) : 0, port->size, -		   port->flags & PNP_PORT_FLAG_16BITADDR ? 16 : 10); +	pnp_printf(buffer, "%sport %#llx-%#llx, align %#llx, size %#llx, " +		   "%i-bit address decoding\n", space, +		   (unsigned long long) port->min, +		   (unsigned long long) port->max, +		   port->align ? ((unsigned long long) port->align - 1) : 0, +		   (unsigned long long) port->size, +		   port->flags & IORESOURCE_IO_16BIT_ADDR ? 16 : 10);  }  static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space, @@ -67,7 +71,7 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,  	pnp_printf(buffer, "%sirq ", space);  	for (i = 0; i < PNP_IRQ_NR; i++) -		if (test_bit(i, irq->map)) { +		if (test_bit(i, irq->map.bits)) {  			if (!first) {  				pnp_printf(buffer, ",");  			} else { @@ -78,7 +82,7 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,  			else  				pnp_printf(buffer, "%i", i);  		} -	if (bitmap_empty(irq->map, PNP_IRQ_NR)) +	if (bitmap_empty(irq->map.bits, PNP_IRQ_NR))  		pnp_printf(buffer, "<none>");  	if (irq->flags & IORESOURCE_IRQ_HIGHEDGE)  		pnp_printf(buffer, " High-Edge"); @@ -88,6 +92,8 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,  		pnp_printf(buffer, " High-Level");  	if (irq->flags & IORESOURCE_IRQ_LOWLEVEL)  		pnp_printf(buffer, " Low-Level"); +	if (irq->flags & IORESOURCE_IRQ_OPTIONAL) +		pnp_printf(buffer, " (optional)");  	pnp_printf(buffer, "\n");  } @@ -148,8 +154,11 @@ static void pnp_print_mem(pnp_info_buffer_t * buffer, char *space,  {  	char *s; -	pnp_printf(buffer, "%sMemory 0x%x-0x%x, align 0x%x, size 0x%x", -		   space, mem->min, mem->max, mem->align, mem->size); +	pnp_printf(buffer, "%sMemory %#llx-%#llx, align %#llx, size %#llx", +		   space, (unsigned long long) mem->min, +		   (unsigned long long) mem->max, +		   (unsigned long long) mem->align, +		   (unsigned long long) mem->size);  	if (mem->flags & IORESOURCE_MEM_WRITEABLE)  		pnp_printf(buffer, ", writeable");  	if (mem->flags & IORESOURCE_MEM_CACHEABLE) @@ -177,65 +186,58 @@ static void pnp_print_mem(pnp_info_buffer_t * buffer, char *space,  }  static void pnp_print_option(pnp_info_buffer_t * buffer, char *space, -			     struct pnp_option *option, int dep) +			     struct pnp_option *option)  { -	char *s; -	struct pnp_port *port; -	struct pnp_irq *irq; -	struct pnp_dma *dma; -	struct pnp_mem *mem; - -	if (dep) { -		switch (option->priority) { -		case PNP_RES_PRIORITY_PREFERRED: -			s = "preferred"; -			break; -		case PNP_RES_PRIORITY_ACCEPTABLE: -			s = "acceptable"; -			break; -		case PNP_RES_PRIORITY_FUNCTIONAL: -			s = "functional"; -			break; -		default: -			s = "invalid"; -		} -		pnp_printf(buffer, "Dependent: %02i - Priority %s\n", dep, s); +	switch (option->type) { +	case IORESOURCE_IO: +		pnp_print_port(buffer, space, &option->u.port); +		break; +	case IORESOURCE_MEM: +		pnp_print_mem(buffer, space, &option->u.mem); +		break; +	case IORESOURCE_IRQ: +		pnp_print_irq(buffer, space, &option->u.irq); +		break; +	case IORESOURCE_DMA: +		pnp_print_dma(buffer, space, &option->u.dma); +		break;  	} - -	for (port = option->port; port; port = port->next) -		pnp_print_port(buffer, space, port); -	for (irq = option->irq; irq; irq = irq->next) -		pnp_print_irq(buffer, space, irq); -	for (dma = option->dma; dma; dma = dma->next) -		pnp_print_dma(buffer, space, dma); -	for (mem = option->mem; mem; mem = mem->next) -		pnp_print_mem(buffer, space, mem);  }  static ssize_t pnp_show_options(struct device *dmdev,  				struct device_attribute *attr, char *buf)  {  	struct pnp_dev *dev = to_pnp_dev(dmdev); -	struct pnp_option *independent = dev->independent; -	struct pnp_option *dependent = dev->dependent; -	int ret, dep = 1; +	pnp_info_buffer_t *buffer; +	struct pnp_option *option; +	int ret, dep = 0, set = 0; +	char *indent; -	pnp_info_buffer_t *buffer = (pnp_info_buffer_t *) -	    pnp_alloc(sizeof(pnp_info_buffer_t)); +	buffer = pnp_alloc(sizeof(pnp_info_buffer_t));  	if (!buffer)  		return -ENOMEM;  	buffer->len = PAGE_SIZE;  	buffer->buffer = buf;  	buffer->curr = buffer->buffer; -	if (independent) -		pnp_print_option(buffer, "", independent, 0); -	while (dependent) { -		pnp_print_option(buffer, "   ", dependent, dep); -		dependent = dependent->next; -		dep++; +	list_for_each_entry(option, &dev->options, list) { +		if (pnp_option_is_dependent(option)) { +			indent = "  "; +			if (!dep || pnp_option_set(option) != set) { +				set = pnp_option_set(option); +				dep = 1; +				pnp_printf(buffer, "Dependent: %02i - " +					   "Priority %s\n", set, +					   pnp_option_priority_name(option)); +			} +		} else { +			dep = 0; +			indent = ""; +		} +		pnp_print_option(buffer, indent, option);  	} +  	ret = (buffer->curr - buf);  	kfree(buffer);  	return ret; @@ -248,79 +250,59 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,  					  char *buf)  {  	struct pnp_dev *dev = to_pnp_dev(dmdev); -	struct resource *res; -	int i, ret;  	pnp_info_buffer_t *buffer; +	struct pnp_resource *pnp_res; +	struct resource *res; +	int ret;  	if (!dev)  		return -EINVAL; -	buffer = (pnp_info_buffer_t *) pnp_alloc(sizeof(pnp_info_buffer_t)); +	buffer = pnp_alloc(sizeof(pnp_info_buffer_t));  	if (!buffer)  		return -ENOMEM; +  	buffer->len = PAGE_SIZE;  	buffer->buffer = buf;  	buffer->curr = buffer->buffer; -	pnp_printf(buffer, "state = "); -	if (dev->active) -		pnp_printf(buffer, "active\n"); -	else -		pnp_printf(buffer, "disabled\n"); +	pnp_printf(buffer, "state = %s\n", dev->active ? "active" : "disabled"); -	for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { -		if (pnp_resource_valid(res)) { -			pnp_printf(buffer, "io"); -			if (res->flags & IORESOURCE_DISABLED) -				pnp_printf(buffer, " disabled\n"); -			else -				pnp_printf(buffer, " 0x%llx-0x%llx\n", -					   (unsigned long long) res->start, -					   (unsigned long long) res->end); -		} -	} -	for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { -		if (pnp_resource_valid(res)) { -			pnp_printf(buffer, "mem"); -			if (res->flags & IORESOURCE_DISABLED) -				pnp_printf(buffer, " disabled\n"); -			else -				pnp_printf(buffer, " 0x%llx-0x%llx\n", -					   (unsigned long long) res->start, -					   (unsigned long long) res->end); -		} -	} -	for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IRQ, i)); i++) { -		if (pnp_resource_valid(res)) { -			pnp_printf(buffer, "irq"); -			if (res->flags & IORESOURCE_DISABLED) -				pnp_printf(buffer, " disabled\n"); -			else -				pnp_printf(buffer, " %lld\n", -					   (unsigned long long) res->start); +	list_for_each_entry(pnp_res, &dev->resources, list) { +		res = &pnp_res->res; + +		pnp_printf(buffer, pnp_resource_type_name(res)); + +		if (res->flags & IORESOURCE_DISABLED) { +			pnp_printf(buffer, " disabled\n"); +			continue;  		} -	} -	for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_DMA, i)); i++) { -		if (pnp_resource_valid(res)) { -			pnp_printf(buffer, "dma"); -			if (res->flags & IORESOURCE_DISABLED) -				pnp_printf(buffer, " disabled\n"); -			else -				pnp_printf(buffer, " %lld\n", -					   (unsigned long long) res->start); + +		switch (pnp_resource_type(res)) { +		case IORESOURCE_IO: +		case IORESOURCE_MEM: +			pnp_printf(buffer, " %#llx-%#llx\n", +				   (unsigned long long) res->start, +				   (unsigned long long) res->end); +			break; +		case IORESOURCE_IRQ: +		case IORESOURCE_DMA: +			pnp_printf(buffer, " %lld\n", +				   (unsigned long long) res->start); +			break;  		}  	} +  	ret = (buffer->curr - buf);  	kfree(buffer);  	return ret;  } -static ssize_t -pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, -			  const char *ubuf, size_t count) +static ssize_t 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 pnp_resource *pnp_res;  	char *buf = (void *)ubuf;  	int retval = 0;  	resource_size_t start, end; @@ -368,7 +350,6 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,  		goto done;  	}  	if (!strnicmp(buf, "set", 3)) { -		int nport = 0, nmem = 0, nirq = 0, ndma = 0;  		if (dev->active)  			goto done;  		buf += 3; @@ -391,10 +372,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,  					end = simple_strtoul(buf, &buf, 0);  				} else  					end = start; -				pnp_res = pnp_add_io_resource(dev, start, end, -							      0); -				if (pnp_res) -					pnp_res->index = nport++; +				pnp_add_io_resource(dev, start, end, 0);  				continue;  			}  			if (!strnicmp(buf, "mem", 3)) { @@ -411,10 +389,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,  					end = simple_strtoul(buf, &buf, 0);  				} else  					end = start; -				pnp_res = pnp_add_mem_resource(dev, start, end, -							       0); -				if (pnp_res) -					pnp_res->index = nmem++; +				pnp_add_mem_resource(dev, start, end, 0);  				continue;  			}  			if (!strnicmp(buf, "irq", 3)) { @@ -422,9 +397,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,  				while (isspace(*buf))  					++buf;  				start = simple_strtoul(buf, &buf, 0); -				pnp_res = pnp_add_irq_resource(dev, start, 0); -				if (pnp_res) -					pnp_res->index = nirq++; +				pnp_add_irq_resource(dev, start, 0);  				continue;  			}  			if (!strnicmp(buf, "dma", 3)) { @@ -432,9 +405,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,  				while (isspace(*buf))  					++buf;  				start = simple_strtoul(buf, &buf, 0); -				pnp_res = pnp_add_dma_resource(dev, start, 0); -				if (pnp_res) -					pnp_res->index = ndma++; +				pnp_add_dma_resource(dev, start, 0);  				continue;  			}  			break;  |