[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/kernel/semaphore.c b/src/bsp/lk/kernel/semaphore.c
new file mode 100644
index 0000000..219360a
--- /dev/null
+++ b/src/bsp/lk/kernel/semaphore.c
@@ -0,0 +1,101 @@
+/* semaphore.c
+ *
+ * Copyright 2012 Christopher Anderson <chris@nullcode.org>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <debug.h>
+#include <err.h>
+#include <kernel/semaphore.h>
+#include <kernel/thread.h>
+
+void sem_init(semaphore_t *sem, unsigned int value)
+{
+ *sem = (semaphore_t)SEMAPHORE_INITIAL_VALUE(*sem, value);
+}
+
+void sem_destroy(semaphore_t *sem)
+{
+ THREAD_LOCK(state);
+ sem->count = 0;
+ wait_queue_destroy(&sem->wait, true);
+ THREAD_UNLOCK(state);
+}
+
+int sem_post(semaphore_t *sem, bool resched)
+{
+ int ret = 0;
+
+ THREAD_LOCK(state);
+
+ /*
+ * If the count is or was negative then a thread is waiting for a resource, otherwise
+ * it's safe to just increase the count available with no downsides
+ */
+ if (unlikely(++sem->count <= 0))
+ ret = wait_queue_wake_one(&sem->wait, resched, NO_ERROR);
+
+ THREAD_UNLOCK(state);
+
+ return ret;
+}
+
+status_t sem_wait(semaphore_t *sem)
+{
+ status_t ret = NO_ERROR;
+ THREAD_LOCK(state);
+
+ /*
+ * If there are no resources available then we need to
+ * sit in the wait queue until sem_post adds some.
+ */
+ if (unlikely(--sem->count < 0))
+ ret = wait_queue_block(&sem->wait, INFINITE_TIME);
+
+ THREAD_UNLOCK(state);
+ return ret;
+}
+
+status_t sem_trywait(semaphore_t *sem)
+{
+ status_t ret = NO_ERROR;
+ THREAD_LOCK(state);
+
+ if (unlikely(sem->count <= 0))
+ ret = ERR_NOT_READY;
+ else
+ sem->count--;
+
+ THREAD_UNLOCK(state);
+ return ret;
+}
+
+status_t sem_timedwait(semaphore_t *sem, lk_time_t timeout)
+{
+ status_t ret = NO_ERROR;
+ THREAD_LOCK(state);
+
+ if (unlikely(--sem->count < 0)) {
+ ret = wait_queue_block(&sem->wait, timeout);
+ if (ret < NO_ERROR) {
+ if (ret == ERR_TIMED_OUT) {
+ sem->count++;
+ }
+ }
+ }
+
+ THREAD_UNLOCK(state);
+ return ret;
+}
+
+/* vim: set noexpandtab: */