bsps/arm/imxrt: Add FDT and FDT helper for QTMR

Makes it simpler to access the QTMR in an application via a FDT name or
link in an application specific FDT entry.
This commit is contained in:
Christian Mauderer
2021-03-21 12:30:29 +01:00
committed by Christian Mauderer
parent 53bd5e3246
commit 65ab1cda10
4 changed files with 295 additions and 141 deletions
File diff suppressed because it is too large Load Diff
+34
View File
@@ -8,6 +8,9 @@
#define _FSL_QTMR_H_
#include "fsl_common.h"
#ifdef __rtems__
#include <rtems.h>
#endif /* __rtems__ */
/*!
* @addtogroup qtmr
@@ -177,6 +180,37 @@ extern "C" {
* @name Initialization and deinitialization
* @{
*/
#ifdef __rtems__
/*!
* @brief Return the timer base based on a FDT node.
*
* @param fdt Pointer to the fdt
* @param node The FDT node
*
* @return Pointer to the timer. NULL on error (for example if node isn't
* compatible).
*/
TMR_Type *QTMR_get_regs_from_fdt(const void *fdt, int node);
/*!
* @brief Return the timer IRQ vector based on a FDT node.
*
* @param fdt Pointer to the fdt
* @param node The FDT node
*
* @return IRQ vector number. BSP_INTERRUPT_VECTOR_INVALID on error.
*/
rtems_vector_number QTMR_get_IRQ_from_fdt(const void *fdt, int node);
/*!
* @brief Return the clock source frequency of the quad timer.
*
* @param base Quad Timer peripheral base address.
*
* @return IRQ vector number. BSP_INTERRUPT_VECTOR_INVALID on error.
*/
uint32_t QTMR_get_src_clk(TMR_Type *base);
#endif /* __rtems__ */
/*!
* @brief Ungates the Quad Timer clock and configures the peripheral for basic operation.
@@ -101,6 +101,30 @@
reg = <0x40100000 0x00100000>;
ranges;
qtimer4: timer@401e8000 {
compatible = "nxp,imxrt-qtimer";
reg = <0x401e8000 0x4000>;
interrupts = <136>;
};
qtimer3: timer@401e4000 {
compatible = "nxp,imxrt-qtimer";
reg = <0x401e4000 0x4000>;
interrupts = <135>;
};
qtimer2: timer@401e0000 {
compatible = "nxp,imxrt-qtimer";
reg = <0x401e0000 0x4000>;
interrupts = <134>;
};
qtimer1: timer@401dc000 {
compatible = "nxp,imxrt-qtimer";
reg = <0x401dc000 0x4000>;
interrupts = <133>;
};
gpio4: gpio@401c4000 {
compatible = "fsl,imxrt-gpio",
"fsl,imx6ul-gpio", "fsl,imx35-gpio";
@@ -6,6 +6,11 @@
*/
#include "fsl_qtmr.h"
#ifdef __rtems__
#include <bsp.h>
#include <bsp/irq.h>
#include <libfdt.h>
#endif /* __rtems__ */
/* Component ID definition, used by tools. */
#ifndef FSL_COMPONENT_ID
@@ -56,6 +61,41 @@ static uint32_t QTMR_GetInstance(TMR_Type *base)
return instance;
}
#ifdef __rtems__
TMR_Type *QTMR_get_regs_from_fdt(const void *fdt, int node)
{
int rv;
TMR_Type *regs;
rv = fdt_node_check_compatible(fdt, node, "nxp,imxrt-qtimer");
if (rv != 0) {
return NULL;
}
regs = imx_get_reg_of_node(fdt, node);
return regs;
}
rtems_vector_number QTMR_get_IRQ_from_fdt(const void *fdt, int node)
{
int rv;
rtems_vector_number irq;
rv = fdt_node_check_compatible(fdt, node, "nxp,imxrt-qtimer");
if (rv != 0) {
return BSP_INTERRUPT_VECTOR_INVALID;
}
irq = imx_get_irq_of_node(fdt, node, 0);
return irq;
}
uint32_t QTMR_get_src_clk(TMR_Type *base)
{
(void) base;
return CLOCK_GetFreq(kCLOCK_IpgClk);
}
#endif /* __rtems__ */
/*!
* brief Ungates the Quad Timer clock and configures the peripheral for basic operation.
*