Skip to content

Commit

Permalink
Merge branch 'device-properties'
Browse files Browse the repository at this point in the history
* device-properties:
  device property: avoid allocations of 0 length
  device property: the secondary fwnode needs to depend on the primary
  device property: add spaces to PROPERTY_ENTRY_STRING macro
  include/linux/property.h: fix build issues with gcc-4.4.4
  i2c: designware: Convert to use unified device property API
  mfd: intel-lpss: Pass HSUART configuration via properties
  mfd: intel-lpss: Pass SDA hold time to I2C host controller driver
  mfd: intel-lpss: Add support for passing device properties
  mfd: core: propagate device properties to sub devices drivers
  driver core: Do not overwrite secondary fwnode with NULL if it is set
  driver core: platform: Add support for built-in device properties
  device property: Take a copy of the property set
  device property: Fallback to secondary fwnode if primary misses the property
  device property: return -EINVAL when property isn't found in ACPI
  device property: improve readability of macros
  device property: helper macros for property entry creation
  device property: keep single value inplace
  device property: refactor built-in properties support
  device property: rename helper functions
  device property: always check for fwnode type
  • Loading branch information
Rafael J. Wysocki committed Jan 12, 2016
2 parents afd2ff9 + f6740c1 commit 9896528
Show file tree
Hide file tree
Showing 13 changed files with 634 additions and 156 deletions.
10 changes: 5 additions & 5 deletions drivers/acpi/property.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ void acpi_free_properties(struct acpi_device *adev)
*
* Return: %0 if property with @name has been found (success),
* %-EINVAL if the arguments are invalid,
* %-ENODATA if the property doesn't exist,
* %-EINVAL if the property doesn't exist,
* %-EPROTO if the property value type doesn't match @type.
*/
static int acpi_data_get_property(struct acpi_device_data *data,
Expand All @@ -360,7 +360,7 @@ static int acpi_data_get_property(struct acpi_device_data *data,
return -EINVAL;

if (!data->pointer || !data->properties)
return -ENODATA;
return -EINVAL;

properties = data->properties;
for (i = 0; i < properties->package.count; i++) {
Expand All @@ -375,13 +375,13 @@ static int acpi_data_get_property(struct acpi_device_data *data,
if (!strcmp(name, propname->string.pointer)) {
if (type != ACPI_TYPE_ANY && propvalue->type != type)
return -EPROTO;
else if (obj)
if (obj)
*obj = propvalue;

return 0;
}
}
return -ENODATA;
return -EINVAL;
}

/**
Expand Down Expand Up @@ -439,7 +439,7 @@ int acpi_node_prop_get(struct fwnode_handle *fwnode, const char *propname,
*
* Return: %0 if array property (package) with @name has been found (success),
* %-EINVAL if the arguments are invalid,
* %-ENODATA if the property doesn't exist,
* %-EINVAL if the property doesn't exist,
* %-EPROTO if the property is not a package or the type of its elements
* doesn't match @type.
*/
Expand Down
5 changes: 4 additions & 1 deletion drivers/base/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2261,7 +2261,10 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
if (fwnode_is_primary(fn))
fn = fn->secondary;

fwnode->secondary = fn;
if (fn) {
WARN_ON(fwnode->secondary);
fwnode->secondary = fn;
}
dev->fwnode = fwnode;
} else {
dev->fwnode = fwnode_is_primary(dev->fwnode) ?
Expand Down
25 changes: 25 additions & 0 deletions drivers/base/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/acpi.h>
#include <linux/clk/clk-conf.h>
#include <linux/limits.h>
#include <linux/property.h>

#include "base.h"
#include "power/power.h"
Expand Down Expand Up @@ -298,6 +299,22 @@ int platform_device_add_data(struct platform_device *pdev, const void *data,
}
EXPORT_SYMBOL_GPL(platform_device_add_data);

/**
* platform_device_add_properties - add built-in properties to a platform device
* @pdev: platform device to add properties to
* @pset: properties to add
*
* The function will take deep copy of the properties in @pset and attach
* the copy to the platform device. The memory associated with properties
* will be freed when the platform device is released.
*/
int platform_device_add_properties(struct platform_device *pdev,
const struct property_set *pset)
{
return device_add_property_set(&pdev->dev, pset);
}
EXPORT_SYMBOL_GPL(platform_device_add_properties);

/**
* platform_device_add - add a platform device to device hierarchy
* @pdev: platform device we're adding
Expand Down Expand Up @@ -409,6 +426,8 @@ void platform_device_del(struct platform_device *pdev)
if (r->parent)
release_resource(r);
}

device_remove_property_set(&pdev->dev);
}
}
EXPORT_SYMBOL_GPL(platform_device_del);
Expand Down Expand Up @@ -487,6 +506,12 @@ struct platform_device *platform_device_register_full(
if (ret)
goto err;

if (pdevinfo->pset) {
ret = platform_device_add_properties(pdev, pdevinfo->pset);
if (ret)
goto err;
}

ret = platform_device_add(pdev);
if (ret) {
err:
Expand Down
Loading

0 comments on commit 9896528

Please sign in to comment.