blob: e43795cd2ccfba2f848dcaa0f3b37aff562af83b [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Thomas Gleixnere6bea9c2011-02-09 13:16:52 +01002/*
3 * Internal header to deal with irq_desc->status which will be renamed
4 * to irq_desc->settings.
5 */
6enum {
7 _IRQ_DEFAULT_INIT_FLAGS = IRQ_DEFAULT_INIT_FLAGS,
Thomas Gleixnera0056772011-02-08 17:11:03 +01008 _IRQ_PER_CPU = IRQ_PER_CPU,
Thomas Gleixner876dbd42011-02-08 17:28:12 +01009 _IRQ_LEVEL = IRQ_LEVEL,
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010010 _IRQ_NOPROBE = IRQ_NOPROBE,
11 _IRQ_NOREQUEST = IRQ_NOREQUEST,
Paul Mundt7f1b1242011-04-07 06:01:44 +090012 _IRQ_NOTHREAD = IRQ_NOTHREAD,
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010013 _IRQ_NOAUTOEN = IRQ_NOAUTOEN,
14 _IRQ_MOVE_PCNTXT = IRQ_MOVE_PCNTXT,
Thomas Gleixnera0056772011-02-08 17:11:03 +010015 _IRQ_NO_BALANCING = IRQ_NO_BALANCING,
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010016 _IRQ_NESTED_THREAD = IRQ_NESTED_THREAD,
Marc Zyngier31d9d9b2011-09-23 17:03:06 +010017 _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID,
Thomas Gleixnerb39898c2013-11-06 12:30:07 +010018 _IRQ_IS_POLLED = IRQ_IS_POLLED,
Thomas Gleixnere9849772015-10-09 23:28:58 +020019 _IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY,
Thomas Gleixnera0056772011-02-08 17:11:03 +010020 _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK,
Thomas Gleixnere6bea9c2011-02-09 13:16:52 +010021};
Thomas Gleixner009b4c32011-02-07 21:48:49 +010022
Thomas Gleixnera0056772011-02-08 17:11:03 +010023#define IRQ_PER_CPU GOT_YOU_MORON
Thomas Gleixnera0056772011-02-08 17:11:03 +010024#define IRQ_NO_BALANCING GOT_YOU_MORON
Thomas Gleixner876dbd42011-02-08 17:28:12 +010025#define IRQ_LEVEL GOT_YOU_MORON
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010026#define IRQ_NOPROBE GOT_YOU_MORON
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010027#define IRQ_NOREQUEST GOT_YOU_MORON
Paul Mundt7f1b1242011-04-07 06:01:44 +090028#define IRQ_NOTHREAD GOT_YOU_MORON
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010029#define IRQ_NOAUTOEN GOT_YOU_MORON
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010030#define IRQ_NESTED_THREAD GOT_YOU_MORON
Marc Zyngier31d9d9b2011-09-23 17:03:06 +010031#define IRQ_PER_CPU_DEVID GOT_YOU_MORON
Thomas Gleixnerb39898c2013-11-06 12:30:07 +010032#define IRQ_IS_POLLED GOT_YOU_MORON
Thomas Gleixnere9849772015-10-09 23:28:58 +020033#define IRQ_DISABLE_UNLAZY GOT_YOU_MORON
Thomas Gleixnera0056772011-02-08 17:11:03 +010034#undef IRQF_MODIFY_MASK
35#define IRQF_MODIFY_MASK GOT_YOU_MORON
36
37static inline void
38irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set)
39{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020040 desc->status_use_accessors &= ~(clr & _IRQF_MODIFY_MASK);
41 desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK);
Thomas Gleixnera0056772011-02-08 17:11:03 +010042}
43
44static inline bool irq_settings_is_per_cpu(struct irq_desc *desc)
45{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020046 return desc->status_use_accessors & _IRQ_PER_CPU;
Thomas Gleixnera0056772011-02-08 17:11:03 +010047}
48
Marc Zyngier31d9d9b2011-09-23 17:03:06 +010049static inline bool irq_settings_is_per_cpu_devid(struct irq_desc *desc)
50{
51 return desc->status_use_accessors & _IRQ_PER_CPU_DEVID;
52}
53
Thomas Gleixnera0056772011-02-08 17:11:03 +010054static inline void irq_settings_set_per_cpu(struct irq_desc *desc)
55{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020056 desc->status_use_accessors |= _IRQ_PER_CPU;
Thomas Gleixnera0056772011-02-08 17:11:03 +010057}
58
59static inline void irq_settings_set_no_balancing(struct irq_desc *desc)
60{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020061 desc->status_use_accessors |= _IRQ_NO_BALANCING;
Thomas Gleixnera0056772011-02-08 17:11:03 +010062}
63
64static inline bool irq_settings_has_no_balance_set(struct irq_desc *desc)
65{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020066 return desc->status_use_accessors & _IRQ_NO_BALANCING;
Thomas Gleixnera0056772011-02-08 17:11:03 +010067}
Thomas Gleixner876dbd42011-02-08 17:28:12 +010068
69static inline u32 irq_settings_get_trigger_mask(struct irq_desc *desc)
70{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020071 return desc->status_use_accessors & IRQ_TYPE_SENSE_MASK;
Thomas Gleixner876dbd42011-02-08 17:28:12 +010072}
73
74static inline void
75irq_settings_set_trigger_mask(struct irq_desc *desc, u32 mask)
76{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020077 desc->status_use_accessors &= ~IRQ_TYPE_SENSE_MASK;
78 desc->status_use_accessors |= mask & IRQ_TYPE_SENSE_MASK;
Thomas Gleixner876dbd42011-02-08 17:28:12 +010079}
80
81static inline bool irq_settings_is_level(struct irq_desc *desc)
82{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020083 return desc->status_use_accessors & _IRQ_LEVEL;
Thomas Gleixner876dbd42011-02-08 17:28:12 +010084}
85
86static inline void irq_settings_clr_level(struct irq_desc *desc)
87{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020088 desc->status_use_accessors &= ~_IRQ_LEVEL;
Thomas Gleixner876dbd42011-02-08 17:28:12 +010089}
90
91static inline void irq_settings_set_level(struct irq_desc *desc)
92{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020093 desc->status_use_accessors |= _IRQ_LEVEL;
Thomas Gleixner876dbd42011-02-08 17:28:12 +010094}
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010095
96static inline bool irq_settings_can_request(struct irq_desc *desc)
97{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +020098 return !(desc->status_use_accessors & _IRQ_NOREQUEST);
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +010099}
100
101static inline void irq_settings_clr_norequest(struct irq_desc *desc)
102{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200103 desc->status_use_accessors &= ~_IRQ_NOREQUEST;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100104}
105
106static inline void irq_settings_set_norequest(struct irq_desc *desc)
107{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200108 desc->status_use_accessors |= _IRQ_NOREQUEST;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100109}
110
Paul Mundt7f1b1242011-04-07 06:01:44 +0900111static inline bool irq_settings_can_thread(struct irq_desc *desc)
112{
113 return !(desc->status_use_accessors & _IRQ_NOTHREAD);
114}
115
116static inline void irq_settings_clr_nothread(struct irq_desc *desc)
117{
118 desc->status_use_accessors &= ~_IRQ_NOTHREAD;
119}
120
121static inline void irq_settings_set_nothread(struct irq_desc *desc)
122{
123 desc->status_use_accessors |= _IRQ_NOTHREAD;
124}
125
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100126static inline bool irq_settings_can_probe(struct irq_desc *desc)
127{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200128 return !(desc->status_use_accessors & _IRQ_NOPROBE);
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100129}
130
131static inline void irq_settings_clr_noprobe(struct irq_desc *desc)
132{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200133 desc->status_use_accessors &= ~_IRQ_NOPROBE;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100134}
135
136static inline void irq_settings_set_noprobe(struct irq_desc *desc)
137{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200138 desc->status_use_accessors |= _IRQ_NOPROBE;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100139}
140
141static inline bool irq_settings_can_move_pcntxt(struct irq_desc *desc)
142{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200143 return desc->status_use_accessors & _IRQ_MOVE_PCNTXT;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100144}
145
146static inline bool irq_settings_can_autoenable(struct irq_desc *desc)
147{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200148 return !(desc->status_use_accessors & _IRQ_NOAUTOEN);
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100149}
150
151static inline bool irq_settings_is_nested_thread(struct irq_desc *desc)
152{
Thomas Gleixner0c6f8a82011-03-28 13:32:20 +0200153 return desc->status_use_accessors & _IRQ_NESTED_THREAD;
Thomas Gleixner1ccb4e612011-02-09 14:44:17 +0100154}
Thomas Gleixnerb39898c2013-11-06 12:30:07 +0100155
156static inline bool irq_settings_is_polled(struct irq_desc *desc)
157{
158 return desc->status_use_accessors & _IRQ_IS_POLLED;
159}
Thomas Gleixnere9849772015-10-09 23:28:58 +0200160
161static inline bool irq_settings_disable_unlazy(struct irq_desc *desc)
162{
163 return desc->status_use_accessors & _IRQ_DISABLE_UNLAZY;
164}
165
166static inline void irq_settings_clr_disable_unlazy(struct irq_desc *desc)
167{
168 desc->status_use_accessors &= ~_IRQ_DISABLE_UNLAZY;
169}