summaryrefslogtreecommitdiffstats
path: root/bsps/shared/irq/irq-entry-remove.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-06-25 15:52:16 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-07-26 19:57:31 +0200
commite5183238723bb35f5f5d2f0624b821f75f8b424b (patch)
tree6c410c8ae06dfeb9abaee226d7fdf025095d9dac /bsps/shared/irq/irq-entry-remove.c
parentbsps/irq: Move bsp_interrupt_handler_is_empty() (diff)
downloadrtems-e5183238723bb35f5f5d2f0624b821f75f8b424b.tar.bz2
bsps/irq: Add rtems_interrupt_entry_install()
Add rtems_interrupt_entry_remove(). Split up irq-generic.c into several files. In particular, place all functions which use dynamic memory into their own file. Add optional macros to let the BSP customize the vector installation after installing the first entry and the vector removal before removing the last entry: * bsp_interrupt_vector_install() * bsp_interrupt_vector_remove() Use these new customization options in the m68k/genmcf548x BSP so re-use the generic interrupt controller support. Update #3269.
Diffstat (limited to '')
-rw-r--r--bsps/shared/irq/irq-entry-remove.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/bsps/shared/irq/irq-entry-remove.c b/bsps/shared/irq/irq-entry-remove.c
new file mode 100644
index 0000000000..3e5fd33fbe
--- /dev/null
+++ b/bsps/shared/irq/irq-entry-remove.c
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup bsp_interrupt
+ *
+ * @brief This source file contains the implementation of
+ * rtems_interrupt_entry_remove() and bsp_interrupt_entry_remove().
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <bsp/irq-generic.h>
+
+void bsp_interrupt_entry_remove(
+ rtems_vector_number vector,
+ rtems_interrupt_entry *entry,
+ rtems_interrupt_entry **previous_next
+)
+{
+ rtems_vector_number index;
+ rtems_interrupt_entry *first;
+ rtems_interrupt_entry *entry_next;
+
+ index = bsp_interrupt_handler_index( vector );
+ first = bsp_interrupt_handler_table[ index ];
+ entry_next = entry->next;
+
+ if ( entry == first && entry_next == NULL ) {
+ /* We remove the last installed entry */
+ bsp_interrupt_vector_disable( vector );
+#if defined(bsp_interrupt_vector_remove)
+ bsp_interrupt_vector_remove( vector );
+#else
+ bsp_interrupt_vector_disable( vector );
+#endif
+ bsp_interrupt_set_handler_unique( index, false );
+#if defined(BSP_INTERRUPT_USE_INDEX_TABLE)
+ bsp_interrupt_handler_index_table[ vector ] = 0;
+#endif
+ }
+
+ bsp_interrupt_entry_store_release( previous_next, entry_next );
+}
+
+static rtems_status_code bsp_interrupt_entry_do_remove(
+ rtems_vector_number vector,
+ rtems_interrupt_entry *entry
+)
+{
+ rtems_interrupt_entry *installed;
+ rtems_interrupt_entry **previous_next;
+
+ installed = bsp_interrupt_entry_find(
+ vector,
+ entry->handler,
+ entry->arg,
+ &previous_next
+ );
+
+ if ( installed != entry ) {
+ return RTEMS_UNSATISFIED;
+ }
+
+ bsp_interrupt_entry_remove( vector, entry, previous_next );
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_status_code rtems_interrupt_entry_remove(
+ rtems_vector_number vector,
+ rtems_interrupt_entry *entry
+)
+{
+ rtems_status_code sc;
+
+ if ( entry == NULL ) {
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ sc = bsp_interrupt_check_and_lock( vector, entry->handler );
+
+ if ( sc != RTEMS_SUCCESSFUL ) {
+ return sc;
+ }
+
+ sc = bsp_interrupt_entry_do_remove( vector, entry );
+ bsp_interrupt_unlock();
+
+ return sc;
+}