Annotation of /trunk/kernel-alx/patches-4.1/0100-4.1.1-all-fixes.patch
Parent Directory | Revision Log
Revision 2748 -
(hide annotations)
(download)
Mon Jan 11 12:00:45 2016 UTC (8 years, 8 months ago) by niro
File size: 13952 byte(s)
Mon Jan 11 12:00:45 2016 UTC (8 years, 8 months ago) by niro
File size: 13952 byte(s)
-linux-4.1 patches up to 4.1.15
1 | niro | 2748 | diff --git a/Makefile b/Makefile |
2 | index f5c8983aeeb7..1caf4ad3eb8a 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,8 +1,8 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 1 | ||
8 | -SUBLEVEL = 0 | ||
9 | +SUBLEVEL = 1 | ||
10 | EXTRAVERSION = | ||
11 | -NAME = Hurr durr I'ma sheep | ||
12 | +NAME = Series 4800 | ||
13 | |||
14 | # *DOCUMENTATION* | ||
15 | # To see a list of typical targets execute "make help" | ||
16 | diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c | ||
17 | index 4f7001f28936..aa4e3a74e541 100644 | ||
18 | --- a/arch/x86/kernel/cpu/perf_event.c | ||
19 | +++ b/arch/x86/kernel/cpu/perf_event.c | ||
20 | @@ -270,11 +270,7 @@ msr_fail: | ||
21 | |||
22 | static void hw_perf_event_destroy(struct perf_event *event) | ||
23 | { | ||
24 | - if (atomic_dec_and_mutex_lock(&active_events, &pmc_reserve_mutex)) { | ||
25 | - release_pmc_hardware(); | ||
26 | - release_ds_buffers(); | ||
27 | - mutex_unlock(&pmc_reserve_mutex); | ||
28 | - } | ||
29 | + x86_release_hardware(); | ||
30 | } | ||
31 | |||
32 | void hw_perf_lbr_event_destroy(struct perf_event *event) | ||
33 | @@ -324,6 +320,35 @@ set_ext_hw_attr(struct hw_perf_event *hwc, struct perf_event *event) | ||
34 | return x86_pmu_extra_regs(val, event); | ||
35 | } | ||
36 | |||
37 | +int x86_reserve_hardware(void) | ||
38 | +{ | ||
39 | + int err = 0; | ||
40 | + | ||
41 | + if (!atomic_inc_not_zero(&active_events)) { | ||
42 | + mutex_lock(&pmc_reserve_mutex); | ||
43 | + if (atomic_read(&active_events) == 0) { | ||
44 | + if (!reserve_pmc_hardware()) | ||
45 | + err = -EBUSY; | ||
46 | + else | ||
47 | + reserve_ds_buffers(); | ||
48 | + } | ||
49 | + if (!err) | ||
50 | + atomic_inc(&active_events); | ||
51 | + mutex_unlock(&pmc_reserve_mutex); | ||
52 | + } | ||
53 | + | ||
54 | + return err; | ||
55 | +} | ||
56 | + | ||
57 | +void x86_release_hardware(void) | ||
58 | +{ | ||
59 | + if (atomic_dec_and_mutex_lock(&active_events, &pmc_reserve_mutex)) { | ||
60 | + release_pmc_hardware(); | ||
61 | + release_ds_buffers(); | ||
62 | + mutex_unlock(&pmc_reserve_mutex); | ||
63 | + } | ||
64 | +} | ||
65 | + | ||
66 | /* | ||
67 | * Check if we can create event of a certain type (that no conflicting events | ||
68 | * are present). | ||
69 | @@ -336,9 +361,10 @@ int x86_add_exclusive(unsigned int what) | ||
70 | return 0; | ||
71 | |||
72 | mutex_lock(&pmc_reserve_mutex); | ||
73 | - for (i = 0; i < ARRAY_SIZE(x86_pmu.lbr_exclusive); i++) | ||
74 | + for (i = 0; i < ARRAY_SIZE(x86_pmu.lbr_exclusive); i++) { | ||
75 | if (i != what && atomic_read(&x86_pmu.lbr_exclusive[i])) | ||
76 | goto out; | ||
77 | + } | ||
78 | |||
79 | atomic_inc(&x86_pmu.lbr_exclusive[what]); | ||
80 | ret = 0; | ||
81 | @@ -527,19 +553,7 @@ static int __x86_pmu_event_init(struct perf_event *event) | ||
82 | if (!x86_pmu_initialized()) | ||
83 | return -ENODEV; | ||
84 | |||
85 | - err = 0; | ||
86 | - if (!atomic_inc_not_zero(&active_events)) { | ||
87 | - mutex_lock(&pmc_reserve_mutex); | ||
88 | - if (atomic_read(&active_events) == 0) { | ||
89 | - if (!reserve_pmc_hardware()) | ||
90 | - err = -EBUSY; | ||
91 | - else | ||
92 | - reserve_ds_buffers(); | ||
93 | - } | ||
94 | - if (!err) | ||
95 | - atomic_inc(&active_events); | ||
96 | - mutex_unlock(&pmc_reserve_mutex); | ||
97 | - } | ||
98 | + err = x86_reserve_hardware(); | ||
99 | if (err) | ||
100 | return err; | ||
101 | |||
102 | diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h | ||
103 | index ef78516850fb..f068695eaca0 100644 | ||
104 | --- a/arch/x86/kernel/cpu/perf_event.h | ||
105 | +++ b/arch/x86/kernel/cpu/perf_event.h | ||
106 | @@ -703,6 +703,10 @@ int x86_add_exclusive(unsigned int what); | ||
107 | |||
108 | void x86_del_exclusive(unsigned int what); | ||
109 | |||
110 | +int x86_reserve_hardware(void); | ||
111 | + | ||
112 | +void x86_release_hardware(void); | ||
113 | + | ||
114 | void hw_perf_lbr_event_destroy(struct perf_event *event); | ||
115 | |||
116 | int x86_setup_perfctr(struct perf_event *event); | ||
117 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c | ||
118 | index a1e35c9f06b9..2813ea0f142e 100644 | ||
119 | --- a/arch/x86/kernel/cpu/perf_event_intel.c | ||
120 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c | ||
121 | @@ -3253,6 +3253,8 @@ __init int intel_pmu_init(void) | ||
122 | |||
123 | case 61: /* 14nm Broadwell Core-M */ | ||
124 | case 86: /* 14nm Broadwell Xeon D */ | ||
125 | + case 71: /* 14nm Broadwell + GT3e (Intel Iris Pro graphics) */ | ||
126 | + case 79: /* 14nm Broadwell Server */ | ||
127 | x86_pmu.late_ack = true; | ||
128 | memcpy(hw_cache_event_ids, hsw_hw_cache_event_ids, sizeof(hw_cache_event_ids)); | ||
129 | memcpy(hw_cache_extra_regs, hsw_hw_cache_extra_regs, sizeof(hw_cache_extra_regs)); | ||
130 | @@ -3322,13 +3324,13 @@ __init int intel_pmu_init(void) | ||
131 | * counter, so do not extend mask to generic counters | ||
132 | */ | ||
133 | for_each_event_constraint(c, x86_pmu.event_constraints) { | ||
134 | - if (c->cmask != FIXED_EVENT_FLAGS | ||
135 | - || c->idxmsk64 == INTEL_PMC_MSK_FIXED_REF_CYCLES) { | ||
136 | - continue; | ||
137 | + if (c->cmask == FIXED_EVENT_FLAGS | ||
138 | + && c->idxmsk64 != INTEL_PMC_MSK_FIXED_REF_CYCLES) { | ||
139 | + c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1; | ||
140 | } | ||
141 | - | ||
142 | - c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1; | ||
143 | - c->weight += x86_pmu.num_counters; | ||
144 | + c->idxmsk64 &= | ||
145 | + ~(~0UL << (INTEL_PMC_IDX_FIXED + x86_pmu.num_counters_fixed)); | ||
146 | + c->weight = hweight64(c->idxmsk64); | ||
147 | } | ||
148 | } | ||
149 | |||
150 | diff --git a/arch/x86/kernel/cpu/perf_event_intel_bts.c b/arch/x86/kernel/cpu/perf_event_intel_bts.c | ||
151 | index ac1f0c55f379..7795f3f8b1d5 100644 | ||
152 | --- a/arch/x86/kernel/cpu/perf_event_intel_bts.c | ||
153 | +++ b/arch/x86/kernel/cpu/perf_event_intel_bts.c | ||
154 | @@ -483,17 +483,26 @@ static int bts_event_add(struct perf_event *event, int mode) | ||
155 | |||
156 | static void bts_event_destroy(struct perf_event *event) | ||
157 | { | ||
158 | + x86_release_hardware(); | ||
159 | x86_del_exclusive(x86_lbr_exclusive_bts); | ||
160 | } | ||
161 | |||
162 | static int bts_event_init(struct perf_event *event) | ||
163 | { | ||
164 | + int ret; | ||
165 | + | ||
166 | if (event->attr.type != bts_pmu.type) | ||
167 | return -ENOENT; | ||
168 | |||
169 | if (x86_add_exclusive(x86_lbr_exclusive_bts)) | ||
170 | return -EBUSY; | ||
171 | |||
172 | + ret = x86_reserve_hardware(); | ||
173 | + if (ret) { | ||
174 | + x86_del_exclusive(x86_lbr_exclusive_bts); | ||
175 | + return ret; | ||
176 | + } | ||
177 | + | ||
178 | event->destroy = bts_event_destroy; | ||
179 | |||
180 | return 0; | ||
181 | diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S | ||
182 | index 53eeb226657c..7e429c99c728 100644 | ||
183 | --- a/arch/x86/kernel/head_32.S | ||
184 | +++ b/arch/x86/kernel/head_32.S | ||
185 | @@ -62,9 +62,16 @@ | ||
186 | #define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD) | ||
187 | #endif | ||
188 | |||
189 | -/* Number of possible pages in the lowmem region */ | ||
190 | -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) | ||
191 | - | ||
192 | +/* | ||
193 | + * Number of possible pages in the lowmem region. | ||
194 | + * | ||
195 | + * We shift 2 by 31 instead of 1 by 32 to the left in order to avoid a | ||
196 | + * gas warning about overflowing shift count when gas has been compiled | ||
197 | + * with only a host target support using a 32-bit type for internal | ||
198 | + * representation. | ||
199 | + */ | ||
200 | +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) | ||
201 | + | ||
202 | /* Enough space to fit pagetables for the low memory linear map */ | ||
203 | MAPPING_BEYOND_END = PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT | ||
204 | |||
205 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c | ||
206 | index 8c81af6dbe06..e527a3e13939 100644 | ||
207 | --- a/drivers/bluetooth/ath3k.c | ||
208 | +++ b/drivers/bluetooth/ath3k.c | ||
209 | @@ -80,6 +80,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
210 | { USB_DEVICE(0x0489, 0xe057) }, | ||
211 | { USB_DEVICE(0x0489, 0xe056) }, | ||
212 | { USB_DEVICE(0x0489, 0xe05f) }, | ||
213 | + { USB_DEVICE(0x0489, 0xe076) }, | ||
214 | { USB_DEVICE(0x0489, 0xe078) }, | ||
215 | { USB_DEVICE(0x04c5, 0x1330) }, | ||
216 | { USB_DEVICE(0x04CA, 0x3004) }, | ||
217 | @@ -88,6 +89,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
218 | { USB_DEVICE(0x04CA, 0x3007) }, | ||
219 | { USB_DEVICE(0x04CA, 0x3008) }, | ||
220 | { USB_DEVICE(0x04CA, 0x300b) }, | ||
221 | + { USB_DEVICE(0x04CA, 0x300d) }, | ||
222 | { USB_DEVICE(0x04CA, 0x300f) }, | ||
223 | { USB_DEVICE(0x04CA, 0x3010) }, | ||
224 | { USB_DEVICE(0x0930, 0x0219) }, | ||
225 | @@ -113,6 +115,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
226 | { USB_DEVICE(0x13d3, 0x3408) }, | ||
227 | { USB_DEVICE(0x13d3, 0x3423) }, | ||
228 | { USB_DEVICE(0x13d3, 0x3432) }, | ||
229 | + { USB_DEVICE(0x13d3, 0x3474) }, | ||
230 | |||
231 | /* Atheros AR5BBU12 with sflash firmware */ | ||
232 | { USB_DEVICE(0x0489, 0xE02C) }, | ||
233 | @@ -137,6 +140,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
234 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, | ||
235 | { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, | ||
236 | { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, | ||
237 | + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, | ||
238 | { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, | ||
239 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
240 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
241 | @@ -145,6 +149,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
242 | { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 }, | ||
243 | { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, | ||
244 | { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, | ||
245 | + { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, | ||
246 | { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, | ||
247 | { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, | ||
248 | { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, | ||
249 | @@ -170,6 +175,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
250 | { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, | ||
251 | { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, | ||
252 | { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, | ||
253 | + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, | ||
254 | |||
255 | /* Atheros AR5BBU22 with sflash firmware */ | ||
256 | { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, | ||
257 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
258 | index 3c10d4dfe9a7..420cc9f3eb76 100644 | ||
259 | --- a/drivers/bluetooth/btusb.c | ||
260 | +++ b/drivers/bluetooth/btusb.c | ||
261 | @@ -178,6 +178,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
262 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, | ||
263 | { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, | ||
264 | { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, | ||
265 | + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, | ||
266 | { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, | ||
267 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
268 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
269 | @@ -186,6 +187,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
270 | { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 }, | ||
271 | { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, | ||
272 | { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, | ||
273 | + { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, | ||
274 | { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, | ||
275 | { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, | ||
276 | { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, | ||
277 | @@ -211,6 +213,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
278 | { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, | ||
279 | { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, | ||
280 | { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, | ||
281 | + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, | ||
282 | |||
283 | /* Atheros AR5BBU12 with sflash firmware */ | ||
284 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, | ||
285 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c | ||
286 | index b2f9521fe551..4cdac7801c8b 100644 | ||
287 | --- a/drivers/net/wireless/b43/main.c | ||
288 | +++ b/drivers/net/wireless/b43/main.c | ||
289 | @@ -5365,6 +5365,10 @@ static void b43_supported_bands(struct b43_wldev *dev, bool *have_2ghz_phy, | ||
290 | *have_5ghz_phy = true; | ||
291 | return; | ||
292 | case 0x4321: /* BCM4306 */ | ||
293 | + /* There are 14e4:4321 PCI devs with 2.4 GHz BCM4321 (N-PHY) */ | ||
294 | + if (dev->phy.type != B43_PHYTYPE_G) | ||
295 | + break; | ||
296 | + /* fall through */ | ||
297 | case 0x4313: /* BCM4311 */ | ||
298 | case 0x431a: /* BCM4318 */ | ||
299 | case 0x432a: /* BCM4321 */ | ||
300 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
301 | index 5c8f58114677..a086e1d69bc7 100644 | ||
302 | --- a/drivers/usb/class/cdc-acm.c | ||
303 | +++ b/drivers/usb/class/cdc-acm.c | ||
304 | @@ -1477,6 +1477,11 @@ skip_countries: | ||
305 | goto alloc_fail8; | ||
306 | } | ||
307 | |||
308 | + if (quirks & CLEAR_HALT_CONDITIONS) { | ||
309 | + usb_clear_halt(usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress)); | ||
310 | + usb_clear_halt(usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress)); | ||
311 | + } | ||
312 | + | ||
313 | return 0; | ||
314 | alloc_fail8: | ||
315 | if (acm->country_codes) { | ||
316 | @@ -1756,6 +1761,10 @@ static const struct usb_device_id acm_ids[] = { | ||
317 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | ||
318 | }, | ||
319 | |||
320 | + { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ | ||
321 | + .driver_info = CLEAR_HALT_CONDITIONS, | ||
322 | + }, | ||
323 | + | ||
324 | /* Nokia S60 phones expose two ACM channels. The first is | ||
325 | * a modem and is picked up by the standard AT-command | ||
326 | * information below. The second is 'vendor-specific' but | ||
327 | diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h | ||
328 | index ffeb3c83941f..b3b6c9db6fe5 100644 | ||
329 | --- a/drivers/usb/class/cdc-acm.h | ||
330 | +++ b/drivers/usb/class/cdc-acm.h | ||
331 | @@ -133,3 +133,4 @@ struct acm { | ||
332 | #define NO_DATA_INTERFACE BIT(4) | ||
333 | #define IGNORE_DEVICE BIT(5) | ||
334 | #define QUIRK_CONTROL_LINE_STATE BIT(6) | ||
335 | +#define CLEAR_HALT_CONDITIONS BIT(7) | ||
336 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
337 | index eddf1ed4155e..0ceb386777ae 100644 | ||
338 | --- a/kernel/events/core.c | ||
339 | +++ b/kernel/events/core.c | ||
340 | @@ -4331,20 +4331,20 @@ static void ring_buffer_attach(struct perf_event *event, | ||
341 | WARN_ON_ONCE(event->rcu_pending); | ||
342 | |||
343 | old_rb = event->rb; | ||
344 | - event->rcu_batches = get_state_synchronize_rcu(); | ||
345 | - event->rcu_pending = 1; | ||
346 | - | ||
347 | spin_lock_irqsave(&old_rb->event_lock, flags); | ||
348 | list_del_rcu(&event->rb_entry); | ||
349 | spin_unlock_irqrestore(&old_rb->event_lock, flags); | ||
350 | - } | ||
351 | |||
352 | - if (event->rcu_pending && rb) { | ||
353 | - cond_synchronize_rcu(event->rcu_batches); | ||
354 | - event->rcu_pending = 0; | ||
355 | + event->rcu_batches = get_state_synchronize_rcu(); | ||
356 | + event->rcu_pending = 1; | ||
357 | } | ||
358 | |||
359 | if (rb) { | ||
360 | + if (event->rcu_pending) { | ||
361 | + cond_synchronize_rcu(event->rcu_batches); | ||
362 | + event->rcu_pending = 0; | ||
363 | + } | ||
364 | + | ||
365 | spin_lock_irqsave(&rb->event_lock, flags); | ||
366 | list_add_rcu(&event->rb_entry, &rb->event_list); | ||
367 | spin_unlock_irqrestore(&rb->event_lock, flags); | ||
368 | diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build | ||
369 | index 10df57237a66..98cfc388ea33 100644 | ||
370 | --- a/tools/build/Makefile.build | ||
371 | +++ b/tools/build/Makefile.build | ||
372 | @@ -94,12 +94,12 @@ obj-y := $(patsubst %/, %/$(obj)-in.o, $(obj-y)) | ||
373 | subdir-obj-y := $(filter %/$(obj)-in.o, $(obj-y)) | ||
374 | |||
375 | # '$(OUTPUT)/dir' prefix to all objects | ||
376 | -prefix := $(subst ./,,$(OUTPUT)$(dir)/) | ||
377 | -obj-y := $(addprefix $(prefix),$(obj-y)) | ||
378 | -subdir-obj-y := $(addprefix $(prefix),$(subdir-obj-y)) | ||
379 | +objprefix := $(subst ./,,$(OUTPUT)$(dir)/) | ||
380 | +obj-y := $(addprefix $(objprefix),$(obj-y)) | ||
381 | +subdir-obj-y := $(addprefix $(objprefix),$(subdir-obj-y)) | ||
382 | |||
383 | # Final '$(obj)-in.o' object | ||
384 | -in-target := $(prefix)$(obj)-in.o | ||
385 | +in-target := $(objprefix)$(obj)-in.o | ||
386 | |||
387 | PHONY += $(subdir-y) | ||
388 |