Merge remote-tracking branches 'spi/fix/dw', 'spi/fix/orion', 'spi/fix/pl022', 'spi...
[cascardo/linux.git] / drivers / acpi / acpi_platform.c
index 1d49503..6ba8beb 100644 (file)
 #include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/dma-mapping.h>
 #include <linux/platform_device.h>
 
 #include "internal.h"
 
 ACPI_MODULE_NAME("platform");
 
-/*
- * The following ACPI IDs are known to be suitable for representing as
- * platform devices.
- */
-static const struct acpi_device_id acpi_platform_device_ids[] = {
-
-       { "PNP0D40" },
-       { "VPC2004" },
-       { "BCM4752" },
-
-       /* Intel Smart Sound Technology */
-       { "INT33C8" },
-       { "80860F28" },
-
-       { }
+static const struct acpi_device_id forbidden_id_list[] = {
+       {"PNP0000", 0}, /* PIC */
+       {"PNP0100", 0}, /* Timer */
+       {"PNP0200", 0}, /* AT DMA Controller */
+       {"", 0},
 };
 
 /**
  * acpi_create_platform_device - Create platform device for ACPI device node
  * @adev: ACPI device node to create a platform device for.
- * @id: ACPI device ID used to match @adev.
  *
  * Check if the given @adev can be represented as a platform device and, if
  * that's the case, create and register a platform device, populate its common
@@ -50,8 +40,7 @@ static const struct acpi_device_id acpi_platform_device_ids[] = {
  *
  * Name of the platform device will be the same as @adev's.
  */
-int acpi_create_platform_device(struct acpi_device *adev,
-                               const struct acpi_device_id *id)
+struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
 {
        struct platform_device *pdev = NULL;
        struct acpi_device *acpi_parent;
@@ -63,19 +52,22 @@ int acpi_create_platform_device(struct acpi_device *adev,
 
        /* If the ACPI node already has a physical device attached, skip it. */
        if (adev->physical_node_count)
-               return 0;
+               return NULL;
+
+       if (!acpi_match_device_ids(adev, forbidden_id_list))
+               return ERR_PTR(-EINVAL);
 
        INIT_LIST_HEAD(&resource_list);
        count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
        if (count < 0) {
-               return 0;
+               return NULL;
        } else if (count > 0) {
                resources = kmalloc(count * sizeof(struct resource),
                                    GFP_KERNEL);
                if (!resources) {
                        dev_err(&adev->dev, "No memory for resources\n");
                        acpi_dev_free_resource_list(&resource_list);
-                       return -ENOMEM;
+                       return ERR_PTR(-ENOMEM);
                }
                count = 0;
                list_for_each_entry(rentry, &resource_list, node)
@@ -111,26 +103,16 @@ int acpi_create_platform_device(struct acpi_device *adev,
        pdevinfo.res = resources;
        pdevinfo.num_res = count;
        pdevinfo.acpi_node.companion = adev;
+       pdevinfo.dma_mask = DMA_BIT_MASK(32);
        pdev = platform_device_register_full(&pdevinfo);
-       if (IS_ERR(pdev)) {
+       if (IS_ERR(pdev))
                dev_err(&adev->dev, "platform device creation failed: %ld\n",
                        PTR_ERR(pdev));
-               pdev = NULL;
-       } else {
+       else
                dev_dbg(&adev->dev, "created platform device %s\n",
                        dev_name(&pdev->dev));
-       }
 
        kfree(resources);
-       return 1;
-}
-
-static struct acpi_scan_handler platform_handler = {
-       .ids = acpi_platform_device_ids,
-       .attach = acpi_create_platform_device,
-};
-
-void __init acpi_platform_init(void)
-{
-       acpi_scan_add_handler(&platform_handler);
+       return pdev;
 }
+EXPORT_SYMBOL_GPL(acpi_create_platform_device);