This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 0bfb850b52 drivers/serial/uart_rpmsg: simplify initialization process 
of uart_rpmsg
0bfb850b52 is described below

commit 0bfb850b5266c408f278a0b7b59362f4f1074a1b
Author: chao an <anchao.arc...@bytedance.com>
AuthorDate: Wed Apr 2 14:36:49 2025 +0800

    drivers/serial/uart_rpmsg: simplify initialization process of uart_rpmsg
    
    Merge multiple heap allocate into one
    
    Signed-off-by: chao an <anchao.arc...@bytedance.com>
---
 drivers/serial/uart_rpmsg.c | 66 ++++++++++++++++-----------------------------
 1 file changed, 23 insertions(+), 43 deletions(-)

diff --git a/drivers/serial/uart_rpmsg.c b/drivers/serial/uart_rpmsg.c
index 7a8e2e828a..2fc7d273f3 100644
--- a/drivers/serial/uart_rpmsg.c
+++ b/drivers/serial/uart_rpmsg.c
@@ -417,43 +417,30 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const 
char *devname,
 {
   FAR struct uart_rpmsg_priv_s *priv;
   FAR struct uart_dev_s *dev;
-  char dev_name[32];
-  int ret = -ENOMEM;
+  char name[32];
+  int ret;
 
-  dev = kmm_zalloc(sizeof(struct uart_dev_s));
-  if (!dev)
+  dev = kmm_zalloc(sizeof(struct uart_dev_s) +
+                   sizeof(struct uart_rpmsg_priv_s) +
+                   buf_size * 2);
+  if (dev == NULL)
     {
-      return ret;
-    }
-
-  dev->ops       = &g_uart_rpmsg_ops;
-  dev->isconsole = isconsole;
-  dev->recv.size = buf_size;
-  dev->xmit.size = buf_size;
-
-  dev->recv.buffer = kmm_malloc(dev->recv.size);
-  if (!dev->recv.buffer)
-    {
-      goto fail;
-    }
-
-  dev->xmit.buffer = kmm_malloc(dev->xmit.size);
-  if (!dev->xmit.buffer)
-    {
-      goto fail;
+      return -ENOMEM;
     }
 
-  priv = kmm_zalloc(sizeof(struct uart_rpmsg_priv_s));
-  if (!priv)
-    {
-      goto fail;
-    }
+  dev->ops         = &g_uart_rpmsg_ops;
+  dev->isconsole   = isconsole;
+  dev->recv.size   = buf_size;
+  dev->xmit.size   = buf_size;
+  dev->priv        = dev + 1;
+  dev->recv.buffer = (FAR char *)dev->priv +
+                     sizeof(struct uart_rpmsg_priv_s);
+  dev->xmit.buffer = dev->recv.buffer + buf_size;
+  priv             = dev->priv;
+  priv->cpuname    = cpuname;
+  priv->devname    = devname;
 
   nxmutex_init(&priv->lock);
-  priv->cpuname = cpuname;
-  priv->devname = devname;
-
-  dev->priv = priv;
 
   ret = rpmsg_register_callback(dev,
                                 uart_rpmsg_device_created,
@@ -463,25 +450,18 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const 
char *devname,
   if (ret < 0)
     {
       nxmutex_destroy(&priv->lock);
-      goto fail;
+      kmm_free(dev);
+      return ret;
     }
 
-  snprintf(dev_name, sizeof(dev_name), "%s%s",
+  snprintf(name, sizeof(name), "%s%s",
            UART_RPMSG_DEV_PREFIX, devname);
-  uart_register(dev_name, dev);
+  uart_register(name, dev);
 
   if (dev->isconsole)
     {
       uart_register(UART_RPMSG_DEV_CONSOLE, dev);
     }
 
-  return OK;
-
-fail:
-  kmm_free(dev->recv.buffer);
-  kmm_free(dev->xmit.buffer);
-  kmm_free(dev->priv);
-  kmm_free(dev);
-
-  return ret;
+  return 0;
 }

Reply via email to