diff options
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/bitops/find.h | 12 | ||||
-rw-r--r-- | include/asm-generic/gpio.h | 235 | ||||
-rw-r--r-- | include/asm-generic/hugetlb.h | 4 | ||||
-rw-r--r-- | include/asm-generic/memory_model.h | 2 | ||||
-rw-r--r-- | include/asm-generic/preempt.h | 105 | ||||
-rw-r--r-- | include/asm-generic/siginfo.h | 2 | ||||
-rw-r--r-- | include/asm-generic/vmlinux.lds.h | 1 | ||||
-rw-r--r-- | include/asm-generic/vtime.h | 1 |
8 files changed, 196 insertions, 166 deletions
diff --git a/include/asm-generic/bitops/find.h b/include/asm-generic/bitops/find.h index 71c778033f57..998d4d544f18 100644 --- a/include/asm-generic/bitops/find.h +++ b/include/asm-generic/bitops/find.h | |||
@@ -7,6 +7,9 @@ | |||
7 | * @addr: The address to base the search on | 7 | * @addr: The address to base the search on |
8 | * @offset: The bitnumber to start searching at | 8 | * @offset: The bitnumber to start searching at |
9 | * @size: The bitmap size in bits | 9 | * @size: The bitmap size in bits |
10 | * | ||
11 | * Returns the bit number for the next set bit | ||
12 | * If no bits are set, returns @size. | ||
10 | */ | 13 | */ |
11 | extern unsigned long find_next_bit(const unsigned long *addr, unsigned long | 14 | extern unsigned long find_next_bit(const unsigned long *addr, unsigned long |
12 | size, unsigned long offset); | 15 | size, unsigned long offset); |
@@ -18,6 +21,9 @@ extern unsigned long find_next_bit(const unsigned long *addr, unsigned long | |||
18 | * @addr: The address to base the search on | 21 | * @addr: The address to base the search on |
19 | * @offset: The bitnumber to start searching at | 22 | * @offset: The bitnumber to start searching at |
20 | * @size: The bitmap size in bits | 23 | * @size: The bitmap size in bits |
24 | * | ||
25 | * Returns the bit number of the next zero bit | ||
26 | * If no bits are zero, returns @size. | ||
21 | */ | 27 | */ |
22 | extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned | 28 | extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned |
23 | long size, unsigned long offset); | 29 | long size, unsigned long offset); |
@@ -28,9 +34,10 @@ extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned | |||
28 | /** | 34 | /** |
29 | * find_first_bit - find the first set bit in a memory region | 35 | * find_first_bit - find the first set bit in a memory region |
30 | * @addr: The address to start the search at | 36 | * @addr: The address to start the search at |
31 | * @size: The maximum size to search | 37 | * @size: The maximum number of bits to search |
32 | * | 38 | * |
33 | * Returns the bit number of the first set bit. | 39 | * Returns the bit number of the first set bit. |
40 | * If no bits are set, returns @size. | ||
34 | */ | 41 | */ |
35 | extern unsigned long find_first_bit(const unsigned long *addr, | 42 | extern unsigned long find_first_bit(const unsigned long *addr, |
36 | unsigned long size); | 43 | unsigned long size); |
@@ -38,9 +45,10 @@ extern unsigned long find_first_bit(const unsigned long *addr, | |||
38 | /** | 45 | /** |
39 | * find_first_zero_bit - find the first cleared bit in a memory region | 46 | * find_first_zero_bit - find the first cleared bit in a memory region |
40 | * @addr: The address to start the search at | 47 | * @addr: The address to start the search at |
41 | * @size: The maximum size to search | 48 | * @size: The maximum number of bits to search |
42 | * | 49 | * |
43 | * Returns the bit number of the first cleared bit. | 50 | * Returns the bit number of the first cleared bit. |
51 | * If no bits are zero, returns @size. | ||
44 | */ | 52 | */ |
45 | extern unsigned long find_first_zero_bit(const unsigned long *addr, | 53 | extern unsigned long find_first_zero_bit(const unsigned long *addr, |
46 | unsigned long size); | 54 | unsigned long size); |
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index bde646995d10..a5f56a0213a7 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h | |||
@@ -10,6 +10,8 @@ | |||
10 | #ifdef CONFIG_GPIOLIB | 10 | #ifdef CONFIG_GPIOLIB |
11 | 11 | ||
12 | #include <linux/compiler.h> | 12 | #include <linux/compiler.h> |
13 | #include <linux/gpio/driver.h> | ||
14 | #include <linux/gpio/consumer.h> | ||
13 | 15 | ||
14 | /* Platforms may implement their GPIO interface with library code, | 16 | /* Platforms may implement their GPIO interface with library code, |
15 | * at a small performance cost for non-inlined operations and some | 17 | * at a small performance cost for non-inlined operations and some |
@@ -49,122 +51,11 @@ struct module; | |||
49 | struct device_node; | 51 | struct device_node; |
50 | struct gpio_desc; | 52 | struct gpio_desc; |
51 | 53 | ||
52 | /** | 54 | /* caller holds gpio_lock *OR* gpio is marked as requested */ |
53 | * struct gpio_chip - abstract a GPIO controller | 55 | static inline struct gpio_chip *gpio_to_chip(unsigned gpio) |
54 | * @label: for diagnostics | 56 | { |
55 | * @dev: optional device providing the GPIOs | 57 | return gpiod_to_chip(gpio_to_desc(gpio)); |
56 | * @owner: helps prevent removal of modules exporting active GPIOs | 58 | } |
57 | * @list: links gpio_chips together for traversal | ||
58 | * @request: optional hook for chip-specific activation, such as | ||
59 | * enabling module power and clock; may sleep | ||
60 | * @free: optional hook for chip-specific deactivation, such as | ||
61 | * disabling module power and clock; may sleep | ||
62 | * @get_direction: returns direction for signal "offset", 0=out, 1=in, | ||
63 | * (same as GPIOF_DIR_XXX), or negative error | ||
64 | * @direction_input: configures signal "offset" as input, or returns error | ||
65 | * @get: returns value for signal "offset"; for output signals this | ||
66 | * returns either the value actually sensed, or zero | ||
67 | * @direction_output: configures signal "offset" as output, or returns error | ||
68 | * @set_debounce: optional hook for setting debounce time for specified gpio in | ||
69 | * interrupt triggered gpio chips | ||
70 | * @set: assigns output value for signal "offset" | ||
71 | * @to_irq: optional hook supporting non-static gpio_to_irq() mappings; | ||
72 | * implementation may not sleep | ||
73 | * @dbg_show: optional routine to show contents in debugfs; default code | ||
74 | * will be used when this is omitted, but custom code can show extra | ||
75 | * state (such as pullup/pulldown configuration). | ||
76 | * @base: identifies the first GPIO number handled by this chip; or, if | ||
77 | * negative during registration, requests dynamic ID allocation. | ||
78 | * @ngpio: the number of GPIOs handled by this controller; the last GPIO | ||
79 | * handled is (base + ngpio - 1). | ||
80 | * @desc: array of ngpio descriptors. Private. | ||
81 | * @can_sleep: flag must be set iff get()/set() methods sleep, as they | ||
82 | * must while accessing GPIO expander chips over I2C or SPI | ||
83 | * @names: if set, must be an array of strings to use as alternative | ||
84 | * names for the GPIOs in this chip. Any entry in the array | ||
85 | * may be NULL if there is no alias for the GPIO, however the | ||
86 | * array must be @ngpio entries long. A name can include a single printk | ||
87 | * format specifier for an unsigned int. It is substituted by the actual | ||
88 | * number of the gpio. | ||
89 | * | ||
90 | * A gpio_chip can help platforms abstract various sources of GPIOs so | ||
91 | * they can all be accessed through a common programing interface. | ||
92 | * Example sources would be SOC controllers, FPGAs, multifunction | ||
93 | * chips, dedicated GPIO expanders, and so on. | ||
94 | * | ||
95 | * Each chip controls a number of signals, identified in method calls | ||
96 | * by "offset" values in the range 0..(@ngpio - 1). When those signals | ||
97 | * are referenced through calls like gpio_get_value(gpio), the offset | ||
98 | * is calculated by subtracting @base from the gpio number. | ||
99 | */ | ||
100 | struct gpio_chip { | ||
101 | const char *label; | ||
102 | struct device *dev; | ||
103 | struct module *owner; | ||
104 | struct list_head list; | ||
105 | |||
106 | int (*request)(struct gpio_chip *chip, | ||
107 | unsigned offset); | ||
108 | void (*free)(struct gpio_chip *chip, | ||
109 | unsigned offset); | ||
110 | int (*get_direction)(struct gpio_chip *chip, | ||
111 | unsigned offset); | ||
112 | int (*direction_input)(struct gpio_chip *chip, | ||
113 | unsigned offset); | ||
114 | int (*get)(struct gpio_chip *chip, | ||
115 | unsigned offset); | ||
116 | int (*direction_output)(struct gpio_chip *chip, | ||
117 | unsigned offset, int value); | ||
118 | int (*set_debounce)(struct gpio_chip *chip, | ||
119 | unsigned offset, unsigned debounce); | ||
120 | |||
121 | void (*set)(struct gpio_chip *chip, | ||
122 | unsigned offset, int value); | ||
123 | |||
124 | int (*to_irq)(struct gpio_chip *chip, | ||
125 | unsigned offset); | ||
126 | |||
127 | void (*dbg_show)(struct seq_file *s, | ||
128 | struct gpio_chip *chip); | ||
129 | int base; | ||
130 | u16 ngpio; | ||
131 | struct gpio_desc *desc; | ||
132 | const char *const *names; | ||
133 | unsigned can_sleep:1; | ||
134 | unsigned exported:1; | ||
135 | |||
136 | #if defined(CONFIG_OF_GPIO) | ||
137 | /* | ||
138 | * If CONFIG_OF is enabled, then all GPIO controllers described in the | ||
139 | * device tree automatically may have an OF translation | ||
140 | */ | ||
141 | struct device_node *of_node; | ||
142 | int of_gpio_n_cells; | ||
143 | int (*of_xlate)(struct gpio_chip *gc, | ||
144 | const struct of_phandle_args *gpiospec, u32 *flags); | ||
145 | #endif | ||
146 | #ifdef CONFIG_PINCTRL | ||
147 | /* | ||
148 | * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally | ||
149 | * describe the actual pin range which they serve in an SoC. This | ||
150 | * information would be used by pinctrl subsystem to configure | ||
151 | * corresponding pins for gpio usage. | ||
152 | */ | ||
153 | struct list_head pin_ranges; | ||
154 | #endif | ||
155 | }; | ||
156 | |||
157 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, | ||
158 | unsigned offset); | ||
159 | extern struct gpio_chip *gpio_to_chip(unsigned gpio); | ||
160 | |||
161 | /* add/remove chips */ | ||
162 | extern int gpiochip_add(struct gpio_chip *chip); | ||
163 | extern int __must_check gpiochip_remove(struct gpio_chip *chip); | ||
164 | extern struct gpio_chip *gpiochip_find(void *data, | ||
165 | int (*match)(struct gpio_chip *chip, | ||
166 | void *data)); | ||
167 | |||
168 | 59 | ||
169 | /* Always use the library code for GPIO management calls, | 60 | /* Always use the library code for GPIO management calls, |
170 | * or when sleeping may be involved. | 61 | * or when sleeping may be involved. |
@@ -172,43 +63,84 @@ extern struct gpio_chip *gpiochip_find(void *data, | |||
172 | extern int gpio_request(unsigned gpio, const char *label); | 63 | extern int gpio_request(unsigned gpio, const char *label); |
173 | extern void gpio_free(unsigned gpio); | 64 | extern void gpio_free(unsigned gpio); |
174 | 65 | ||
175 | extern int gpio_direction_input(unsigned gpio); | 66 | static inline int gpio_direction_input(unsigned gpio) |
176 | extern int gpio_direction_output(unsigned gpio, int value); | 67 | { |
68 | return gpiod_direction_input(gpio_to_desc(gpio)); | ||
69 | } | ||
70 | static inline int gpio_direction_output(unsigned gpio, int value) | ||
71 | { | ||
72 | return gpiod_direction_output(gpio_to_desc(gpio), value); | ||
73 | } | ||
177 | 74 | ||
178 | extern int gpio_set_debounce(unsigned gpio, unsigned debounce); | 75 | static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) |
76 | { | ||
77 | return gpiod_set_debounce(gpio_to_desc(gpio), debounce); | ||
78 | } | ||
179 | 79 | ||
180 | extern int gpio_get_value_cansleep(unsigned gpio); | 80 | static inline int gpio_get_value_cansleep(unsigned gpio) |
181 | extern void gpio_set_value_cansleep(unsigned gpio, int value); | 81 | { |
82 | return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio)); | ||
83 | } | ||
84 | static inline void gpio_set_value_cansleep(unsigned gpio, int value) | ||
85 | { | ||
86 | return gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value); | ||
87 | } | ||
182 | 88 | ||
183 | 89 | ||
184 | /* A platform's <asm/gpio.h> code may want to inline the I/O calls when | 90 | /* A platform's <asm/gpio.h> code may want to inline the I/O calls when |
185 | * the GPIO is constant and refers to some always-present controller, | 91 | * the GPIO is constant and refers to some always-present controller, |
186 | * giving direct access to chip registers and tight bitbanging loops. | 92 | * giving direct access to chip registers and tight bitbanging loops. |
187 | */ | 93 | */ |
188 | extern int __gpio_get_value(unsigned gpio); | 94 | static inline int __gpio_get_value(unsigned gpio) |
189 | extern void __gpio_set_value(unsigned gpio, int value); | 95 | { |
96 | return gpiod_get_raw_value(gpio_to_desc(gpio)); | ||
97 | } | ||
98 | static inline void __gpio_set_value(unsigned gpio, int value) | ||
99 | { | ||
100 | return gpiod_set_raw_value(gpio_to_desc(gpio), value); | ||
101 | } | ||
190 | 102 | ||
191 | extern int __gpio_cansleep(unsigned gpio); | 103 | static inline int __gpio_cansleep(unsigned gpio) |
104 | { | ||
105 | return gpiod_cansleep(gpio_to_desc(gpio)); | ||
106 | } | ||
192 | 107 | ||
193 | extern int __gpio_to_irq(unsigned gpio); | 108 | static inline int __gpio_to_irq(unsigned gpio) |
109 | { | ||
110 | return gpiod_to_irq(gpio_to_desc(gpio)); | ||
111 | } | ||
112 | |||
113 | extern int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset); | ||
114 | extern void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset); | ||
194 | 115 | ||
195 | extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label); | 116 | extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label); |
196 | extern int gpio_request_array(const struct gpio *array, size_t num); | 117 | extern int gpio_request_array(const struct gpio *array, size_t num); |
197 | extern void gpio_free_array(const struct gpio *array, size_t num); | 118 | extern void gpio_free_array(const struct gpio *array, size_t num); |
198 | 119 | ||
199 | #ifdef CONFIG_GPIO_SYSFS | ||
200 | |||
201 | /* | 120 | /* |
202 | * A sysfs interface can be exported by individual drivers if they want, | 121 | * A sysfs interface can be exported by individual drivers if they want, |
203 | * but more typically is configured entirely from userspace. | 122 | * but more typically is configured entirely from userspace. |
204 | */ | 123 | */ |
205 | extern int gpio_export(unsigned gpio, bool direction_may_change); | 124 | static inline int gpio_export(unsigned gpio, bool direction_may_change) |
206 | extern int gpio_export_link(struct device *dev, const char *name, | 125 | { |
207 | unsigned gpio); | 126 | return gpiod_export(gpio_to_desc(gpio), direction_may_change); |
208 | extern int gpio_sysfs_set_active_low(unsigned gpio, int value); | 127 | } |
209 | extern void gpio_unexport(unsigned gpio); | 128 | |
129 | static inline int gpio_export_link(struct device *dev, const char *name, | ||
130 | unsigned gpio) | ||
131 | { | ||
132 | return gpiod_export_link(dev, name, gpio_to_desc(gpio)); | ||
133 | } | ||
134 | |||
135 | static inline int gpio_sysfs_set_active_low(unsigned gpio, int value) | ||
136 | { | ||
137 | return gpiod_sysfs_set_active_low(gpio_to_desc(gpio), value); | ||
138 | } | ||
210 | 139 | ||
211 | #endif /* CONFIG_GPIO_SYSFS */ | 140 | static inline void gpio_unexport(unsigned gpio) |
141 | { | ||
142 | gpiod_unexport(gpio_to_desc(gpio)); | ||
143 | } | ||
212 | 144 | ||
213 | #ifdef CONFIG_PINCTRL | 145 | #ifdef CONFIG_PINCTRL |
214 | 146 | ||
@@ -228,6 +160,9 @@ struct gpio_pin_range { | |||
228 | int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | 160 | int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, |
229 | unsigned int gpio_offset, unsigned int pin_offset, | 161 | unsigned int gpio_offset, unsigned int pin_offset, |
230 | unsigned int npins); | 162 | unsigned int npins); |
163 | int gpiochip_add_pingroup_range(struct gpio_chip *chip, | ||
164 | struct pinctrl_dev *pctldev, | ||
165 | unsigned int gpio_offset, const char *pin_group); | ||
231 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip); | 166 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip); |
232 | 167 | ||
233 | #else | 168 | #else |
@@ -239,6 +174,13 @@ gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | |||
239 | { | 174 | { |
240 | return 0; | 175 | return 0; |
241 | } | 176 | } |
177 | static inline int | ||
178 | gpiochip_add_pingroup_range(struct gpio_chip *chip, | ||
179 | struct pinctrl_dev *pctldev, | ||
180 | unsigned int gpio_offset, const char *pin_group) | ||
181 | { | ||
182 | return 0; | ||
183 | } | ||
242 | 184 | ||
243 | static inline void | 185 | static inline void |
244 | gpiochip_remove_pin_ranges(struct gpio_chip *chip) | 186 | gpiochip_remove_pin_ranges(struct gpio_chip *chip) |
@@ -278,31 +220,4 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value) | |||
278 | 220 | ||
279 | #endif /* !CONFIG_GPIOLIB */ | 221 | #endif /* !CONFIG_GPIOLIB */ |
280 | 222 | ||
281 | #ifndef CONFIG_GPIO_SYSFS | ||
282 | |||
283 | struct device; | ||
284 | |||
285 | /* sysfs support is only available with gpiolib, where it's optional */ | ||
286 | |||
287 | static inline int gpio_export(unsigned gpio, bool direction_may_change) | ||
288 | { | ||
289 | return -ENOSYS; | ||
290 | } | ||
291 | |||
292 | static inline int gpio_export_link(struct device *dev, const char *name, | ||
293 | unsigned gpio) | ||
294 | { | ||
295 | return -ENOSYS; | ||
296 | } | ||
297 | |||
298 | static inline int gpio_sysfs_set_active_low(unsigned gpio, int value) | ||
299 | { | ||
300 | return -ENOSYS; | ||
301 | } | ||
302 | |||
303 | static inline void gpio_unexport(unsigned gpio) | ||
304 | { | ||
305 | } | ||
306 | #endif /* CONFIG_GPIO_SYSFS */ | ||
307 | |||
308 | #endif /* _ASM_GENERIC_GPIO_H */ | 223 | #endif /* _ASM_GENERIC_GPIO_H */ |
diff --git a/include/asm-generic/hugetlb.h b/include/asm-generic/hugetlb.h index d06079c774a0..99b490b4d05a 100644 --- a/include/asm-generic/hugetlb.h +++ b/include/asm-generic/hugetlb.h | |||
@@ -6,12 +6,12 @@ static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot) | |||
6 | return mk_pte(page, pgprot); | 6 | return mk_pte(page, pgprot); |
7 | } | 7 | } |
8 | 8 | ||
9 | static inline int huge_pte_write(pte_t pte) | 9 | static inline unsigned long huge_pte_write(pte_t pte) |
10 | { | 10 | { |
11 | return pte_write(pte); | 11 | return pte_write(pte); |
12 | } | 12 | } |
13 | 13 | ||
14 | static inline int huge_pte_dirty(pte_t pte) | 14 | static inline unsigned long huge_pte_dirty(pte_t pte) |
15 | { | 15 | { |
16 | return pte_dirty(pte); | 16 | return pte_dirty(pte); |
17 | } | 17 | } |
diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h index aea9e45efce6..14909b0b9cae 100644 --- a/include/asm-generic/memory_model.h +++ b/include/asm-generic/memory_model.h | |||
@@ -53,7 +53,7 @@ | |||
53 | 53 | ||
54 | #elif defined(CONFIG_SPARSEMEM) | 54 | #elif defined(CONFIG_SPARSEMEM) |
55 | /* | 55 | /* |
56 | * Note: section's mem_map is encorded to reflect its start_pfn. | 56 | * Note: section's mem_map is encoded to reflect its start_pfn. |
57 | * section[i].section_mem_map == mem_map's address - start_pfn; | 57 | * section[i].section_mem_map == mem_map's address - start_pfn; |
58 | */ | 58 | */ |
59 | #define __page_to_pfn(pg) \ | 59 | #define __page_to_pfn(pg) \ |
diff --git a/include/asm-generic/preempt.h b/include/asm-generic/preempt.h new file mode 100644 index 000000000000..ddf2b420ac8f --- /dev/null +++ b/include/asm-generic/preempt.h | |||
@@ -0,0 +1,105 @@ | |||
1 | #ifndef __ASM_PREEMPT_H | ||
2 | #define __ASM_PREEMPT_H | ||
3 | |||
4 | #include <linux/thread_info.h> | ||
5 | |||
6 | /* | ||
7 | * We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users | ||
8 | * that think a non-zero value indicates we cannot preempt. | ||
9 | */ | ||
10 | static __always_inline int preempt_count(void) | ||
11 | { | ||
12 | return current_thread_info()->preempt_count & ~PREEMPT_NEED_RESCHED; | ||
13 | } | ||
14 | |||
15 | static __always_inline int *preempt_count_ptr(void) | ||
16 | { | ||
17 | return ¤t_thread_info()->preempt_count; | ||
18 | } | ||
19 | |||
20 | /* | ||
21 | * We now loose PREEMPT_NEED_RESCHED and cause an extra reschedule; however the | ||
22 | * alternative is loosing a reschedule. Better schedule too often -- also this | ||
23 | * should be a very rare operation. | ||
24 | */ | ||
25 | static __always_inline void preempt_count_set(int pc) | ||
26 | { | ||
27 | *preempt_count_ptr() = pc; | ||
28 | } | ||
29 | |||
30 | /* | ||
31 | * must be macros to avoid header recursion hell | ||
32 | */ | ||
33 | #define task_preempt_count(p) \ | ||
34 | (task_thread_info(p)->preempt_count & ~PREEMPT_NEED_RESCHED) | ||
35 | |||
36 | #define init_task_preempt_count(p) do { \ | ||
37 | task_thread_info(p)->preempt_count = PREEMPT_DISABLED; \ | ||
38 | } while (0) | ||
39 | |||
40 | #define init_idle_preempt_count(p, cpu) do { \ | ||
41 | task_thread_info(p)->preempt_count = PREEMPT_ENABLED; \ | ||
42 | } while (0) | ||
43 | |||
44 | /* | ||
45 | * We fold the NEED_RESCHED bit into the preempt count such that | ||
46 | * preempt_enable() can decrement and test for needing to reschedule with a | ||
47 | * single instruction. | ||
48 | * | ||
49 | * We invert the actual bit, so that when the decrement hits 0 we know we both | ||
50 | * need to resched (the bit is cleared) and can resched (no preempt count). | ||
51 | */ | ||
52 | |||
53 | static __always_inline void set_preempt_need_resched(void) | ||
54 | { | ||
55 | *preempt_count_ptr() &= ~PREEMPT_NEED_RESCHED; | ||
56 | } | ||
57 | |||
58 | static __always_inline void clear_preempt_need_resched(void) | ||
59 | { | ||
60 | *preempt_count_ptr() |= PREEMPT_NEED_RESCHED; | ||
61 | } | ||
62 | |||
63 | static __always_inline bool test_preempt_need_resched(void) | ||
64 | { | ||
65 | return !(*preempt_count_ptr() & PREEMPT_NEED_RESCHED); | ||
66 | } | ||
67 | |||
68 | /* | ||
69 | * The various preempt_count add/sub methods | ||
70 | */ | ||
71 | |||
72 | static __always_inline void __preempt_count_add(int val) | ||
73 | { | ||
74 | *preempt_count_ptr() += val; | ||
75 | } | ||
76 | |||
77 | static __always_inline void __preempt_count_sub(int val) | ||
78 | { | ||
79 | *preempt_count_ptr() -= val; | ||
80 | } | ||
81 | |||
82 | static __always_inline bool __preempt_count_dec_and_test(void) | ||
83 | { | ||
84 | return !--*preempt_count_ptr(); | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * Returns true when we need to resched and can (barring IRQ state). | ||
89 | */ | ||
90 | static __always_inline bool should_resched(void) | ||
91 | { | ||
92 | return unlikely(!*preempt_count_ptr()); | ||
93 | } | ||
94 | |||
95 | #ifdef CONFIG_PREEMPT | ||
96 | extern asmlinkage void preempt_schedule(void); | ||
97 | #define __preempt_schedule() preempt_schedule() | ||
98 | |||
99 | #ifdef CONFIG_CONTEXT_TRACKING | ||
100 | extern asmlinkage void preempt_schedule_context(void); | ||
101 | #define __preempt_schedule_context() preempt_schedule_context() | ||
102 | #endif | ||
103 | #endif /* CONFIG_PREEMPT */ | ||
104 | |||
105 | #endif /* __ASM_PREEMPT_H */ | ||
diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index b685d3bd32e2..3d1a3af5cf59 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h | |||
@@ -32,6 +32,6 @@ static inline void copy_siginfo(struct siginfo *to, struct siginfo *from) | |||
32 | 32 | ||
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | extern int copy_siginfo_to_user(struct siginfo __user *to, struct siginfo *from); | 35 | extern int copy_siginfo_to_user(struct siginfo __user *to, const struct siginfo *from); |
36 | 36 | ||
37 | #endif | 37 | #endif |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 83e2c31e8b00..bc2121fa9132 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -473,6 +473,7 @@ | |||
473 | #define KERNEL_CTORS() . = ALIGN(8); \ | 473 | #define KERNEL_CTORS() . = ALIGN(8); \ |
474 | VMLINUX_SYMBOL(__ctors_start) = .; \ | 474 | VMLINUX_SYMBOL(__ctors_start) = .; \ |
475 | *(.ctors) \ | 475 | *(.ctors) \ |
476 | *(.init_array) \ | ||
476 | VMLINUX_SYMBOL(__ctors_end) = .; | 477 | VMLINUX_SYMBOL(__ctors_end) = .; |
477 | #else | 478 | #else |
478 | #define KERNEL_CTORS() | 479 | #define KERNEL_CTORS() |
diff --git a/include/asm-generic/vtime.h b/include/asm-generic/vtime.h index e69de29bb2d1..b1a49677fe25 100644 --- a/include/asm-generic/vtime.h +++ b/include/asm-generic/vtime.h | |||
@@ -0,0 +1 @@ | |||
/* no content, but patch(1) dislikes empty files */ | |||