PNP: add pnp_possible_config() -- can a device could be configured this way?
[deliverable/linux.git] / drivers / pnp / resource.c
index ff79aa6168cf5f0e80feac3f018d776233f019cc..786fd356916d0a66f135decd11d7c51aab1fa6a5 100644 (file)
@@ -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)
 {
This page took 0.025512 seconds and 5 git commands to generate.