Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop 0fc206fb9 -> e343a7bbd


os; move call to os_dev_initialize() to take place from within
sysinit. If device gets created after OS is started, call it's
init routine immediatelly.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/fc601297
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/fc601297
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/fc601297

Branch: refs/heads/develop
Commit: fc601297ce3205b6d1ec40b285eba281aec98415
Parents: 0fc206f
Author: Marko Kiiskila <[email protected]>
Authored: Thu Jan 26 10:07:23 2017 -0800
Committer: Marko Kiiskila <[email protected]>
Committed: Thu Jan 26 10:07:23 2017 -0800

----------------------------------------------------------------------
 kernel/os/src/os.c     |  8 +++++---
 kernel/os/src/os_dev.c | 44 +++++++++++++++++++++++++++++++++-----------
 2 files changed, 38 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc601297/kernel/os/src/os.c
----------------------------------------------------------------------
diff --git a/kernel/os/src/os.c b/kernel/os/src/os.c
index edbadbc..754dcea 100644
--- a/kernel/os/src/os.c
+++ b/kernel/os/src/os.c
@@ -208,9 +208,6 @@ os_start(void)
 #if MYNEWT_VAL(OS_SCHEDULING)
     os_error_t err;
 
-    err = os_dev_initialize_all(OS_DEV_INIT_KERNEL);
-    assert(err == OS_OK);
-
     /* Enable the watchdog prior to starting the OS */
     hal_watchdog_enable();
 
@@ -224,9 +221,14 @@ os_start(void)
 void
 os_pkg_init(void)
 {
+    os_error_t err;
+
     /* Ensure this function only gets called by sysinit. */
     SYSINIT_ASSERT_ACTIVE();
 
+    err = os_dev_initialize_all(OS_DEV_INIT_KERNEL);
+    assert(err == OS_OK);
+
     os_msys_init();
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc601297/kernel/os/src/os_dev.c
----------------------------------------------------------------------
diff --git a/kernel/os/src/os_dev.c b/kernel/os/src/os_dev.c
index fafb6cc..139fe13 100644
--- a/kernel/os/src/os_dev.c
+++ b/kernel/os/src/os_dev.c
@@ -91,6 +91,32 @@ os_dev_add(struct os_dev *dev)
     return (0);
 }
 
+/**
+ * Call device initialize routine, and mark it ready. This is a private
+ * function.
+ *
+ * @param dev The device to initialize.
+ *
+ * @return 0 on success, non-zero on failure.
+ */
+static int
+os_dev_initialize(struct os_dev *dev)
+{
+    int rc;
+
+    rc = dev->od_init(dev, dev->od_init_arg);
+    if (rc != 0) {
+        if (dev->od_flags & OS_DEV_F_INIT_CRITICAL) {
+            goto err;
+        }
+    } else {
+        dev->od_flags |= OS_DEV_F_STATUS_READY;
+    }
+    return 0;
+err:
+    return rc;
+}
+
 
 /**
  * Create a new device in the kernel.
@@ -122,7 +148,9 @@ os_dev_create(struct os_dev *dev, char *name, uint8_t stage,
         goto err;
     }
 
-    return (0);
+    if (g_os_started) {
+        rc = os_dev_initialize(dev);
+    }
 err:
     return (rc);
 }
@@ -138,23 +166,17 @@ int
 os_dev_initialize_all(uint8_t stage)
 {
     struct os_dev *dev;
-    int rc;
+    int rc = 0;
 
     STAILQ_FOREACH(dev, &g_os_dev_list, od_next) {
         if (dev->od_stage == stage) {
-            rc = dev->od_init(dev, dev->od_init_arg);
-            if (rc != 0) {
-                if (dev->od_flags & OS_DEV_F_INIT_CRITICAL) {
-                    goto err;
-                }
-            } else {
-                dev->od_flags |= OS_DEV_F_STATUS_READY;
+            rc = os_dev_initialize(dev);
+            if (rc) {
+                break;
             }
         }
     }
 
-    return (0);
-err:
     return (rc);
 }
 

Reply via email to