diff --git a/drivers/timer/clockevent.c b/drivers/timer/clockevent.c index e1845aaf2efba227d3f7c9a885f90e5a5d4b4fd2..d5702ab3d60a520d26e0e9c0b99d812f4bbff92b 100644 --- a/drivers/timer/clockevent.c +++ b/drivers/timer/clockevent.c @@ -239,9 +239,9 @@ void os_clockevent_start_oneshot(os_clockevent_t *ce, uint64_t nsec) ce->period_nsec = 0; ce->period_count = 0; - os_spin_lock_irq(&gs_device_lock, &level); + os_spin_lock_irq(&ce->spinlock, &level); os_clockevent_next(ce, OS_TRUE); - os_spin_unlock_irq(&gs_device_lock, level); + os_spin_unlock_irq(&ce->spinlock, level); } void os_clockevent_start_period(os_clockevent_t *ce, uint64_t nsec) @@ -263,9 +263,9 @@ void os_clockevent_start_period(os_clockevent_t *ce, uint64_t nsec) ce->period_count = 1; } - os_spin_lock_irq(&gs_device_lock, &level); + os_spin_lock_irq(&ce->spinlock, &level); os_clockevent_next(ce, OS_TRUE); - os_spin_unlock_irq(&gs_device_lock, level); + os_spin_unlock_irq(&ce->spinlock, level); } void os_clockevent_stop(os_clockevent_t *ce) @@ -274,14 +274,14 @@ void os_clockevent_stop(os_clockevent_t *ce) OS_ASSERT(ce != NULL); - os_spin_lock_irq(&gs_device_lock, &level); + os_spin_lock_irq(&ce->spinlock, &level); ce->next_nsec = 0; ce->period_nsec = 0; ce->ops->stop(ce); - os_spin_unlock_irq(&gs_device_lock, level); + os_spin_unlock_irq(&ce->spinlock, level); } int clockevent_isr_cnt = 0; void os_clockevent_isr(os_clockevent_t *ce) @@ -350,12 +350,12 @@ static void clockevent_resume(void *priv, uint8_t mode) if (!strcmp(LPMGR_TIMER_DEVICE_NAME, ce->parent.name)) return; - os_spin_lock_irq(&gs_device_lock, &level); + os_spin_lock_irq(&ce->spinlock, &level); if (ce->next_nsec != 0) os_clockevent_next(ce, OS_TRUE); - os_spin_unlock_irq(&gs_device_lock, level); + os_spin_unlock_irq(&ce->spinlock, level); } static const struct os_lpmgr_device_ops clockevent_lpmgr_ops = { @@ -419,6 +419,9 @@ void os_clockevent_register(const char *name, os_clockevent_t *ce) ce->parent.ops = &_clockevent_ops; ce->parent.type = OS_DEVICE_TYPE_CLOCKEVENT; + + os_spin_lock_init(&ce->spinlock); + os_device_register(&ce->parent, name); if (strcmp(ce->parent.name, OS_CLOCKEVENT_BEST) == 0) diff --git a/drivers/timer/clockevent.h b/drivers/timer/clockevent.h index 7095ad680648050d67e024ded7b655ffbebf0b26..b430f679dac6d78ce68e9142730a61cd714f5ffd 100644 --- a/drivers/timer/clockevent.h +++ b/drivers/timer/clockevent.h @@ -67,6 +67,8 @@ struct os_clockevent const struct os_clockevent_ops *ops; os_list_node_t list; + + os_spinlock_t spinlock; uint32_t rating; uint32_t freq;