lkml.org 
[lkml]   [2021]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [net-next PATCH v3 09/15] device property: Introduce fwnode_get_id()
    On Tue, Jan 12, 2021 at 3:42 PM Calvin Johnson
    <calvin.johnson@oss.nxp.com> wrote:
    >
    > Using fwnode_get_id(), get the reg property value for DT node
    > or get the _ADR object value for ACPI node.
    >
    > Signed-off-by: Calvin Johnson <calvin.johnson@oss.nxp.com>
    > ---
    >
    > Changes in v3:
    > - Modified to retrieve reg property value for ACPI as well
    > - Resolved compilation issue with CONFIG_ACPI = n
    > - Added more info into documentation
    >
    > Changes in v2: None
    >
    > drivers/base/property.c | 33 +++++++++++++++++++++++++++++++++
    > include/linux/property.h | 1 +
    > 2 files changed, 34 insertions(+)
    >
    > diff --git a/drivers/base/property.c b/drivers/base/property.c
    > index 35b95c6ac0c6..2d51108cb936 100644
    > --- a/drivers/base/property.c
    > +++ b/drivers/base/property.c
    > @@ -580,6 +580,39 @@ 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
    > + *
    > + * This function provides the id of a fwnode which can be either
    > + * DT or ACPI node. For ACPI, "reg" property value, if present will
    > + * be provided or else _ADR value will be provided.
    > + * Returns 0 on success or a negative errno.
    > + */
    > +int fwnode_get_id(struct fwnode_handle *fwnode, u32 *id)
    > +{
    > +#ifdef CONFIG_ACPI
    > + unsigned long long adr;
    > + acpi_status status;
    > +#endif
    > + int ret;
    > +
    > + ret = fwnode_property_read_u32(fwnode, "reg", id);
    > + if (!(ret && is_acpi_node(fwnode)))
    > + return ret;
    > +
    > +#ifdef CONFIG_ACPI
    > + status = acpi_evaluate_integer(ACPI_HANDLE_FWNODE(fwnode),
    > + METHOD_NAME__ADR, NULL, &adr);
    > + if (ACPI_FAILURE(status))
    > + return -EINVAL;
    > + *id = (u32)adr;

    Shouldn't be

    return 0;
    #else
    return -EINVAL;
    #endif

    ?

    Yes, it's a theoretical case when is_acpi_node() returns true when
    CONFIG_ACPI=n.

    > +#endif
    > + return 0;
    > +}
    > +EXPORT_SYMBOL_GPL(fwnode_get_id);
    > +
    > /**
    > * fwnode_get_parent - Return parent firwmare node
    > * @fwnode: Firmware whose parent is retrieved
    > diff --git a/include/linux/property.h b/include/linux/property.h
    > index 0a9001fe7aea..3f41475f010b 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);
    > --
    > 2.17.1
    >


    --
    With Best Regards,
    Andy Shevchenko

    \
     
     \ /
      Last update: 2021-01-12 16:49    [W:2.654 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site