xref: /linux/kernel/irq/settings.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e6bea9c4SThomas Gleixner /*
3e6bea9c4SThomas Gleixner  * Internal header to deal with irq_desc->status which will be renamed
4e6bea9c4SThomas Gleixner  * to irq_desc->settings.
5e6bea9c4SThomas Gleixner  */
6e6bea9c4SThomas Gleixner enum {
7e6bea9c4SThomas Gleixner 	_IRQ_DEFAULT_INIT_FLAGS	= IRQ_DEFAULT_INIT_FLAGS,
8a005677bSThomas Gleixner 	_IRQ_PER_CPU		= IRQ_PER_CPU,
9876dbd4cSThomas Gleixner 	_IRQ_LEVEL		= IRQ_LEVEL,
101ccb4e61SThomas Gleixner 	_IRQ_NOPROBE		= IRQ_NOPROBE,
111ccb4e61SThomas Gleixner 	_IRQ_NOREQUEST		= IRQ_NOREQUEST,
127f1b1244SPaul Mundt 	_IRQ_NOTHREAD		= IRQ_NOTHREAD,
131ccb4e61SThomas Gleixner 	_IRQ_NOAUTOEN		= IRQ_NOAUTOEN,
141ccb4e61SThomas Gleixner 	_IRQ_MOVE_PCNTXT	= IRQ_MOVE_PCNTXT,
15a005677bSThomas Gleixner 	_IRQ_NO_BALANCING	= IRQ_NO_BALANCING,
161ccb4e61SThomas Gleixner 	_IRQ_NESTED_THREAD	= IRQ_NESTED_THREAD,
1731d9d9b6SMarc Zyngier 	_IRQ_PER_CPU_DEVID	= IRQ_PER_CPU_DEVID,
18b39898cdSThomas Gleixner 	_IRQ_IS_POLLED		= IRQ_IS_POLLED,
19e9849777SThomas Gleixner 	_IRQ_DISABLE_UNLAZY	= IRQ_DISABLE_UNLAZY,
2083cfac95SMarc Zyngier 	_IRQ_HIDDEN		= IRQ_HIDDEN,
21*c2b1063eSThomas Gleixner 	_IRQ_NO_DEBUG		= IRQ_NO_DEBUG,
22a005677bSThomas Gleixner 	_IRQF_MODIFY_MASK	= IRQF_MODIFY_MASK,
23e6bea9c4SThomas Gleixner };
24009b4c3bSThomas Gleixner 
25a005677bSThomas Gleixner #define IRQ_PER_CPU		GOT_YOU_MORON
26a005677bSThomas Gleixner #define IRQ_NO_BALANCING	GOT_YOU_MORON
27876dbd4cSThomas Gleixner #define IRQ_LEVEL		GOT_YOU_MORON
281ccb4e61SThomas Gleixner #define IRQ_NOPROBE		GOT_YOU_MORON
291ccb4e61SThomas Gleixner #define IRQ_NOREQUEST		GOT_YOU_MORON
307f1b1244SPaul Mundt #define IRQ_NOTHREAD		GOT_YOU_MORON
311ccb4e61SThomas Gleixner #define IRQ_NOAUTOEN		GOT_YOU_MORON
321ccb4e61SThomas Gleixner #define IRQ_NESTED_THREAD	GOT_YOU_MORON
3331d9d9b6SMarc Zyngier #define IRQ_PER_CPU_DEVID	GOT_YOU_MORON
34b39898cdSThomas Gleixner #define IRQ_IS_POLLED		GOT_YOU_MORON
35e9849777SThomas Gleixner #define IRQ_DISABLE_UNLAZY	GOT_YOU_MORON
3683cfac95SMarc Zyngier #define IRQ_HIDDEN		GOT_YOU_MORON
37*c2b1063eSThomas Gleixner #define IRQ_NO_DEBUG		GOT_YOU_MORON
38a005677bSThomas Gleixner #undef IRQF_MODIFY_MASK
39a005677bSThomas Gleixner #define IRQF_MODIFY_MASK	GOT_YOU_MORON
40a005677bSThomas Gleixner 
41a005677bSThomas Gleixner static inline void
irq_settings_clr_and_set(struct irq_desc * desc,u32 clr,u32 set)42a005677bSThomas Gleixner irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set)
43a005677bSThomas Gleixner {
440c6f8a8bSThomas Gleixner 	desc->status_use_accessors &= ~(clr & _IRQF_MODIFY_MASK);
450c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK);
46a005677bSThomas Gleixner }
47a005677bSThomas Gleixner 
irq_settings_is_per_cpu(struct irq_desc * desc)48a005677bSThomas Gleixner static inline bool irq_settings_is_per_cpu(struct irq_desc *desc)
49a005677bSThomas Gleixner {
500c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & _IRQ_PER_CPU;
51a005677bSThomas Gleixner }
52a005677bSThomas Gleixner 
irq_settings_is_per_cpu_devid(struct irq_desc * desc)5331d9d9b6SMarc Zyngier static inline bool irq_settings_is_per_cpu_devid(struct irq_desc *desc)
5431d9d9b6SMarc Zyngier {
5531d9d9b6SMarc Zyngier 	return desc->status_use_accessors & _IRQ_PER_CPU_DEVID;
5631d9d9b6SMarc Zyngier }
5731d9d9b6SMarc Zyngier 
irq_settings_set_per_cpu(struct irq_desc * desc)58a005677bSThomas Gleixner static inline void irq_settings_set_per_cpu(struct irq_desc *desc)
59a005677bSThomas Gleixner {
600c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= _IRQ_PER_CPU;
61a005677bSThomas Gleixner }
62a005677bSThomas Gleixner 
irq_settings_set_no_balancing(struct irq_desc * desc)63a005677bSThomas Gleixner static inline void irq_settings_set_no_balancing(struct irq_desc *desc)
64a005677bSThomas Gleixner {
650c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= _IRQ_NO_BALANCING;
66a005677bSThomas Gleixner }
67a005677bSThomas Gleixner 
irq_settings_has_no_balance_set(struct irq_desc * desc)68a005677bSThomas Gleixner static inline bool irq_settings_has_no_balance_set(struct irq_desc *desc)
69a005677bSThomas Gleixner {
700c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & _IRQ_NO_BALANCING;
71a005677bSThomas Gleixner }
72876dbd4cSThomas Gleixner 
irq_settings_get_trigger_mask(struct irq_desc * desc)73876dbd4cSThomas Gleixner static inline u32 irq_settings_get_trigger_mask(struct irq_desc *desc)
74876dbd4cSThomas Gleixner {
750c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & IRQ_TYPE_SENSE_MASK;
76876dbd4cSThomas Gleixner }
77876dbd4cSThomas Gleixner 
78876dbd4cSThomas Gleixner static inline void
irq_settings_set_trigger_mask(struct irq_desc * desc,u32 mask)79876dbd4cSThomas Gleixner irq_settings_set_trigger_mask(struct irq_desc *desc, u32 mask)
80876dbd4cSThomas Gleixner {
810c6f8a8bSThomas Gleixner 	desc->status_use_accessors &= ~IRQ_TYPE_SENSE_MASK;
820c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= mask & IRQ_TYPE_SENSE_MASK;
83876dbd4cSThomas Gleixner }
84876dbd4cSThomas Gleixner 
irq_settings_is_level(struct irq_desc * desc)85876dbd4cSThomas Gleixner static inline bool irq_settings_is_level(struct irq_desc *desc)
86876dbd4cSThomas Gleixner {
870c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & _IRQ_LEVEL;
88876dbd4cSThomas Gleixner }
89876dbd4cSThomas Gleixner 
irq_settings_clr_level(struct irq_desc * desc)90876dbd4cSThomas Gleixner static inline void irq_settings_clr_level(struct irq_desc *desc)
91876dbd4cSThomas Gleixner {
920c6f8a8bSThomas Gleixner 	desc->status_use_accessors &= ~_IRQ_LEVEL;
93876dbd4cSThomas Gleixner }
94876dbd4cSThomas Gleixner 
irq_settings_set_level(struct irq_desc * desc)95876dbd4cSThomas Gleixner static inline void irq_settings_set_level(struct irq_desc *desc)
96876dbd4cSThomas Gleixner {
970c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= _IRQ_LEVEL;
98876dbd4cSThomas Gleixner }
991ccb4e61SThomas Gleixner 
irq_settings_can_request(struct irq_desc * desc)1001ccb4e61SThomas Gleixner static inline bool irq_settings_can_request(struct irq_desc *desc)
1011ccb4e61SThomas Gleixner {
1020c6f8a8bSThomas Gleixner 	return !(desc->status_use_accessors & _IRQ_NOREQUEST);
1031ccb4e61SThomas Gleixner }
1041ccb4e61SThomas Gleixner 
irq_settings_clr_norequest(struct irq_desc * desc)1051ccb4e61SThomas Gleixner static inline void irq_settings_clr_norequest(struct irq_desc *desc)
1061ccb4e61SThomas Gleixner {
1070c6f8a8bSThomas Gleixner 	desc->status_use_accessors &= ~_IRQ_NOREQUEST;
1081ccb4e61SThomas Gleixner }
1091ccb4e61SThomas Gleixner 
irq_settings_set_norequest(struct irq_desc * desc)1101ccb4e61SThomas Gleixner static inline void irq_settings_set_norequest(struct irq_desc *desc)
1111ccb4e61SThomas Gleixner {
1120c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= _IRQ_NOREQUEST;
1131ccb4e61SThomas Gleixner }
1141ccb4e61SThomas Gleixner 
irq_settings_can_thread(struct irq_desc * desc)1157f1b1244SPaul Mundt static inline bool irq_settings_can_thread(struct irq_desc *desc)
1167f1b1244SPaul Mundt {
1177f1b1244SPaul Mundt 	return !(desc->status_use_accessors & _IRQ_NOTHREAD);
1187f1b1244SPaul Mundt }
1197f1b1244SPaul Mundt 
irq_settings_clr_nothread(struct irq_desc * desc)1207f1b1244SPaul Mundt static inline void irq_settings_clr_nothread(struct irq_desc *desc)
1217f1b1244SPaul Mundt {
1227f1b1244SPaul Mundt 	desc->status_use_accessors &= ~_IRQ_NOTHREAD;
1237f1b1244SPaul Mundt }
1247f1b1244SPaul Mundt 
irq_settings_set_nothread(struct irq_desc * desc)1257f1b1244SPaul Mundt static inline void irq_settings_set_nothread(struct irq_desc *desc)
1267f1b1244SPaul Mundt {
1277f1b1244SPaul Mundt 	desc->status_use_accessors |= _IRQ_NOTHREAD;
1287f1b1244SPaul Mundt }
1297f1b1244SPaul Mundt 
irq_settings_can_probe(struct irq_desc * desc)1301ccb4e61SThomas Gleixner static inline bool irq_settings_can_probe(struct irq_desc *desc)
1311ccb4e61SThomas Gleixner {
1320c6f8a8bSThomas Gleixner 	return !(desc->status_use_accessors & _IRQ_NOPROBE);
1331ccb4e61SThomas Gleixner }
1341ccb4e61SThomas Gleixner 
irq_settings_clr_noprobe(struct irq_desc * desc)1351ccb4e61SThomas Gleixner static inline void irq_settings_clr_noprobe(struct irq_desc *desc)
1361ccb4e61SThomas Gleixner {
1370c6f8a8bSThomas Gleixner 	desc->status_use_accessors &= ~_IRQ_NOPROBE;
1381ccb4e61SThomas Gleixner }
1391ccb4e61SThomas Gleixner 
irq_settings_set_noprobe(struct irq_desc * desc)1401ccb4e61SThomas Gleixner static inline void irq_settings_set_noprobe(struct irq_desc *desc)
1411ccb4e61SThomas Gleixner {
1420c6f8a8bSThomas Gleixner 	desc->status_use_accessors |= _IRQ_NOPROBE;
1431ccb4e61SThomas Gleixner }
1441ccb4e61SThomas Gleixner 
irq_settings_can_move_pcntxt(struct irq_desc * desc)1451ccb4e61SThomas Gleixner static inline bool irq_settings_can_move_pcntxt(struct irq_desc *desc)
1461ccb4e61SThomas Gleixner {
1470c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & _IRQ_MOVE_PCNTXT;
1481ccb4e61SThomas Gleixner }
1491ccb4e61SThomas Gleixner 
irq_settings_can_autoenable(struct irq_desc * desc)1501ccb4e61SThomas Gleixner static inline bool irq_settings_can_autoenable(struct irq_desc *desc)
1511ccb4e61SThomas Gleixner {
1520c6f8a8bSThomas Gleixner 	return !(desc->status_use_accessors & _IRQ_NOAUTOEN);
1531ccb4e61SThomas Gleixner }
1541ccb4e61SThomas Gleixner 
irq_settings_is_nested_thread(struct irq_desc * desc)1551ccb4e61SThomas Gleixner static inline bool irq_settings_is_nested_thread(struct irq_desc *desc)
1561ccb4e61SThomas Gleixner {
1570c6f8a8bSThomas Gleixner 	return desc->status_use_accessors & _IRQ_NESTED_THREAD;
1581ccb4e61SThomas Gleixner }
159b39898cdSThomas Gleixner 
irq_settings_is_polled(struct irq_desc * desc)160b39898cdSThomas Gleixner static inline bool irq_settings_is_polled(struct irq_desc *desc)
161b39898cdSThomas Gleixner {
162b39898cdSThomas Gleixner 	return desc->status_use_accessors & _IRQ_IS_POLLED;
163b39898cdSThomas Gleixner }
164e9849777SThomas Gleixner 
irq_settings_disable_unlazy(struct irq_desc * desc)165e9849777SThomas Gleixner static inline bool irq_settings_disable_unlazy(struct irq_desc *desc)
166e9849777SThomas Gleixner {
167e9849777SThomas Gleixner 	return desc->status_use_accessors & _IRQ_DISABLE_UNLAZY;
168e9849777SThomas Gleixner }
169e9849777SThomas Gleixner 
irq_settings_clr_disable_unlazy(struct irq_desc * desc)170e9849777SThomas Gleixner static inline void irq_settings_clr_disable_unlazy(struct irq_desc *desc)
171e9849777SThomas Gleixner {
172e9849777SThomas Gleixner 	desc->status_use_accessors &= ~_IRQ_DISABLE_UNLAZY;
173e9849777SThomas Gleixner }
17483cfac95SMarc Zyngier 
irq_settings_is_hidden(struct irq_desc * desc)17583cfac95SMarc Zyngier static inline bool irq_settings_is_hidden(struct irq_desc *desc)
17683cfac95SMarc Zyngier {
17783cfac95SMarc Zyngier 	return desc->status_use_accessors & _IRQ_HIDDEN;
17883cfac95SMarc Zyngier }
179*c2b1063eSThomas Gleixner 
irq_settings_set_no_debug(struct irq_desc * desc)180*c2b1063eSThomas Gleixner static inline void irq_settings_set_no_debug(struct irq_desc *desc)
181*c2b1063eSThomas Gleixner {
182*c2b1063eSThomas Gleixner 	desc->status_use_accessors |= _IRQ_NO_DEBUG;
183*c2b1063eSThomas Gleixner }
184*c2b1063eSThomas Gleixner 
irq_settings_no_debug(struct irq_desc * desc)185*c2b1063eSThomas Gleixner static inline bool irq_settings_no_debug(struct irq_desc *desc)
186*c2b1063eSThomas Gleixner {
187*c2b1063eSThomas Gleixner 	return desc->status_use_accessors & _IRQ_NO_DEBUG;
188*c2b1063eSThomas Gleixner }
189