On 4/28/2026 8:13 PM, Shenwei Wang wrote:
-----Original Message-----
From: Beleswar Prasad Padhi <[email protected]>
Sent: Tuesday, April 28, 2026 2:25 AM
To: Shenwei Wang <[email protected]>; Linus Walleij
<[email protected]>; Bartosz Golaszewski <[email protected]>; Jonathan Corbet
<[email protected]>; Rob Herring <[email protected]>; Krzysztof Kozlowski
<[email protected]>; Conor Dooley <[email protected]>; Bjorn Andersson
<[email protected]>; Mathieu Poirier <[email protected]>; Frank Li
<[email protected]>; Sascha Hauer <[email protected]>
Cc: Shuah Khan <[email protected]>; [email protected]; linux-
[email protected]; [email protected]; Pengutronix Kernel Team
<[email protected]>; Fabio Estevam <[email protected]>; Peng Fan
<[email protected]>; [email protected]; linux-
[email protected]; [email protected]; linux-arm-
[email protected]; dl-linux-imx <[email protected]>; Bartosz
Golaszewski <[email protected]>; Andrew Lunn <[email protected]>
Subject: [EXT] Re: [PATCH v13 3/4] gpio: rpmsg: add generic rpmsg GPIO driver
On 28/04/26 00:53, Shenwei Wang wrote:
[...]
+ void *channel_devices[MAX_PORT_PER_CHANNEL];
So this is technically a rpmsg endpoint (struct rpmsg_endpoint)
without naming it "endpoint". Every rpmsg endpoint has a reference to
its parent rpmsg channel (struct rpmsg_device) which represents the
same information here. So we should use the framework standard here.
Yes, agree to use "endpoint_devices".
I did not mean to say to just change the variable name from "channel_devices" to
"endpoint_devices". Infact you would not need to have this field & struct
anymore.
Pseudo-code:
1. Add a 'struct rpmsg_endpoint *ept' field to struct rpmsg_gpio_port
to maintain the ept to port idx map.
2. Call port->ept = rpmsg_create_ept(rpdev,
rpmsg_gpio_channel_callback,
port,
{rpdev.id.name,
RPMSG_ADDR_ANY,
RPMSG_ADDR_ANY})
from rpmsg_gpiochip_register().
On the Linux side, we invoke rpmsg_create_ept. What is expected from the remote
system in this case?
Nothing extra in my opinion. rpmsg_create_ept() just creates a dynamic
local endpoint address for Linux's usage. The firmware just has to make
sure to reply to the same endpoint address where it received the
message. This should already be in place IMO, because currently you are
sending all messages in the default endpoint (rpdev->ept) which is also
dynamic[1] and is created when the channel is created. And you receive
the responses correctly. (Unless you have hard-coded the default ept
address in the firmware)
[1]:
https://github.com/torvalds/linux/blob/master/drivers/rpmsg/rpmsg_core.c#L480
(chinfo.src is RPMSG_ADDR_ANY)
Thanks,
Beleswar
If the remote side does not need any extra support, this would be an excellent
solution.
Thanks,
Shenwei
3. Send msgs from local ept in rpmsg_gpio_send_message() by:
rpmsg_send(port->ept, msg, sizeof(*msg));
4. Get the port info in rpmsg_gpio_channel_callback() by:
struct rpmsg_gpio_port *port = priv;
Which also eliminates the need for struct rpdev_drvdata as you can just do
rpmsg_get_rproc_node_name(rpdev) from rpmsg_gpiochip_register().