use small lock in:
arch/arm/src/imxrt/imxrt_wdog.c arch/arm/src/kinetis/kinetis_edma.c arch/arm/src/lc823450/lc823450_dvfs2.c arch/arm/src/lc823450/lc823450_timer.c arch/arm/src/lpc54xx/lpc54_lowputc.c Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
parent
b3813bd450
commit
46c2d46a6b
6 changed files with 80 additions and 63 deletions
|
@ -73,6 +73,7 @@ struct imxrt_wdog_lower
|
||||||
const struct watchdog_ops_s *ops; /* Lower half operations */
|
const struct watchdog_ops_s *ops; /* Lower half operations */
|
||||||
uint32_t timeout;
|
uint32_t timeout;
|
||||||
uint32_t enabled;
|
uint32_t enabled;
|
||||||
|
spinlock_t lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -239,12 +240,14 @@ static int imxrt_wdog_stop(struct watchdog_lowerhalf_s *lower)
|
||||||
|
|
||||||
static int imxrt_wdog_keepalive(struct watchdog_lowerhalf_s *lower)
|
static int imxrt_wdog_keepalive(struct watchdog_lowerhalf_s *lower)
|
||||||
{
|
{
|
||||||
irqstate_t flags = spin_lock_irqsave(NULL);
|
struct imxrt_wdog_lower *priv = (struct imxrt_wdog_lower *)lower;
|
||||||
|
|
||||||
|
irqstate_t flags = spin_lock_irqsave(&priv->lock);
|
||||||
|
|
||||||
putreg16(WDOG_KEEP_ALIVE_KEY1, IMXRT_WDOG1_WSR);
|
putreg16(WDOG_KEEP_ALIVE_KEY1, IMXRT_WDOG1_WSR);
|
||||||
putreg16(WDOG_KEEP_ALIVE_KEY2, IMXRT_WDOG1_WSR);
|
putreg16(WDOG_KEEP_ALIVE_KEY2, IMXRT_WDOG1_WSR);
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -314,7 +317,7 @@ static int imxrt_wdog_settimeout(struct watchdog_lowerhalf_s *lower,
|
||||||
|
|
||||||
priv->timeout = timeout;
|
priv->timeout = timeout;
|
||||||
|
|
||||||
irqstate_t flags = spin_lock_irqsave(NULL);
|
irqstate_t flags = spin_lock_irqsave(&priv->lock);
|
||||||
|
|
||||||
/* write timer value to WCR WT register */
|
/* write timer value to WCR WT register */
|
||||||
|
|
||||||
|
@ -328,7 +331,7 @@ static int imxrt_wdog_settimeout(struct watchdog_lowerhalf_s *lower,
|
||||||
putreg16(WDOG_KEEP_ALIVE_KEY1, IMXRT_WDOG1_WSR);
|
putreg16(WDOG_KEEP_ALIVE_KEY1, IMXRT_WDOG1_WSR);
|
||||||
putreg16(WDOG_KEEP_ALIVE_KEY2, IMXRT_WDOG1_WSR);
|
putreg16(WDOG_KEEP_ALIVE_KEY2, IMXRT_WDOG1_WSR);
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -360,14 +363,14 @@ void imxrt_wdog_initialize(void)
|
||||||
priv->ops = &g_wdgops;
|
priv->ops = &g_wdgops;
|
||||||
priv->timeout = WDOG_MIN;
|
priv->timeout = WDOG_MIN;
|
||||||
|
|
||||||
|
spin_lock_init(&g_wdgdev.lock);
|
||||||
|
|
||||||
/* Register the watchdog driver at the path */
|
/* Register the watchdog driver at the path */
|
||||||
|
|
||||||
wdinfo("Entry: devpath=%s\n", DEVPATH);
|
wdinfo("Entry: devpath=%s\n", DEVPATH);
|
||||||
watchdog_register(DEVPATH, (struct watchdog_lowerhalf_s *)priv);
|
watchdog_register(DEVPATH, (struct watchdog_lowerhalf_s *)priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_WATCHDOG && CONFIG_IMXRT_WDOG */
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: imxrt_wdog_disable
|
* Name: imxrt_wdog_disable
|
||||||
*
|
*
|
||||||
|
@ -395,9 +398,11 @@ void imxrt_wdog_disable_all(void)
|
||||||
putreg16(reg, IMXRT_WDOG2_WCR);
|
putreg16(reg, IMXRT_WDOG2_WCR);
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = enter_critical_section();
|
flags = spin_lock_irqsave(&g_wdgdev.lock);
|
||||||
putreg32(RTWDOG_UPDATE_KEY, IMXRT_RTWDOG_CNT);
|
putreg32(RTWDOG_UPDATE_KEY, IMXRT_RTWDOG_CNT);
|
||||||
putreg32(0xffff, IMXRT_RTWDOG_TOVAL);
|
putreg32(0xffff, IMXRT_RTWDOG_TOVAL);
|
||||||
modifyreg32(IMXRT_RTWDOG_CS, RTWDOG_CS_EN, RTWDOG_CS_UPDATE);
|
modifyreg32(IMXRT_RTWDOG_CS, RTWDOG_CS_EN, RTWDOG_CS_UPDATE);
|
||||||
leave_critical_section(flags);
|
spin_unlock_irqrestore(&g_wdgdev.lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_WATCHDOG && CONFIG_IMXRT_WDOG */
|
|
@ -155,6 +155,7 @@ struct kinetis_edma_s
|
||||||
static struct kinetis_edma_s g_edma =
|
static struct kinetis_edma_s g_edma =
|
||||||
{
|
{
|
||||||
.chlock = NXMUTEX_INITIALIZER,
|
.chlock = NXMUTEX_INITIALIZER,
|
||||||
|
.lock = SP_UNLOCKED,
|
||||||
#if CONFIG_KINETIS_EDMA_NTCD > 0
|
#if CONFIG_KINETIS_EDMA_NTCD > 0
|
||||||
.dsem = SEM_INITIALIZER(CONFIG_KINETIS_EDMA_NTCD),
|
.dsem = SEM_INITIALIZER(CONFIG_KINETIS_EDMA_NTCD),
|
||||||
#endif
|
#endif
|
||||||
|
@ -197,15 +198,16 @@ static struct kinetis_edmatcd_s *kinetis_tcd_alloc(void)
|
||||||
* waiting.
|
* waiting.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
flags = enter_critical_section();
|
|
||||||
nxsem_wait_uninterruptible(&g_edma.dsem);
|
nxsem_wait_uninterruptible(&g_edma.dsem);
|
||||||
|
|
||||||
|
flags = spin_lock_irqsave(&g_edma.lock);
|
||||||
|
|
||||||
/* Now there should be a TCD in the free list reserved just for us */
|
/* Now there should be a TCD in the free list reserved just for us */
|
||||||
|
|
||||||
tcd = (struct kinetis_edmatcd_s *)sq_remfirst(&g_tcd_free);
|
tcd = (struct kinetis_edmatcd_s *)sq_remfirst(&g_tcd_free);
|
||||||
DEBUGASSERT(tcd != NULL);
|
DEBUGASSERT(tcd != NULL);
|
||||||
|
|
||||||
leave_critical_section(flags);
|
spin_unlock_irqrestore(&g_edma.lock, flags);
|
||||||
return tcd;
|
return tcd;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -219,6 +221,19 @@ static struct kinetis_edmatcd_s *kinetis_tcd_alloc(void)
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if CONFIG_KINETIS_EDMA_NTCD > 0
|
#if CONFIG_KINETIS_EDMA_NTCD > 0
|
||||||
|
static void kinetis_tcd_free_nolock(struct kinetis_edmatcd_s *tcd)
|
||||||
|
{
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
/* Add the the TCD to the end of the free list and post the 'dsem',
|
||||||
|
* possibly waking up another thread that might be waiting for
|
||||||
|
* a TCD.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sq_addlast((sq_entry_t *)tcd, &g_tcd_free);
|
||||||
|
nxsem_post(&g_edma.dsem);
|
||||||
|
}
|
||||||
|
|
||||||
static void kinetis_tcd_free(struct kinetis_edmatcd_s *tcd)
|
static void kinetis_tcd_free(struct kinetis_edmatcd_s *tcd)
|
||||||
{
|
{
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
@ -228,10 +243,11 @@ static void kinetis_tcd_free(struct kinetis_edmatcd_s *tcd)
|
||||||
* a TCD.
|
* a TCD.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_edma.lock);
|
||||||
sq_addlast((sq_entry_t *)tcd, &g_tcd_free);
|
sched_lock();
|
||||||
nxsem_post(&g_edma.dsem);
|
kinetis_tcd_free_nolock(tcd);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_edma.lock, flags);
|
||||||
|
sched_unlock();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -435,9 +451,13 @@ static void kinetis_dmaterminate(struct kinetis_dmach_s *dmach, int result)
|
||||||
struct kinetis_edmatcd_s *next;
|
struct kinetis_edmatcd_s *next;
|
||||||
#endif
|
#endif
|
||||||
uintptr_t regaddr;
|
uintptr_t regaddr;
|
||||||
|
irqstate_t flags;
|
||||||
uint8_t regval8;
|
uint8_t regval8;
|
||||||
uint8_t chan;
|
uint8_t chan;
|
||||||
|
|
||||||
|
flags = spin_lock_irqsave(&g_edma.lock);
|
||||||
|
sched_lock();
|
||||||
|
|
||||||
/* Disable channel ERROR interrupts */
|
/* Disable channel ERROR interrupts */
|
||||||
|
|
||||||
chan = dmach->chan;
|
chan = dmach->chan;
|
||||||
|
@ -469,7 +489,7 @@ static void kinetis_dmaterminate(struct kinetis_dmach_s *dmach, int result)
|
||||||
next = dmach->flags & EDMA_CONFIG_LOOPDEST ?
|
next = dmach->flags & EDMA_CONFIG_LOOPDEST ?
|
||||||
NULL : (struct kinetis_edmatcd_s *)tcd->dlastsga;
|
NULL : (struct kinetis_edmatcd_s *)tcd->dlastsga;
|
||||||
|
|
||||||
kinetis_tcd_free(tcd);
|
kinetis_tcd_free_nolock(tcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
dmach->head = NULL;
|
dmach->head = NULL;
|
||||||
|
@ -486,6 +506,9 @@ static void kinetis_dmaterminate(struct kinetis_dmach_s *dmach, int result)
|
||||||
dmach->callback = NULL;
|
dmach->callback = NULL;
|
||||||
dmach->arg = NULL;
|
dmach->arg = NULL;
|
||||||
dmach->state = KINETIS_DMA_IDLE;
|
dmach->state = KINETIS_DMA_IDLE;
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&g_edma.lock, flags);
|
||||||
|
sched_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -1114,7 +1137,7 @@ int kinetis_dmach_start(DMACH_HANDLE handle, edma_callback_t callback,
|
||||||
|
|
||||||
/* Save the callback info. This will be invoked when the DMA completes */
|
/* Save the callback info. This will be invoked when the DMA completes */
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_edma.lock);
|
||||||
dmach->callback = callback;
|
dmach->callback = callback;
|
||||||
dmach->arg = arg;
|
dmach->arg = arg;
|
||||||
|
|
||||||
|
@ -1139,7 +1162,7 @@ int kinetis_dmach_start(DMACH_HANDLE handle, edma_callback_t callback,
|
||||||
putreg8(regval8, KINETIS_EDMA_SERQ);
|
putreg8(regval8, KINETIS_EDMA_SERQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_edma.lock, flags);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1162,14 +1185,11 @@ int kinetis_dmach_start(DMACH_HANDLE handle, edma_callback_t callback,
|
||||||
void kinetis_dmach_stop(DMACH_HANDLE handle)
|
void kinetis_dmach_stop(DMACH_HANDLE handle)
|
||||||
{
|
{
|
||||||
struct kinetis_dmach_s *dmach = (struct kinetis_dmach_s *)handle;
|
struct kinetis_dmach_s *dmach = (struct kinetis_dmach_s *)handle;
|
||||||
irqstate_t flags;
|
|
||||||
|
|
||||||
dmainfo("dmach: %p\n", dmach);
|
dmainfo("dmach: %p\n", dmach);
|
||||||
DEBUGASSERT(dmach != NULL);
|
DEBUGASSERT(dmach != NULL);
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
|
||||||
kinetis_dmaterminate(dmach, -EINTR);
|
kinetis_dmaterminate(dmach, -EINTR);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -1267,7 +1287,7 @@ void kinetis_dmasample(DMACH_HANDLE handle, struct kinetis_dmaregs_s *regs)
|
||||||
|
|
||||||
/* eDMA Global Registers */
|
/* eDMA Global Registers */
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_edma.lock);
|
||||||
|
|
||||||
regs->cr = getreg32(KINETIS_EDMA_CR); /* Control */
|
regs->cr = getreg32(KINETIS_EDMA_CR); /* Control */
|
||||||
regs->es = getreg32(KINETIS_EDMA_ES); /* Error Status */
|
regs->es = getreg32(KINETIS_EDMA_ES); /* Error Status */
|
||||||
|
@ -1302,7 +1322,7 @@ void kinetis_dmasample(DMACH_HANDLE handle, struct kinetis_dmaregs_s *regs)
|
||||||
regaddr = KINETIS_DMAMUX_CHCFG(chan);
|
regaddr = KINETIS_DMAMUX_CHCFG(chan);
|
||||||
regs->dmamux = getreg32(regaddr); /* Channel configuration */
|
regs->dmamux = getreg32(regaddr); /* Channel configuration */
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_edma.lock, flags);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_DEBUG_DMA */
|
#endif /* CONFIG_DEBUG_DMA */
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,8 @@
|
||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
static spinlock_t g_dvfs_lock = SP_UNLOCKED;
|
||||||
|
|
||||||
typedef struct freq_entry
|
typedef struct freq_entry
|
||||||
{
|
{
|
||||||
uint16_t freq;
|
uint16_t freq;
|
||||||
|
@ -428,7 +430,7 @@ static void lc823450_dvfs_do_auto(uint32_t idle[])
|
||||||
|
|
||||||
void lc823450_dvfs_get_idletime(uint64_t idletime[])
|
void lc823450_dvfs_get_idletime(uint64_t idletime[])
|
||||||
{
|
{
|
||||||
irqstate_t flags = spin_lock_irqsave(NULL);
|
irqstate_t flags = spin_lock_irqsave(&g_dvfs_lock);
|
||||||
|
|
||||||
/* First, copy g_idle_totaltime to the caller */
|
/* First, copy g_idle_totaltime to the caller */
|
||||||
|
|
||||||
|
@ -448,7 +450,7 @@ void lc823450_dvfs_get_idletime(uint64_t idletime[])
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_dvfs_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -504,7 +506,7 @@ void lc823450_dvfs_tick_callback(void)
|
||||||
|
|
||||||
void lc823450_dvfs_enter_idle(void)
|
void lc823450_dvfs_enter_idle(void)
|
||||||
{
|
{
|
||||||
irqstate_t flags = spin_lock_irqsave(NULL);
|
irqstate_t flags = spin_lock_irqsave(&g_dvfs_lock);
|
||||||
|
|
||||||
int me = this_cpu();
|
int me = this_cpu();
|
||||||
|
|
||||||
|
@ -544,7 +546,7 @@ void lc823450_dvfs_enter_idle(void)
|
||||||
lc823450_dvfs_set_div(_dvfs_cur_idx, 1);
|
lc823450_dvfs_set_div(_dvfs_cur_idx, 1);
|
||||||
|
|
||||||
exit_with_error:
|
exit_with_error:
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_dvfs_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -554,7 +556,7 @@ exit_with_error:
|
||||||
|
|
||||||
void lc823450_dvfs_exit_idle(int irq)
|
void lc823450_dvfs_exit_idle(int irq)
|
||||||
{
|
{
|
||||||
irqstate_t flags = spin_lock_irqsave(NULL);
|
irqstate_t flags = spin_lock_irqsave(&g_dvfs_lock);
|
||||||
|
|
||||||
int me = this_cpu();
|
int me = this_cpu();
|
||||||
uint64_t d;
|
uint64_t d;
|
||||||
|
@ -596,7 +598,7 @@ exit_with_error:
|
||||||
|
|
||||||
_dvfs_cpu_is_active[me] = 1;
|
_dvfs_cpu_is_active[me] = 1;
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_dvfs_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -628,7 +630,7 @@ int lc823450_dvfs_set_freq(int freq)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_dvfs_lock);
|
||||||
|
|
||||||
switch (freq)
|
switch (freq)
|
||||||
{
|
{
|
||||||
|
@ -656,6 +658,6 @@ int lc823450_dvfs_set_freq(int freq)
|
||||||
lc823450_dvfs_set_div(idx, 0);
|
lc823450_dvfs_set_div(idx, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_dvfs_lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,6 +148,8 @@ static void hrt_usleep_add(struct hrt_s *phrt);
|
||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
static spinlock_t g_hrt_timer_queue_lock = SP_UNLOCKED;
|
||||||
|
|
||||||
#ifdef CHECK_INTERVAL
|
#ifdef CHECK_INTERVAL
|
||||||
static bool _timer_val = true;
|
static bool _timer_val = true;
|
||||||
#endif
|
#endif
|
||||||
|
@ -185,7 +187,7 @@ static void hrt_queue_refresh(void)
|
||||||
struct hrt_s *tmp;
|
struct hrt_s *tmp;
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_hrt_timer_queue_lock);
|
||||||
elapsed = (uint64_t)getreg32(MT20CNT) * (1000 * 1000) * 10 / XT1OSC_CLK;
|
elapsed = (uint64_t)getreg32(MT20CNT) * (1000 * 1000) * 10 / XT1OSC_CLK;
|
||||||
|
|
||||||
for (pent = hrt_timer_queue.head; pent; pent = dq_next(pent))
|
for (pent = hrt_timer_queue.head; pent; pent = dq_next(pent))
|
||||||
|
@ -204,9 +206,9 @@ cont:
|
||||||
if (tmp->usec <= 0)
|
if (tmp->usec <= 0)
|
||||||
{
|
{
|
||||||
dq_rem(pent, &hrt_timer_queue);
|
dq_rem(pent, &hrt_timer_queue);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
nxsem_post(&tmp->sem);
|
nxsem_post(&tmp->sem);
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_hrt_timer_queue_lock);
|
||||||
goto cont;
|
goto cont;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -215,7 +217,7 @@ cont:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -230,7 +232,7 @@ static void hrt_usleep_setup(void)
|
||||||
struct hrt_s *head;
|
struct hrt_s *head;
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_hrt_timer_queue_lock);
|
||||||
head = container_of(hrt_timer_queue.head, struct hrt_s, ent);
|
head = container_of(hrt_timer_queue.head, struct hrt_s, ent);
|
||||||
if (head == NULL)
|
if (head == NULL)
|
||||||
{
|
{
|
||||||
|
@ -238,7 +240,7 @@ static void hrt_usleep_setup(void)
|
||||||
|
|
||||||
modifyreg32(MCLKCNTEXT1, MCLKCNTEXT1_MTM2C_CLKEN, 0x0);
|
modifyreg32(MCLKCNTEXT1, MCLKCNTEXT1_MTM2C_CLKEN, 0x0);
|
||||||
modifyreg32(MCLKCNTEXT1, MCLKCNTEXT1_MTM2_CLKEN, 0x0);
|
modifyreg32(MCLKCNTEXT1, MCLKCNTEXT1_MTM2_CLKEN, 0x0);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,7 +262,7 @@ static void hrt_usleep_setup(void)
|
||||||
/* Enable MTM2-Ch0 */
|
/* Enable MTM2-Ch0 */
|
||||||
|
|
||||||
putreg32(1, MT2OPR);
|
putreg32(1, MT2OPR);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -299,7 +301,7 @@ static void hrt_usleep_add(struct hrt_s *phrt)
|
||||||
|
|
||||||
hrt_queue_refresh();
|
hrt_queue_refresh();
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_hrt_timer_queue_lock);
|
||||||
|
|
||||||
/* add phrt to hrt_timer_queue */
|
/* add phrt to hrt_timer_queue */
|
||||||
|
|
||||||
|
@ -321,7 +323,7 @@ static void hrt_usleep_add(struct hrt_s *phrt)
|
||||||
dq_addlast(&phrt->ent, &hrt_timer_queue);
|
dq_addlast(&phrt->ent, &hrt_timer_queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
|
|
||||||
hrt_usleep_setup();
|
hrt_usleep_setup();
|
||||||
}
|
}
|
||||||
|
@ -699,7 +701,7 @@ int up_rtc_gettime(struct timespec *tp)
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
uint64_t f;
|
uint64_t f;
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
flags = spin_lock_irqsave(&g_hrt_timer_queue_lock);
|
||||||
|
|
||||||
/* Get the elapsed time */
|
/* Get the elapsed time */
|
||||||
|
|
||||||
|
@ -710,7 +712,7 @@ int up_rtc_gettime(struct timespec *tp)
|
||||||
f = up_get_timer_fraction();
|
f = up_get_timer_fraction();
|
||||||
elapsed += f;
|
elapsed += f;
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
spin_unlock_irqrestore(&g_hrt_timer_queue_lock, flags);
|
||||||
|
|
||||||
tmrinfo("elapsed = %lld\n", elapsed);
|
tmrinfo("elapsed = %lld\n", elapsed);
|
||||||
|
|
||||||
|
|
|
@ -244,6 +244,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef HAVE_USART_CONSOLE
|
#ifdef HAVE_USART_CONSOLE
|
||||||
|
static spinlock_t g_console_lock = SP_UNLOCKED;
|
||||||
|
|
||||||
/* USART console configuration */
|
/* USART console configuration */
|
||||||
|
|
||||||
static const struct uart_config_s g_console_config =
|
static const struct uart_config_s g_console_config =
|
||||||
|
@ -784,31 +786,17 @@ void arm_lowputc(char ch)
|
||||||
#ifdef HAVE_USART_CONSOLE
|
#ifdef HAVE_USART_CONSOLE
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
for (; ; )
|
/* Wait for the transmit FIFO to be not full */
|
||||||
{
|
|
||||||
/* Wait for the transmit FIFO to be not full */
|
|
||||||
|
|
||||||
while ((getreg32(CONSOLE_BASE + LPC54_USART_FIFOSTAT_OFFSET) &
|
flags = spin_lock_irqsave(&g_console_lock);
|
||||||
USART_FIFOSTAT_TXNOTFULL) == 0)
|
while ((getreg32(CONSOLE_BASE + LPC54_USART_FIFOSTAT_OFFSET) &
|
||||||
{
|
USART_FIFOSTAT_TXNOTFULL) == 0);
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable interrupts so that the fest test and the transmission are
|
/* Send the character */
|
||||||
* atomic.
|
|
||||||
*/
|
|
||||||
|
|
||||||
flags = spin_lock_irqsave(NULL);
|
putreg32((uint32_t)ch, CONSOLE_BASE + LPC54_USART_FIFOWR_OFFSET);
|
||||||
if ((getreg32(CONSOLE_BASE + LPC54_USART_FIFOSTAT_OFFSET) &
|
|
||||||
USART_FIFOSTAT_TXNOTFULL) != 0)
|
|
||||||
{
|
|
||||||
/* Send the character */
|
|
||||||
|
|
||||||
putreg32((uint32_t)ch, CONSOLE_BASE + LPC54_USART_FIFOWR_OFFSET);
|
spin_unlock_irqrestore(&g_console_lock, flags);
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(NULL, flags);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,7 @@ static void gs2200m_irq_enable(void)
|
||||||
{
|
{
|
||||||
/* Check if irq has been asserted */
|
/* Check if irq has been asserted */
|
||||||
|
|
||||||
dready = gs2200m_dready(&g_gs2200m_lock);
|
dready = gs2200m_dready(NULL);
|
||||||
|
|
||||||
/* NOTE: stm32 does not support level-triggered irq */
|
/* NOTE: stm32 does not support level-triggered irq */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue