]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
device property: Split property reading bool and presence test ops
authorRob Herring (Arm) <robh@kernel.org>
Thu, 9 Jan 2025 19:42:05 +0000 (13:42 -0600)
committerRob Herring (Arm) <robh@kernel.org>
Mon, 13 Jan 2025 23:47:29 +0000 (17:47 -0600)
The fwnode/device property API currently implement
(fwnode|device)_property_read_bool() with (fwnode|device)_property_present().
That does not allow having different behavior depending on the backend.

Specifically, the usage of (fwnode|device)_property_read_bool() on
non-boolean properties is deprecated on DT. In order to add a warning
on this deprecated use, these 2 APIs need separate ops for the backend.

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20250109-dt-type-warnings-v1-1-0150e32e716c@kernel.org
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
drivers/acpi/property.c
drivers/base/property.c
drivers/base/swnode.c
drivers/of/property.c
include/linux/fwnode.h
include/linux/of.h
include/linux/property.h

index 80a52a4e66dd167e70c80a164a89beb8c834ae13..8c53959ee31e700004de098bdab21dec118cf111 100644 (file)
@@ -1656,6 +1656,7 @@ static int acpi_fwnode_irq_get(const struct fwnode_handle *fwnode,
                        acpi_fwnode_device_dma_supported,               \
                .device_get_dma_attr = acpi_fwnode_device_get_dma_attr, \
                .property_present = acpi_fwnode_property_present,       \
+               .property_read_bool = acpi_fwnode_property_present,     \
                .property_read_int_array =                              \
                        acpi_fwnode_property_read_int_array,            \
                .property_read_string_array =                           \
index 837d77e3af2bd5bf655e6fa0f64c10a05b361b90..c1392743df9c3f6c554f093f4efae3ea1ad1fdf2 100644 (file)
@@ -70,6 +70,44 @@ bool fwnode_property_present(const struct fwnode_handle *fwnode,
 }
 EXPORT_SYMBOL_GPL(fwnode_property_present);
 
+/**
+ * device_property_read_bool - Return the value for a boolean property of a device
+ * @dev: Device whose property is being checked
+ * @propname: Name of the property
+ *
+ * Return if property @propname is true or false in the device firmware description.
+ *
+ * Return: true if property @propname is present. Otherwise, returns false.
+ */
+bool device_property_read_bool(const struct device *dev, const char *propname)
+{
+       return fwnode_property_read_bool(dev_fwnode(dev), propname);
+}
+EXPORT_SYMBOL_GPL(device_property_read_bool);
+
+/**
+ * fwnode_property_read_bool - Return the value for a boolean property of a firmware node
+ * @fwnode: Firmware node whose property to check
+ * @propname: Name of the property
+ *
+ * Return if property @propname is true or false in the firmware description.
+ */
+bool fwnode_property_read_bool(const struct fwnode_handle *fwnode,
+                            const char *propname)
+{
+       bool ret;
+
+       if (IS_ERR_OR_NULL(fwnode))
+               return false;
+
+       ret = fwnode_call_bool_op(fwnode, property_read_bool, propname);
+       if (ret)
+               return ret;
+
+       return fwnode_call_bool_op(fwnode->secondary, property_read_bool, propname);
+}
+EXPORT_SYMBOL_GPL(fwnode_property_read_bool);
+
 /**
  * device_property_read_u8_array - return a u8 array property of a device
  * @dev: Device to get the property of
index eb6eb25b343bafaa9c03f881b98a528305fa6093..b1726a3515f6fbe13c2186af1f74479263798e42 100644 (file)
@@ -677,6 +677,7 @@ static const struct fwnode_operations software_node_ops = {
        .get = software_node_get,
        .put = software_node_put,
        .property_present = software_node_property_present,
+       .property_read_bool = software_node_property_present,
        .property_read_int_array = software_node_read_int_array,
        .property_read_string_array = software_node_read_string_array,
        .get_name = software_node_get_name,
index 9d8b68c72c363acf364c96138eb55f247a094860..2109515a3bc2a821f31a9aecbf71a5956e6d8b97 100644 (file)
@@ -965,6 +965,12 @@ of_fwnode_device_get_dma_attr(const struct fwnode_handle *fwnode)
 
 static bool of_fwnode_property_present(const struct fwnode_handle *fwnode,
                                       const char *propname)
+{
+       return of_property_present(to_of_node(fwnode), propname);
+}
+
+static bool of_fwnode_property_read_bool(const struct fwnode_handle *fwnode,
+                                        const char *propname)
 {
        return of_property_read_bool(to_of_node(fwnode), propname);
 }
@@ -1562,6 +1568,7 @@ const struct fwnode_operations of_fwnode_ops = {
        .device_dma_supported = of_fwnode_device_dma_supported,
        .device_get_dma_attr = of_fwnode_device_get_dma_attr,
        .property_present = of_fwnode_property_present,
+       .property_read_bool = of_fwnode_property_read_bool,
        .property_read_int_array = of_fwnode_property_read_int_array,
        .property_read_string_array = of_fwnode_property_read_string_array,
        .get_name = of_fwnode_get_name,
index 0d79070c5a70f21e9d73751941f28cefb244950d..0731994b9d7c832cae8a30063f3a64194e4f19aa 100644 (file)
@@ -112,6 +112,7 @@ struct fwnode_reference_args {
  * @device_is_available: Return true if the device is available.
  * @device_get_match_data: Return the device driver match data.
  * @property_present: Return true if a property is present.
+ * @property_read_bool: Return a boolean property value.
  * @property_read_int_array: Read an array of integer properties. Return zero on
  *                          success, a negative error code otherwise.
  * @property_read_string_array: Read an array of string properties. Return zero
@@ -141,6 +142,8 @@ struct fwnode_operations {
        (*device_get_dma_attr)(const struct fwnode_handle *fwnode);
        bool (*property_present)(const struct fwnode_handle *fwnode,
                                 const char *propname);
+       bool (*property_read_bool)(const struct fwnode_handle *fwnode,
+                                  const char *propname);
        int (*property_read_int_array)(const struct fwnode_handle *fwnode,
                                       const char *propname,
                                       unsigned int elem_size, void *val,
index f921786cb8ac782286ed5ff4425a35668204d050..1cb4eb7fc2eded2246c697c3bcaf1b85d43108ab 100644 (file)
@@ -1271,7 +1271,9 @@ static inline bool of_property_read_bool(const struct device_node *np,
  */
 static inline bool of_property_present(const struct device_node *np, const char *propname)
 {
-       return of_property_read_bool(np, propname);
+       struct property *prop = of_find_property(np, propname, NULL);
+
+       return prop ? true : false;
 }
 
 /**
index 61fc20e5f81f8da992aa021996ddf68ef3eff0ed..e214ecd241eb4e6d9e0873d094f2c956bbf66c34 100644 (file)
@@ -37,6 +37,7 @@ struct fwnode_handle *__dev_fwnode(struct device *dev);
                 struct device *: __dev_fwnode)(dev)
 
 bool device_property_present(const struct device *dev, const char *propname);
+bool device_property_read_bool(const struct device *dev, const char *propname);
 int device_property_read_u8_array(const struct device *dev, const char *propname,
                                  u8 *val, size_t nval);
 int device_property_read_u16_array(const struct device *dev, const char *propname,
@@ -54,6 +55,8 @@ int device_property_match_string(const struct device *dev,
 
 bool fwnode_property_present(const struct fwnode_handle *fwnode,
                             const char *propname);
+bool fwnode_property_read_bool(const struct fwnode_handle *fwnode,
+                            const char *propname);
 int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode,
                                  const char *propname, u8 *val,
                                  size_t nval);
@@ -207,12 +210,6 @@ int fwnode_irq_get_byname(const struct fwnode_handle *fwnode, const char *name);
 
 unsigned int device_get_child_node_count(const struct device *dev);
 
-static inline bool device_property_read_bool(const struct device *dev,
-                                            const char *propname)
-{
-       return device_property_present(dev, propname);
-}
-
 static inline int device_property_read_u8(const struct device *dev,
                                          const char *propname, u8 *val)
 {
@@ -263,12 +260,6 @@ static inline int device_property_string_array_count(const struct device *dev,
        return device_property_read_string_array(dev, propname, NULL, 0);
 }
 
-static inline bool fwnode_property_read_bool(const struct fwnode_handle *fwnode,
-                                            const char *propname)
-{
-       return fwnode_property_present(fwnode, propname);
-}
-
 static inline int fwnode_property_read_u8(const struct fwnode_handle *fwnode,
                                          const char *propname, u8 *val)
 {