|
@@ -624,6 +624,68 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
|
|
|
return pnp_res;
|
|
|
}
|
|
|
|
|
|
+static int pnp_possible_option(struct pnp_option *option, int type,
|
|
|
+ resource_size_t start, resource_size_t size)
|
|
|
+{
|
|
|
+ struct pnp_option *tmp;
|
|
|
+ struct pnp_port *port;
|
|
|
+ struct pnp_mem *mem;
|
|
|
+ struct pnp_irq *irq;
|
|
|
+ struct pnp_dma *dma;
|
|
|
+
|
|
|
+ if (!option)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ for (tmp = option; tmp; tmp = tmp->next) {
|
|
|
+ switch (type) {
|
|
|
+ case IORESOURCE_IO:
|
|
|
+ for (port = tmp->port; port; port = port->next) {
|
|
|
+ if (port->min == start && port->size == size)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case IORESOURCE_MEM:
|
|
|
+ for (mem = tmp->mem; mem; mem = mem->next) {
|
|
|
+ if (mem->min == start && mem->size == size)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case IORESOURCE_IRQ:
|
|
|
+ for (irq = tmp->irq; irq; irq = irq->next) {
|
|
|
+ if (start < PNP_IRQ_NR &&
|
|
|
+ test_bit(start, irq->map))
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case IORESOURCE_DMA:
|
|
|
+ for (dma = tmp->dma; dma; dma = dma->next) {
|
|
|
+ if (dma->map & (1 << start))
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Determine whether the specified resource is a possible configuration
|
|
|
+ * for this device.
|
|
|
+ */
|
|
|
+int pnp_possible_config(struct pnp_dev *dev, int type, resource_size_t start,
|
|
|
+ resource_size_t size)
|
|
|
+{
|
|
|
+ if (pnp_possible_option(dev->independent, type, start, size))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ if (pnp_possible_option(dev->dependent, type, start, size))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(pnp_possible_config);
|
|
|
+
|
|
|
/* format is: pnp_reserve_irq=irq1[,irq2] .... */
|
|
|
static int __init pnp_setup_reserve_irq(char *str)
|
|
|
{
|