On Wed, Mar 09, 2022 at 01:41:04PM +0200, Ilias Apalodimas wrote: > Hi Akashi-san, > > > Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> > > Reviewed-by: Simon Glass <s...@chromium.org> > > --- > > drivers/core/Makefile | 2 +- > > drivers/core/root.c | 2 + > > drivers/core/tag.c | 139 ++++++++++++++++++++++++++++++ > > include/asm-generic/global_data.h | 4 + > > include/dm/tag.h | 110 +++++++++++++++++++++++ > > 5 files changed, 256 insertions(+), 1 deletion(-) > > create mode 100644 drivers/core/tag.c > > create mode 100644 include/dm/tag.h > > > > diff --git a/drivers/core/Makefile b/drivers/core/Makefile > > index 5edd4e413576..3742e7574525 100644 > > --- a/drivers/core/Makefile > > +++ b/drivers/core/Makefile > > @@ -2,7 +2,7 @@ > > # > > # Copyright (c) 2013 Google, Inc > > > > -obj-y += device.o fdtaddr.o lists.o root.o uclass.o util.o > > +obj-y += device.o fdtaddr.o lists.o root.o uclass.o util.o tag.o > > obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi.o > > obj-$(CONFIG_DEVRES) += devres.o > > obj-$(CONFIG_$(SPL_)DM_DEVICE_REMOVE) += device-remove.o > > diff --git a/drivers/core/root.c b/drivers/core/root.c > > index 8efb4256b27e..86b3884fc674 100644 > > --- a/drivers/core/root.c > > +++ b/drivers/core/root.c > > @@ -199,6 +199,8 @@ int dm_init(bool of_live) > > return ret; > > } > > > > + INIT_LIST_HEAD((struct list_head *)&gd->dmtag_list); > > + > > return 0; > > } > > > > diff --git a/drivers/core/tag.c b/drivers/core/tag.c > > new file mode 100644 > > index 000000000000..6829bcd8806c > > --- /dev/null > > +++ b/drivers/core/tag.c > > @@ -0,0 +1,139 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * Copyright (c) 2021 Linaro Limited > > + * Author: AKASHI Takahiro > > + */ > > + > > +#include <malloc.h> > > +#include <asm/global_data.h> > > +#include <dm/tag.h> > > +#include <linux/err.h> > > +#include <linux/list.h> > > +#include <linux/types.h> > > + > > +struct udevice; > > + > > +DECLARE_GLOBAL_DATA_PTR; > > + > > +int dev_tag_set_ptr(struct udevice *dev, enum dm_tag_t tag, void *ptr) > > +{ > > + struct dmtag_node *node; > > + > > + if (!dev || tag >= DM_TAG_COUNT) > > + return -EINVAL; > > + > > + list_for_each_entry(node, &gd->dmtag_list, sibling) { > > + if (node->dev == dev && node->tag == tag) > > + return -EEXIST; > > + } > > + > > + node = calloc(sizeof(*node), 1); > > + if (!node) > > + return -ENOSPC; > > Isn't -ENOMEM better here?
Ah, yes. > > + > > + node->dev = dev; > > + node->tag = tag; > > + node->ptr = ptr; > > + list_add_tail(&node->sibling, (struct list_head *)&gd->dmtag_list); > > + > > + return 0; > > +} > > + > > +int dev_tag_set_val(struct udevice *dev, enum dm_tag_t tag, ulong val) > > Is this used anywhere else apart from selftests? Currently, no. It exists just for future simpler use cases. -Takahiro Akashi > > +{ > > + struct dmtag_node *node; > > > Thanks > /Ilias