diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/tick-broadcast.c | 10 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 6 | ||||
| -rw-r--r-- | kernel/time/tick-internal.h | 3 |
3 files changed, 18 insertions, 1 deletions
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 48b2761b566..a3b5aff6260 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void) | |||
| 600 | return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT; | 600 | return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT; |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | /* | ||
| 604 | * Check whether the broadcast device supports oneshot. | ||
| 605 | */ | ||
| 606 | bool tick_broadcast_oneshot_available(void) | ||
| 607 | { | ||
| 608 | struct clock_event_device *bc = tick_broadcast_device.evtdev; | ||
| 609 | |||
| 610 | return bc ? bc->features & CLOCK_EVT_FEAT_ONESHOT : false; | ||
| 611 | } | ||
| 612 | |||
| 603 | #endif | 613 | #endif |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 051bc80a0c4..ed228ef6f6b 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -51,7 +51,11 @@ int tick_is_oneshot_available(void) | |||
| 51 | { | 51 | { |
| 52 | struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); | 52 | struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); |
| 53 | 53 | ||
| 54 | return dev && (dev->features & CLOCK_EVT_FEAT_ONESHOT); | 54 | if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT)) |
| 55 | return 0; | ||
| 56 | if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) | ||
| 57 | return 1; | ||
| 58 | return tick_broadcast_oneshot_available(); | ||
| 55 | } | 59 | } |
| 56 | 60 | ||
| 57 | /* | 61 | /* |
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index 290eefbc1f6..f65d3a723a6 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h | |||
| @@ -36,6 +36,7 @@ extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup); | |||
| 36 | extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc); | 36 | extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc); |
| 37 | extern int tick_broadcast_oneshot_active(void); | 37 | extern int tick_broadcast_oneshot_active(void); |
| 38 | extern void tick_check_oneshot_broadcast(int cpu); | 38 | extern void tick_check_oneshot_broadcast(int cpu); |
| 39 | bool tick_broadcast_oneshot_available(void); | ||
| 39 | # else /* BROADCAST */ | 40 | # else /* BROADCAST */ |
| 40 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | 41 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) |
| 41 | { | 42 | { |
| @@ -46,6 +47,7 @@ static inline void tick_broadcast_switch_to_oneshot(void) { } | |||
| 46 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } | 47 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } |
| 47 | static inline int tick_broadcast_oneshot_active(void) { return 0; } | 48 | static inline int tick_broadcast_oneshot_active(void) { return 0; } |
| 48 | static inline void tick_check_oneshot_broadcast(int cpu) { } | 49 | static inline void tick_check_oneshot_broadcast(int cpu) { } |
| 50 | static inline bool tick_broadcast_oneshot_available(void) { return true; } | ||
| 49 | # endif /* !BROADCAST */ | 51 | # endif /* !BROADCAST */ |
| 50 | 52 | ||
| 51 | #else /* !ONESHOT */ | 53 | #else /* !ONESHOT */ |
| @@ -76,6 +78,7 @@ static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | |||
| 76 | return 0; | 78 | return 0; |
| 77 | } | 79 | } |
| 78 | static inline int tick_broadcast_oneshot_active(void) { return 0; } | 80 | static inline int tick_broadcast_oneshot_active(void) { return 0; } |
| 81 | static inline bool tick_broadcast_oneshot_available(void) { return false; } | ||
| 79 | #endif /* !TICK_ONESHOT */ | 82 | #endif /* !TICK_ONESHOT */ |
| 80 | 83 | ||
| 81 | /* | 84 | /* |
