vserver 1.9.5.x5
[linux-2.6.git] / drivers / base / platform.c
index 9f285ed..c8c87ce 100644 (file)
@@ -57,6 +57,41 @@ int platform_get_irq(struct platform_device *dev, unsigned int num)
        return r ? r->start : 0;
 }
 
+/**
+ *     platform_get_resource_byname - get a resource for a device by name
+ *     @dev: platform device
+ *     @type: resource type
+ *     @name: resource name
+ */
+struct resource *
+platform_get_resource_byname(struct platform_device *dev, unsigned int type,
+                     char *name)
+{
+       int i;
+
+       for (i = 0; i < dev->num_resources; i++) {
+               struct resource *r = &dev->resource[i];
+
+               if ((r->flags & (IORESOURCE_IO|IORESOURCE_MEM|
+                                IORESOURCE_IRQ|IORESOURCE_DMA)) == type)
+                       if (!strcmp(r->name, name))
+                               return r;
+       }
+       return NULL;
+}
+
+/**
+ *     platform_get_irq - get an IRQ for a device
+ *     @dev: platform device
+ *     @name: IRQ name
+ */
+int platform_get_irq_byname(struct platform_device *dev, char *name)
+{
+       struct resource *r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name);
+
+       return r ? r->start : 0;
+}
+
 /**
  *     platform_add_devices - add a numbers of platform devices
  *     @devs: array of platform devices to add
@@ -103,13 +138,16 @@ int platform_device_register(struct platform_device * pdev)
        for (i = 0; i < pdev->num_resources; i++) {
                struct resource *p, *r = &pdev->resource[i];
 
-               r->name = pdev->dev.bus_id;
+               if (r->name == NULL)
+                       r->name = pdev->dev.bus_id;
 
-               p = NULL;
-               if (r->flags & IORESOURCE_MEM)
-                       p = &iomem_resource;
-               else if (r->flags & IORESOURCE_IO)
-                       p = &ioport_resource;
+               p = r->parent;
+               if (!p) {
+                       if (r->flags & IORESOURCE_MEM)
+                               p = &iomem_resource;
+                       else if (r->flags & IORESOURCE_IO)
+                               p = &ioport_resource;
+               }
 
                if (p && request_resource(p, r)) {
                        printk(KERN_ERR
@@ -238,7 +276,7 @@ static int platform_match(struct device * dev, struct device_driver * drv)
        return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
 }
 
-static int platform_suspend(struct device * dev, u32 state)
+static int platform_suspend(struct device * dev, pm_message_t state)
 {
        int ret = 0;
 
@@ -298,13 +336,15 @@ u64 dma_get_required_mask(struct device *dev)
        }
        return mask & *dev->dma_mask;
 }
-EXPORT_SYMBOL(dma_get_required_mask);
+EXPORT_SYMBOL_GPL(dma_get_required_mask);
 #endif
 
-EXPORT_SYMBOL(platform_bus);
-EXPORT_SYMBOL(platform_bus_type);
-EXPORT_SYMBOL(platform_device_register);
-EXPORT_SYMBOL(platform_device_register_simple);
-EXPORT_SYMBOL(platform_device_unregister);
-EXPORT_SYMBOL(platform_get_irq);
-EXPORT_SYMBOL(platform_get_resource);
+EXPORT_SYMBOL_GPL(platform_bus);
+EXPORT_SYMBOL_GPL(platform_bus_type);
+EXPORT_SYMBOL_GPL(platform_device_register);
+EXPORT_SYMBOL_GPL(platform_device_register_simple);
+EXPORT_SYMBOL_GPL(platform_device_unregister);
+EXPORT_SYMBOL_GPL(platform_get_irq);
+EXPORT_SYMBOL_GPL(platform_get_resource);
+EXPORT_SYMBOL_GPL(platform_get_irq_byname);
+EXPORT_SYMBOL_GPL(platform_get_resource_byname);