drivers/rpmsg: unitfy the rpmsg signals from transport to struct rpmsg_s

Now all the rpmsg transport use the signals in struct rpmsg_s instead
add element in its own private struct.

Signed-off-by: yintao <yintao@xiaomi.com>
This commit is contained in:
yintao 2025-01-12 19:18:01 +08:00 committed by Alan C. Assis
parent 49f94e5e95
commit 492abaa052
7 changed files with 21 additions and 38 deletions

View file

@ -220,17 +220,7 @@ int rpmsg_get_signals(FAR struct rpmsg_device *rdev)
{
FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev);
if (rpmsg == NULL)
{
return -EINVAL;
}
if (rpmsg->ops->get_signals != NULL)
{
return rpmsg->ops->get_signals(rpmsg);
}
return 0;
return atomic_read(&rpmsg->signals);
}
int rpmsg_register_callback(FAR void *priv,
@ -528,6 +518,7 @@ int rpmsg_register(FAR const char *path, FAR struct rpmsg_s *rpmsg,
metal_list_init(&rpmsg->bind);
nxrmutex_init(&rpmsg->lock);
rpmsg->ops = ops;
atomic_store(&rpmsg->signals, RPMSG_SIGNAL_RUNNING);
/* Add priv to list */
@ -592,3 +583,10 @@ void rpmsg_dump_all(void)
{
rpmsg_ioctl(NULL, RPMSGIOC_DUMP, 0);
}
void rpmsg_modify_signals(FAR struct rpmsg_s *rpmsg,
int setflags, int clrflags)
{
atomic_fetch_and(&rpmsg->signals, ~clrflags);
atomic_fetch_or(&rpmsg->signals, setflags);
}

View file

@ -51,7 +51,6 @@ static FAR const char *
rpmsg_port_get_local_cpuname(FAR struct rpmsg_s *rpmsg);
static FAR const char *rpmsg_port_get_cpuname(FAR struct rpmsg_s *rpmsg);
static void rpmsg_port_dump(FAR struct rpmsg_s *rpmsg);
static int rpmsg_port_get_signals(FAR struct rpmsg_s *rpmsg);
/****************************************************************************
* Private Data
@ -66,7 +65,6 @@ static const struct rpmsg_ops_s g_rpmsg_port_ops =
rpmsg_port_dump,
rpmsg_port_get_local_cpuname,
rpmsg_port_get_cpuname,
rpmsg_port_get_signals,
};
/****************************************************************************
@ -566,17 +564,6 @@ static FAR const char *rpmsg_port_get_cpuname(FAR struct rpmsg_s *rpmsg)
return port->cpuname;
}
/****************************************************************************
* Name: rpmsg_port_get_signals
****************************************************************************/
static int rpmsg_port_get_signals(FAR struct rpmsg_s *rpmsg)
{
FAR struct rpmsg_port_s *port = (FAR struct rpmsg_port_s *)rpmsg;
return atomic_read(&port->signals);
}
/****************************************************************************
* Public Functions
****************************************************************************/
@ -769,7 +756,6 @@ int rpmsg_port_register(FAR struct rpmsg_port_s *port,
return ret;
}
atomic_fetch_or(&port->signals, RPMSG_SIGNAL_RUNNING);
rpmsg_register_endpoint(&port->rdev, &port->rdev.ns_ept, "NS",
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
rpmsg_port_ns_callback, NULL, port);

View file

@ -29,8 +29,6 @@
#include <stdbool.h>
#include <nuttx/atomic.h>
#include <nuttx/list.h>
#include <nuttx/spinlock.h>
#include <nuttx/semaphore.h>
@ -131,10 +129,6 @@ struct rpmsg_port_s
char cpuname[RPMSG_NAME_SIZE];
/* Remote cpu status */
atomic_t signals;
/* Ops need implemented by drivers under port layer */
const FAR struct rpmsg_port_ops_s *ops;

View file

@ -321,11 +321,11 @@ static void rpmsg_port_spi_complete_handler(FAR void *arg)
if (rpspi->rxhdr->cmd == RPMSG_PORT_SPI_CMD_SUSPEND)
{
atomic_fetch_and(&rpspi->port.signals, ~RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpspi->port.rpmsg, 0, RPMSG_SIGNAL_RUNNING);
}
else if (rpspi->rxhdr->cmd == RPMSG_PORT_SPI_CMD_RESUME)
{
atomic_fetch_or(&rpspi->port.signals, RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpspi->port.rpmsg, RPMSG_SIGNAL_RUNNING, 0);
}
else if (rpspi->rxhdr->cmd != RPMSG_PORT_SPI_CMD_AVAIL)
{

View file

@ -382,11 +382,11 @@ static void rpmsg_port_spi_slave_notify(FAR struct spi_slave_dev_s *dev,
if (rpspi->rxhdr->cmd == RPMSG_PORT_SPI_CMD_SUSPEND)
{
atomic_fetch_and(&rpspi->port.signals, ~RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpspi->port.rpmsg, 0, RPMSG_SIGNAL_RUNNING);
}
else if (rpspi->rxhdr->cmd == RPMSG_PORT_SPI_CMD_RESUME)
{
atomic_fetch_or(&rpspi->port.signals, RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpspi->port.rpmsg, RPMSG_SIGNAL_RUNNING, 0);
}
else if (rpspi->rxhdr->cmd != RPMSG_PORT_SPI_CMD_AVAIL)
{

View file

@ -379,14 +379,16 @@ static int rpmsg_port_uart_rx_thread(int argc, FAR char *argv[])
else if (buf[i] == RPMSG_PORT_UART_SUSPEND)
{
rpmsgdbg("Received suspend command\n");
atomic_fetch_and(&rpuart->port.signals, ~RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpuart->port.rpmsg,
0, RPMSG_SIGNAL_RUNNING);
nxsem_wait(&rpuart->wake);
continue;
}
else if (buf[i] == RPMSG_PORT_UART_RESUME)
{
rpmsgdbg("Received resume command\n");
atomic_fetch_or(&rpuart->port.signals, RPMSG_SIGNAL_RUNNING);
rpmsg_modify_signals(&rpuart->port.rpmsg,
RPMSG_SIGNAL_RUNNING, 0);
nxsem_post(&rpuart->wake);
continue;
}

View file

@ -31,6 +31,7 @@
#ifdef CONFIG_RPMSG
#include <metal/atomic.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/rpmsg/rpmsg_ping.h>
#include <openamp/rpmsg.h>
@ -63,6 +64,7 @@ struct rpmsg_s
#ifdef CONFIG_RPMSG_TEST
struct rpmsg_endpoint test;
#endif
atomic_int signals;
struct rpmsg_device rdev[0];
};
@ -82,7 +84,6 @@ struct rpmsg_ops_s
CODE void (*dump)(FAR struct rpmsg_s *rpmsg);
CODE FAR const char *(*get_local_cpuname)(FAR struct rpmsg_s *rpmsg);
CODE FAR const char *(*get_cpuname)(FAR struct rpmsg_s *rpmsg);
CODE int (*get_signals)(FAR struct rpmsg_s *rpmsg);
};
CODE typedef void (*rpmsg_dev_cb_t)(FAR struct rpmsg_device *rdev,
@ -112,6 +113,8 @@ int rpmsg_post(FAR struct rpmsg_endpoint *ept, FAR sem_t *sem);
FAR const char *rpmsg_get_local_cpuname(FAR struct rpmsg_device *rdev);
FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev);
int rpmsg_get_signals(FAR struct rpmsg_device *rdev);
void rpmsg_modify_signals(FAR struct rpmsg_s *rpmsg,
int setflags, int clrflags);
static inline_function bool rpmsg_is_running(FAR struct rpmsg_device *rdev)
{