mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@barebox.org>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@barebox.org>
Subject: [PATCH 02/44] driver: introduce common struct bobject
Date: Mon, 11 Aug 2025 14:27:42 +0200	[thread overview]
Message-ID: <20250811122824.1667791-3-a.fatoum@barebox.org> (raw)
In-Reply-To: <20250811122824.1667791-1-a.fatoum@barebox.org>

We do not have Linux kobject with attributes in barebox, but we do
have something roughly equivalent: struct device and device parameters,
which enables us to do things like eth0.mode=dhcp on the shell.

The parameter API is fairly expressive and would be very useful for
transferring data between commands. In preparation for doing that,
introduce struct bobject, which will allow device-less parameters in
the future. We keep it in a union with the name, so we do not have to
patch all instances of dev->name across the tree.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
 drivers/base/driver.c | 32 --------------------------------
 include/bobject.h     | 26 ++++++++++++++++++++++++++
 include/device.h      |  9 +++++++--
 lib/Makefile          |  1 +
 lib/bobject.c         | 36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 70 insertions(+), 34 deletions(-)
 create mode 100644 include/bobject.h
 create mode 100644 lib/bobject.c

diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 21bf88a74e50..4f3ae4909e07 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -621,38 +621,6 @@ int generic_memmap_ro(struct cdev *cdev, void **map, int flags)
 	return generic_memmap_rw(cdev, map, flags);
 }
 
-/**
- * dev_set_name - set a device name
- * @dev: device
- * @fmt: format string for the device's name
- *
- * NOTE: This function expects dev->name to be free()-able, so extra
- * precautions needs to be taken when mixing its usage with manual
- * assignement of device.name.
- */
-int dev_set_name(struct device *dev, const char *fmt, ...)
-{
-	va_list vargs;
-	int err;
-	/*
-	 * Save old pointer in case we are overriding already set name
-	 */
-	char *oldname = dev->name;
-
-	va_start(vargs, fmt);
-	err = vasprintf(&dev->name, fmt, vargs);
-	va_end(vargs);
-
-	/*
-	 * Free old pointer, we do this after vasprintf call in case
-	 * old device name was in one of vargs
-	 */
-	free(oldname);
-
-	return WARN_ON(err < 0) ? err : 0;
-}
-EXPORT_SYMBOL_GPL(dev_set_name);
-
 /**
  * dev_add_alias - add alias for device
  * @dev: device
diff --git a/include/bobject.h b/include/bobject.h
new file mode 100644
index 000000000000..783ab64569dc
--- /dev/null
+++ b/include/bobject.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __BOBJECT_H_
+#define __BOBJECT_H_
+
+#include <linux/compiler.h>
+
+/**
+ * struct bobject - barebox object
+ * @name: name of object (must be first member)
+ */
+struct bobject {
+	char			*name;
+};
+
+struct device;
+
+typedef union {
+	struct bobject *bobj;
+	struct device *dev;
+} bobject_t __attribute__((transparent_union));
+
+
+__printf(2, 3) int bobject_set_name(bobject_t bobj, const char *name, ...);
+
+#endif
diff --git a/include/device.h b/include/device.h
index 7ef807f7d6b1..8b65693d9672 100644
--- a/include/device.h
+++ b/include/device.h
@@ -9,6 +9,7 @@
 #include <linux/types.h>
 #include <linux/list.h>
 #include <init.h>
+#include <bobject.h>
 
 enum dev_dma_coherence {
 	DEV_DMA_COHERENCE_DEFAULT = 0,
@@ -26,6 +27,7 @@ struct of_device_id;
 
 /**
  * struct device - The basic device structure
+ * @bobject: base class barebox object
  * @name: This member is used to match with a driver. This is a
  *        descriptive name and could be MPC5XXX_ether or imx_serial.
  *        Unless absolutely necessary, should not be modified
@@ -63,7 +65,10 @@ struct of_device_id;
  * @deferred_probe_reason: If a driver probe is deferred, this stores the last error.
  */
 struct device {
-	char *name;
+	union {
+		struct bobject bobject;
+		char *name;
+	};
 
 	char *unique_name;
 	int id;
@@ -187,7 +192,7 @@ static inline const char *dev_name(const struct device *dev)
 	return dev_id(dev) ?: dev->name;
 }
 
-int dev_set_name(struct device *dev, const char *fmt, ...) __printf(2, 3);
+#define dev_set_name bobject_set_name
 
 static inline bool dev_is_dma_coherent(struct device *dev)
 {
diff --git a/lib/Makefile b/lib/Makefile
index 9592ccb68312..13f1de142008 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
+obj-y			+= bobject.o
 obj-y			+= bcd.o
 obj-y			+= term.o
 obj-$(CONFIG_BOOTSTRAP)	+= bootstrap/
diff --git a/lib/bobject.c b/lib/bobject.c
new file mode 100644
index 000000000000..a770993b90bd
--- /dev/null
+++ b/lib/bobject.c
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <bobject.h>
+#include <stdio.h>
+
+/**
+ * bobject_set_name - set a barebox object's name
+ * @bobj: barebox object or device
+ * @fmt: format string for the object's name
+ *
+ * NOTE: This function expects bobj->name to be free()-able, so extra
+ * precautions needs to be taken when mixing its usage with manual
+ * assignement of bobject.name.
+ */
+int bobject_set_name(bobject_t bobj, const char *fmt, ...)
+{
+	va_list vargs;
+	int err;
+	/*
+	 * Save old pointer in case we are overriding already set name
+	 */
+	char *oldname = bobj.bobj->name;
+
+	va_start(vargs, fmt);
+	err = vasprintf(&bobj.bobj->name, fmt, vargs);
+	va_end(vargs);
+
+	/*
+	 * Free old pointer, we do this after vasprintf call in case
+	 * old device name was in one of vargs
+	 */
+	free(oldname);
+
+	return WARN_ON(err < 0) ? err : 0;
+}
+EXPORT_SYMBOL_GPL(bobject_set_name);
-- 
2.39.5




  parent reply	other threads:[~2025-08-11 13:30 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-11 12:27 [PATCH 00/44] commands: add bfetch/buds of command redirection Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 01/44] driver: move device name definition into device.h Ahmad Fatoum
2025-08-11 12:27 ` Ahmad Fatoum [this message]
2025-08-11 12:27 ` [PATCH 03/44] lib: param: rename dev_remove_param to param_remove Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 04/44] param: implement dev_remove_parameters using param_remove Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 05/44] lib: param: add dev_for_each_param helpers Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 06/44] driver: initialize device parameters as part of bobject Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 07/44] param: operate on bobjects instead of full devices Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 08/44] commands: version: print value of CONFIG_NAME Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 09/44] treewide: populate CONFIG_NAME for all configs in-tree Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 10/44] test: py: change barebox_config from set to dict Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 11/44] test: add heuristic for guessing labgrid environment YAML Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 12/44] usb: drop dead iSerialNumber parameter addition Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 13/44] drivers: use dev_add_param_uint32_fixed for IDs Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 14/44] param: make bobject_add_param_fixed variadic Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 15/44] param: handle NULL gracefully in bobject_get_param Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 16/44] common: introduce structured I/O Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 17/44] ARM: cpuinfo: support structio output Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 18/44] commands: uptime: enable structured I/O Ahmad Fatoum
2025-08-11 12:27 ` [PATCH 19/44] string: implement strv_length helper Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 20/44] ARM: psci: client: add PSCI version/method parameters Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 21/44] net: move netmask_to_prefix into header Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 22/44] stringlist: implement string_list_empty Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 23/44] optee: add revision info to tee devinfo output Ahmad Fatoum
2025-08-12  9:35   ` Sascha Hauer
2025-08-12  9:44     ` Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 24/44] tee: enable structured I/O in devinfo handler Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 25/44] mtd: add devices to new mtd class Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 26/44] nvmem: add devices to new nvmem class Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 27/44] nvmem: export functions to query NVMEM size Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 28/44] video: add devices to new fb class Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 29/44] security: blobgen: add easy way to check for existent providers Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 30/44] pmdomain: add easy way to check for provider support Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 31/44] bbu: add easy way to check for existent providers Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 32/44] firmware: " Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 33/44] rtc: export rtc_class in header Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 34/44] driver: featctrl: export of_feature_controllers Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 35/44] net: dsa: export dsa_switch_list Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 36/44] usb: export usb_host_list Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 37/44] pstore: export pstore_is_ready Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 38/44] pinctrl: export pinctrl_list Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 39/44] clk: implement clk_have_nonfixed_providers Ahmad Fatoum
2025-08-13  5:38   ` Sascha Hauer
2025-08-11 12:28 ` [PATCH 40/44] driver: bus: export get_bus_by_name Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 41/44] fimware: arm_scmi: export scmi_list Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 42/44] block: define BLK_TYPE_COUNT as last enum blk_type value Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 43/44] commands: introduce bfetch command Ahmad Fatoum
2025-08-12 10:39   ` Sascha Hauer
2025-08-12 11:09     ` Ahmad Fatoum
2025-08-11 12:28 ` [PATCH 44/44] configs: enable bfetch in some popular defconfigs Ahmad Fatoum
2025-08-12 10:29 ` [PATCH 00/44] commands: add bfetch/buds of command redirection Sascha Hauer
2025-08-12 11:23   ` Ahmad Fatoum
2025-08-13  5:48 ` (subset) " Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250811122824.1667791-3-a.fatoum@barebox.org \
    --to=a.fatoum@barebox.org \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox