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 {