]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pnp/core.c
[MIPS] cevt-txx9: Reset timer counter on initialization
[linux-2.6-omap-h63xx.git] / drivers / pnp / core.c
index 7d366ca672d34ea7b6d07afa04fbcfbec849ad10..20771b7d4482562d18536aca252f9e870b08f907 100644 (file)
@@ -106,18 +106,53 @@ static void pnp_release_device(struct device *dmdev)
        pnp_free_option(dev->independent);
        pnp_free_option(dev->dependent);
        pnp_free_ids(dev);
+       kfree(dev->res);
        kfree(dev);
 }
 
-int __pnp_add_device(struct pnp_dev *dev)
+struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid)
 {
-       int ret;
+       struct pnp_dev *dev;
+       struct pnp_id *dev_id;
 
-       pnp_fixup_device(dev);
+       dev = kzalloc(sizeof(struct pnp_dev), GFP_KERNEL);
+       if (!dev)
+               return NULL;
+
+       dev->res = kzalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
+       if (!dev->res) {
+               kfree(dev);
+               return NULL;
+       }
+
+       dev->protocol = protocol;
+       dev->number = id;
+       dev->dma_mask = DMA_24BIT_MASK;
+
+       dev->dev.parent = &dev->protocol->dev;
        dev->dev.bus = &pnp_bus_type;
        dev->dev.dma_mask = &dev->dma_mask;
-       dev->dma_mask = dev->dev.coherent_dma_mask = DMA_24BIT_MASK;
+       dev->dev.coherent_dma_mask = dev->dma_mask;
        dev->dev.release = &pnp_release_device;
+
+       sprintf(dev->dev.bus_id, "%02x:%02x", dev->protocol->number,
+               dev->number);
+
+       dev_id = pnp_add_id(dev, pnpid);
+       if (!dev_id) {
+               kfree(dev->res);
+               kfree(dev);
+               return NULL;
+       }
+
+       return dev;
+}
+
+int __pnp_add_device(struct pnp_dev *dev)
+{
+       int ret;
+
+       pnp_fixup_device(dev);
        dev->status = PNP_READY;
        spin_lock(&pnp_lock);
        list_add_tail(&dev->global_list, &pnp_global);
@@ -145,9 +180,6 @@ int pnp_add_device(struct pnp_dev *dev)
        if (dev->card)
                return -EINVAL;
 
-       dev->dev.parent = &dev->protocol->dev;
-       sprintf(dev->dev.bus_id, "%02x:%02x", dev->protocol->number,
-               dev->number);
        ret = __pnp_add_device(dev);
        if (ret)
                return ret;