[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20251223183142.31897-3-damien.riegel@silabs.com>
Date: Tue, 23 Dec 2025 13:31:36 -0500
From: Damien Riégel <damien.riegel@...abs.com>
To: greybus-dev@...ts.linaro.org
Cc: linux-kernel@...r.kernel.org, Johan Hovold <johan@...nel.org>,
Alex Elder <elder@...nel.org>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
linux-devel@...abs.com,
Damien Riégel <damien.riegel@...abs.com>
Subject: [PATCH 2/8] greybus: let gb_interface_create take additional p2p argument
Update the function that creates an interface to take an additional
boolean argument to indicate if the interface is point to point or not.
If this argument is true, interface's type and ID are immediately set,
and a different group of attributes is set on the interface device, as
there is no way to fetch greybus attributes (vendor ID, product ID,
serial number) or Unipro attributes (ddbl1 manufacturer and product ID)
when SVC is absent, and so it doesn't make sense to expose them.
Signed-off-by: Damien Riégel <damien.riegel@...abs.com>
---
drivers/greybus/interface.c | 20 ++++++++++++++++----
drivers/greybus/module.c | 2 +-
include/linux/greybus/interface.h | 3 ++-
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/greybus/interface.c b/drivers/greybus/interface.c
index e96b58b211b..aa2bd841977 100644
--- a/drivers/greybus/interface.c
+++ b/drivers/greybus/interface.c
@@ -687,6 +687,12 @@ static const struct attribute_group *interface_groups[] = {
NULL
};
+static const struct attribute_group *interface_groups_p2p[] = {
+ &interface_greybus_group,
+ &interface_common_group,
+ NULL
+};
+
static void gb_interface_release(struct device *dev)
{
struct gb_interface *intf = to_gb_interface(dev);
@@ -790,7 +796,8 @@ const struct device_type greybus_interface_type = {
* failure occurs due to memory exhaustion.
*/
struct gb_interface *gb_interface_create(struct gb_module *module,
- u8 interface_id)
+ u8 interface_id,
+ bool p2p)
{
struct gb_host_device *hd = module->hd;
struct gb_interface *intf;
@@ -808,13 +815,18 @@ struct gb_interface *gb_interface_create(struct gb_module *module,
INIT_WORK(&intf->mode_switch_work, gb_interface_mode_switch_work);
init_completion(&intf->mode_switch_completion);
- /* Invalid device id to start with */
- intf->device_id = GB_INTERFACE_DEVICE_ID_BAD;
+ if (p2p) {
+ intf->device_id = GB_SVC_DEVICE_ID_MIN;
+ intf->type = GB_INTERFACE_TYPE_P2P;
+ } else {
+ /* Invalid device id to start with */
+ intf->device_id = GB_INTERFACE_DEVICE_ID_BAD;
+ }
intf->dev.parent = &module->dev;
intf->dev.bus = &greybus_bus_type;
intf->dev.type = &greybus_interface_type;
- intf->dev.groups = interface_groups;
+ intf->dev.groups = p2p ? interface_groups_p2p : interface_groups;
intf->dev.dma_mask = module->dev.dma_mask;
device_initialize(&intf->dev);
dev_set_name(&intf->dev, "%s.%u", dev_name(&module->dev),
diff --git a/drivers/greybus/module.c b/drivers/greybus/module.c
index 7f7153a1dd6..4ed68550d32 100644
--- a/drivers/greybus/module.c
+++ b/drivers/greybus/module.c
@@ -113,7 +113,7 @@ struct gb_module *gb_module_create(struct gb_host_device *hd, u8 module_id,
trace_gb_module_create(module);
for (i = 0; i < num_interfaces; ++i) {
- intf = gb_interface_create(module, module_id + i);
+ intf = gb_interface_create(module, module_id + i, false);
if (!intf) {
dev_err(&module->dev, "failed to create interface %u\n",
module_id + i);
diff --git a/include/linux/greybus/interface.h b/include/linux/greybus/interface.h
index fed6356eb13..dee42859ebe 100644
--- a/include/linux/greybus/interface.h
+++ b/include/linux/greybus/interface.h
@@ -70,7 +70,8 @@ struct gb_interface {
#define to_gb_interface(d) container_of(d, struct gb_interface, dev)
struct gb_interface *gb_interface_create(struct gb_module *module,
- u8 interface_id);
+ u8 interface_id,
+ bool p2p);
int gb_interface_activate(struct gb_interface *intf);
void gb_interface_deactivate(struct gb_interface *intf);
int gb_interface_enable(struct gb_interface *intf);
--
2.49.0
Powered by blists - more mailing lists