ACPI / platform: Add support for build-in properties
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Thu, 3 Nov 2016 14:21:26 +0000 (16:21 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 9 Nov 2016 23:30:29 +0000 (00:30 +0100)
We have a couple of drivers, acpi_apd.c and acpi_lpss.c,
that need to pass extra build-in properties to the devices
they create. Previously the drivers added those properties
to the struct device which is member of the struct
acpi_device, but that does not work. Those properties need
to be assigned to the struct device of the platform device
instead in order for them to become available to the
drivers.

To fix this, this patch changes acpi_create_platform_device
function to take struct property_entry pointer as parameter.

Fixes: 20a875e2e86e (serial: 8250_dw: Add quirk for APM X-Gene SoC)
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Tested-by: Yazen Ghannam <yazen.ghannam@amd.com>
Tested-by: Jérôme de Bretagne <jerome.debretagne@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_apd.c
drivers/acpi/acpi_lpss.c
drivers/acpi/acpi_platform.c
drivers/acpi/dptf/int340x_thermal.c
drivers/acpi/scan.c
drivers/platform/x86/intel-hid.c
drivers/platform/x86/intel-vbtn.c
include/linux/acpi.h

index 5f112d811e427edad03a286c111bcf51cf6d7c65..5959ed996a752ff59146241d0be70f53fa7d4905 100644 (file)
@@ -117,7 +117,7 @@ static int acpi_apd_create_device(struct acpi_device *adev,
        int ret;
 
        if (!dev_desc) {
-               pdev = acpi_create_platform_device(adev);
+               pdev = acpi_create_platform_device(adev, NULL);
                return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
        }
 
@@ -134,14 +134,8 @@ static int acpi_apd_create_device(struct acpi_device *adev,
                        goto err_out;
        }
 
-       if (dev_desc->properties) {
-               ret = device_add_properties(&adev->dev, dev_desc->properties);
-               if (ret)
-                       goto err_out;
-       }
-
        adev->driver_data = pdata;
-       pdev = acpi_create_platform_device(adev);
+       pdev = acpi_create_platform_device(adev, dev_desc->properties);
        if (!IS_ERR_OR_NULL(pdev))
                return 1;
 
index 5520102881357e005361ffd879dc7a245d2fd253..373657f7e35a9cac3a2a951cd030c00ef6fbd06d 100644 (file)
@@ -395,7 +395,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
 
        dev_desc = (const struct lpss_device_desc *)id->driver_data;
        if (!dev_desc) {
-               pdev = acpi_create_platform_device(adev);
+               pdev = acpi_create_platform_device(adev, NULL);
                return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
        }
        pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
@@ -451,14 +451,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
                goto err_out;
        }
 
-       if (dev_desc->properties) {
-               ret = device_add_properties(&adev->dev, dev_desc->properties);
-               if (ret)
-                       goto err_out;
-       }
-
        adev->driver_data = pdata;
-       pdev = acpi_create_platform_device(adev);
+       pdev = acpi_create_platform_device(adev, dev_desc->properties);
        if (!IS_ERR_OR_NULL(pdev)) {
                return 1;
        }
index 159f7f19abceb59816491425daec8df080e482da..56e70da83c6cef503fbbaaf38f715ad7993c285a 100644 (file)
@@ -33,6 +33,7 @@ static const struct acpi_device_id forbidden_id_list[] = {
 /**
  * acpi_create_platform_device - Create platform device for ACPI device node
  * @adev: ACPI device node to create a platform device for.
+ * @properties: Optional collection of build-in properties.
  *
  * 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
@@ -40,7 +41,8 @@ static const struct acpi_device_id forbidden_id_list[] = {
  *
  * Name of the platform device will be the same as @adev's.
  */
-struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
+struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
+                                       struct property_entry *properties)
 {
        struct platform_device *pdev = NULL;
        struct platform_device_info pdevinfo;
@@ -88,6 +90,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
        pdevinfo.res = resources;
        pdevinfo.num_res = count;
        pdevinfo.fwnode = acpi_fwnode_handle(adev);
+       pdevinfo.properties = properties;
 
        if (acpi_dma_supported(adev))
                pdevinfo.dma_mask = DMA_BIT_MASK(32);
index 33505c651f62792e136cedc73a8b022c10f2ba21..86364097e236e5d2d7d99b4e4e94f67b7560ebfd 100644 (file)
@@ -34,11 +34,11 @@ static int int340x_thermal_handler_attach(struct acpi_device *adev,
                                        const struct acpi_device_id *id)
 {
        if (IS_ENABLED(CONFIG_INT340X_THERMAL))
-               acpi_create_platform_device(adev);
+               acpi_create_platform_device(adev, NULL);
        /* Intel SoC DTS thermal driver needs INT3401 to set IRQ descriptor */
        else if (IS_ENABLED(CONFIG_INTEL_SOC_DTS_THERMAL) &&
                 id->driver_data == INT3401_DEVICE)
-               acpi_create_platform_device(adev);
+               acpi_create_platform_device(adev, NULL);
        return 1;
 }
 
index ad9fc84a8601206cec6cc1fb15cb36e5c23250cb..3d31ae3a482d21ce2a80126e9fde875114992b41 100644 (file)
@@ -1734,7 +1734,7 @@ static void acpi_default_enumeration(struct acpi_device *device)
                               &is_spi_i2c_slave);
        acpi_dev_free_resource_list(&resource_list);
        if (!is_spi_i2c_slave) {
-               acpi_create_platform_device(device);
+               acpi_create_platform_device(device, NULL);
                acpi_device_set_enumerated(device);
        } else {
                blocking_notifier_call_chain(&acpi_reconfig_chain,
index ed5874217ee76cf4364d8bbd6f8e49f26e19c215..12dbb50633761b40253adff49f0c3881b40fed90 100644 (file)
@@ -264,7 +264,7 @@ check_acpi_dev(acpi_handle handle, u32 lvl, void *context, void **rv)
                return AE_OK;
 
        if (acpi_match_device_ids(dev, ids) == 0)
-               if (acpi_create_platform_device(dev))
+               if (acpi_create_platform_device(dev, NULL))
                        dev_info(&dev->dev,
                                 "intel-hid: created platform device\n");
 
index 146d02f8c9bc01c99c791bb45ba8df77ce7bb64b..78080763df51768f04548e1627d3baded9bbac14 100644 (file)
@@ -164,7 +164,7 @@ check_acpi_dev(acpi_handle handle, u32 lvl, void *context, void **rv)
                return AE_OK;
 
        if (acpi_match_device_ids(dev, ids) == 0)
-               if (acpi_create_platform_device(dev))
+               if (acpi_create_platform_device(dev, NULL))
                        dev_info(&dev->dev,
                                 "intel-vbtn: created platform device\n");
 
index 632ec16a855e5e25bf2c8ffa2207696771ac6ca1..c09936f55166fafee92a76b81a5ee20c633c5066 100644 (file)
@@ -546,7 +546,8 @@ int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
 int acpi_device_modalias(struct device *, char *, int);
 void acpi_walk_dep_device_list(acpi_handle handle);
 
-struct platform_device *acpi_create_platform_device(struct acpi_device *);
+struct platform_device *acpi_create_platform_device(struct acpi_device *,
+                                                   struct property_entry *);
 #define ACPI_PTR(_ptr) (_ptr)
 
 static inline void acpi_device_set_enumerated(struct acpi_device *adev)