diff options
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/property.c | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/drivers/base/property.c b/drivers/base/property.c index cf3b2160e34e..62787bc89a1d 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c | |||
| @@ -15,6 +15,12 @@ | |||
| 15 | #include <linux/acpi.h> | 15 | #include <linux/acpi.h> |
| 16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
| 17 | 17 | ||
| 18 | static inline struct fwnode_handle *dev_fwnode(struct device *dev) | ||
| 19 | { | ||
| 20 | return IS_ENABLED(CONFIG_OF) && dev->of_node ? | ||
| 21 | &dev->of_node->fwnode : dev->fwnode; | ||
| 22 | } | ||
| 23 | |||
| 18 | /** | 24 | /** |
| 19 | * device_property_present - check if a property of a device is present | 25 | * device_property_present - check if a property of a device is present |
| 20 | * @dev: Device whose property is being checked | 26 | * @dev: Device whose property is being checked |
| @@ -24,10 +30,7 @@ | |||
| 24 | */ | 30 | */ |
| 25 | bool device_property_present(struct device *dev, const char *propname) | 31 | bool device_property_present(struct device *dev, const char *propname) |
| 26 | { | 32 | { |
| 27 | if (IS_ENABLED(CONFIG_OF) && dev->of_node) | 33 | return fwnode_property_present(dev_fwnode(dev), propname); |
| 28 | return of_property_read_bool(dev->of_node, propname); | ||
| 29 | |||
| 30 | return !acpi_dev_prop_get(ACPI_COMPANION(dev), propname, NULL); | ||
| 31 | } | 34 | } |
| 32 | EXPORT_SYMBOL_GPL(device_property_present); | 35 | EXPORT_SYMBOL_GPL(device_property_present); |
| 33 | 36 | ||
| @@ -47,17 +50,6 @@ bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname) | |||
| 47 | } | 50 | } |
| 48 | EXPORT_SYMBOL_GPL(fwnode_property_present); | 51 | EXPORT_SYMBOL_GPL(fwnode_property_present); |
| 49 | 52 | ||
| 50 | #define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval) \ | ||
| 51 | (val) ? of_property_read_##type##_array((node), (propname), (val), (nval)) \ | ||
| 52 | : of_property_count_elems_of_size((node), (propname), sizeof(type)) | ||
| 53 | |||
| 54 | #define DEV_PROP_READ_ARRAY(_dev_, _propname_, _type_, _proptype_, _val_, _nval_) \ | ||
| 55 | IS_ENABLED(CONFIG_OF) && _dev_->of_node ? \ | ||
| 56 | (OF_DEV_PROP_READ_ARRAY(_dev_->of_node, _propname_, _type_, \ | ||
| 57 | _val_, _nval_)) : \ | ||
| 58 | acpi_dev_prop_read(ACPI_COMPANION(_dev_), _propname_, \ | ||
| 59 | _proptype_, _val_, _nval_) | ||
| 60 | |||
| 61 | /** | 53 | /** |
| 62 | * device_property_read_u8_array - return a u8 array property of a device | 54 | * device_property_read_u8_array - return a u8 array property of a device |
| 63 | * @dev: Device to get the property of | 55 | * @dev: Device to get the property of |
| @@ -78,7 +70,7 @@ EXPORT_SYMBOL_GPL(fwnode_property_present); | |||
| 78 | int device_property_read_u8_array(struct device *dev, const char *propname, | 70 | int device_property_read_u8_array(struct device *dev, const char *propname, |
| 79 | u8 *val, size_t nval) | 71 | u8 *val, size_t nval) |
| 80 | { | 72 | { |
| 81 | return DEV_PROP_READ_ARRAY(dev, propname, u8, DEV_PROP_U8, val, nval); | 73 | return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval); |
| 82 | } | 74 | } |
| 83 | EXPORT_SYMBOL_GPL(device_property_read_u8_array); | 75 | EXPORT_SYMBOL_GPL(device_property_read_u8_array); |
| 84 | 76 | ||
| @@ -102,7 +94,7 @@ EXPORT_SYMBOL_GPL(device_property_read_u8_array); | |||
| 102 | int device_property_read_u16_array(struct device *dev, const char *propname, | 94 | int device_property_read_u16_array(struct device *dev, const char *propname, |
| 103 | u16 *val, size_t nval) | 95 | u16 *val, size_t nval) |
| 104 | { | 96 | { |
| 105 | return DEV_PROP_READ_ARRAY(dev, propname, u16, DEV_PROP_U16, val, nval); | 97 | return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval); |
| 106 | } | 98 | } |
| 107 | EXPORT_SYMBOL_GPL(device_property_read_u16_array); | 99 | EXPORT_SYMBOL_GPL(device_property_read_u16_array); |
| 108 | 100 | ||
| @@ -126,7 +118,7 @@ EXPORT_SYMBOL_GPL(device_property_read_u16_array); | |||
| 126 | int device_property_read_u32_array(struct device *dev, const char *propname, | 118 | int device_property_read_u32_array(struct device *dev, const char *propname, |
| 127 | u32 *val, size_t nval) | 119 | u32 *val, size_t nval) |
| 128 | { | 120 | { |
| 129 | return DEV_PROP_READ_ARRAY(dev, propname, u32, DEV_PROP_U32, val, nval); | 121 | return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval); |
| 130 | } | 122 | } |
| 131 | EXPORT_SYMBOL_GPL(device_property_read_u32_array); | 123 | EXPORT_SYMBOL_GPL(device_property_read_u32_array); |
| 132 | 124 | ||
| @@ -150,7 +142,7 @@ EXPORT_SYMBOL_GPL(device_property_read_u32_array); | |||
| 150 | int device_property_read_u64_array(struct device *dev, const char *propname, | 142 | int device_property_read_u64_array(struct device *dev, const char *propname, |
| 151 | u64 *val, size_t nval) | 143 | u64 *val, size_t nval) |
| 152 | { | 144 | { |
| 153 | return DEV_PROP_READ_ARRAY(dev, propname, u64, DEV_PROP_U64, val, nval); | 145 | return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval); |
| 154 | } | 146 | } |
| 155 | EXPORT_SYMBOL_GPL(device_property_read_u64_array); | 147 | EXPORT_SYMBOL_GPL(device_property_read_u64_array); |
| 156 | 148 | ||
| @@ -174,11 +166,7 @@ EXPORT_SYMBOL_GPL(device_property_read_u64_array); | |||
| 174 | int device_property_read_string_array(struct device *dev, const char *propname, | 166 | int device_property_read_string_array(struct device *dev, const char *propname, |
| 175 | const char **val, size_t nval) | 167 | const char **val, size_t nval) |
| 176 | { | 168 | { |
| 177 | return IS_ENABLED(CONFIG_OF) && dev->of_node ? | 169 | return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval); |
| 178 | (val ? of_property_read_string_array(dev->of_node, propname, val, nval) | ||
| 179 | : of_property_count_strings(dev->of_node, propname)) : | ||
| 180 | acpi_dev_prop_read(ACPI_COMPANION(dev), propname, | ||
| 181 | DEV_PROP_STRING, val, nval); | ||
| 182 | } | 170 | } |
| 183 | EXPORT_SYMBOL_GPL(device_property_read_string_array); | 171 | EXPORT_SYMBOL_GPL(device_property_read_string_array); |
| 184 | 172 | ||
| @@ -199,13 +187,14 @@ EXPORT_SYMBOL_GPL(device_property_read_string_array); | |||
| 199 | int device_property_read_string(struct device *dev, const char *propname, | 187 | int device_property_read_string(struct device *dev, const char *propname, |
| 200 | const char **val) | 188 | const char **val) |
| 201 | { | 189 | { |
| 202 | return IS_ENABLED(CONFIG_OF) && dev->of_node ? | 190 | return fwnode_property_read_string(dev_fwnode(dev), propname, val); |
| 203 | of_property_read_string(dev->of_node, propname, val) : | ||
| 204 | acpi_dev_prop_read(ACPI_COMPANION(dev), propname, | ||
| 205 | DEV_PROP_STRING, val, 1); | ||
| 206 | } | 191 | } |
| 207 | EXPORT_SYMBOL_GPL(device_property_read_string); | 192 | EXPORT_SYMBOL_GPL(device_property_read_string); |
| 208 | 193 | ||
| 194 | #define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval) \ | ||
| 195 | (val) ? of_property_read_##type##_array((node), (propname), (val), (nval)) \ | ||
| 196 | : of_property_count_elems_of_size((node), (propname), sizeof(type)) | ||
| 197 | |||
| 209 | #define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_) \ | 198 | #define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_) \ |
| 210 | ({ \ | 199 | ({ \ |
| 211 | int _ret_; \ | 200 | int _ret_; \ |
