Re: [net-next PATCH v2 10/14] device property: Introduce fwnode_get_id()
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: 2020-12-15 17:01:56
Also in:
linux-acpi, lkml, netdev
Hi Calvin, Thank you for the patch. On Tue, Dec 15, 2020 at 10:13:11PM +0530, Calvin Johnson wrote:
quoted hunk ↗ jump to hunk
Using fwnode_get_id(), get the reg property value for DT node and get the _ADR object value for ACPI node. Signed-off-by: Calvin Johnson <redacted> --- Changes in v2: None drivers/base/property.c | 26 ++++++++++++++++++++++++++ include/linux/property.h | 1 + 2 files changed, 27 insertions(+)diff --git a/drivers/base/property.c b/drivers/base/property.c index 4c43d30145c6..1c50e17ae879 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c@@ -580,6 +580,32 @@ const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode) return fwnode_call_ptr_op(fwnode, get_name_prefix); } +/** + * fwnode_get_id - Get the id of a fwnode. + * @fwnode: firmware node + * @id: id of the fwnode + *
Is the concept of fwnode ID documented clearly somewhere ? I think this function should otherwise have more documentation, at least to explain what the ID is.
+ * Returns 0 on success or a negative errno.
+ */
+int fwnode_get_id(struct fwnode_handle *fwnode, u32 *id)
+{
+ unsigned long long adr;
+ acpi_status status;
+
+ if (is_of_node(fwnode)) {
+ return of_property_read_u32(to_of_node(fwnode), "reg", id);
+ } else if (is_acpi_node(fwnode)) {
+ status = acpi_evaluate_integer(ACPI_HANDLE_FWNODE(fwnode),
+ METHOD_NAME__ADR, NULL, &adr);
+ if (ACPI_FAILURE(status))
+ return -ENODATA;Would it make sense to standardize error codes ? of_property_read_u32() can return -EINVAL, -ENODATA or -EOVERFLOW. I don't think the caller of this function would be very interested to tell those three cases apart. Maybe we should return -EINVAL in all error cases ? Or maybe different error codes to mean "the backend doesn't support the concept of IDs", and "the device doesn't have an ID" ?
quoted hunk ↗ jump to hunk
+ *id = (u32)adr; + return 0; + } + return -EINVAL; +} +EXPORT_SYMBOL_GPL(fwnode_get_id); + /** * fwnode_get_parent - Return parent firwmare node * @fwnode: Firmware whose parent is retrieveddiff --git a/include/linux/property.h b/include/linux/property.h index 2d4542629d80..92d405cf2b07 100644 --- a/include/linux/property.h +++ b/include/linux/property.h@@ -82,6 +82,7 @@ struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode, const char *fwnode_get_name(const struct fwnode_handle *fwnode); const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode); +int fwnode_get_id(struct fwnode_handle *fwnode, u32 *id); struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode); struct fwnode_handle *fwnode_get_next_parent( struct fwnode_handle *fwnode);
-- Regards, Laurent Pinchart _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel