diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-generic/global_data.h | 8 | ||||
-rw-r--r-- | include/cyclic.h | 35 | ||||
-rw-r--r-- | include/linux/list.h | 53 |
3 files changed, 36 insertions, 60 deletions
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index c4b2bb4497..02ad8ca595 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -481,9 +481,9 @@ struct global_data { #endif #ifdef CONFIG_CYCLIC /** - * @cyclic: cyclic driver data + * @cyclic_list: list of registered cyclic functions */ - struct cyclic_drv *cyclic; + struct hlist_head cyclic_list; #endif /** * @dmtag_list: List of DM tags @@ -650,6 +650,10 @@ enum gd_flags { * @GD_FLG_FDT_CHANGED: Device tree change has been detected by tests */ GD_FLG_FDT_CHANGED = 0x100000, + /** + * GD_FLG_CYCLIC_RUNNING: cyclic_run is in progress + */ + GD_FLG_CYCLIC_RUNNING = 0x200000, }; #endif /* __ASSEMBLY__ */ diff --git a/include/cyclic.h b/include/cyclic.h index 9c5c4fcc54..44ad3cb6b8 100644 --- a/include/cyclic.h +++ b/include/cyclic.h @@ -15,19 +15,6 @@ #include <asm/types.h> /** - * struct cyclic_drv - Cyclic driver internal data - * - * @cyclic_list: Cylic list node - * @cyclic_ready: Flag if cyclic infrastructure is ready - * @cyclic_running: Flag if cyclic infrastructure is running - */ -struct cyclic_drv { - struct list_head cyclic_list; - bool cyclic_ready; - bool cyclic_running; -}; - -/** * struct cyclic_info - Information about cyclic execution function * * @func: Function to call periodically @@ -50,7 +37,7 @@ struct cyclic_info { uint64_t cpu_time_us; uint64_t run_cnt; uint64_t next_call; - struct list_head list; + struct hlist_node list; bool already_warned; }; @@ -79,18 +66,11 @@ struct cyclic_info *cyclic_register(cyclic_func_t func, uint64_t delay_us, int cyclic_unregister(struct cyclic_info *cyclic); /** - * cyclic_init() - Set up cyclic functions - * - * Init a list of cyclic functions, so that these can be added as needed - */ -int cyclic_init(void); - -/** - * cyclic_uninit() - Clean up cyclic functions + * cyclic_unregister_all() - Clean up cyclic functions * * This removes all cyclic functions */ -int cyclic_uninit(void); +int cyclic_unregister_all(void); /** * cyclic_get_list() - Get cyclic list pointer @@ -99,7 +79,7 @@ int cyclic_uninit(void); * * @return: pointer to cyclic_list */ -struct list_head *cyclic_get_list(void); +struct hlist_head *cyclic_get_list(void); /** * cyclic_run() - Interate over all registered cyclic functions @@ -138,12 +118,7 @@ static inline void schedule(void) { } -static inline int cyclic_init(void) -{ - return 0; -} - -static inline int cyclic_uninit(void) +static inline int cyclic_unregister_all(void) { return 0; } diff --git a/include/linux/list.h b/include/linux/list.h index 3eacf68e3a..6910721c00 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -646,54 +646,51 @@ static inline void hlist_add_after(struct hlist_node *n, for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ pos = n) +#define hlist_entry_safe(ptr, type, member) \ + ({ typeof(ptr) ____ptr = (ptr); \ + ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ + }) + /** * hlist_for_each_entry - iterate over list of given type - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the hlist_node within the struct. */ -#define hlist_for_each_entry(tpos, pos, head, member) \ - for (pos = (head)->first; \ - pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) +#define hlist_for_each_entry(pos, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) /** * hlist_for_each_entry_continue - iterate over a hlist continuing after current point - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. + * @pos: the type * to use as a loop cursor. * @member: the name of the hlist_node within the struct. */ -#define hlist_for_each_entry_continue(tpos, pos, member) \ - for (pos = (pos)->next; \ - pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) +#define hlist_for_each_entry_continue(pos, member) \ + for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) /** * hlist_for_each_entry_from - iterate over a hlist continuing from current point - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. + * @pos: the type * to use as a loop cursor. * @member: the name of the hlist_node within the struct. */ -#define hlist_for_each_entry_from(tpos, pos, member) \ - for (; pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) +#define hlist_for_each_entry_from(pos, member) \ + for (; pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) /** * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. - * @n: another &struct hlist_node to use as temporary storage + * @pos: the type * to use as a loop cursor. + * @n: a &struct hlist_node to use as temporary storage * @head: the head for your list. * @member: the name of the hlist_node within the struct. */ -#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ - for (pos = (head)->first; \ - pos && ({ n = pos->next; 1; }) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = n) +#define hlist_for_each_entry_safe(pos, n, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ + pos && ({ n = pos->member.next; 1; }); \ + pos = hlist_entry_safe(n, typeof(*pos), member)) #endif |