You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2019/01/03 14:58:53 UTC

[mynewt-core] 01/03: hw/bus: Add node initialization op for bus_dev

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

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 50ea751ab21f6b1d595f7824429ee5b7de4e9065
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Mon Dec 17 14:02:54 2018 +0100

    hw/bus: Add node initialization op for bus_dev
    
    Previously, when creating os_dev for node user
    
    With new approach there is single generic init_node function which then
    calls init_node op depending on bus where node is attached. This allows
    to prorperly initialize node regardless of which bus it is attached to
    without changing the code.
---
 hw/bus/i2c/include/bus/i2c.h    | 15 +-------------
 hw/bus/i2c/src/i2c.c            | 38 ++++++++++++++--------------------
 hw/bus/include/bus/bus_driver.h |  2 ++
 hw/bus/spi/include/bus/spi.h    |  5 +----
 hw/bus/spi/src/spi.c            | 46 ++++++++++++++++++-----------------------
 hw/bus/src/bus.c                |  8 +++++++
 6 files changed, 48 insertions(+), 66 deletions(-)

diff --git a/hw/bus/i2c/include/bus/i2c.h b/hw/bus/i2c/include/bus/i2c.h
index 3053da5..5cecfb7 100644
--- a/hw/bus/i2c/include/bus/i2c.h
+++ b/hw/bus/i2c/include/bus/i2c.h
@@ -123,19 +123,6 @@ bus_i2c_dev_create(const char *name, struct bus_i2c_dev *dev,
 }
 
 /**
- * Initialize os_dev as bus I2C node
- *
- * This can be passed as a parameter to os_dev_create() when creating os_dev
- * object for I2C node, however it's recommended to create devices using helper
- * like bus_i2c_node_create().
- *
- * @param node  Node device object
- * @param arg   Node configuration struct (struct bus_node_cfg)
- */
-int
-bus_i2c_node_init_func(struct os_dev *odev, void *arg);
-
-/**
  * Create bus I2C node
  *
  * This is a convenient helper and recommended way to create os_dev for bus I2C
@@ -155,7 +142,7 @@ bus_i2c_node_create(const char *name, struct bus_i2c_node *node,
     bnode->init_arg = arg;
 
     return os_dev_create(odev, name, OS_DEV_INIT_PRIMARY, 1,
-                         bus_i2c_node_init_func, (void *)cfg);
+                         bus_node_init_func, (void *)cfg);
 }
 
 #ifdef __cplusplus
diff --git a/hw/bus/i2c/src/i2c.c b/hw/bus/i2c/src/i2c.c
index df12c49..985416f 100644
--- a/hw/bus/i2c/src/i2c.c
+++ b/hw/bus/i2c/src/i2c.c
@@ -47,6 +47,21 @@ bus_i2c_translate_hal_error(int hal_err)
 }
 
 static int
+bus_i2c_init_node(struct bus_dev *bdev, struct bus_node *bnode, void *arg)
+{
+    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
+    struct bus_i2c_node_cfg *cfg = arg;
+
+    BUS_DEBUG_POISON_NODE(node);
+
+    node->freq = cfg->freq;
+    node->addr = cfg->addr;
+    node->quirks = cfg->quirks;
+
+    return 0;
+}
+
+static int
 bus_i2c_enable(struct bus_dev *bdev)
 {
     struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
@@ -164,6 +179,7 @@ static int bus_i2c_disable(struct bus_dev *bdev)
 }
 
 static const struct bus_dev_ops bus_i2c_ops = {
+    .init_node = bus_i2c_init_node,
     .enable = bus_i2c_enable,
     .configure = bus_i2c_configure,
     .read = bus_i2c_read,
@@ -198,25 +214,3 @@ bus_i2c_dev_init_func(struct os_dev *odev, void *arg)
 
     return 0;
 }
-
-int
-bus_i2c_node_init_func(struct os_dev *odev, void *arg)
-{
-    struct bus_i2c_node *node = (struct bus_i2c_node *)odev;
-    struct bus_i2c_node_cfg *cfg = arg;
-    struct bus_node_cfg *node_cfg = &cfg->node_cfg;
-    int rc;
-
-    BUS_DEBUG_POISON_NODE(node);
-
-    node->freq = cfg->freq;
-    node->addr = cfg->addr;
-    node->quirks = cfg->quirks;
-
-    rc = bus_node_init_func(odev, node_cfg);
-    if (rc) {
-        return rc;
-    }
-
-    return 0;
-}
diff --git a/hw/bus/include/bus/bus_driver.h b/hw/bus/include/bus/bus_driver.h
index 5ad822f..249c85f 100644
--- a/hw/bus/include/bus/bus_driver.h
+++ b/hw/bus/include/bus/bus_driver.h
@@ -49,6 +49,8 @@ STATS_SECT_END
  * These operations shall be defined by bus driver
  */
 struct bus_dev_ops {
+    /* Initialize node */
+    int (* init_node)(struct bus_dev *bus, struct bus_node *node, void *arg);
     /* Enable bus device */
     int (* enable)(struct bus_dev *bus);
     /* Configure bus for node */
diff --git a/hw/bus/spi/include/bus/spi.h b/hw/bus/spi/include/bus/spi.h
index c2ea042..7c7e05a 100644
--- a/hw/bus/spi/include/bus/spi.h
+++ b/hw/bus/spi/include/bus/spi.h
@@ -96,9 +96,6 @@ bus_spi_dev_create(const char *name, struct bus_spi_dev *dev,
                          bus_spi_dev_init_func, cfg);
 }
 
-int
-bus_spi_node_init_func(struct os_dev *odev, void *arg);
-
 static inline int
 bus_spi_node_create(const char *name, struct bus_spi_node *node,
                     const struct bus_spi_node_cfg *cfg, void *arg)
@@ -109,7 +106,7 @@ bus_spi_node_create(const char *name, struct bus_spi_node *node,
     bnode->init_arg = arg;
 
     return os_dev_create(odev, name, OS_DEV_INIT_PRIMARY, 1,
-                         bus_spi_node_init_func, (void *)cfg);
+                         bus_node_init_func, (void *)cfg);
 }
 
 #ifdef __cplusplus
diff --git a/hw/bus/spi/src/spi.c b/hw/bus/spi/src/spi.c
index 3372233..b526e22 100644
--- a/hw/bus/spi/src/spi.c
+++ b/hw/bus/spi/src/spi.c
@@ -26,6 +26,25 @@
 #include "bus/spi.h"
 
 static int
+bus_spi_init_node(struct bus_dev *bdev, struct bus_node *bnode, void *arg)
+{
+    struct bus_spi_node *node = (struct bus_spi_node *)bnode;
+    struct bus_spi_node_cfg *cfg = arg;
+
+    BUS_DEBUG_POISON_NODE(node);
+
+    node->pin_cs = cfg->pin_cs;
+    node->mode = cfg->mode;
+    node->data_order = cfg->data_order;
+    node->freq = cfg->freq;
+    node->quirks = cfg->quirks;
+
+    hal_gpio_init_out(node->pin_cs, 1);
+
+    return 0;
+}
+
+static int
 bus_spi_enable(struct bus_dev *bdev)
 {
     struct bus_spi_dev *dev = (struct bus_spi_dev *)bdev;
@@ -159,6 +178,7 @@ static int bus_spi_disable(struct bus_dev *bdev)
 }
 
 static const struct bus_dev_ops bus_spi_ops = {
+    .init_node = bus_spi_init_node,
     .enable = bus_spi_enable,
     .configure = bus_spi_configure,
     .read = bus_spi_read,
@@ -197,29 +217,3 @@ bus_spi_dev_init_func(struct os_dev *odev, void *arg)
 
     return 0;
 }
-
-int
-bus_spi_node_init_func(struct os_dev *odev, void *arg)
-{
-    struct bus_spi_node *node = (struct bus_spi_node *)odev;
-    struct bus_spi_node_cfg *cfg = arg;
-    struct bus_node_cfg *node_cfg = &cfg->node_cfg;
-    int rc;
-
-    BUS_DEBUG_POISON_NODE(node);
-
-    node->pin_cs = cfg->pin_cs;
-    node->mode = cfg->mode;
-    node->data_order = cfg->data_order;
-    node->freq = cfg->freq;
-    node->quirks = cfg->quirks;
-
-    hal_gpio_init_out(node->pin_cs, 1);
-
-    rc = bus_node_init_func(odev, node_cfg);
-    if (rc) {
-        return rc;
-    }
-
-    return 0;
-}
diff --git a/hw/bus/src/bus.c b/hw/bus/src/bus.c
index 6f987fb..107e1bf 100644
--- a/hw/bus/src/bus.c
+++ b/hw/bus/src/bus.c
@@ -151,10 +151,12 @@ bus_node_init_func(struct os_dev *odev, void *arg)
     struct bus_node *bnode = (struct bus_node *)odev;
     struct bus_node_cfg *node_cfg = arg;
     struct os_dev *parent_odev;
+    struct bus_dev *bdev;
     void *init_arg;
 #if MYNEWT_VAL(BUS_STATS_PER_NODE)
     char *stats_name;
 #endif
+    int rc;
 
     parent_odev = os_dev_lookup(node_cfg->bus_name);
     if (!parent_odev) {
@@ -167,6 +169,12 @@ bus_node_init_func(struct os_dev *odev, void *arg)
     init_arg = bnode->init_arg;
     bnode->parent_bus = (struct bus_dev *)parent_odev;
 
+    bdev = (struct bus_dev *)parent_odev;
+    rc = bdev->dops->init_node(bdev, bnode, arg);
+    if (rc) {
+        return rc;
+    }
+
     if (node_cfg->lock_timeout_ms) {
         bnode->lock_timeout = os_time_ms_to_ticks32(node_cfg->lock_timeout_ms);
     } else {