Bluetooth: hci_bcm: Support platform enumeration
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 10 Mar 2017 12:28:20 +0000 (14:28 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Apr 2017 20:02:38 +0000 (22:02 +0200)
Until now the driver supports only ACPI enumeration. Nevertheless
Intel Edison SoM has Broadcom Wi-Fi + BT chip and neither ACPI nor DT
enumeration mechanism.

Enable pure platform driver in order to support Intel Edison SoM.

Cc: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_bcm.c

index c7d3c6842bcfb51c4ac6272cb44b562315938211..04fe5535a153b46d82340b3fed353fe79c6461c4 100644 (file)
@@ -697,28 +697,14 @@ static int bcm_resource(struct acpi_resource *ares, void *data)
        /* Always tell the ACPI core to skip this resource */
        return 1;
 }
+#endif /* CONFIG_ACPI */
 
-static int bcm_acpi_probe(struct bcm_device *dev)
+static int bcm_platform_probe(struct bcm_device *dev)
 {
        struct platform_device *pdev = dev->pdev;
-       LIST_HEAD(resources);
-       const struct dmi_system_id *dmi_id;
-       const struct acpi_gpio_mapping *gpio_mapping = acpi_bcm_int_last_gpios;
-       const struct acpi_device_id *id;
-       int ret;
 
        dev->name = dev_name(&pdev->dev);
 
-       /* Retrieve GPIO data */
-       id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
-       if (id)
-               gpio_mapping = (const struct acpi_gpio_mapping *) id->driver_data;
-
-       ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
-                                       gpio_mapping);
-       if (ret)
-               return ret;
-
        dev->clk = devm_clk_get(&pdev->dev, NULL);
 
        dev->device_wakeup = devm_gpiod_get_optional(&pdev->dev,
@@ -755,6 +741,33 @@ static int bcm_acpi_probe(struct bcm_device *dev)
                return -EINVAL;
        }
 
+       return 0;
+}
+
+#ifdef CONFIG_ACPI
+static int bcm_acpi_probe(struct bcm_device *dev)
+{
+       struct platform_device *pdev = dev->pdev;
+       LIST_HEAD(resources);
+       const struct dmi_system_id *dmi_id;
+       const struct acpi_gpio_mapping *gpio_mapping = acpi_bcm_int_last_gpios;
+       const struct acpi_device_id *id;
+       int ret;
+
+       /* Retrieve GPIO data */
+       id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
+       if (id)
+               gpio_mapping = (const struct acpi_gpio_mapping *) id->driver_data;
+
+       ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
+                                       gpio_mapping);
+       if (ret)
+               return ret;
+
+       ret = bcm_platform_probe(dev);
+       if (ret)
+               return ret;
+
        /* Retrieve UART ACPI info */
        ret = acpi_dev_get_resources(ACPI_COMPANION(&dev->pdev->dev),
                                     &resources, bcm_resource, dev);
@@ -789,7 +802,10 @@ static int bcm_probe(struct platform_device *pdev)
 
        dev->pdev = pdev;
 
-       ret = bcm_acpi_probe(dev);
+       if (has_acpi_companion(&pdev->dev))
+               ret = bcm_acpi_probe(dev);
+       else
+               ret = bcm_platform_probe(dev);
        if (ret)
                return ret;