Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc8c2e30 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Len Brown
Browse files

PNP: make generic pnp_add_io_resource()



Add a pnp_add_io_resource() that can be used by all the PNP
backends.  This consolidates a little more pnp_resource_table
knowledge into one place.

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent dc16f5f2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -45,3 +45,6 @@ struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq,
					  int flags);
struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma,
					  int flags);
struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev,
					 resource_size_t start,
					 resource_size_t end, int flags);
+8 −12
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
	struct resource *res;
	char *buf = (void *)ubuf;
	int retval = 0;
	resource_size_t start;
	resource_size_t start, end;

	if (dev->status & PNP_ATTACHED) {
		retval = -EBUSY;
@@ -382,24 +382,20 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
				buf += 2;
				while (isspace(*buf))
					++buf;
				pnp_res = pnp_get_pnp_resource(dev,
						IORESOURCE_IO, nport);
				if (!pnp_res)
					break;
				pnp_res->index = nport;
				res = &pnp_res->res;
				res->start = simple_strtoul(buf, &buf, 0);
				start = simple_strtoul(buf, &buf, 0);
				while (isspace(*buf))
					++buf;
				if (*buf == '-') {
					buf += 1;
					while (isspace(*buf))
						++buf;
					res->end = simple_strtoul(buf, &buf, 0);
					end = simple_strtoul(buf, &buf, 0);
				} else
					res->end = res->start;
				res->flags = IORESOURCE_IO;
				nport++;
					end = start;
				pnp_res = pnp_add_io_resource(dev, start, end,
							      0);
				if (pnp_res)
					pnp_res->index = nport++;
				continue;
			}
			if (!strnicmp(buf, "mem", 3)) {
+3 −5
Original line number Diff line number Diff line
@@ -941,11 +941,9 @@ static int isapnp_read_resources(struct pnp_dev *dev)
			ret = isapnp_read_word(ISAPNP_CFG_PORT + (tmp << 1));
			if (!ret)
				continue;
			pnp_res = pnp_get_pnp_resource(dev, IORESOURCE_IO, tmp);
			pnp_res = pnp_add_io_resource(dev, ret, ret, 0);
			if (pnp_res)
				pnp_res->index = tmp;
			res = &pnp_res->res;
			res->start = ret;
			res->flags = IORESOURCE_IO;
		}
		for (tmp = 0; tmp < ISAPNP_MAX_MEM; tmp++) {
			ret =
+10 −25
Original line number Diff line number Diff line
@@ -158,33 +158,18 @@ static int dma_flags(int type, int bus_master, int transfer)
	return flags;
}

static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev,
					       u64 io, u64 len, int io_decode)
static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start,
					       u64 len, int io_decode)
{
	struct resource *res;
	int i;
	static unsigned char warned;
	int flags = 0;
	u64 end = start + len - 1;

	for (i = 0; i < PNP_MAX_PORT; i++) {
		res = pnp_get_resource(dev, IORESOURCE_IO, i);
		if (!pnp_resource_valid(res))
			break;
	}
	if (i < PNP_MAX_PORT) {
		res->flags = IORESOURCE_IO;	// Also clears _UNSET flag
	if (io_decode == ACPI_DECODE_16)
			res->flags |= PNP_PORT_FLAG_16BITADDR;
		if (len <= 0 || (io + len - 1) >= 0x10003) {
			res->flags |= IORESOURCE_DISABLED;
			return;
		}
		res->start = io;
		res->end = io + len - 1;
	} else if (!warned) {
		printk(KERN_WARNING "pnpacpi: exceeded the max number of IO "
				"resources: %d \n", PNP_MAX_PORT);
		warned = 1;
	}
		flags |= PNP_PORT_FLAG_16BITADDR;
	if (len == 0 || end >= 0x10003)
		flags |= IORESOURCE_DISABLED;

	pnp_add_io_resource(dev, start, end, flags);
}

static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev,
+6 −17
Original line number Diff line number Diff line
@@ -55,26 +55,15 @@ inline void pcibios_penalize_isa_irq(int irq, int active)
 */

static void pnpbios_parse_allocated_ioresource(struct pnp_dev *dev,
					       int io, int len)
					       int start, int len)
{
	struct resource *res;
	int i;
	int flags = 0;
	int end = start + len - 1;

	for (i = 0; i < PNP_MAX_PORT; i++) {
		res = pnp_get_resource(dev, IORESOURCE_IO, i);
		if (!pnp_resource_valid(res))
			break;
	}
	if (len <= 0 || end >= 0x10003)
		flags |= IORESOURCE_DISABLED;

	if (i < PNP_MAX_PORT) {
		res->flags = IORESOURCE_IO;	// Also clears _UNSET flag
		if (len <= 0 || (io + len - 1) >= 0x10003) {
			res->flags |= IORESOURCE_DISABLED;
			return;
		}
		res->start = (unsigned long)io;
		res->end = (unsigned long)(io + len - 1);
	}
	pnp_add_io_resource(dev, start, end, flags);
}

static void pnpbios_parse_allocated_memresource(struct pnp_dev *dev,
Loading