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

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

PNP: make generic pnp_add_irq_resource()



Add a pnp_add_irq_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 a50b6d7b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -40,3 +40,6 @@ struct pnp_resource_table {
	struct pnp_resource dma[PNP_MAX_DMA];
	struct pnp_resource irq[PNP_MAX_IRQ];
};

struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq,
					  int flags);
+5 −10
Original line number Diff line number Diff line
@@ -324,6 +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;

	if (dev->status & PNP_ATTACHED) {
		retval = -EBUSY;
@@ -429,15 +430,9 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,
				buf += 3;
				while (isspace(*buf))
					++buf;
				pnp_res = pnp_get_pnp_resource(dev,
						IORESOURCE_IRQ, nirq);
				if (!pnp_res)
					break;
				pnp_res->index = nirq;
				res = &pnp_res->res;
				res->start = res->end =
				    simple_strtoul(buf, &buf, 0);
				res->flags = IORESOURCE_IRQ;
				start = simple_strtoul(buf, &buf, 0);
				pnp_res = pnp_add_irq_resource(dev, start, 0);
				if (pnp_res)
					nirq++;
				continue;
			}
+3 −6
Original line number Diff line number Diff line
@@ -965,12 +965,9 @@ static int isapnp_read_resources(struct pnp_dev *dev)
			     8);
			if (!ret)
				continue;
			pnp_res = pnp_get_pnp_resource(dev, IORESOURCE_IRQ,
						       tmp);
			pnp_res = pnp_add_irq_resource(dev, ret, 0);
			if (pnp_res)
				pnp_res->index = tmp;
			res = &pnp_res->res;
			res->start = res->end = ret;
			res->flags = IORESOURCE_IRQ;
		}
		for (tmp = 0; tmp < ISAPNP_MAX_DMA; tmp++) {
			ret = isapnp_read_byte(ISAPNP_CFG_DMA + tmp);
+7 −26
Original line number Diff line number Diff line
@@ -82,28 +82,12 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,
						u32 gsi, int triggering,
						int polarity, int shareable)
{
	struct resource *res;
	int i;
	int irq;
	int irq, flags;
	int p, t;
	static unsigned char warned;

	if (!valid_IRQ(gsi))
		return;

	for (i = 0; i < PNP_MAX_IRQ; i++) {
		res = pnp_get_resource(dev, IORESOURCE_IRQ, i);
		if (!pnp_resource_valid(res))
			break;
	}
	if (i >= PNP_MAX_IRQ) {
		if (!warned) {
			printk(KERN_WARNING "pnpacpi: exceeded the max number"
				" of IRQ resources: %d\n", PNP_MAX_IRQ);
			warned = 1;
		}
		return;
	}
	/*
	 * in IO-APIC mode, use overrided attribute. Two reasons:
	 * 1. BIOS bug in DSDT
@@ -121,17 +105,14 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,
		}
	}

	res->flags = IORESOURCE_IRQ;	// Also clears _UNSET flag
	res->flags |= irq_flags(triggering, polarity, shareable);
	flags = irq_flags(triggering, polarity, shareable);
	irq = acpi_register_gsi(gsi, triggering, polarity);
	if (irq < 0) {
		res->flags |= IORESOURCE_DISABLED;
		return;
	}

	res->start = irq;
	res->end = irq;
	if (irq >= 0)
		pcibios_penalize_isa_irq(irq, 1);
	else
		flags |= IORESOURCE_DISABLED;

	pnp_add_irq_resource(dev, irq, flags);
}

static int dma_flags(int type, int bus_master, int transfer)
+7 −24
Original line number Diff line number Diff line
@@ -54,28 +54,6 @@ inline void pcibios_penalize_isa_irq(int irq, int active)
 * Allocated Resources
 */

static void pnpbios_parse_allocated_irqresource(struct pnp_dev *dev, int irq)
{
	struct resource *res;
	int i;

	for (i = 0; i < PNP_MAX_IRQ; i++) {
		res = pnp_get_resource(dev, IORESOURCE_IRQ, i);
		if (!pnp_resource_valid(res))
			break;
	}

	if (i < PNP_MAX_IRQ) {
		res->flags = IORESOURCE_IRQ;	// Also clears _UNSET flag
		if (irq == -1) {
			res->flags |= IORESOURCE_DISABLED;
			return;
		}
		res->start = res->end = (unsigned long)irq;
		pcibios_penalize_isa_irq(irq, 1);
	}
}

static void pnpbios_parse_allocated_dmaresource(struct pnp_dev *dev, int dma)
{
	struct resource *res;
@@ -148,7 +126,7 @@ static unsigned char *pnpbios_parse_allocated_resource_data(struct pnp_dev *dev,
							    unsigned char *end)
{
	unsigned int len, tag;
	int io, size, mask, i;
	int io, size, mask, i, flags;

	if (!p)
		return NULL;
@@ -205,12 +183,17 @@ static unsigned char *pnpbios_parse_allocated_resource_data(struct pnp_dev *dev,
		case SMALL_TAG_IRQ:
			if (len < 2 || len > 3)
				goto len_err;
			flags = 0;
			io = -1;
			mask = p[1] + p[2] * 256;
			for (i = 0; i < 16; i++, mask = mask >> 1)
				if (mask & 0x01)
					io = i;
			pnpbios_parse_allocated_irqresource(dev, io);
			if (io != -1)
				pcibios_penalize_isa_irq(io, 1);
			else
				flags = IORESOURCE_DISABLED;
			pnp_add_irq_resource(dev, io, flags);
			break;

		case SMALL_TAG_DMA:
Loading