xref: /openbmc/linux/tools/firewire/list.h (revision b2441318)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
29f6d3c4bSStefan Richter struct list {
39f6d3c4bSStefan Richter 	struct list *next, *prev;
49f6d3c4bSStefan Richter };
59f6d3c4bSStefan Richter 
69f6d3c4bSStefan Richter static inline void
list_init(struct list * list)79f6d3c4bSStefan Richter list_init(struct list *list)
89f6d3c4bSStefan Richter {
99f6d3c4bSStefan Richter 	list->next = list;
109f6d3c4bSStefan Richter 	list->prev = list;
119f6d3c4bSStefan Richter }
129f6d3c4bSStefan Richter 
139f6d3c4bSStefan Richter static inline int
list_empty(struct list * list)149f6d3c4bSStefan Richter list_empty(struct list *list)
159f6d3c4bSStefan Richter {
169f6d3c4bSStefan Richter 	return list->next == list;
179f6d3c4bSStefan Richter }
189f6d3c4bSStefan Richter 
199f6d3c4bSStefan Richter static inline void
list_insert(struct list * link,struct list * new_link)209f6d3c4bSStefan Richter list_insert(struct list *link, struct list *new_link)
219f6d3c4bSStefan Richter {
229f6d3c4bSStefan Richter 	new_link->prev		= link->prev;
239f6d3c4bSStefan Richter 	new_link->next		= link;
249f6d3c4bSStefan Richter 	new_link->prev->next	= new_link;
259f6d3c4bSStefan Richter 	new_link->next->prev	= new_link;
269f6d3c4bSStefan Richter }
279f6d3c4bSStefan Richter 
289f6d3c4bSStefan Richter static inline void
list_append(struct list * list,struct list * new_link)299f6d3c4bSStefan Richter list_append(struct list *list, struct list *new_link)
309f6d3c4bSStefan Richter {
319f6d3c4bSStefan Richter 	list_insert((struct list *)list, new_link);
329f6d3c4bSStefan Richter }
339f6d3c4bSStefan Richter 
349f6d3c4bSStefan Richter static inline void
list_prepend(struct list * list,struct list * new_link)359f6d3c4bSStefan Richter list_prepend(struct list *list, struct list *new_link)
369f6d3c4bSStefan Richter {
379f6d3c4bSStefan Richter 	list_insert(list->next, new_link);
389f6d3c4bSStefan Richter }
399f6d3c4bSStefan Richter 
409f6d3c4bSStefan Richter static inline void
list_remove(struct list * link)419f6d3c4bSStefan Richter list_remove(struct list *link)
429f6d3c4bSStefan Richter {
439f6d3c4bSStefan Richter 	link->prev->next = link->next;
449f6d3c4bSStefan Richter 	link->next->prev = link->prev;
459f6d3c4bSStefan Richter }
469f6d3c4bSStefan Richter 
479f6d3c4bSStefan Richter #define list_entry(link, type, member) \
489f6d3c4bSStefan Richter 	((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
499f6d3c4bSStefan Richter 
509f6d3c4bSStefan Richter #define list_head(list, type, member)		\
519f6d3c4bSStefan Richter 	list_entry((list)->next, type, member)
529f6d3c4bSStefan Richter 
539f6d3c4bSStefan Richter #define list_tail(list, type, member)		\
549f6d3c4bSStefan Richter 	list_entry((list)->prev, type, member)
559f6d3c4bSStefan Richter 
569f6d3c4bSStefan Richter #define list_next(elm, member)					\
579f6d3c4bSStefan Richter 	list_entry((elm)->member.next, typeof(*elm), member)
589f6d3c4bSStefan Richter 
599f6d3c4bSStefan Richter #define list_for_each_entry(pos, list, member)			\
609f6d3c4bSStefan Richter 	for (pos = list_head(list, typeof(*pos), member);	\
619f6d3c4bSStefan Richter 	     &pos->member != (list);				\
629f6d3c4bSStefan Richter 	     pos = list_next(pos, member))
639f6d3c4bSStefan Richter 
64