diff options
Diffstat (limited to 'bsps/arm/shared/clock/clock-a9mpcore.c')
-rw-r--r-- | bsps/arm/shared/clock/clock-a9mpcore.c | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/bsps/arm/shared/clock/clock-a9mpcore.c b/bsps/arm/shared/clock/clock-a9mpcore.c index 6eaea05baf..c393933c81 100644 --- a/bsps/arm/shared/clock/clock-a9mpcore.c +++ b/bsps/arm/shared/clock/clock-a9mpcore.c @@ -1,15 +1,37 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup A9MPCoreSupport + * + * @brief This source file contains the Clock Driver for Cortex-A9 MPCore + * compatible devices. + */ + /* - * Copyright (c) 2013, 2016 embedded brains GmbH. All rights reserved. + * Copyright (C) 2013, 2016 embedded brains GmbH & Co. KG * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@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. * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. + * 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.h> @@ -25,32 +47,33 @@ static struct timecounter a9mpcore_tc; -/* This is defined in dev/clock/clockimpl.h */ -void Clock_isr(rtems_irq_hdl_param arg); - __attribute__ ((weak)) uint32_t a9mpcore_clock_periphclk(void) { /* default to the BSP option. */ return BSP_ARM_A9MPCORE_PERIPHCLK; } -static void a9mpcore_clock_at_tick(void) +static void a9mpcore_clock_at_tick(volatile a9mpcore_gt *gt) { - volatile a9mpcore_gt *gt = A9MPCORE_GT; - gt->irqst = A9MPCORE_GT_IRQST_EFLG; } -static void a9mpcore_clock_handler_install(void) +static rtems_interrupt_entry a9mpcore_clock_interrupt_entry; + +static void a9mpcore_clock_handler_install(rtems_interrupt_handler handler) { rtems_status_code sc; - sc = rtems_interrupt_handler_install( + rtems_interrupt_entry_initialize( + &a9mpcore_clock_interrupt_entry, + handler, + RTEMS_DEVOLATILE(a9mpcore_gt *, A9MPCORE_GT), + "Clock" + ); + sc = rtems_interrupt_entry_install( A9MPCORE_IRQ_GT, - "Clock", RTEMS_INTERRUPT_UNIQUE, - (rtems_interrupt_handler) Clock_isr, - NULL + &a9mpcore_clock_interrupt_entry ); if (sc != RTEMS_SUCCESSFUL) { bsp_fatal(BSP_ARM_A9MPCORE_FATAL_CLOCK_IRQ_INSTALL); @@ -135,7 +158,7 @@ static void a9mpcore_clock_initialize(void) volatile a9mpcore_gt *gt = A9MPCORE_GT; uint64_t periphclk = a9mpcore_clock_periphclk(); uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick(); - uint32_t interval = (uint32_t) ((periphclk * us_per_tick) / 1000000); + uint32_t interval = (uint32_t) ((periphclk * us_per_tick) / 1000000) - 1; uint64_t cmpval; gt->ctrl &= A9MPCORE_GT_CTRL_TMR_EN; @@ -166,14 +189,14 @@ CPU_Counter_ticks _CPU_Counter_read(void) return gt->cntrlower; } -#define Clock_driver_support_at_tick() \ - a9mpcore_clock_at_tick() +#define Clock_driver_support_at_tick(arg) \ + a9mpcore_clock_at_tick(arg) #define Clock_driver_support_initialize_hardware() \ a9mpcore_clock_initialize() #define Clock_driver_support_install_isr(isr) \ - a9mpcore_clock_handler_install() + a9mpcore_clock_handler_install(isr) /* Include shared source clock driver code */ #include "../../shared/dev/clock/clockimpl.h" |