Magellan Linux

Contents of /trunk/kernel-alx/patches-4.9/0269-4.9.170-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3346 - (show annotations) (download)
Tue Jun 18 09:42:00 2019 UTC (4 years, 10 months ago) by niro
File size: 138305 byte(s)
-linux-4.9.170
1 diff --git a/Makefile b/Makefile
2 index 23cc23c47adf..966069dab768 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,6 +1,6 @@
6 VERSION = 4
7 PATCHLEVEL = 9
8 -SUBLEVEL = 169
9 +SUBLEVEL = 170
10 EXTRAVERSION =
11 NAME = Roaring Lionus
12
13 diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S
14 index 1f945d0f40da..208bf2c9e7b0 100644
15 --- a/arch/arc/kernel/head.S
16 +++ b/arch/arc/kernel/head.S
17 @@ -107,6 +107,7 @@ ENTRY(stext)
18 ; r2 = pointer to uboot provided cmdline or external DTB in mem
19 ; These are handled later in handle_uboot_args()
20 st r0, [@uboot_tag]
21 + st r1, [@uboot_magic]
22 st r2, [@uboot_arg]
23 #endif
24
25 diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
26 index 9119bea503a7..9f96120eee6e 100644
27 --- a/arch/arc/kernel/setup.c
28 +++ b/arch/arc/kernel/setup.c
29 @@ -32,6 +32,7 @@ unsigned int intr_to_DE_cnt;
30
31 /* Part of U-boot ABI: see head.S */
32 int __initdata uboot_tag;
33 +int __initdata uboot_magic;
34 char __initdata *uboot_arg;
35
36 const struct machine_desc *machine_desc;
37 @@ -400,6 +401,8 @@ static inline bool uboot_arg_invalid(unsigned long addr)
38 #define UBOOT_TAG_NONE 0
39 #define UBOOT_TAG_CMDLINE 1
40 #define UBOOT_TAG_DTB 2
41 +/* We always pass 0 as magic from U-boot */
42 +#define UBOOT_MAGIC_VALUE 0
43
44 void __init handle_uboot_args(void)
45 {
46 @@ -415,6 +418,11 @@ void __init handle_uboot_args(void)
47 goto ignore_uboot_args;
48 }
49
50 + if (uboot_magic != UBOOT_MAGIC_VALUE) {
51 + pr_warn(IGNORE_ARGS "non zero uboot magic\n");
52 + goto ignore_uboot_args;
53 + }
54 +
55 if (uboot_tag != UBOOT_TAG_NONE &&
56 uboot_arg_invalid((unsigned long)uboot_arg)) {
57 pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg);
58 diff --git a/arch/arm/crypto/sha256-armv4.pl b/arch/arm/crypto/sha256-armv4.pl
59 index fac0533ea633..f64e8413ab9a 100644
60 --- a/arch/arm/crypto/sha256-armv4.pl
61 +++ b/arch/arm/crypto/sha256-armv4.pl
62 @@ -205,10 +205,11 @@ K256:
63 .global sha256_block_data_order
64 .type sha256_block_data_order,%function
65 sha256_block_data_order:
66 +.Lsha256_block_data_order:
67 #if __ARM_ARCH__<7
68 sub r3,pc,#8 @ sha256_block_data_order
69 #else
70 - adr r3,sha256_block_data_order
71 + adr r3,.Lsha256_block_data_order
72 #endif
73 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
74 ldr r12,.LOPENSSL_armcap
75 diff --git a/arch/arm/crypto/sha256-core.S_shipped b/arch/arm/crypto/sha256-core.S_shipped
76 index 555a1a8eec90..72c248081d27 100644
77 --- a/arch/arm/crypto/sha256-core.S_shipped
78 +++ b/arch/arm/crypto/sha256-core.S_shipped
79 @@ -86,10 +86,11 @@ K256:
80 .global sha256_block_data_order
81 .type sha256_block_data_order,%function
82 sha256_block_data_order:
83 +.Lsha256_block_data_order:
84 #if __ARM_ARCH__<7
85 sub r3,pc,#8 @ sha256_block_data_order
86 #else
87 - adr r3,sha256_block_data_order
88 + adr r3,.Lsha256_block_data_order
89 #endif
90 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
91 ldr r12,.LOPENSSL_armcap
92 diff --git a/arch/arm/crypto/sha512-armv4.pl b/arch/arm/crypto/sha512-armv4.pl
93 index a2b11a844357..5fe336420bcf 100644
94 --- a/arch/arm/crypto/sha512-armv4.pl
95 +++ b/arch/arm/crypto/sha512-armv4.pl
96 @@ -267,10 +267,11 @@ WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817)
97 .global sha512_block_data_order
98 .type sha512_block_data_order,%function
99 sha512_block_data_order:
100 +.Lsha512_block_data_order:
101 #if __ARM_ARCH__<7
102 sub r3,pc,#8 @ sha512_block_data_order
103 #else
104 - adr r3,sha512_block_data_order
105 + adr r3,.Lsha512_block_data_order
106 #endif
107 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
108 ldr r12,.LOPENSSL_armcap
109 diff --git a/arch/arm/crypto/sha512-core.S_shipped b/arch/arm/crypto/sha512-core.S_shipped
110 index 3694c4d4ca2b..de9bd7f55242 100644
111 --- a/arch/arm/crypto/sha512-core.S_shipped
112 +++ b/arch/arm/crypto/sha512-core.S_shipped
113 @@ -134,10 +134,11 @@ WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817)
114 .global sha512_block_data_order
115 .type sha512_block_data_order,%function
116 sha512_block_data_order:
117 +.Lsha512_block_data_order:
118 #if __ARM_ARCH__<7
119 sub r3,pc,#8 @ sha512_block_data_order
120 #else
121 - adr r3,sha512_block_data_order
122 + adr r3,.Lsha512_block_data_order
123 #endif
124 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
125 ldr r12,.LOPENSSL_armcap
126 diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
127 index 69bda1a5707e..1f665acaa6a9 100644
128 --- a/arch/arm/kernel/patch.c
129 +++ b/arch/arm/kernel/patch.c
130 @@ -15,7 +15,7 @@ struct patch {
131 unsigned int insn;
132 };
133
134 -static DEFINE_SPINLOCK(patch_lock);
135 +static DEFINE_RAW_SPINLOCK(patch_lock);
136
137 static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
138 __acquires(&patch_lock)
139 @@ -32,7 +32,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
140 return addr;
141
142 if (flags)
143 - spin_lock_irqsave(&patch_lock, *flags);
144 + raw_spin_lock_irqsave(&patch_lock, *flags);
145 else
146 __acquire(&patch_lock);
147
148 @@ -47,7 +47,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
149 clear_fixmap(fixmap);
150
151 if (flags)
152 - spin_unlock_irqrestore(&patch_lock, *flags);
153 + raw_spin_unlock_irqrestore(&patch_lock, *flags);
154 else
155 __release(&patch_lock);
156 }
157 diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig
158 index e8229b9fee4a..3265b8f86069 100644
159 --- a/arch/arm/plat-samsung/Kconfig
160 +++ b/arch/arm/plat-samsung/Kconfig
161 @@ -258,7 +258,7 @@ config S3C_PM_DEBUG_LED_SMDK
162
163 config SAMSUNG_PM_CHECK
164 bool "S3C2410 PM Suspend Memory CRC"
165 - depends on PM
166 + depends on PM && (PLAT_S3C24XX || ARCH_S3C64XX || ARCH_S5PV210)
167 select CRC32
168 help
169 Enable the PM code's memory area checksum over sleep. This option
170 diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c
171 index d39cfb2c6b63..311d0fad17e6 100644
172 --- a/arch/x86/kernel/cpu/cyrix.c
173 +++ b/arch/x86/kernel/cpu/cyrix.c
174 @@ -121,7 +121,7 @@ static void set_cx86_reorder(void)
175 setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
176
177 /* Load/Store Serialize to mem access disable (=reorder it) */
178 - setCx86_old(CX86_PCR0, getCx86_old(CX86_PCR0) & ~0x80);
179 + setCx86(CX86_PCR0, getCx86(CX86_PCR0) & ~0x80);
180 /* set load/store serialize from 1GB to 4GB */
181 ccr3 |= 0xe0;
182 setCx86(CX86_CCR3, ccr3);
183 @@ -132,11 +132,11 @@ static void set_cx86_memwb(void)
184 pr_info("Enable Memory-Write-back mode on Cyrix/NSC processor.\n");
185
186 /* CCR2 bit 2: unlock NW bit */
187 - setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) & ~0x04);
188 + setCx86(CX86_CCR2, getCx86(CX86_CCR2) & ~0x04);
189 /* set 'Not Write-through' */
190 write_cr0(read_cr0() | X86_CR0_NW);
191 /* CCR2 bit 2: lock NW bit and set WT1 */
192 - setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) | 0x14);
193 + setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14);
194 }
195
196 /*
197 @@ -150,14 +150,14 @@ static void geode_configure(void)
198 local_irq_save(flags);
199
200 /* Suspend on halt power saving and enable #SUSP pin */
201 - setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) | 0x88);
202 + setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
203
204 ccr3 = getCx86(CX86_CCR3);
205 setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
206
207
208 /* FPU fast, DTE cache, Mem bypass */
209 - setCx86_old(CX86_CCR4, getCx86_old(CX86_CCR4) | 0x38);
210 + setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x38);
211 setCx86(CX86_CCR3, ccr3); /* disable MAPEN */
212
213 set_cx86_memwb();
214 @@ -293,7 +293,7 @@ static void init_cyrix(struct cpuinfo_x86 *c)
215 /* GXm supports extended cpuid levels 'ala' AMD */
216 if (c->cpuid_level == 2) {
217 /* Enable cxMMX extensions (GX1 Datasheet 54) */
218 - setCx86_old(CX86_CCR7, getCx86_old(CX86_CCR7) | 1);
219 + setCx86(CX86_CCR7, getCx86(CX86_CCR7) | 1);
220
221 /*
222 * GXm : 0x30 ... 0x5f GXm datasheet 51
223 @@ -316,7 +316,7 @@ static void init_cyrix(struct cpuinfo_x86 *c)
224 if (dir1 > 7) {
225 dir0_msn++; /* M II */
226 /* Enable MMX extensions (App note 108) */
227 - setCx86_old(CX86_CCR7, getCx86_old(CX86_CCR7)|1);
228 + setCx86(CX86_CCR7, getCx86(CX86_CCR7)|1);
229 } else {
230 /* A 6x86MX - it has the bug. */
231 set_cpu_bug(c, X86_BUG_COMA);
232 diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
233 index 756634f14df6..775c23d4021a 100644
234 --- a/arch/x86/kernel/hpet.c
235 +++ b/arch/x86/kernel/hpet.c
236 @@ -914,6 +914,8 @@ int __init hpet_enable(void)
237 return 0;
238
239 hpet_set_mapping();
240 + if (!hpet_virt_address)
241 + return 0;
242
243 /*
244 * Read the period and check for a sane value:
245 diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c
246 index 8771766d46b6..9954a604a822 100644
247 --- a/arch/x86/kernel/hw_breakpoint.c
248 +++ b/arch/x86/kernel/hw_breakpoint.c
249 @@ -352,6 +352,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
250 #endif
251 default:
252 WARN_ON_ONCE(1);
253 + return -EINVAL;
254 }
255
256 /*
257 diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
258 index ad0b13ad4bbb..4a76000bcf7a 100644
259 --- a/drivers/acpi/sbs.c
260 +++ b/drivers/acpi/sbs.c
261 @@ -443,9 +443,13 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
262
263 /*
264 * The spec requires that bit 4 always be 1. If it's not set, assume
265 - * that the implementation doesn't support an SBS charger
266 + * that the implementation doesn't support an SBS charger.
267 + *
268 + * And on some MacBooks a status of 0xffff is always returned, no
269 + * matter whether the charger is plugged in or not, which is also
270 + * wrong, so ignore the SBS charger for those too.
271 */
272 - if (!((status >> 4) & 0x1))
273 + if (!((status >> 4) & 0x1) || status == 0xffff)
274 return -ENODEV;
275
276 sbs->charger_present = (status >> 15) & 0x1;
277 diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
278 index fa0f66809503..d29f78441cdb 100644
279 --- a/drivers/char/tpm/tpm_crb.c
280 +++ b/drivers/char/tpm/tpm_crb.c
281 @@ -102,19 +102,29 @@ static int crb_recv(struct tpm_chip *chip, u8 *buf, size_t count)
282 struct crb_priv *priv = dev_get_drvdata(&chip->dev);
283 unsigned int expected;
284
285 - /* sanity check */
286 - if (count < 6)
287 + /* A sanity check that the upper layer wants to get at least the header
288 + * as that is the minimum size for any TPM response.
289 + */
290 + if (count < TPM_HEADER_SIZE)
291 return -EIO;
292
293 + /* If this bit is set, according to the spec, the TPM is in
294 + * unrecoverable condition.
295 + */
296 if (ioread32(&priv->cca->sts) & CRB_CTRL_STS_ERROR)
297 return -EIO;
298
299 - memcpy_fromio(buf, priv->rsp, 6);
300 - expected = be32_to_cpup((__be32 *) &buf[2]);
301 - if (expected > count || expected < 6)
302 + /* Read the first 8 bytes in order to get the length of the response.
303 + * We read exactly a quad word in order to make sure that the remaining
304 + * reads will be aligned.
305 + */
306 + memcpy_fromio(buf, priv->rsp, 8);
307 +
308 + expected = be32_to_cpup((__be32 *)&buf[2]);
309 + if (expected > count || expected < TPM_HEADER_SIZE)
310 return -EIO;
311
312 - memcpy_fromio(&buf[6], &priv->rsp[6], expected - 6);
313 + memcpy_fromio(&buf[8], &priv->rsp[8], expected - 8);
314
315 return expected;
316 }
317 diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
318 index 7a6305884f97..32d22bdf7164 100644
319 --- a/drivers/gpio/gpio-pxa.c
320 +++ b/drivers/gpio/gpio-pxa.c
321 @@ -774,6 +774,9 @@ static int pxa_gpio_suspend(void)
322 struct pxa_gpio_bank *c;
323 int gpio;
324
325 + if (!pchip)
326 + return 0;
327 +
328 for_each_gpio_bank(gpio, c, pchip) {
329 c->saved_gplr = readl_relaxed(c->regbase + GPLR_OFFSET);
330 c->saved_gpdr = readl_relaxed(c->regbase + GPDR_OFFSET);
331 @@ -792,6 +795,9 @@ static void pxa_gpio_resume(void)
332 struct pxa_gpio_bank *c;
333 int gpio;
334
335 + if (!pchip)
336 + return;
337 +
338 for_each_gpio_bank(gpio, c, pchip) {
339 /* restore level with set/clear */
340 writel_relaxed(c->saved_gplr, c->regbase + GPSR_OFFSET);
341 diff --git a/drivers/hid/i2c-hid/Makefile b/drivers/hid/i2c-hid/Makefile
342 index 832d8f9aaba2..099e1ce2f234 100644
343 --- a/drivers/hid/i2c-hid/Makefile
344 +++ b/drivers/hid/i2c-hid/Makefile
345 @@ -3,3 +3,6 @@
346 #
347
348 obj-$(CONFIG_I2C_HID) += i2c-hid.o
349 +
350 +i2c-hid-objs = i2c-hid-core.o
351 +i2c-hid-$(CONFIG_DMI) += i2c-hid-dmi-quirks.o
352 diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
353 new file mode 100644
354 index 000000000000..850527d5fab1
355 --- /dev/null
356 +++ b/drivers/hid/i2c-hid/i2c-hid-core.c
357 @@ -0,0 +1,1359 @@
358 +/*
359 + * HID over I2C protocol implementation
360 + *
361 + * Copyright (c) 2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
362 + * Copyright (c) 2012 Ecole Nationale de l'Aviation Civile, France
363 + * Copyright (c) 2012 Red Hat, Inc
364 + *
365 + * This code is partly based on "USB HID support for Linux":
366 + *
367 + * Copyright (c) 1999 Andreas Gal
368 + * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
369 + * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
370 + * Copyright (c) 2007-2008 Oliver Neukum
371 + * Copyright (c) 2006-2010 Jiri Kosina
372 + *
373 + * This file is subject to the terms and conditions of the GNU General Public
374 + * License. See the file COPYING in the main directory of this archive for
375 + * more details.
376 + */
377 +
378 +#include <linux/module.h>
379 +#include <linux/i2c.h>
380 +#include <linux/interrupt.h>
381 +#include <linux/input.h>
382 +#include <linux/delay.h>
383 +#include <linux/slab.h>
384 +#include <linux/pm.h>
385 +#include <linux/pm_runtime.h>
386 +#include <linux/device.h>
387 +#include <linux/wait.h>
388 +#include <linux/err.h>
389 +#include <linux/string.h>
390 +#include <linux/list.h>
391 +#include <linux/jiffies.h>
392 +#include <linux/kernel.h>
393 +#include <linux/hid.h>
394 +#include <linux/mutex.h>
395 +#include <linux/acpi.h>
396 +#include <linux/of.h>
397 +#include <linux/gpio/consumer.h>
398 +
399 +#include <linux/i2c/i2c-hid.h>
400 +
401 +#include "../hid-ids.h"
402 +#include "i2c-hid.h"
403 +
404 +/* quirks to control the device */
405 +#define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0)
406 +
407 +/* flags */
408 +#define I2C_HID_STARTED 0
409 +#define I2C_HID_RESET_PENDING 1
410 +#define I2C_HID_READ_PENDING 2
411 +
412 +#define I2C_HID_PWR_ON 0x00
413 +#define I2C_HID_PWR_SLEEP 0x01
414 +
415 +/* debug option */
416 +static bool debug;
417 +module_param(debug, bool, 0444);
418 +MODULE_PARM_DESC(debug, "print a lot of debug information");
419 +
420 +#define i2c_hid_dbg(ihid, fmt, arg...) \
421 +do { \
422 + if (debug) \
423 + dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
424 +} while (0)
425 +
426 +struct i2c_hid_desc {
427 + __le16 wHIDDescLength;
428 + __le16 bcdVersion;
429 + __le16 wReportDescLength;
430 + __le16 wReportDescRegister;
431 + __le16 wInputRegister;
432 + __le16 wMaxInputLength;
433 + __le16 wOutputRegister;
434 + __le16 wMaxOutputLength;
435 + __le16 wCommandRegister;
436 + __le16 wDataRegister;
437 + __le16 wVendorID;
438 + __le16 wProductID;
439 + __le16 wVersionID;
440 + __le32 reserved;
441 +} __packed;
442 +
443 +struct i2c_hid_cmd {
444 + unsigned int registerIndex;
445 + __u8 opcode;
446 + unsigned int length;
447 + bool wait;
448 +};
449 +
450 +union command {
451 + u8 data[0];
452 + struct cmd {
453 + __le16 reg;
454 + __u8 reportTypeID;
455 + __u8 opcode;
456 + } __packed c;
457 +};
458 +
459 +#define I2C_HID_CMD(opcode_) \
460 + .opcode = opcode_, .length = 4, \
461 + .registerIndex = offsetof(struct i2c_hid_desc, wCommandRegister)
462 +
463 +/* fetch HID descriptor */
464 +static const struct i2c_hid_cmd hid_descr_cmd = { .length = 2 };
465 +/* fetch report descriptors */
466 +static const struct i2c_hid_cmd hid_report_descr_cmd = {
467 + .registerIndex = offsetof(struct i2c_hid_desc,
468 + wReportDescRegister),
469 + .opcode = 0x00,
470 + .length = 2 };
471 +/* commands */
472 +static const struct i2c_hid_cmd hid_reset_cmd = { I2C_HID_CMD(0x01),
473 + .wait = true };
474 +static const struct i2c_hid_cmd hid_get_report_cmd = { I2C_HID_CMD(0x02) };
475 +static const struct i2c_hid_cmd hid_set_report_cmd = { I2C_HID_CMD(0x03) };
476 +static const struct i2c_hid_cmd hid_set_power_cmd = { I2C_HID_CMD(0x08) };
477 +static const struct i2c_hid_cmd hid_no_cmd = { .length = 0 };
478 +
479 +/*
480 + * These definitions are not used here, but are defined by the spec.
481 + * Keeping them here for documentation purposes.
482 + *
483 + * static const struct i2c_hid_cmd hid_get_idle_cmd = { I2C_HID_CMD(0x04) };
484 + * static const struct i2c_hid_cmd hid_set_idle_cmd = { I2C_HID_CMD(0x05) };
485 + * static const struct i2c_hid_cmd hid_get_protocol_cmd = { I2C_HID_CMD(0x06) };
486 + * static const struct i2c_hid_cmd hid_set_protocol_cmd = { I2C_HID_CMD(0x07) };
487 + */
488 +
489 +static DEFINE_MUTEX(i2c_hid_open_mut);
490 +
491 +/* The main device structure */
492 +struct i2c_hid {
493 + struct i2c_client *client; /* i2c client */
494 + struct hid_device *hid; /* pointer to corresponding HID dev */
495 + union {
496 + __u8 hdesc_buffer[sizeof(struct i2c_hid_desc)];
497 + struct i2c_hid_desc hdesc; /* the HID Descriptor */
498 + };
499 + __le16 wHIDDescRegister; /* location of the i2c
500 + * register of the HID
501 + * descriptor. */
502 + unsigned int bufsize; /* i2c buffer size */
503 + u8 *inbuf; /* Input buffer */
504 + u8 *rawbuf; /* Raw Input buffer */
505 + u8 *cmdbuf; /* Command buffer */
506 + u8 *argsbuf; /* Command arguments buffer */
507 +
508 + unsigned long flags; /* device flags */
509 + unsigned long quirks; /* Various quirks */
510 +
511 + wait_queue_head_t wait; /* For waiting the interrupt */
512 + struct gpio_desc *desc;
513 + int irq;
514 +
515 + struct i2c_hid_platform_data pdata;
516 +
517 + bool irq_wake_enabled;
518 + struct mutex reset_lock;
519 +};
520 +
521 +static const struct i2c_hid_quirks {
522 + __u16 idVendor;
523 + __u16 idProduct;
524 + __u32 quirks;
525 +} i2c_hid_quirks[] = {
526 + { USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8752,
527 + I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
528 + { USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8755,
529 + I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
530 + { 0, 0 }
531 +};
532 +
533 +/*
534 + * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
535 + * @idVendor: the 16-bit vendor ID
536 + * @idProduct: the 16-bit product ID
537 + *
538 + * Returns: a u32 quirks value.
539 + */
540 +static u32 i2c_hid_lookup_quirk(const u16 idVendor, const u16 idProduct)
541 +{
542 + u32 quirks = 0;
543 + int n;
544 +
545 + for (n = 0; i2c_hid_quirks[n].idVendor; n++)
546 + if (i2c_hid_quirks[n].idVendor == idVendor &&
547 + (i2c_hid_quirks[n].idProduct == (__u16)HID_ANY_ID ||
548 + i2c_hid_quirks[n].idProduct == idProduct))
549 + quirks = i2c_hid_quirks[n].quirks;
550 +
551 + return quirks;
552 +}
553 +
554 +static int __i2c_hid_command(struct i2c_client *client,
555 + const struct i2c_hid_cmd *command, u8 reportID,
556 + u8 reportType, u8 *args, int args_len,
557 + unsigned char *buf_recv, int data_len)
558 +{
559 + struct i2c_hid *ihid = i2c_get_clientdata(client);
560 + union command *cmd = (union command *)ihid->cmdbuf;
561 + int ret;
562 + struct i2c_msg msg[2];
563 + int msg_num = 1;
564 +
565 + int length = command->length;
566 + bool wait = command->wait;
567 + unsigned int registerIndex = command->registerIndex;
568 +
569 + /* special case for hid_descr_cmd */
570 + if (command == &hid_descr_cmd) {
571 + cmd->c.reg = ihid->wHIDDescRegister;
572 + } else {
573 + cmd->data[0] = ihid->hdesc_buffer[registerIndex];
574 + cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1];
575 + }
576 +
577 + if (length > 2) {
578 + cmd->c.opcode = command->opcode;
579 + cmd->c.reportTypeID = reportID | reportType << 4;
580 + }
581 +
582 + memcpy(cmd->data + length, args, args_len);
583 + length += args_len;
584 +
585 + i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data);
586 +
587 + msg[0].addr = client->addr;
588 + msg[0].flags = client->flags & I2C_M_TEN;
589 + msg[0].len = length;
590 + msg[0].buf = cmd->data;
591 + if (data_len > 0) {
592 + msg[1].addr = client->addr;
593 + msg[1].flags = client->flags & I2C_M_TEN;
594 + msg[1].flags |= I2C_M_RD;
595 + msg[1].len = data_len;
596 + msg[1].buf = buf_recv;
597 + msg_num = 2;
598 + set_bit(I2C_HID_READ_PENDING, &ihid->flags);
599 + }
600 +
601 + if (wait)
602 + set_bit(I2C_HID_RESET_PENDING, &ihid->flags);
603 +
604 + ret = i2c_transfer(client->adapter, msg, msg_num);
605 +
606 + if (data_len > 0)
607 + clear_bit(I2C_HID_READ_PENDING, &ihid->flags);
608 +
609 + if (ret != msg_num)
610 + return ret < 0 ? ret : -EIO;
611 +
612 + ret = 0;
613 +
614 + if (wait) {
615 + i2c_hid_dbg(ihid, "%s: waiting...\n", __func__);
616 + if (!wait_event_timeout(ihid->wait,
617 + !test_bit(I2C_HID_RESET_PENDING, &ihid->flags),
618 + msecs_to_jiffies(5000)))
619 + ret = -ENODATA;
620 + i2c_hid_dbg(ihid, "%s: finished.\n", __func__);
621 + }
622 +
623 + return ret;
624 +}
625 +
626 +static int i2c_hid_command(struct i2c_client *client,
627 + const struct i2c_hid_cmd *command,
628 + unsigned char *buf_recv, int data_len)
629 +{
630 + return __i2c_hid_command(client, command, 0, 0, NULL, 0,
631 + buf_recv, data_len);
632 +}
633 +
634 +static int i2c_hid_get_report(struct i2c_client *client, u8 reportType,
635 + u8 reportID, unsigned char *buf_recv, int data_len)
636 +{
637 + struct i2c_hid *ihid = i2c_get_clientdata(client);
638 + u8 args[3];
639 + int ret;
640 + int args_len = 0;
641 + u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
642 +
643 + i2c_hid_dbg(ihid, "%s\n", __func__);
644 +
645 + if (reportID >= 0x0F) {
646 + args[args_len++] = reportID;
647 + reportID = 0x0F;
648 + }
649 +
650 + args[args_len++] = readRegister & 0xFF;
651 + args[args_len++] = readRegister >> 8;
652 +
653 + ret = __i2c_hid_command(client, &hid_get_report_cmd, reportID,
654 + reportType, args, args_len, buf_recv, data_len);
655 + if (ret) {
656 + dev_err(&client->dev,
657 + "failed to retrieve report from device.\n");
658 + return ret;
659 + }
660 +
661 + return 0;
662 +}
663 +
664 +/**
665 + * i2c_hid_set_or_send_report: forward an incoming report to the device
666 + * @client: the i2c_client of the device
667 + * @reportType: 0x03 for HID_FEATURE_REPORT ; 0x02 for HID_OUTPUT_REPORT
668 + * @reportID: the report ID
669 + * @buf: the actual data to transfer, without the report ID
670 + * @len: size of buf
671 + * @use_data: true: use SET_REPORT HID command, false: send plain OUTPUT report
672 + */
673 +static int i2c_hid_set_or_send_report(struct i2c_client *client, u8 reportType,
674 + u8 reportID, unsigned char *buf, size_t data_len, bool use_data)
675 +{
676 + struct i2c_hid *ihid = i2c_get_clientdata(client);
677 + u8 *args = ihid->argsbuf;
678 + const struct i2c_hid_cmd *hidcmd;
679 + int ret;
680 + u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
681 + u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister);
682 + u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength);
683 + u16 size;
684 + int args_len;
685 + int index = 0;
686 +
687 + i2c_hid_dbg(ihid, "%s\n", __func__);
688 +
689 + if (data_len > ihid->bufsize)
690 + return -EINVAL;
691 +
692 + size = 2 /* size */ +
693 + (reportID ? 1 : 0) /* reportID */ +
694 + data_len /* buf */;
695 + args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ +
696 + 2 /* dataRegister */ +
697 + size /* args */;
698 +
699 + if (!use_data && maxOutputLength == 0)
700 + return -ENOSYS;
701 +
702 + if (reportID >= 0x0F) {
703 + args[index++] = reportID;
704 + reportID = 0x0F;
705 + }
706 +
707 + /*
708 + * use the data register for feature reports or if the device does not
709 + * support the output register
710 + */
711 + if (use_data) {
712 + args[index++] = dataRegister & 0xFF;
713 + args[index++] = dataRegister >> 8;
714 + hidcmd = &hid_set_report_cmd;
715 + } else {
716 + args[index++] = outputRegister & 0xFF;
717 + args[index++] = outputRegister >> 8;
718 + hidcmd = &hid_no_cmd;
719 + }
720 +
721 + args[index++] = size & 0xFF;
722 + args[index++] = size >> 8;
723 +
724 + if (reportID)
725 + args[index++] = reportID;
726 +
727 + memcpy(&args[index], buf, data_len);
728 +
729 + ret = __i2c_hid_command(client, hidcmd, reportID,
730 + reportType, args, args_len, NULL, 0);
731 + if (ret) {
732 + dev_err(&client->dev, "failed to set a report to device.\n");
733 + return ret;
734 + }
735 +
736 + return data_len;
737 +}
738 +
739 +static int i2c_hid_set_power(struct i2c_client *client, int power_state)
740 +{
741 + struct i2c_hid *ihid = i2c_get_clientdata(client);
742 + int ret;
743 +
744 + i2c_hid_dbg(ihid, "%s\n", __func__);
745 +
746 + /*
747 + * Some devices require to send a command to wakeup before power on.
748 + * The call will get a return value (EREMOTEIO) but device will be
749 + * triggered and activated. After that, it goes like a normal device.
750 + */
751 + if (power_state == I2C_HID_PWR_ON &&
752 + ihid->quirks & I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV) {
753 + ret = i2c_hid_command(client, &hid_set_power_cmd, NULL, 0);
754 +
755 + /* Device was already activated */
756 + if (!ret)
757 + goto set_pwr_exit;
758 + }
759 +
760 + ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state,
761 + 0, NULL, 0, NULL, 0);
762 +
763 + if (ret)
764 + dev_err(&client->dev, "failed to change power setting.\n");
765 +
766 +set_pwr_exit:
767 + return ret;
768 +}
769 +
770 +static int i2c_hid_hwreset(struct i2c_client *client)
771 +{
772 + struct i2c_hid *ihid = i2c_get_clientdata(client);
773 + int ret;
774 +
775 + i2c_hid_dbg(ihid, "%s\n", __func__);
776 +
777 + /*
778 + * This prevents sending feature reports while the device is
779 + * being reset. Otherwise we may lose the reset complete
780 + * interrupt.
781 + */
782 + mutex_lock(&ihid->reset_lock);
783 +
784 + ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
785 + if (ret)
786 + goto out_unlock;
787 +
788 + /*
789 + * The HID over I2C specification states that if a DEVICE needs time
790 + * after the PWR_ON request, it should utilise CLOCK stretching.
791 + * However, it has been observered that the Windows driver provides a
792 + * 1ms sleep between the PWR_ON and RESET requests and that some devices
793 + * rely on this.
794 + */
795 + usleep_range(1000, 5000);
796 +
797 + i2c_hid_dbg(ihid, "resetting...\n");
798 +
799 + ret = i2c_hid_command(client, &hid_reset_cmd, NULL, 0);
800 + if (ret) {
801 + dev_err(&client->dev, "failed to reset device.\n");
802 + i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
803 + }
804 +
805 +out_unlock:
806 + mutex_unlock(&ihid->reset_lock);
807 + return ret;
808 +}
809 +
810 +static void i2c_hid_get_input(struct i2c_hid *ihid)
811 +{
812 + int ret;
813 + u32 ret_size;
814 + int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
815 +
816 + if (size > ihid->bufsize)
817 + size = ihid->bufsize;
818 +
819 + ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
820 + if (ret != size) {
821 + if (ret < 0)
822 + return;
823 +
824 + dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n",
825 + __func__, ret, size);
826 + return;
827 + }
828 +
829 + ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8;
830 +
831 + if (!ret_size) {
832 + /* host or device initiated RESET completed */
833 + if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags))
834 + wake_up(&ihid->wait);
835 + return;
836 + }
837 +
838 + if ((ret_size > size) || (ret_size < 2)) {
839 + dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n",
840 + __func__, size, ret_size);
841 + return;
842 + }
843 +
844 + i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);
845 +
846 + if (test_bit(I2C_HID_STARTED, &ihid->flags))
847 + hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2,
848 + ret_size - 2, 1);
849 +
850 + return;
851 +}
852 +
853 +static irqreturn_t i2c_hid_irq(int irq, void *dev_id)
854 +{
855 + struct i2c_hid *ihid = dev_id;
856 +
857 + if (test_bit(I2C_HID_READ_PENDING, &ihid->flags))
858 + return IRQ_HANDLED;
859 +
860 + i2c_hid_get_input(ihid);
861 +
862 + return IRQ_HANDLED;
863 +}
864 +
865 +static int i2c_hid_get_report_length(struct hid_report *report)
866 +{
867 + return ((report->size - 1) >> 3) + 1 +
868 + report->device->report_enum[report->type].numbered + 2;
869 +}
870 +
871 +static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
872 + size_t bufsize)
873 +{
874 + struct hid_device *hid = report->device;
875 + struct i2c_client *client = hid->driver_data;
876 + struct i2c_hid *ihid = i2c_get_clientdata(client);
877 + unsigned int size, ret_size;
878 +
879 + size = i2c_hid_get_report_length(report);
880 + if (i2c_hid_get_report(client,
881 + report->type == HID_FEATURE_REPORT ? 0x03 : 0x01,
882 + report->id, buffer, size))
883 + return;
884 +
885 + i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer);
886 +
887 + ret_size = buffer[0] | (buffer[1] << 8);
888 +
889 + if (ret_size != size) {
890 + dev_err(&client->dev, "error in %s size:%d / ret_size:%d\n",
891 + __func__, size, ret_size);
892 + return;
893 + }
894 +
895 + /* hid->driver_lock is held as we are in probe function,
896 + * we just need to setup the input fields, so using
897 + * hid_report_raw_event is safe. */
898 + hid_report_raw_event(hid, report->type, buffer + 2, size - 2, 1);
899 +}
900 +
901 +/*
902 + * Initialize all reports
903 + */
904 +static void i2c_hid_init_reports(struct hid_device *hid)
905 +{
906 + struct hid_report *report;
907 + struct i2c_client *client = hid->driver_data;
908 + struct i2c_hid *ihid = i2c_get_clientdata(client);
909 + u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL);
910 +
911 + if (!inbuf) {
912 + dev_err(&client->dev, "can not retrieve initial reports\n");
913 + return;
914 + }
915 +
916 + /*
917 + * The device must be powered on while we fetch initial reports
918 + * from it.
919 + */
920 + pm_runtime_get_sync(&client->dev);
921 +
922 + list_for_each_entry(report,
923 + &hid->report_enum[HID_FEATURE_REPORT].report_list, list)
924 + i2c_hid_init_report(report, inbuf, ihid->bufsize);
925 +
926 + pm_runtime_put(&client->dev);
927 +
928 + kfree(inbuf);
929 +}
930 +
931 +/*
932 + * Traverse the supplied list of reports and find the longest
933 + */
934 +static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type,
935 + unsigned int *max)
936 +{
937 + struct hid_report *report;
938 + unsigned int size;
939 +
940 + /* We should not rely on wMaxInputLength, as some devices may set it to
941 + * a wrong length. */
942 + list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
943 + size = i2c_hid_get_report_length(report);
944 + if (*max < size)
945 + *max = size;
946 + }
947 +}
948 +
949 +static void i2c_hid_free_buffers(struct i2c_hid *ihid)
950 +{
951 + kfree(ihid->inbuf);
952 + kfree(ihid->rawbuf);
953 + kfree(ihid->argsbuf);
954 + kfree(ihid->cmdbuf);
955 + ihid->inbuf = NULL;
956 + ihid->rawbuf = NULL;
957 + ihid->cmdbuf = NULL;
958 + ihid->argsbuf = NULL;
959 + ihid->bufsize = 0;
960 +}
961 +
962 +static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
963 +{
964 + /* the worst case is computed from the set_report command with a
965 + * reportID > 15 and the maximum report length */
966 + int args_len = sizeof(__u8) + /* ReportID */
967 + sizeof(__u8) + /* optional ReportID byte */
968 + sizeof(__u16) + /* data register */
969 + sizeof(__u16) + /* size of the report */
970 + report_size; /* report */
971 +
972 + ihid->inbuf = kzalloc(report_size, GFP_KERNEL);
973 + ihid->rawbuf = kzalloc(report_size, GFP_KERNEL);
974 + ihid->argsbuf = kzalloc(args_len, GFP_KERNEL);
975 + ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL);
976 +
977 + if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) {
978 + i2c_hid_free_buffers(ihid);
979 + return -ENOMEM;
980 + }
981 +
982 + ihid->bufsize = report_size;
983 +
984 + return 0;
985 +}
986 +
987 +static int i2c_hid_get_raw_report(struct hid_device *hid,
988 + unsigned char report_number, __u8 *buf, size_t count,
989 + unsigned char report_type)
990 +{
991 + struct i2c_client *client = hid->driver_data;
992 + struct i2c_hid *ihid = i2c_get_clientdata(client);
993 + size_t ret_count, ask_count;
994 + int ret;
995 +
996 + if (report_type == HID_OUTPUT_REPORT)
997 + return -EINVAL;
998 +
999 + /* +2 bytes to include the size of the reply in the query buffer */
1000 + ask_count = min(count + 2, (size_t)ihid->bufsize);
1001 +
1002 + ret = i2c_hid_get_report(client,
1003 + report_type == HID_FEATURE_REPORT ? 0x03 : 0x01,
1004 + report_number, ihid->rawbuf, ask_count);
1005 +
1006 + if (ret < 0)
1007 + return ret;
1008 +
1009 + ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8);
1010 +
1011 + if (ret_count <= 2)
1012 + return 0;
1013 +
1014 + ret_count = min(ret_count, ask_count);
1015 +
1016 + /* The query buffer contains the size, dropping it in the reply */
1017 + count = min(count, ret_count - 2);
1018 + memcpy(buf, ihid->rawbuf + 2, count);
1019 +
1020 + return count;
1021 +}
1022 +
1023 +static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
1024 + size_t count, unsigned char report_type, bool use_data)
1025 +{
1026 + struct i2c_client *client = hid->driver_data;
1027 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1028 + int report_id = buf[0];
1029 + int ret;
1030 +
1031 + if (report_type == HID_INPUT_REPORT)
1032 + return -EINVAL;
1033 +
1034 + mutex_lock(&ihid->reset_lock);
1035 +
1036 + if (report_id) {
1037 + buf++;
1038 + count--;
1039 + }
1040 +
1041 + ret = i2c_hid_set_or_send_report(client,
1042 + report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
1043 + report_id, buf, count, use_data);
1044 +
1045 + if (report_id && ret >= 0)
1046 + ret++; /* add report_id to the number of transfered bytes */
1047 +
1048 + mutex_unlock(&ihid->reset_lock);
1049 +
1050 + return ret;
1051 +}
1052 +
1053 +static int i2c_hid_output_report(struct hid_device *hid, __u8 *buf,
1054 + size_t count)
1055 +{
1056 + return i2c_hid_output_raw_report(hid, buf, count, HID_OUTPUT_REPORT,
1057 + false);
1058 +}
1059 +
1060 +static int i2c_hid_raw_request(struct hid_device *hid, unsigned char reportnum,
1061 + __u8 *buf, size_t len, unsigned char rtype,
1062 + int reqtype)
1063 +{
1064 + switch (reqtype) {
1065 + case HID_REQ_GET_REPORT:
1066 + return i2c_hid_get_raw_report(hid, reportnum, buf, len, rtype);
1067 + case HID_REQ_SET_REPORT:
1068 + if (buf[0] != reportnum)
1069 + return -EINVAL;
1070 + return i2c_hid_output_raw_report(hid, buf, len, rtype, true);
1071 + default:
1072 + return -EIO;
1073 + }
1074 +}
1075 +
1076 +static int i2c_hid_parse(struct hid_device *hid)
1077 +{
1078 + struct i2c_client *client = hid->driver_data;
1079 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1080 + struct i2c_hid_desc *hdesc = &ihid->hdesc;
1081 + unsigned int rsize;
1082 + char *rdesc;
1083 + int ret;
1084 + int tries = 3;
1085 + char *use_override;
1086 +
1087 + i2c_hid_dbg(ihid, "entering %s\n", __func__);
1088 +
1089 + rsize = le16_to_cpu(hdesc->wReportDescLength);
1090 + if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
1091 + dbg_hid("weird size of report descriptor (%u)\n", rsize);
1092 + return -EINVAL;
1093 + }
1094 +
1095 + do {
1096 + ret = i2c_hid_hwreset(client);
1097 + if (ret)
1098 + msleep(1000);
1099 + } while (tries-- > 0 && ret);
1100 +
1101 + if (ret)
1102 + return ret;
1103 +
1104 + use_override = i2c_hid_get_dmi_hid_report_desc_override(client->name,
1105 + &rsize);
1106 +
1107 + if (use_override) {
1108 + rdesc = use_override;
1109 + i2c_hid_dbg(ihid, "Using a HID report descriptor override\n");
1110 + } else {
1111 + rdesc = kzalloc(rsize, GFP_KERNEL);
1112 +
1113 + if (!rdesc) {
1114 + dbg_hid("couldn't allocate rdesc memory\n");
1115 + return -ENOMEM;
1116 + }
1117 +
1118 + i2c_hid_dbg(ihid, "asking HID report descriptor\n");
1119 +
1120 + ret = i2c_hid_command(client, &hid_report_descr_cmd,
1121 + rdesc, rsize);
1122 + if (ret) {
1123 + hid_err(hid, "reading report descriptor failed\n");
1124 + kfree(rdesc);
1125 + return -EIO;
1126 + }
1127 + }
1128 +
1129 + i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc);
1130 +
1131 + ret = hid_parse_report(hid, rdesc, rsize);
1132 + if (!use_override)
1133 + kfree(rdesc);
1134 +
1135 + if (ret) {
1136 + dbg_hid("parsing report descriptor failed\n");
1137 + return ret;
1138 + }
1139 +
1140 + return 0;
1141 +}
1142 +
1143 +static int i2c_hid_start(struct hid_device *hid)
1144 +{
1145 + struct i2c_client *client = hid->driver_data;
1146 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1147 + int ret;
1148 + unsigned int bufsize = HID_MIN_BUFFER_SIZE;
1149 +
1150 + i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize);
1151 + i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize);
1152 + i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize);
1153 +
1154 + if (bufsize > ihid->bufsize) {
1155 + i2c_hid_free_buffers(ihid);
1156 +
1157 + ret = i2c_hid_alloc_buffers(ihid, bufsize);
1158 +
1159 + if (ret)
1160 + return ret;
1161 + }
1162 +
1163 + if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
1164 + i2c_hid_init_reports(hid);
1165 +
1166 + return 0;
1167 +}
1168 +
1169 +static void i2c_hid_stop(struct hid_device *hid)
1170 +{
1171 + hid->claimed = 0;
1172 +}
1173 +
1174 +static int i2c_hid_open(struct hid_device *hid)
1175 +{
1176 + struct i2c_client *client = hid->driver_data;
1177 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1178 + int ret = 0;
1179 +
1180 + mutex_lock(&i2c_hid_open_mut);
1181 + if (!hid->open++) {
1182 + ret = pm_runtime_get_sync(&client->dev);
1183 + if (ret < 0) {
1184 + hid->open--;
1185 + goto done;
1186 + }
1187 + set_bit(I2C_HID_STARTED, &ihid->flags);
1188 + }
1189 +done:
1190 + mutex_unlock(&i2c_hid_open_mut);
1191 + return ret < 0 ? ret : 0;
1192 +}
1193 +
1194 +static void i2c_hid_close(struct hid_device *hid)
1195 +{
1196 + struct i2c_client *client = hid->driver_data;
1197 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1198 +
1199 + /* protecting hid->open to make sure we don't restart
1200 + * data acquistion due to a resumption we no longer
1201 + * care about
1202 + */
1203 + mutex_lock(&i2c_hid_open_mut);
1204 + if (!--hid->open) {
1205 + clear_bit(I2C_HID_STARTED, &ihid->flags);
1206 +
1207 + /* Save some power */
1208 + pm_runtime_put(&client->dev);
1209 + }
1210 + mutex_unlock(&i2c_hid_open_mut);
1211 +}
1212 +
1213 +static int i2c_hid_power(struct hid_device *hid, int lvl)
1214 +{
1215 + struct i2c_client *client = hid->driver_data;
1216 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1217 +
1218 + i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl);
1219 +
1220 + switch (lvl) {
1221 + case PM_HINT_FULLON:
1222 + pm_runtime_get_sync(&client->dev);
1223 + break;
1224 + case PM_HINT_NORMAL:
1225 + pm_runtime_put(&client->dev);
1226 + break;
1227 + }
1228 + return 0;
1229 +}
1230 +
1231 +static struct hid_ll_driver i2c_hid_ll_driver = {
1232 + .parse = i2c_hid_parse,
1233 + .start = i2c_hid_start,
1234 + .stop = i2c_hid_stop,
1235 + .open = i2c_hid_open,
1236 + .close = i2c_hid_close,
1237 + .power = i2c_hid_power,
1238 + .output_report = i2c_hid_output_report,
1239 + .raw_request = i2c_hid_raw_request,
1240 +};
1241 +
1242 +static int i2c_hid_init_irq(struct i2c_client *client)
1243 +{
1244 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1245 + int ret;
1246 +
1247 + dev_dbg(&client->dev, "Requesting IRQ: %d\n", ihid->irq);
1248 +
1249 + ret = request_threaded_irq(ihid->irq, NULL, i2c_hid_irq,
1250 + IRQF_TRIGGER_LOW | IRQF_ONESHOT,
1251 + client->name, ihid);
1252 + if (ret < 0) {
1253 + dev_warn(&client->dev,
1254 + "Could not register for %s interrupt, irq = %d,"
1255 + " ret = %d\n",
1256 + client->name, ihid->irq, ret);
1257 +
1258 + return ret;
1259 + }
1260 +
1261 + return 0;
1262 +}
1263 +
1264 +static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
1265 +{
1266 + struct i2c_client *client = ihid->client;
1267 + struct i2c_hid_desc *hdesc = &ihid->hdesc;
1268 + unsigned int dsize;
1269 + int ret;
1270 +
1271 + /* i2c hid fetch using a fixed descriptor size (30 bytes) */
1272 + if (i2c_hid_get_dmi_i2c_hid_desc_override(client->name)) {
1273 + i2c_hid_dbg(ihid, "Using a HID descriptor override\n");
1274 + ihid->hdesc =
1275 + *i2c_hid_get_dmi_i2c_hid_desc_override(client->name);
1276 + } else {
1277 + i2c_hid_dbg(ihid, "Fetching the HID descriptor\n");
1278 + ret = i2c_hid_command(client, &hid_descr_cmd,
1279 + ihid->hdesc_buffer,
1280 + sizeof(struct i2c_hid_desc));
1281 + if (ret) {
1282 + dev_err(&client->dev, "hid_descr_cmd failed\n");
1283 + return -ENODEV;
1284 + }
1285 + }
1286 +
1287 + /* Validate the length of HID descriptor, the 4 first bytes:
1288 + * bytes 0-1 -> length
1289 + * bytes 2-3 -> bcdVersion (has to be 1.00) */
1290 + /* check bcdVersion == 1.0 */
1291 + if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) {
1292 + dev_err(&client->dev,
1293 + "unexpected HID descriptor bcdVersion (0x%04hx)\n",
1294 + le16_to_cpu(hdesc->bcdVersion));
1295 + return -ENODEV;
1296 + }
1297 +
1298 + /* Descriptor length should be 30 bytes as per the specification */
1299 + dsize = le16_to_cpu(hdesc->wHIDDescLength);
1300 + if (dsize != sizeof(struct i2c_hid_desc)) {
1301 + dev_err(&client->dev, "weird size of HID descriptor (%u)\n",
1302 + dsize);
1303 + return -ENODEV;
1304 + }
1305 + i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer);
1306 + return 0;
1307 +}
1308 +
1309 +#ifdef CONFIG_ACPI
1310 +
1311 +/* Default GPIO mapping */
1312 +static const struct acpi_gpio_params i2c_hid_irq_gpio = { 0, 0, true };
1313 +static const struct acpi_gpio_mapping i2c_hid_acpi_gpios[] = {
1314 + { "gpios", &i2c_hid_irq_gpio, 1 },
1315 + { },
1316 +};
1317 +
1318 +static int i2c_hid_acpi_pdata(struct i2c_client *client,
1319 + struct i2c_hid_platform_data *pdata)
1320 +{
1321 + static u8 i2c_hid_guid[] = {
1322 + 0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
1323 + 0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
1324 + };
1325 + union acpi_object *obj;
1326 + struct acpi_device *adev;
1327 + acpi_handle handle;
1328 + int ret;
1329 +
1330 + handle = ACPI_HANDLE(&client->dev);
1331 + if (!handle || acpi_bus_get_device(handle, &adev))
1332 + return -ENODEV;
1333 +
1334 + obj = acpi_evaluate_dsm_typed(handle, i2c_hid_guid, 1, 1, NULL,
1335 + ACPI_TYPE_INTEGER);
1336 + if (!obj) {
1337 + dev_err(&client->dev, "device _DSM execution failed\n");
1338 + return -ENODEV;
1339 + }
1340 +
1341 + pdata->hid_descriptor_address = obj->integer.value;
1342 + ACPI_FREE(obj);
1343 +
1344 + /* GPIOs are optional */
1345 + ret = acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
1346 + return ret < 0 && ret != -ENXIO ? ret : 0;
1347 +}
1348 +
1349 +static void i2c_hid_acpi_fix_up_power(struct device *dev)
1350 +{
1351 + acpi_handle handle = ACPI_HANDLE(dev);
1352 + struct acpi_device *adev;
1353 +
1354 + if (handle && acpi_bus_get_device(handle, &adev) == 0)
1355 + acpi_device_fix_up_power(adev);
1356 +}
1357 +
1358 +static const struct acpi_device_id i2c_hid_acpi_match[] = {
1359 + {"ACPI0C50", 0 },
1360 + {"PNP0C50", 0 },
1361 + { },
1362 +};
1363 +MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match);
1364 +#else
1365 +static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
1366 + struct i2c_hid_platform_data *pdata)
1367 +{
1368 + return -ENODEV;
1369 +}
1370 +
1371 +static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {}
1372 +#endif
1373 +
1374 +#ifdef CONFIG_OF
1375 +static int i2c_hid_of_probe(struct i2c_client *client,
1376 + struct i2c_hid_platform_data *pdata)
1377 +{
1378 + struct device *dev = &client->dev;
1379 + u32 val;
1380 + int ret;
1381 +
1382 + ret = of_property_read_u32(dev->of_node, "hid-descr-addr", &val);
1383 + if (ret) {
1384 + dev_err(&client->dev, "HID register address not provided\n");
1385 + return -ENODEV;
1386 + }
1387 + if (val >> 16) {
1388 + dev_err(&client->dev, "Bad HID register address: 0x%08x\n",
1389 + val);
1390 + return -EINVAL;
1391 + }
1392 + pdata->hid_descriptor_address = val;
1393 +
1394 + return 0;
1395 +}
1396 +
1397 +static const struct of_device_id i2c_hid_of_match[] = {
1398 + { .compatible = "hid-over-i2c" },
1399 + {},
1400 +};
1401 +MODULE_DEVICE_TABLE(of, i2c_hid_of_match);
1402 +#else
1403 +static inline int i2c_hid_of_probe(struct i2c_client *client,
1404 + struct i2c_hid_platform_data *pdata)
1405 +{
1406 + return -ENODEV;
1407 +}
1408 +#endif
1409 +
1410 +static int i2c_hid_probe(struct i2c_client *client,
1411 + const struct i2c_device_id *dev_id)
1412 +{
1413 + int ret;
1414 + struct i2c_hid *ihid;
1415 + struct hid_device *hid;
1416 + __u16 hidRegister;
1417 + struct i2c_hid_platform_data *platform_data = client->dev.platform_data;
1418 +
1419 + dbg_hid("HID probe called for i2c 0x%02x\n", client->addr);
1420 +
1421 + ihid = kzalloc(sizeof(struct i2c_hid), GFP_KERNEL);
1422 + if (!ihid)
1423 + return -ENOMEM;
1424 +
1425 + if (client->dev.of_node) {
1426 + ret = i2c_hid_of_probe(client, &ihid->pdata);
1427 + if (ret)
1428 + goto err;
1429 + } else if (!platform_data) {
1430 + ret = i2c_hid_acpi_pdata(client, &ihid->pdata);
1431 + if (ret) {
1432 + dev_err(&client->dev,
1433 + "HID register address not provided\n");
1434 + goto err;
1435 + }
1436 + } else {
1437 + ihid->pdata = *platform_data;
1438 + }
1439 +
1440 + if (client->irq > 0) {
1441 + ihid->irq = client->irq;
1442 + } else if (ACPI_COMPANION(&client->dev)) {
1443 + ihid->desc = gpiod_get(&client->dev, NULL, GPIOD_IN);
1444 + if (IS_ERR(ihid->desc)) {
1445 + dev_err(&client->dev, "Failed to get GPIO interrupt\n");
1446 + return PTR_ERR(ihid->desc);
1447 + }
1448 +
1449 + ihid->irq = gpiod_to_irq(ihid->desc);
1450 + if (ihid->irq < 0) {
1451 + gpiod_put(ihid->desc);
1452 + dev_err(&client->dev, "Failed to convert GPIO to IRQ\n");
1453 + return ihid->irq;
1454 + }
1455 + }
1456 +
1457 + i2c_set_clientdata(client, ihid);
1458 +
1459 + ihid->client = client;
1460 +
1461 + hidRegister = ihid->pdata.hid_descriptor_address;
1462 + ihid->wHIDDescRegister = cpu_to_le16(hidRegister);
1463 +
1464 + init_waitqueue_head(&ihid->wait);
1465 + mutex_init(&ihid->reset_lock);
1466 +
1467 + /* we need to allocate the command buffer without knowing the maximum
1468 + * size of the reports. Let's use HID_MIN_BUFFER_SIZE, then we do the
1469 + * real computation later. */
1470 + ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE);
1471 + if (ret < 0)
1472 + goto err;
1473 +
1474 + i2c_hid_acpi_fix_up_power(&client->dev);
1475 +
1476 + pm_runtime_get_noresume(&client->dev);
1477 + pm_runtime_set_active(&client->dev);
1478 + pm_runtime_enable(&client->dev);
1479 + device_enable_async_suspend(&client->dev);
1480 +
1481 + /* Make sure there is something at this address */
1482 + ret = i2c_smbus_read_byte(client);
1483 + if (ret < 0) {
1484 + dev_dbg(&client->dev, "nothing at this address: %d\n", ret);
1485 + ret = -ENXIO;
1486 + goto err_pm;
1487 + }
1488 +
1489 + ret = i2c_hid_fetch_hid_descriptor(ihid);
1490 + if (ret < 0)
1491 + goto err_pm;
1492 +
1493 + ret = i2c_hid_init_irq(client);
1494 + if (ret < 0)
1495 + goto err_pm;
1496 +
1497 + hid = hid_allocate_device();
1498 + if (IS_ERR(hid)) {
1499 + ret = PTR_ERR(hid);
1500 + goto err_irq;
1501 + }
1502 +
1503 + ihid->hid = hid;
1504 +
1505 + hid->driver_data = client;
1506 + hid->ll_driver = &i2c_hid_ll_driver;
1507 + hid->dev.parent = &client->dev;
1508 + hid->bus = BUS_I2C;
1509 + hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
1510 + hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
1511 + hid->product = le16_to_cpu(ihid->hdesc.wProductID);
1512 +
1513 + snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
1514 + client->name, hid->vendor, hid->product);
1515 + strlcpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys));
1516 +
1517 + ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product);
1518 +
1519 + ret = hid_add_device(hid);
1520 + if (ret) {
1521 + if (ret != -ENODEV)
1522 + hid_err(client, "can't add hid device: %d\n", ret);
1523 + goto err_mem_free;
1524 + }
1525 +
1526 + pm_runtime_put(&client->dev);
1527 + return 0;
1528 +
1529 +err_mem_free:
1530 + hid_destroy_device(hid);
1531 +
1532 +err_irq:
1533 + free_irq(ihid->irq, ihid);
1534 +
1535 +err_pm:
1536 + pm_runtime_put_noidle(&client->dev);
1537 + pm_runtime_disable(&client->dev);
1538 +
1539 +err:
1540 + if (ihid->desc)
1541 + gpiod_put(ihid->desc);
1542 +
1543 + i2c_hid_free_buffers(ihid);
1544 + kfree(ihid);
1545 + return ret;
1546 +}
1547 +
1548 +static int i2c_hid_remove(struct i2c_client *client)
1549 +{
1550 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1551 + struct hid_device *hid;
1552 +
1553 + pm_runtime_get_sync(&client->dev);
1554 + pm_runtime_disable(&client->dev);
1555 + pm_runtime_set_suspended(&client->dev);
1556 + pm_runtime_put_noidle(&client->dev);
1557 +
1558 + hid = ihid->hid;
1559 + hid_destroy_device(hid);
1560 +
1561 + free_irq(ihid->irq, ihid);
1562 +
1563 + if (ihid->bufsize)
1564 + i2c_hid_free_buffers(ihid);
1565 +
1566 + if (ihid->desc)
1567 + gpiod_put(ihid->desc);
1568 +
1569 + kfree(ihid);
1570 +
1571 + acpi_dev_remove_driver_gpios(ACPI_COMPANION(&client->dev));
1572 +
1573 + return 0;
1574 +}
1575 +
1576 +static void i2c_hid_shutdown(struct i2c_client *client)
1577 +{
1578 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1579 +
1580 + i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
1581 + free_irq(client->irq, ihid);
1582 +}
1583 +
1584 +#ifdef CONFIG_PM_SLEEP
1585 +static int i2c_hid_suspend(struct device *dev)
1586 +{
1587 + struct i2c_client *client = to_i2c_client(dev);
1588 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1589 + struct hid_device *hid = ihid->hid;
1590 + int ret;
1591 + int wake_status;
1592 +
1593 + if (hid->driver && hid->driver->suspend) {
1594 + /*
1595 + * Wake up the device so that IO issues in
1596 + * HID driver's suspend code can succeed.
1597 + */
1598 + ret = pm_runtime_resume(dev);
1599 + if (ret < 0)
1600 + return ret;
1601 +
1602 + ret = hid->driver->suspend(hid, PMSG_SUSPEND);
1603 + if (ret < 0)
1604 + return ret;
1605 + }
1606 +
1607 + if (!pm_runtime_suspended(dev)) {
1608 + /* Save some power */
1609 + i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
1610 +
1611 + disable_irq(ihid->irq);
1612 + }
1613 +
1614 + if (device_may_wakeup(&client->dev)) {
1615 + wake_status = enable_irq_wake(ihid->irq);
1616 + if (!wake_status)
1617 + ihid->irq_wake_enabled = true;
1618 + else
1619 + hid_warn(hid, "Failed to enable irq wake: %d\n",
1620 + wake_status);
1621 + }
1622 +
1623 + return 0;
1624 +}
1625 +
1626 +static int i2c_hid_resume(struct device *dev)
1627 +{
1628 + int ret;
1629 + struct i2c_client *client = to_i2c_client(dev);
1630 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1631 + struct hid_device *hid = ihid->hid;
1632 + int wake_status;
1633 +
1634 + if (device_may_wakeup(&client->dev) && ihid->irq_wake_enabled) {
1635 + wake_status = disable_irq_wake(ihid->irq);
1636 + if (!wake_status)
1637 + ihid->irq_wake_enabled = false;
1638 + else
1639 + hid_warn(hid, "Failed to disable irq wake: %d\n",
1640 + wake_status);
1641 + }
1642 +
1643 + /* We'll resume to full power */
1644 + pm_runtime_disable(dev);
1645 + pm_runtime_set_active(dev);
1646 + pm_runtime_enable(dev);
1647 +
1648 + enable_irq(ihid->irq);
1649 + ret = i2c_hid_hwreset(client);
1650 + if (ret)
1651 + return ret;
1652 +
1653 + if (hid->driver && hid->driver->reset_resume) {
1654 + ret = hid->driver->reset_resume(hid);
1655 + return ret;
1656 + }
1657 +
1658 + return 0;
1659 +}
1660 +#endif
1661 +
1662 +#ifdef CONFIG_PM
1663 +static int i2c_hid_runtime_suspend(struct device *dev)
1664 +{
1665 + struct i2c_client *client = to_i2c_client(dev);
1666 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1667 +
1668 + i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
1669 + disable_irq(ihid->irq);
1670 + return 0;
1671 +}
1672 +
1673 +static int i2c_hid_runtime_resume(struct device *dev)
1674 +{
1675 + struct i2c_client *client = to_i2c_client(dev);
1676 + struct i2c_hid *ihid = i2c_get_clientdata(client);
1677 +
1678 + enable_irq(ihid->irq);
1679 + i2c_hid_set_power(client, I2C_HID_PWR_ON);
1680 + return 0;
1681 +}
1682 +#endif
1683 +
1684 +static const struct dev_pm_ops i2c_hid_pm = {
1685 + SET_SYSTEM_SLEEP_PM_OPS(i2c_hid_suspend, i2c_hid_resume)
1686 + SET_RUNTIME_PM_OPS(i2c_hid_runtime_suspend, i2c_hid_runtime_resume,
1687 + NULL)
1688 +};
1689 +
1690 +static const struct i2c_device_id i2c_hid_id_table[] = {
1691 + { "hid", 0 },
1692 + { "hid-over-i2c", 0 },
1693 + { },
1694 +};
1695 +MODULE_DEVICE_TABLE(i2c, i2c_hid_id_table);
1696 +
1697 +
1698 +static struct i2c_driver i2c_hid_driver = {
1699 + .driver = {
1700 + .name = "i2c_hid",
1701 + .pm = &i2c_hid_pm,
1702 + .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match),
1703 + .of_match_table = of_match_ptr(i2c_hid_of_match),
1704 + },
1705 +
1706 + .probe = i2c_hid_probe,
1707 + .remove = i2c_hid_remove,
1708 + .shutdown = i2c_hid_shutdown,
1709 + .id_table = i2c_hid_id_table,
1710 +};
1711 +
1712 +module_i2c_driver(i2c_hid_driver);
1713 +
1714 +MODULE_DESCRIPTION("HID over I2C core driver");
1715 +MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
1716 +MODULE_LICENSE("GPL");
1717 diff --git a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
1718 new file mode 100644
1719 index 000000000000..1d645c9ab417
1720 --- /dev/null
1721 +++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
1722 @@ -0,0 +1,376 @@
1723 +// SPDX-License-Identifier: GPL-2.0+
1724 +
1725 +/*
1726 + * Quirks for I2C-HID devices that do not supply proper descriptors
1727 + *
1728 + * Copyright (c) 2018 Julian Sax <jsbc@gmx.de>
1729 + *
1730 + */
1731 +
1732 +#include <linux/types.h>
1733 +#include <linux/dmi.h>
1734 +#include <linux/mod_devicetable.h>
1735 +
1736 +#include "i2c-hid.h"
1737 +
1738 +
1739 +struct i2c_hid_desc_override {
1740 + union {
1741 + struct i2c_hid_desc *i2c_hid_desc;
1742 + uint8_t *i2c_hid_desc_buffer;
1743 + };
1744 + uint8_t *hid_report_desc;
1745 + unsigned int hid_report_desc_size;
1746 + uint8_t *i2c_name;
1747 +};
1748 +
1749 +
1750 +/*
1751 + * descriptors for the SIPODEV SP1064 touchpad
1752 + *
1753 + * This device does not supply any descriptors and on windows a filter
1754 + * driver operates between the i2c-hid layer and the device and injects
1755 + * these descriptors when the device is prompted. The descriptors were
1756 + * extracted by listening to the i2c-hid traffic that occurs between the
1757 + * windows filter driver and the windows i2c-hid driver.
1758 + */
1759 +
1760 +static const struct i2c_hid_desc_override sipodev_desc = {
1761 + .i2c_hid_desc_buffer = (uint8_t [])
1762 + {0x1e, 0x00, /* Length of descriptor */
1763 + 0x00, 0x01, /* Version of descriptor */
1764 + 0xdb, 0x01, /* Length of report descriptor */
1765 + 0x21, 0x00, /* Location of report descriptor */
1766 + 0x24, 0x00, /* Location of input report */
1767 + 0x1b, 0x00, /* Max input report length */
1768 + 0x25, 0x00, /* Location of output report */
1769 + 0x11, 0x00, /* Max output report length */
1770 + 0x22, 0x00, /* Location of command register */
1771 + 0x23, 0x00, /* Location of data register */
1772 + 0x11, 0x09, /* Vendor ID */
1773 + 0x88, 0x52, /* Product ID */
1774 + 0x06, 0x00, /* Version ID */
1775 + 0x00, 0x00, 0x00, 0x00 /* Reserved */
1776 + },
1777 +
1778 + .hid_report_desc = (uint8_t [])
1779 + {0x05, 0x01, /* Usage Page (Desktop), */
1780 + 0x09, 0x02, /* Usage (Mouse), */
1781 + 0xA1, 0x01, /* Collection (Application), */
1782 + 0x85, 0x01, /* Report ID (1), */
1783 + 0x09, 0x01, /* Usage (Pointer), */
1784 + 0xA1, 0x00, /* Collection (Physical), */
1785 + 0x05, 0x09, /* Usage Page (Button), */
1786 + 0x19, 0x01, /* Usage Minimum (01h), */
1787 + 0x29, 0x02, /* Usage Maximum (02h), */
1788 + 0x25, 0x01, /* Logical Maximum (1), */
1789 + 0x75, 0x01, /* Report Size (1), */
1790 + 0x95, 0x02, /* Report Count (2), */
1791 + 0x81, 0x02, /* Input (Variable), */
1792 + 0x95, 0x06, /* Report Count (6), */
1793 + 0x81, 0x01, /* Input (Constant), */
1794 + 0x05, 0x01, /* Usage Page (Desktop), */
1795 + 0x09, 0x30, /* Usage (X), */
1796 + 0x09, 0x31, /* Usage (Y), */
1797 + 0x15, 0x81, /* Logical Minimum (-127), */
1798 + 0x25, 0x7F, /* Logical Maximum (127), */
1799 + 0x75, 0x08, /* Report Size (8), */
1800 + 0x95, 0x02, /* Report Count (2), */
1801 + 0x81, 0x06, /* Input (Variable, Relative), */
1802 + 0xC0, /* End Collection, */
1803 + 0xC0, /* End Collection, */
1804 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1805 + 0x09, 0x05, /* Usage (Touchpad), */
1806 + 0xA1, 0x01, /* Collection (Application), */
1807 + 0x85, 0x04, /* Report ID (4), */
1808 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1809 + 0x09, 0x22, /* Usage (Finger), */
1810 + 0xA1, 0x02, /* Collection (Logical), */
1811 + 0x15, 0x00, /* Logical Minimum (0), */
1812 + 0x25, 0x01, /* Logical Maximum (1), */
1813 + 0x09, 0x47, /* Usage (Touch Valid), */
1814 + 0x09, 0x42, /* Usage (Tip Switch), */
1815 + 0x95, 0x02, /* Report Count (2), */
1816 + 0x75, 0x01, /* Report Size (1), */
1817 + 0x81, 0x02, /* Input (Variable), */
1818 + 0x95, 0x01, /* Report Count (1), */
1819 + 0x75, 0x03, /* Report Size (3), */
1820 + 0x25, 0x05, /* Logical Maximum (5), */
1821 + 0x09, 0x51, /* Usage (Contact Identifier), */
1822 + 0x81, 0x02, /* Input (Variable), */
1823 + 0x75, 0x01, /* Report Size (1), */
1824 + 0x95, 0x03, /* Report Count (3), */
1825 + 0x81, 0x03, /* Input (Constant, Variable), */
1826 + 0x05, 0x01, /* Usage Page (Desktop), */
1827 + 0x26, 0x44, 0x0A, /* Logical Maximum (2628), */
1828 + 0x75, 0x10, /* Report Size (16), */
1829 + 0x55, 0x0E, /* Unit Exponent (14), */
1830 + 0x65, 0x11, /* Unit (Centimeter), */
1831 + 0x09, 0x30, /* Usage (X), */
1832 + 0x46, 0x1A, 0x04, /* Physical Maximum (1050), */
1833 + 0x95, 0x01, /* Report Count (1), */
1834 + 0x81, 0x02, /* Input (Variable), */
1835 + 0x46, 0xBC, 0x02, /* Physical Maximum (700), */
1836 + 0x26, 0x34, 0x05, /* Logical Maximum (1332), */
1837 + 0x09, 0x31, /* Usage (Y), */
1838 + 0x81, 0x02, /* Input (Variable), */
1839 + 0xC0, /* End Collection, */
1840 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1841 + 0x09, 0x22, /* Usage (Finger), */
1842 + 0xA1, 0x02, /* Collection (Logical), */
1843 + 0x25, 0x01, /* Logical Maximum (1), */
1844 + 0x09, 0x47, /* Usage (Touch Valid), */
1845 + 0x09, 0x42, /* Usage (Tip Switch), */
1846 + 0x95, 0x02, /* Report Count (2), */
1847 + 0x75, 0x01, /* Report Size (1), */
1848 + 0x81, 0x02, /* Input (Variable), */
1849 + 0x95, 0x01, /* Report Count (1), */
1850 + 0x75, 0x03, /* Report Size (3), */
1851 + 0x25, 0x05, /* Logical Maximum (5), */
1852 + 0x09, 0x51, /* Usage (Contact Identifier), */
1853 + 0x81, 0x02, /* Input (Variable), */
1854 + 0x75, 0x01, /* Report Size (1), */
1855 + 0x95, 0x03, /* Report Count (3), */
1856 + 0x81, 0x03, /* Input (Constant, Variable), */
1857 + 0x05, 0x01, /* Usage Page (Desktop), */
1858 + 0x26, 0x44, 0x0A, /* Logical Maximum (2628), */
1859 + 0x75, 0x10, /* Report Size (16), */
1860 + 0x09, 0x30, /* Usage (X), */
1861 + 0x46, 0x1A, 0x04, /* Physical Maximum (1050), */
1862 + 0x95, 0x01, /* Report Count (1), */
1863 + 0x81, 0x02, /* Input (Variable), */
1864 + 0x46, 0xBC, 0x02, /* Physical Maximum (700), */
1865 + 0x26, 0x34, 0x05, /* Logical Maximum (1332), */
1866 + 0x09, 0x31, /* Usage (Y), */
1867 + 0x81, 0x02, /* Input (Variable), */
1868 + 0xC0, /* End Collection, */
1869 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1870 + 0x09, 0x22, /* Usage (Finger), */
1871 + 0xA1, 0x02, /* Collection (Logical), */
1872 + 0x25, 0x01, /* Logical Maximum (1), */
1873 + 0x09, 0x47, /* Usage (Touch Valid), */
1874 + 0x09, 0x42, /* Usage (Tip Switch), */
1875 + 0x95, 0x02, /* Report Count (2), */
1876 + 0x75, 0x01, /* Report Size (1), */
1877 + 0x81, 0x02, /* Input (Variable), */
1878 + 0x95, 0x01, /* Report Count (1), */
1879 + 0x75, 0x03, /* Report Size (3), */
1880 + 0x25, 0x05, /* Logical Maximum (5), */
1881 + 0x09, 0x51, /* Usage (Contact Identifier), */
1882 + 0x81, 0x02, /* Input (Variable), */
1883 + 0x75, 0x01, /* Report Size (1), */
1884 + 0x95, 0x03, /* Report Count (3), */
1885 + 0x81, 0x03, /* Input (Constant, Variable), */
1886 + 0x05, 0x01, /* Usage Page (Desktop), */
1887 + 0x26, 0x44, 0x0A, /* Logical Maximum (2628), */
1888 + 0x75, 0x10, /* Report Size (16), */
1889 + 0x09, 0x30, /* Usage (X), */
1890 + 0x46, 0x1A, 0x04, /* Physical Maximum (1050), */
1891 + 0x95, 0x01, /* Report Count (1), */
1892 + 0x81, 0x02, /* Input (Variable), */
1893 + 0x46, 0xBC, 0x02, /* Physical Maximum (700), */
1894 + 0x26, 0x34, 0x05, /* Logical Maximum (1332), */
1895 + 0x09, 0x31, /* Usage (Y), */
1896 + 0x81, 0x02, /* Input (Variable), */
1897 + 0xC0, /* End Collection, */
1898 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1899 + 0x09, 0x22, /* Usage (Finger), */
1900 + 0xA1, 0x02, /* Collection (Logical), */
1901 + 0x25, 0x01, /* Logical Maximum (1), */
1902 + 0x09, 0x47, /* Usage (Touch Valid), */
1903 + 0x09, 0x42, /* Usage (Tip Switch), */
1904 + 0x95, 0x02, /* Report Count (2), */
1905 + 0x75, 0x01, /* Report Size (1), */
1906 + 0x81, 0x02, /* Input (Variable), */
1907 + 0x95, 0x01, /* Report Count (1), */
1908 + 0x75, 0x03, /* Report Size (3), */
1909 + 0x25, 0x05, /* Logical Maximum (5), */
1910 + 0x09, 0x51, /* Usage (Contact Identifier), */
1911 + 0x81, 0x02, /* Input (Variable), */
1912 + 0x75, 0x01, /* Report Size (1), */
1913 + 0x95, 0x03, /* Report Count (3), */
1914 + 0x81, 0x03, /* Input (Constant, Variable), */
1915 + 0x05, 0x01, /* Usage Page (Desktop), */
1916 + 0x26, 0x44, 0x0A, /* Logical Maximum (2628), */
1917 + 0x75, 0x10, /* Report Size (16), */
1918 + 0x09, 0x30, /* Usage (X), */
1919 + 0x46, 0x1A, 0x04, /* Physical Maximum (1050), */
1920 + 0x95, 0x01, /* Report Count (1), */
1921 + 0x81, 0x02, /* Input (Variable), */
1922 + 0x46, 0xBC, 0x02, /* Physical Maximum (700), */
1923 + 0x26, 0x34, 0x05, /* Logical Maximum (1332), */
1924 + 0x09, 0x31, /* Usage (Y), */
1925 + 0x81, 0x02, /* Input (Variable), */
1926 + 0xC0, /* End Collection, */
1927 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1928 + 0x55, 0x0C, /* Unit Exponent (12), */
1929 + 0x66, 0x01, 0x10, /* Unit (Seconds), */
1930 + 0x47, 0xFF, 0xFF, 0x00, 0x00,/* Physical Maximum (65535), */
1931 + 0x27, 0xFF, 0xFF, 0x00, 0x00,/* Logical Maximum (65535), */
1932 + 0x75, 0x10, /* Report Size (16), */
1933 + 0x95, 0x01, /* Report Count (1), */
1934 + 0x09, 0x56, /* Usage (Scan Time), */
1935 + 0x81, 0x02, /* Input (Variable), */
1936 + 0x09, 0x54, /* Usage (Contact Count), */
1937 + 0x25, 0x7F, /* Logical Maximum (127), */
1938 + 0x75, 0x08, /* Report Size (8), */
1939 + 0x81, 0x02, /* Input (Variable), */
1940 + 0x05, 0x09, /* Usage Page (Button), */
1941 + 0x09, 0x01, /* Usage (01h), */
1942 + 0x25, 0x01, /* Logical Maximum (1), */
1943 + 0x75, 0x01, /* Report Size (1), */
1944 + 0x95, 0x01, /* Report Count (1), */
1945 + 0x81, 0x02, /* Input (Variable), */
1946 + 0x95, 0x07, /* Report Count (7), */
1947 + 0x81, 0x03, /* Input (Constant, Variable), */
1948 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1949 + 0x85, 0x02, /* Report ID (2), */
1950 + 0x09, 0x55, /* Usage (Contact Count Maximum), */
1951 + 0x09, 0x59, /* Usage (59h), */
1952 + 0x75, 0x04, /* Report Size (4), */
1953 + 0x95, 0x02, /* Report Count (2), */
1954 + 0x25, 0x0F, /* Logical Maximum (15), */
1955 + 0xB1, 0x02, /* Feature (Variable), */
1956 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1957 + 0x85, 0x07, /* Report ID (7), */
1958 + 0x09, 0x60, /* Usage (60h), */
1959 + 0x75, 0x01, /* Report Size (1), */
1960 + 0x95, 0x01, /* Report Count (1), */
1961 + 0x25, 0x01, /* Logical Maximum (1), */
1962 + 0xB1, 0x02, /* Feature (Variable), */
1963 + 0x95, 0x07, /* Report Count (7), */
1964 + 0xB1, 0x03, /* Feature (Constant, Variable), */
1965 + 0x85, 0x06, /* Report ID (6), */
1966 + 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
1967 + 0x09, 0xC5, /* Usage (C5h), */
1968 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
1969 + 0x75, 0x08, /* Report Size (8), */
1970 + 0x96, 0x00, 0x01, /* Report Count (256), */
1971 + 0xB1, 0x02, /* Feature (Variable), */
1972 + 0xC0, /* End Collection, */
1973 + 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
1974 + 0x09, 0x01, /* Usage (01h), */
1975 + 0xA1, 0x01, /* Collection (Application), */
1976 + 0x85, 0x0D, /* Report ID (13), */
1977 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
1978 + 0x19, 0x01, /* Usage Minimum (01h), */
1979 + 0x29, 0x02, /* Usage Maximum (02h), */
1980 + 0x75, 0x08, /* Report Size (8), */
1981 + 0x95, 0x02, /* Report Count (2), */
1982 + 0xB1, 0x02, /* Feature (Variable), */
1983 + 0xC0, /* End Collection, */
1984 + 0x05, 0x0D, /* Usage Page (Digitizer), */
1985 + 0x09, 0x0E, /* Usage (Configuration), */
1986 + 0xA1, 0x01, /* Collection (Application), */
1987 + 0x85, 0x03, /* Report ID (3), */
1988 + 0x09, 0x22, /* Usage (Finger), */
1989 + 0xA1, 0x02, /* Collection (Logical), */
1990 + 0x09, 0x52, /* Usage (Device Mode), */
1991 + 0x25, 0x0A, /* Logical Maximum (10), */
1992 + 0x95, 0x01, /* Report Count (1), */
1993 + 0xB1, 0x02, /* Feature (Variable), */
1994 + 0xC0, /* End Collection, */
1995 + 0x09, 0x22, /* Usage (Finger), */
1996 + 0xA1, 0x00, /* Collection (Physical), */
1997 + 0x85, 0x05, /* Report ID (5), */
1998 + 0x09, 0x57, /* Usage (57h), */
1999 + 0x09, 0x58, /* Usage (58h), */
2000 + 0x75, 0x01, /* Report Size (1), */
2001 + 0x95, 0x02, /* Report Count (2), */
2002 + 0x25, 0x01, /* Logical Maximum (1), */
2003 + 0xB1, 0x02, /* Feature (Variable), */
2004 + 0x95, 0x06, /* Report Count (6), */
2005 + 0xB1, 0x03, /* Feature (Constant, Variable),*/
2006 + 0xC0, /* End Collection, */
2007 + 0xC0 /* End Collection */
2008 + },
2009 + .hid_report_desc_size = 475,
2010 + .i2c_name = "SYNA3602:00"
2011 +};
2012 +
2013 +
2014 +static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
2015 + {
2016 + .ident = "Teclast F6 Pro",
2017 + .matches = {
2018 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TECLAST"),
2019 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "F6 Pro"),
2020 + },
2021 + .driver_data = (void *)&sipodev_desc
2022 + },
2023 + {
2024 + .ident = "Teclast F7",
2025 + .matches = {
2026 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TECLAST"),
2027 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "F7"),
2028 + },
2029 + .driver_data = (void *)&sipodev_desc
2030 + },
2031 + {
2032 + .ident = "Trekstor Primebook C13",
2033 + .matches = {
2034 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
2035 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Primebook C13"),
2036 + },
2037 + .driver_data = (void *)&sipodev_desc
2038 + },
2039 + {
2040 + .ident = "Trekstor Primebook C11",
2041 + .matches = {
2042 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
2043 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Primebook C11"),
2044 + },
2045 + .driver_data = (void *)&sipodev_desc
2046 + },
2047 + {
2048 + .ident = "Direkt-Tek DTLAPY116-2",
2049 + .matches = {
2050 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Direkt-Tek"),
2051 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "DTLAPY116-2"),
2052 + },
2053 + .driver_data = (void *)&sipodev_desc
2054 + },
2055 + {
2056 + .ident = "Mediacom Flexbook Edge 11",
2057 + .matches = {
2058 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
2059 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "FlexBook edge11 - M-FBE11"),
2060 + },
2061 + .driver_data = (void *)&sipodev_desc
2062 + }
2063 +};
2064 +
2065 +
2066 +struct i2c_hid_desc *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name)
2067 +{
2068 + struct i2c_hid_desc_override *override;
2069 + const struct dmi_system_id *system_id;
2070 +
2071 + system_id = dmi_first_match(i2c_hid_dmi_desc_override_table);
2072 + if (!system_id)
2073 + return NULL;
2074 +
2075 + override = system_id->driver_data;
2076 + if (strcmp(override->i2c_name, i2c_name))
2077 + return NULL;
2078 +
2079 + return override->i2c_hid_desc;
2080 +}
2081 +
2082 +char *i2c_hid_get_dmi_hid_report_desc_override(uint8_t *i2c_name,
2083 + unsigned int *size)
2084 +{
2085 + struct i2c_hid_desc_override *override;
2086 + const struct dmi_system_id *system_id;
2087 +
2088 + system_id = dmi_first_match(i2c_hid_dmi_desc_override_table);
2089 + if (!system_id)
2090 + return NULL;
2091 +
2092 + override = system_id->driver_data;
2093 + if (strcmp(override->i2c_name, i2c_name))
2094 + return NULL;
2095 +
2096 + *size = override->hid_report_desc_size;
2097 + return override->hid_report_desc;
2098 +}
2099 diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
2100 deleted file mode 100644
2101 index ce2b80009c19..000000000000
2102 --- a/drivers/hid/i2c-hid/i2c-hid.c
2103 +++ /dev/null
2104 @@ -1,1339 +0,0 @@
2105 -/*
2106 - * HID over I2C protocol implementation
2107 - *
2108 - * Copyright (c) 2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
2109 - * Copyright (c) 2012 Ecole Nationale de l'Aviation Civile, France
2110 - * Copyright (c) 2012 Red Hat, Inc
2111 - *
2112 - * This code is partly based on "USB HID support for Linux":
2113 - *
2114 - * Copyright (c) 1999 Andreas Gal
2115 - * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
2116 - * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
2117 - * Copyright (c) 2007-2008 Oliver Neukum
2118 - * Copyright (c) 2006-2010 Jiri Kosina
2119 - *
2120 - * This file is subject to the terms and conditions of the GNU General Public
2121 - * License. See the file COPYING in the main directory of this archive for
2122 - * more details.
2123 - */
2124 -
2125 -#include <linux/module.h>
2126 -#include <linux/i2c.h>
2127 -#include <linux/interrupt.h>
2128 -#include <linux/input.h>
2129 -#include <linux/delay.h>
2130 -#include <linux/slab.h>
2131 -#include <linux/pm.h>
2132 -#include <linux/pm_runtime.h>
2133 -#include <linux/device.h>
2134 -#include <linux/wait.h>
2135 -#include <linux/err.h>
2136 -#include <linux/string.h>
2137 -#include <linux/list.h>
2138 -#include <linux/jiffies.h>
2139 -#include <linux/kernel.h>
2140 -#include <linux/hid.h>
2141 -#include <linux/mutex.h>
2142 -#include <linux/acpi.h>
2143 -#include <linux/of.h>
2144 -#include <linux/gpio/consumer.h>
2145 -
2146 -#include <linux/i2c/i2c-hid.h>
2147 -
2148 -#include "../hid-ids.h"
2149 -
2150 -/* quirks to control the device */
2151 -#define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0)
2152 -
2153 -/* flags */
2154 -#define I2C_HID_STARTED 0
2155 -#define I2C_HID_RESET_PENDING 1
2156 -#define I2C_HID_READ_PENDING 2
2157 -
2158 -#define I2C_HID_PWR_ON 0x00
2159 -#define I2C_HID_PWR_SLEEP 0x01
2160 -
2161 -/* debug option */
2162 -static bool debug;
2163 -module_param(debug, bool, 0444);
2164 -MODULE_PARM_DESC(debug, "print a lot of debug information");
2165 -
2166 -#define i2c_hid_dbg(ihid, fmt, arg...) \
2167 -do { \
2168 - if (debug) \
2169 - dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
2170 -} while (0)
2171 -
2172 -struct i2c_hid_desc {
2173 - __le16 wHIDDescLength;
2174 - __le16 bcdVersion;
2175 - __le16 wReportDescLength;
2176 - __le16 wReportDescRegister;
2177 - __le16 wInputRegister;
2178 - __le16 wMaxInputLength;
2179 - __le16 wOutputRegister;
2180 - __le16 wMaxOutputLength;
2181 - __le16 wCommandRegister;
2182 - __le16 wDataRegister;
2183 - __le16 wVendorID;
2184 - __le16 wProductID;
2185 - __le16 wVersionID;
2186 - __le32 reserved;
2187 -} __packed;
2188 -
2189 -struct i2c_hid_cmd {
2190 - unsigned int registerIndex;
2191 - __u8 opcode;
2192 - unsigned int length;
2193 - bool wait;
2194 -};
2195 -
2196 -union command {
2197 - u8 data[0];
2198 - struct cmd {
2199 - __le16 reg;
2200 - __u8 reportTypeID;
2201 - __u8 opcode;
2202 - } __packed c;
2203 -};
2204 -
2205 -#define I2C_HID_CMD(opcode_) \
2206 - .opcode = opcode_, .length = 4, \
2207 - .registerIndex = offsetof(struct i2c_hid_desc, wCommandRegister)
2208 -
2209 -/* fetch HID descriptor */
2210 -static const struct i2c_hid_cmd hid_descr_cmd = { .length = 2 };
2211 -/* fetch report descriptors */
2212 -static const struct i2c_hid_cmd hid_report_descr_cmd = {
2213 - .registerIndex = offsetof(struct i2c_hid_desc,
2214 - wReportDescRegister),
2215 - .opcode = 0x00,
2216 - .length = 2 };
2217 -/* commands */
2218 -static const struct i2c_hid_cmd hid_reset_cmd = { I2C_HID_CMD(0x01),
2219 - .wait = true };
2220 -static const struct i2c_hid_cmd hid_get_report_cmd = { I2C_HID_CMD(0x02) };
2221 -static const struct i2c_hid_cmd hid_set_report_cmd = { I2C_HID_CMD(0x03) };
2222 -static const struct i2c_hid_cmd hid_set_power_cmd = { I2C_HID_CMD(0x08) };
2223 -static const struct i2c_hid_cmd hid_no_cmd = { .length = 0 };
2224 -
2225 -/*
2226 - * These definitions are not used here, but are defined by the spec.
2227 - * Keeping them here for documentation purposes.
2228 - *
2229 - * static const struct i2c_hid_cmd hid_get_idle_cmd = { I2C_HID_CMD(0x04) };
2230 - * static const struct i2c_hid_cmd hid_set_idle_cmd = { I2C_HID_CMD(0x05) };
2231 - * static const struct i2c_hid_cmd hid_get_protocol_cmd = { I2C_HID_CMD(0x06) };
2232 - * static const struct i2c_hid_cmd hid_set_protocol_cmd = { I2C_HID_CMD(0x07) };
2233 - */
2234 -
2235 -static DEFINE_MUTEX(i2c_hid_open_mut);
2236 -
2237 -/* The main device structure */
2238 -struct i2c_hid {
2239 - struct i2c_client *client; /* i2c client */
2240 - struct hid_device *hid; /* pointer to corresponding HID dev */
2241 - union {
2242 - __u8 hdesc_buffer[sizeof(struct i2c_hid_desc)];
2243 - struct i2c_hid_desc hdesc; /* the HID Descriptor */
2244 - };
2245 - __le16 wHIDDescRegister; /* location of the i2c
2246 - * register of the HID
2247 - * descriptor. */
2248 - unsigned int bufsize; /* i2c buffer size */
2249 - u8 *inbuf; /* Input buffer */
2250 - u8 *rawbuf; /* Raw Input buffer */
2251 - u8 *cmdbuf; /* Command buffer */
2252 - u8 *argsbuf; /* Command arguments buffer */
2253 -
2254 - unsigned long flags; /* device flags */
2255 - unsigned long quirks; /* Various quirks */
2256 -
2257 - wait_queue_head_t wait; /* For waiting the interrupt */
2258 - struct gpio_desc *desc;
2259 - int irq;
2260 -
2261 - struct i2c_hid_platform_data pdata;
2262 -
2263 - bool irq_wake_enabled;
2264 - struct mutex reset_lock;
2265 -};
2266 -
2267 -static const struct i2c_hid_quirks {
2268 - __u16 idVendor;
2269 - __u16 idProduct;
2270 - __u32 quirks;
2271 -} i2c_hid_quirks[] = {
2272 - { USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8752,
2273 - I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
2274 - { USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8755,
2275 - I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
2276 - { 0, 0 }
2277 -};
2278 -
2279 -/*
2280 - * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
2281 - * @idVendor: the 16-bit vendor ID
2282 - * @idProduct: the 16-bit product ID
2283 - *
2284 - * Returns: a u32 quirks value.
2285 - */
2286 -static u32 i2c_hid_lookup_quirk(const u16 idVendor, const u16 idProduct)
2287 -{
2288 - u32 quirks = 0;
2289 - int n;
2290 -
2291 - for (n = 0; i2c_hid_quirks[n].idVendor; n++)
2292 - if (i2c_hid_quirks[n].idVendor == idVendor &&
2293 - (i2c_hid_quirks[n].idProduct == (__u16)HID_ANY_ID ||
2294 - i2c_hid_quirks[n].idProduct == idProduct))
2295 - quirks = i2c_hid_quirks[n].quirks;
2296 -
2297 - return quirks;
2298 -}
2299 -
2300 -static int __i2c_hid_command(struct i2c_client *client,
2301 - const struct i2c_hid_cmd *command, u8 reportID,
2302 - u8 reportType, u8 *args, int args_len,
2303 - unsigned char *buf_recv, int data_len)
2304 -{
2305 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2306 - union command *cmd = (union command *)ihid->cmdbuf;
2307 - int ret;
2308 - struct i2c_msg msg[2];
2309 - int msg_num = 1;
2310 -
2311 - int length = command->length;
2312 - bool wait = command->wait;
2313 - unsigned int registerIndex = command->registerIndex;
2314 -
2315 - /* special case for hid_descr_cmd */
2316 - if (command == &hid_descr_cmd) {
2317 - cmd->c.reg = ihid->wHIDDescRegister;
2318 - } else {
2319 - cmd->data[0] = ihid->hdesc_buffer[registerIndex];
2320 - cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1];
2321 - }
2322 -
2323 - if (length > 2) {
2324 - cmd->c.opcode = command->opcode;
2325 - cmd->c.reportTypeID = reportID | reportType << 4;
2326 - }
2327 -
2328 - memcpy(cmd->data + length, args, args_len);
2329 - length += args_len;
2330 -
2331 - i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data);
2332 -
2333 - msg[0].addr = client->addr;
2334 - msg[0].flags = client->flags & I2C_M_TEN;
2335 - msg[0].len = length;
2336 - msg[0].buf = cmd->data;
2337 - if (data_len > 0) {
2338 - msg[1].addr = client->addr;
2339 - msg[1].flags = client->flags & I2C_M_TEN;
2340 - msg[1].flags |= I2C_M_RD;
2341 - msg[1].len = data_len;
2342 - msg[1].buf = buf_recv;
2343 - msg_num = 2;
2344 - set_bit(I2C_HID_READ_PENDING, &ihid->flags);
2345 - }
2346 -
2347 - if (wait)
2348 - set_bit(I2C_HID_RESET_PENDING, &ihid->flags);
2349 -
2350 - ret = i2c_transfer(client->adapter, msg, msg_num);
2351 -
2352 - if (data_len > 0)
2353 - clear_bit(I2C_HID_READ_PENDING, &ihid->flags);
2354 -
2355 - if (ret != msg_num)
2356 - return ret < 0 ? ret : -EIO;
2357 -
2358 - ret = 0;
2359 -
2360 - if (wait) {
2361 - i2c_hid_dbg(ihid, "%s: waiting...\n", __func__);
2362 - if (!wait_event_timeout(ihid->wait,
2363 - !test_bit(I2C_HID_RESET_PENDING, &ihid->flags),
2364 - msecs_to_jiffies(5000)))
2365 - ret = -ENODATA;
2366 - i2c_hid_dbg(ihid, "%s: finished.\n", __func__);
2367 - }
2368 -
2369 - return ret;
2370 -}
2371 -
2372 -static int i2c_hid_command(struct i2c_client *client,
2373 - const struct i2c_hid_cmd *command,
2374 - unsigned char *buf_recv, int data_len)
2375 -{
2376 - return __i2c_hid_command(client, command, 0, 0, NULL, 0,
2377 - buf_recv, data_len);
2378 -}
2379 -
2380 -static int i2c_hid_get_report(struct i2c_client *client, u8 reportType,
2381 - u8 reportID, unsigned char *buf_recv, int data_len)
2382 -{
2383 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2384 - u8 args[3];
2385 - int ret;
2386 - int args_len = 0;
2387 - u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
2388 -
2389 - i2c_hid_dbg(ihid, "%s\n", __func__);
2390 -
2391 - if (reportID >= 0x0F) {
2392 - args[args_len++] = reportID;
2393 - reportID = 0x0F;
2394 - }
2395 -
2396 - args[args_len++] = readRegister & 0xFF;
2397 - args[args_len++] = readRegister >> 8;
2398 -
2399 - ret = __i2c_hid_command(client, &hid_get_report_cmd, reportID,
2400 - reportType, args, args_len, buf_recv, data_len);
2401 - if (ret) {
2402 - dev_err(&client->dev,
2403 - "failed to retrieve report from device.\n");
2404 - return ret;
2405 - }
2406 -
2407 - return 0;
2408 -}
2409 -
2410 -/**
2411 - * i2c_hid_set_or_send_report: forward an incoming report to the device
2412 - * @client: the i2c_client of the device
2413 - * @reportType: 0x03 for HID_FEATURE_REPORT ; 0x02 for HID_OUTPUT_REPORT
2414 - * @reportID: the report ID
2415 - * @buf: the actual data to transfer, without the report ID
2416 - * @len: size of buf
2417 - * @use_data: true: use SET_REPORT HID command, false: send plain OUTPUT report
2418 - */
2419 -static int i2c_hid_set_or_send_report(struct i2c_client *client, u8 reportType,
2420 - u8 reportID, unsigned char *buf, size_t data_len, bool use_data)
2421 -{
2422 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2423 - u8 *args = ihid->argsbuf;
2424 - const struct i2c_hid_cmd *hidcmd;
2425 - int ret;
2426 - u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
2427 - u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister);
2428 - u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength);
2429 - u16 size;
2430 - int args_len;
2431 - int index = 0;
2432 -
2433 - i2c_hid_dbg(ihid, "%s\n", __func__);
2434 -
2435 - if (data_len > ihid->bufsize)
2436 - return -EINVAL;
2437 -
2438 - size = 2 /* size */ +
2439 - (reportID ? 1 : 0) /* reportID */ +
2440 - data_len /* buf */;
2441 - args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ +
2442 - 2 /* dataRegister */ +
2443 - size /* args */;
2444 -
2445 - if (!use_data && maxOutputLength == 0)
2446 - return -ENOSYS;
2447 -
2448 - if (reportID >= 0x0F) {
2449 - args[index++] = reportID;
2450 - reportID = 0x0F;
2451 - }
2452 -
2453 - /*
2454 - * use the data register for feature reports or if the device does not
2455 - * support the output register
2456 - */
2457 - if (use_data) {
2458 - args[index++] = dataRegister & 0xFF;
2459 - args[index++] = dataRegister >> 8;
2460 - hidcmd = &hid_set_report_cmd;
2461 - } else {
2462 - args[index++] = outputRegister & 0xFF;
2463 - args[index++] = outputRegister >> 8;
2464 - hidcmd = &hid_no_cmd;
2465 - }
2466 -
2467 - args[index++] = size & 0xFF;
2468 - args[index++] = size >> 8;
2469 -
2470 - if (reportID)
2471 - args[index++] = reportID;
2472 -
2473 - memcpy(&args[index], buf, data_len);
2474 -
2475 - ret = __i2c_hid_command(client, hidcmd, reportID,
2476 - reportType, args, args_len, NULL, 0);
2477 - if (ret) {
2478 - dev_err(&client->dev, "failed to set a report to device.\n");
2479 - return ret;
2480 - }
2481 -
2482 - return data_len;
2483 -}
2484 -
2485 -static int i2c_hid_set_power(struct i2c_client *client, int power_state)
2486 -{
2487 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2488 - int ret;
2489 -
2490 - i2c_hid_dbg(ihid, "%s\n", __func__);
2491 -
2492 - /*
2493 - * Some devices require to send a command to wakeup before power on.
2494 - * The call will get a return value (EREMOTEIO) but device will be
2495 - * triggered and activated. After that, it goes like a normal device.
2496 - */
2497 - if (power_state == I2C_HID_PWR_ON &&
2498 - ihid->quirks & I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV) {
2499 - ret = i2c_hid_command(client, &hid_set_power_cmd, NULL, 0);
2500 -
2501 - /* Device was already activated */
2502 - if (!ret)
2503 - goto set_pwr_exit;
2504 - }
2505 -
2506 - ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state,
2507 - 0, NULL, 0, NULL, 0);
2508 -
2509 - if (ret)
2510 - dev_err(&client->dev, "failed to change power setting.\n");
2511 -
2512 -set_pwr_exit:
2513 - return ret;
2514 -}
2515 -
2516 -static int i2c_hid_hwreset(struct i2c_client *client)
2517 -{
2518 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2519 - int ret;
2520 -
2521 - i2c_hid_dbg(ihid, "%s\n", __func__);
2522 -
2523 - /*
2524 - * This prevents sending feature reports while the device is
2525 - * being reset. Otherwise we may lose the reset complete
2526 - * interrupt.
2527 - */
2528 - mutex_lock(&ihid->reset_lock);
2529 -
2530 - ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
2531 - if (ret)
2532 - goto out_unlock;
2533 -
2534 - /*
2535 - * The HID over I2C specification states that if a DEVICE needs time
2536 - * after the PWR_ON request, it should utilise CLOCK stretching.
2537 - * However, it has been observered that the Windows driver provides a
2538 - * 1ms sleep between the PWR_ON and RESET requests and that some devices
2539 - * rely on this.
2540 - */
2541 - usleep_range(1000, 5000);
2542 -
2543 - i2c_hid_dbg(ihid, "resetting...\n");
2544 -
2545 - ret = i2c_hid_command(client, &hid_reset_cmd, NULL, 0);
2546 - if (ret) {
2547 - dev_err(&client->dev, "failed to reset device.\n");
2548 - i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
2549 - }
2550 -
2551 -out_unlock:
2552 - mutex_unlock(&ihid->reset_lock);
2553 - return ret;
2554 -}
2555 -
2556 -static void i2c_hid_get_input(struct i2c_hid *ihid)
2557 -{
2558 - int ret;
2559 - u32 ret_size;
2560 - int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
2561 -
2562 - if (size > ihid->bufsize)
2563 - size = ihid->bufsize;
2564 -
2565 - ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
2566 - if (ret != size) {
2567 - if (ret < 0)
2568 - return;
2569 -
2570 - dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n",
2571 - __func__, ret, size);
2572 - return;
2573 - }
2574 -
2575 - ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8;
2576 -
2577 - if (!ret_size) {
2578 - /* host or device initiated RESET completed */
2579 - if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags))
2580 - wake_up(&ihid->wait);
2581 - return;
2582 - }
2583 -
2584 - if ((ret_size > size) || (ret_size < 2)) {
2585 - dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n",
2586 - __func__, size, ret_size);
2587 - return;
2588 - }
2589 -
2590 - i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);
2591 -
2592 - if (test_bit(I2C_HID_STARTED, &ihid->flags))
2593 - hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2,
2594 - ret_size - 2, 1);
2595 -
2596 - return;
2597 -}
2598 -
2599 -static irqreturn_t i2c_hid_irq(int irq, void *dev_id)
2600 -{
2601 - struct i2c_hid *ihid = dev_id;
2602 -
2603 - if (test_bit(I2C_HID_READ_PENDING, &ihid->flags))
2604 - return IRQ_HANDLED;
2605 -
2606 - i2c_hid_get_input(ihid);
2607 -
2608 - return IRQ_HANDLED;
2609 -}
2610 -
2611 -static int i2c_hid_get_report_length(struct hid_report *report)
2612 -{
2613 - return ((report->size - 1) >> 3) + 1 +
2614 - report->device->report_enum[report->type].numbered + 2;
2615 -}
2616 -
2617 -static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
2618 - size_t bufsize)
2619 -{
2620 - struct hid_device *hid = report->device;
2621 - struct i2c_client *client = hid->driver_data;
2622 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2623 - unsigned int size, ret_size;
2624 -
2625 - size = i2c_hid_get_report_length(report);
2626 - if (i2c_hid_get_report(client,
2627 - report->type == HID_FEATURE_REPORT ? 0x03 : 0x01,
2628 - report->id, buffer, size))
2629 - return;
2630 -
2631 - i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer);
2632 -
2633 - ret_size = buffer[0] | (buffer[1] << 8);
2634 -
2635 - if (ret_size != size) {
2636 - dev_err(&client->dev, "error in %s size:%d / ret_size:%d\n",
2637 - __func__, size, ret_size);
2638 - return;
2639 - }
2640 -
2641 - /* hid->driver_lock is held as we are in probe function,
2642 - * we just need to setup the input fields, so using
2643 - * hid_report_raw_event is safe. */
2644 - hid_report_raw_event(hid, report->type, buffer + 2, size - 2, 1);
2645 -}
2646 -
2647 -/*
2648 - * Initialize all reports
2649 - */
2650 -static void i2c_hid_init_reports(struct hid_device *hid)
2651 -{
2652 - struct hid_report *report;
2653 - struct i2c_client *client = hid->driver_data;
2654 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2655 - u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL);
2656 -
2657 - if (!inbuf) {
2658 - dev_err(&client->dev, "can not retrieve initial reports\n");
2659 - return;
2660 - }
2661 -
2662 - /*
2663 - * The device must be powered on while we fetch initial reports
2664 - * from it.
2665 - */
2666 - pm_runtime_get_sync(&client->dev);
2667 -
2668 - list_for_each_entry(report,
2669 - &hid->report_enum[HID_FEATURE_REPORT].report_list, list)
2670 - i2c_hid_init_report(report, inbuf, ihid->bufsize);
2671 -
2672 - pm_runtime_put(&client->dev);
2673 -
2674 - kfree(inbuf);
2675 -}
2676 -
2677 -/*
2678 - * Traverse the supplied list of reports and find the longest
2679 - */
2680 -static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type,
2681 - unsigned int *max)
2682 -{
2683 - struct hid_report *report;
2684 - unsigned int size;
2685 -
2686 - /* We should not rely on wMaxInputLength, as some devices may set it to
2687 - * a wrong length. */
2688 - list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
2689 - size = i2c_hid_get_report_length(report);
2690 - if (*max < size)
2691 - *max = size;
2692 - }
2693 -}
2694 -
2695 -static void i2c_hid_free_buffers(struct i2c_hid *ihid)
2696 -{
2697 - kfree(ihid->inbuf);
2698 - kfree(ihid->rawbuf);
2699 - kfree(ihid->argsbuf);
2700 - kfree(ihid->cmdbuf);
2701 - ihid->inbuf = NULL;
2702 - ihid->rawbuf = NULL;
2703 - ihid->cmdbuf = NULL;
2704 - ihid->argsbuf = NULL;
2705 - ihid->bufsize = 0;
2706 -}
2707 -
2708 -static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
2709 -{
2710 - /* the worst case is computed from the set_report command with a
2711 - * reportID > 15 and the maximum report length */
2712 - int args_len = sizeof(__u8) + /* ReportID */
2713 - sizeof(__u8) + /* optional ReportID byte */
2714 - sizeof(__u16) + /* data register */
2715 - sizeof(__u16) + /* size of the report */
2716 - report_size; /* report */
2717 -
2718 - ihid->inbuf = kzalloc(report_size, GFP_KERNEL);
2719 - ihid->rawbuf = kzalloc(report_size, GFP_KERNEL);
2720 - ihid->argsbuf = kzalloc(args_len, GFP_KERNEL);
2721 - ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL);
2722 -
2723 - if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) {
2724 - i2c_hid_free_buffers(ihid);
2725 - return -ENOMEM;
2726 - }
2727 -
2728 - ihid->bufsize = report_size;
2729 -
2730 - return 0;
2731 -}
2732 -
2733 -static int i2c_hid_get_raw_report(struct hid_device *hid,
2734 - unsigned char report_number, __u8 *buf, size_t count,
2735 - unsigned char report_type)
2736 -{
2737 - struct i2c_client *client = hid->driver_data;
2738 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2739 - size_t ret_count, ask_count;
2740 - int ret;
2741 -
2742 - if (report_type == HID_OUTPUT_REPORT)
2743 - return -EINVAL;
2744 -
2745 - /* +2 bytes to include the size of the reply in the query buffer */
2746 - ask_count = min(count + 2, (size_t)ihid->bufsize);
2747 -
2748 - ret = i2c_hid_get_report(client,
2749 - report_type == HID_FEATURE_REPORT ? 0x03 : 0x01,
2750 - report_number, ihid->rawbuf, ask_count);
2751 -
2752 - if (ret < 0)
2753 - return ret;
2754 -
2755 - ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8);
2756 -
2757 - if (ret_count <= 2)
2758 - return 0;
2759 -
2760 - ret_count = min(ret_count, ask_count);
2761 -
2762 - /* The query buffer contains the size, dropping it in the reply */
2763 - count = min(count, ret_count - 2);
2764 - memcpy(buf, ihid->rawbuf + 2, count);
2765 -
2766 - return count;
2767 -}
2768 -
2769 -static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
2770 - size_t count, unsigned char report_type, bool use_data)
2771 -{
2772 - struct i2c_client *client = hid->driver_data;
2773 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2774 - int report_id = buf[0];
2775 - int ret;
2776 -
2777 - if (report_type == HID_INPUT_REPORT)
2778 - return -EINVAL;
2779 -
2780 - mutex_lock(&ihid->reset_lock);
2781 -
2782 - if (report_id) {
2783 - buf++;
2784 - count--;
2785 - }
2786 -
2787 - ret = i2c_hid_set_or_send_report(client,
2788 - report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
2789 - report_id, buf, count, use_data);
2790 -
2791 - if (report_id && ret >= 0)
2792 - ret++; /* add report_id to the number of transfered bytes */
2793 -
2794 - mutex_unlock(&ihid->reset_lock);
2795 -
2796 - return ret;
2797 -}
2798 -
2799 -static int i2c_hid_output_report(struct hid_device *hid, __u8 *buf,
2800 - size_t count)
2801 -{
2802 - return i2c_hid_output_raw_report(hid, buf, count, HID_OUTPUT_REPORT,
2803 - false);
2804 -}
2805 -
2806 -static int i2c_hid_raw_request(struct hid_device *hid, unsigned char reportnum,
2807 - __u8 *buf, size_t len, unsigned char rtype,
2808 - int reqtype)
2809 -{
2810 - switch (reqtype) {
2811 - case HID_REQ_GET_REPORT:
2812 - return i2c_hid_get_raw_report(hid, reportnum, buf, len, rtype);
2813 - case HID_REQ_SET_REPORT:
2814 - if (buf[0] != reportnum)
2815 - return -EINVAL;
2816 - return i2c_hid_output_raw_report(hid, buf, len, rtype, true);
2817 - default:
2818 - return -EIO;
2819 - }
2820 -}
2821 -
2822 -static int i2c_hid_parse(struct hid_device *hid)
2823 -{
2824 - struct i2c_client *client = hid->driver_data;
2825 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2826 - struct i2c_hid_desc *hdesc = &ihid->hdesc;
2827 - unsigned int rsize;
2828 - char *rdesc;
2829 - int ret;
2830 - int tries = 3;
2831 -
2832 - i2c_hid_dbg(ihid, "entering %s\n", __func__);
2833 -
2834 - rsize = le16_to_cpu(hdesc->wReportDescLength);
2835 - if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
2836 - dbg_hid("weird size of report descriptor (%u)\n", rsize);
2837 - return -EINVAL;
2838 - }
2839 -
2840 - do {
2841 - ret = i2c_hid_hwreset(client);
2842 - if (ret)
2843 - msleep(1000);
2844 - } while (tries-- > 0 && ret);
2845 -
2846 - if (ret)
2847 - return ret;
2848 -
2849 - rdesc = kzalloc(rsize, GFP_KERNEL);
2850 -
2851 - if (!rdesc) {
2852 - dbg_hid("couldn't allocate rdesc memory\n");
2853 - return -ENOMEM;
2854 - }
2855 -
2856 - i2c_hid_dbg(ihid, "asking HID report descriptor\n");
2857 -
2858 - ret = i2c_hid_command(client, &hid_report_descr_cmd, rdesc, rsize);
2859 - if (ret) {
2860 - hid_err(hid, "reading report descriptor failed\n");
2861 - kfree(rdesc);
2862 - return -EIO;
2863 - }
2864 -
2865 - i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc);
2866 -
2867 - ret = hid_parse_report(hid, rdesc, rsize);
2868 - kfree(rdesc);
2869 - if (ret) {
2870 - dbg_hid("parsing report descriptor failed\n");
2871 - return ret;
2872 - }
2873 -
2874 - return 0;
2875 -}
2876 -
2877 -static int i2c_hid_start(struct hid_device *hid)
2878 -{
2879 - struct i2c_client *client = hid->driver_data;
2880 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2881 - int ret;
2882 - unsigned int bufsize = HID_MIN_BUFFER_SIZE;
2883 -
2884 - i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize);
2885 - i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize);
2886 - i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize);
2887 -
2888 - if (bufsize > ihid->bufsize) {
2889 - i2c_hid_free_buffers(ihid);
2890 -
2891 - ret = i2c_hid_alloc_buffers(ihid, bufsize);
2892 -
2893 - if (ret)
2894 - return ret;
2895 - }
2896 -
2897 - if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
2898 - i2c_hid_init_reports(hid);
2899 -
2900 - return 0;
2901 -}
2902 -
2903 -static void i2c_hid_stop(struct hid_device *hid)
2904 -{
2905 - hid->claimed = 0;
2906 -}
2907 -
2908 -static int i2c_hid_open(struct hid_device *hid)
2909 -{
2910 - struct i2c_client *client = hid->driver_data;
2911 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2912 - int ret = 0;
2913 -
2914 - mutex_lock(&i2c_hid_open_mut);
2915 - if (!hid->open++) {
2916 - ret = pm_runtime_get_sync(&client->dev);
2917 - if (ret < 0) {
2918 - hid->open--;
2919 - goto done;
2920 - }
2921 - set_bit(I2C_HID_STARTED, &ihid->flags);
2922 - }
2923 -done:
2924 - mutex_unlock(&i2c_hid_open_mut);
2925 - return ret < 0 ? ret : 0;
2926 -}
2927 -
2928 -static void i2c_hid_close(struct hid_device *hid)
2929 -{
2930 - struct i2c_client *client = hid->driver_data;
2931 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2932 -
2933 - /* protecting hid->open to make sure we don't restart
2934 - * data acquistion due to a resumption we no longer
2935 - * care about
2936 - */
2937 - mutex_lock(&i2c_hid_open_mut);
2938 - if (!--hid->open) {
2939 - clear_bit(I2C_HID_STARTED, &ihid->flags);
2940 -
2941 - /* Save some power */
2942 - pm_runtime_put(&client->dev);
2943 - }
2944 - mutex_unlock(&i2c_hid_open_mut);
2945 -}
2946 -
2947 -static int i2c_hid_power(struct hid_device *hid, int lvl)
2948 -{
2949 - struct i2c_client *client = hid->driver_data;
2950 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2951 -
2952 - i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl);
2953 -
2954 - switch (lvl) {
2955 - case PM_HINT_FULLON:
2956 - pm_runtime_get_sync(&client->dev);
2957 - break;
2958 - case PM_HINT_NORMAL:
2959 - pm_runtime_put(&client->dev);
2960 - break;
2961 - }
2962 - return 0;
2963 -}
2964 -
2965 -static struct hid_ll_driver i2c_hid_ll_driver = {
2966 - .parse = i2c_hid_parse,
2967 - .start = i2c_hid_start,
2968 - .stop = i2c_hid_stop,
2969 - .open = i2c_hid_open,
2970 - .close = i2c_hid_close,
2971 - .power = i2c_hid_power,
2972 - .output_report = i2c_hid_output_report,
2973 - .raw_request = i2c_hid_raw_request,
2974 -};
2975 -
2976 -static int i2c_hid_init_irq(struct i2c_client *client)
2977 -{
2978 - struct i2c_hid *ihid = i2c_get_clientdata(client);
2979 - int ret;
2980 -
2981 - dev_dbg(&client->dev, "Requesting IRQ: %d\n", ihid->irq);
2982 -
2983 - ret = request_threaded_irq(ihid->irq, NULL, i2c_hid_irq,
2984 - IRQF_TRIGGER_LOW | IRQF_ONESHOT,
2985 - client->name, ihid);
2986 - if (ret < 0) {
2987 - dev_warn(&client->dev,
2988 - "Could not register for %s interrupt, irq = %d,"
2989 - " ret = %d\n",
2990 - client->name, ihid->irq, ret);
2991 -
2992 - return ret;
2993 - }
2994 -
2995 - return 0;
2996 -}
2997 -
2998 -static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
2999 -{
3000 - struct i2c_client *client = ihid->client;
3001 - struct i2c_hid_desc *hdesc = &ihid->hdesc;
3002 - unsigned int dsize;
3003 - int ret;
3004 -
3005 - /* i2c hid fetch using a fixed descriptor size (30 bytes) */
3006 - i2c_hid_dbg(ihid, "Fetching the HID descriptor\n");
3007 - ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer,
3008 - sizeof(struct i2c_hid_desc));
3009 - if (ret) {
3010 - dev_err(&client->dev, "hid_descr_cmd failed\n");
3011 - return -ENODEV;
3012 - }
3013 -
3014 - /* Validate the length of HID descriptor, the 4 first bytes:
3015 - * bytes 0-1 -> length
3016 - * bytes 2-3 -> bcdVersion (has to be 1.00) */
3017 - /* check bcdVersion == 1.0 */
3018 - if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) {
3019 - dev_err(&client->dev,
3020 - "unexpected HID descriptor bcdVersion (0x%04hx)\n",
3021 - le16_to_cpu(hdesc->bcdVersion));
3022 - return -ENODEV;
3023 - }
3024 -
3025 - /* Descriptor length should be 30 bytes as per the specification */
3026 - dsize = le16_to_cpu(hdesc->wHIDDescLength);
3027 - if (dsize != sizeof(struct i2c_hid_desc)) {
3028 - dev_err(&client->dev, "weird size of HID descriptor (%u)\n",
3029 - dsize);
3030 - return -ENODEV;
3031 - }
3032 - i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer);
3033 - return 0;
3034 -}
3035 -
3036 -#ifdef CONFIG_ACPI
3037 -
3038 -/* Default GPIO mapping */
3039 -static const struct acpi_gpio_params i2c_hid_irq_gpio = { 0, 0, true };
3040 -static const struct acpi_gpio_mapping i2c_hid_acpi_gpios[] = {
3041 - { "gpios", &i2c_hid_irq_gpio, 1 },
3042 - { },
3043 -};
3044 -
3045 -static int i2c_hid_acpi_pdata(struct i2c_client *client,
3046 - struct i2c_hid_platform_data *pdata)
3047 -{
3048 - static u8 i2c_hid_guid[] = {
3049 - 0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
3050 - 0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
3051 - };
3052 - union acpi_object *obj;
3053 - struct acpi_device *adev;
3054 - acpi_handle handle;
3055 - int ret;
3056 -
3057 - handle = ACPI_HANDLE(&client->dev);
3058 - if (!handle || acpi_bus_get_device(handle, &adev))
3059 - return -ENODEV;
3060 -
3061 - obj = acpi_evaluate_dsm_typed(handle, i2c_hid_guid, 1, 1, NULL,
3062 - ACPI_TYPE_INTEGER);
3063 - if (!obj) {
3064 - dev_err(&client->dev, "device _DSM execution failed\n");
3065 - return -ENODEV;
3066 - }
3067 -
3068 - pdata->hid_descriptor_address = obj->integer.value;
3069 - ACPI_FREE(obj);
3070 -
3071 - /* GPIOs are optional */
3072 - ret = acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
3073 - return ret < 0 && ret != -ENXIO ? ret : 0;
3074 -}
3075 -
3076 -static void i2c_hid_acpi_fix_up_power(struct device *dev)
3077 -{
3078 - acpi_handle handle = ACPI_HANDLE(dev);
3079 - struct acpi_device *adev;
3080 -
3081 - if (handle && acpi_bus_get_device(handle, &adev) == 0)
3082 - acpi_device_fix_up_power(adev);
3083 -}
3084 -
3085 -static const struct acpi_device_id i2c_hid_acpi_match[] = {
3086 - {"ACPI0C50", 0 },
3087 - {"PNP0C50", 0 },
3088 - { },
3089 -};
3090 -MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match);
3091 -#else
3092 -static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
3093 - struct i2c_hid_platform_data *pdata)
3094 -{
3095 - return -ENODEV;
3096 -}
3097 -
3098 -static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {}
3099 -#endif
3100 -
3101 -#ifdef CONFIG_OF
3102 -static int i2c_hid_of_probe(struct i2c_client *client,
3103 - struct i2c_hid_platform_data *pdata)
3104 -{
3105 - struct device *dev = &client->dev;
3106 - u32 val;
3107 - int ret;
3108 -
3109 - ret = of_property_read_u32(dev->of_node, "hid-descr-addr", &val);
3110 - if (ret) {
3111 - dev_err(&client->dev, "HID register address not provided\n");
3112 - return -ENODEV;
3113 - }
3114 - if (val >> 16) {
3115 - dev_err(&client->dev, "Bad HID register address: 0x%08x\n",
3116 - val);
3117 - return -EINVAL;
3118 - }
3119 - pdata->hid_descriptor_address = val;
3120 -
3121 - return 0;
3122 -}
3123 -
3124 -static const struct of_device_id i2c_hid_of_match[] = {
3125 - { .compatible = "hid-over-i2c" },
3126 - {},
3127 -};
3128 -MODULE_DEVICE_TABLE(of, i2c_hid_of_match);
3129 -#else
3130 -static inline int i2c_hid_of_probe(struct i2c_client *client,
3131 - struct i2c_hid_platform_data *pdata)
3132 -{
3133 - return -ENODEV;
3134 -}
3135 -#endif
3136 -
3137 -static int i2c_hid_probe(struct i2c_client *client,
3138 - const struct i2c_device_id *dev_id)
3139 -{
3140 - int ret;
3141 - struct i2c_hid *ihid;
3142 - struct hid_device *hid;
3143 - __u16 hidRegister;
3144 - struct i2c_hid_platform_data *platform_data = client->dev.platform_data;
3145 -
3146 - dbg_hid("HID probe called for i2c 0x%02x\n", client->addr);
3147 -
3148 - ihid = kzalloc(sizeof(struct i2c_hid), GFP_KERNEL);
3149 - if (!ihid)
3150 - return -ENOMEM;
3151 -
3152 - if (client->dev.of_node) {
3153 - ret = i2c_hid_of_probe(client, &ihid->pdata);
3154 - if (ret)
3155 - goto err;
3156 - } else if (!platform_data) {
3157 - ret = i2c_hid_acpi_pdata(client, &ihid->pdata);
3158 - if (ret) {
3159 - dev_err(&client->dev,
3160 - "HID register address not provided\n");
3161 - goto err;
3162 - }
3163 - } else {
3164 - ihid->pdata = *platform_data;
3165 - }
3166 -
3167 - if (client->irq > 0) {
3168 - ihid->irq = client->irq;
3169 - } else if (ACPI_COMPANION(&client->dev)) {
3170 - ihid->desc = gpiod_get(&client->dev, NULL, GPIOD_IN);
3171 - if (IS_ERR(ihid->desc)) {
3172 - dev_err(&client->dev, "Failed to get GPIO interrupt\n");
3173 - return PTR_ERR(ihid->desc);
3174 - }
3175 -
3176 - ihid->irq = gpiod_to_irq(ihid->desc);
3177 - if (ihid->irq < 0) {
3178 - gpiod_put(ihid->desc);
3179 - dev_err(&client->dev, "Failed to convert GPIO to IRQ\n");
3180 - return ihid->irq;
3181 - }
3182 - }
3183 -
3184 - i2c_set_clientdata(client, ihid);
3185 -
3186 - ihid->client = client;
3187 -
3188 - hidRegister = ihid->pdata.hid_descriptor_address;
3189 - ihid->wHIDDescRegister = cpu_to_le16(hidRegister);
3190 -
3191 - init_waitqueue_head(&ihid->wait);
3192 - mutex_init(&ihid->reset_lock);
3193 -
3194 - /* we need to allocate the command buffer without knowing the maximum
3195 - * size of the reports. Let's use HID_MIN_BUFFER_SIZE, then we do the
3196 - * real computation later. */
3197 - ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE);
3198 - if (ret < 0)
3199 - goto err;
3200 -
3201 - i2c_hid_acpi_fix_up_power(&client->dev);
3202 -
3203 - pm_runtime_get_noresume(&client->dev);
3204 - pm_runtime_set_active(&client->dev);
3205 - pm_runtime_enable(&client->dev);
3206 - device_enable_async_suspend(&client->dev);
3207 -
3208 - /* Make sure there is something at this address */
3209 - ret = i2c_smbus_read_byte(client);
3210 - if (ret < 0) {
3211 - dev_dbg(&client->dev, "nothing at this address: %d\n", ret);
3212 - ret = -ENXIO;
3213 - goto err_pm;
3214 - }
3215 -
3216 - ret = i2c_hid_fetch_hid_descriptor(ihid);
3217 - if (ret < 0)
3218 - goto err_pm;
3219 -
3220 - ret = i2c_hid_init_irq(client);
3221 - if (ret < 0)
3222 - goto err_pm;
3223 -
3224 - hid = hid_allocate_device();
3225 - if (IS_ERR(hid)) {
3226 - ret = PTR_ERR(hid);
3227 - goto err_irq;
3228 - }
3229 -
3230 - ihid->hid = hid;
3231 -
3232 - hid->driver_data = client;
3233 - hid->ll_driver = &i2c_hid_ll_driver;
3234 - hid->dev.parent = &client->dev;
3235 - hid->bus = BUS_I2C;
3236 - hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
3237 - hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
3238 - hid->product = le16_to_cpu(ihid->hdesc.wProductID);
3239 -
3240 - snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
3241 - client->name, hid->vendor, hid->product);
3242 - strlcpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys));
3243 -
3244 - ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product);
3245 -
3246 - ret = hid_add_device(hid);
3247 - if (ret) {
3248 - if (ret != -ENODEV)
3249 - hid_err(client, "can't add hid device: %d\n", ret);
3250 - goto err_mem_free;
3251 - }
3252 -
3253 - pm_runtime_put(&client->dev);
3254 - return 0;
3255 -
3256 -err_mem_free:
3257 - hid_destroy_device(hid);
3258 -
3259 -err_irq:
3260 - free_irq(ihid->irq, ihid);
3261 -
3262 -err_pm:
3263 - pm_runtime_put_noidle(&client->dev);
3264 - pm_runtime_disable(&client->dev);
3265 -
3266 -err:
3267 - if (ihid->desc)
3268 - gpiod_put(ihid->desc);
3269 -
3270 - i2c_hid_free_buffers(ihid);
3271 - kfree(ihid);
3272 - return ret;
3273 -}
3274 -
3275 -static int i2c_hid_remove(struct i2c_client *client)
3276 -{
3277 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3278 - struct hid_device *hid;
3279 -
3280 - pm_runtime_get_sync(&client->dev);
3281 - pm_runtime_disable(&client->dev);
3282 - pm_runtime_set_suspended(&client->dev);
3283 - pm_runtime_put_noidle(&client->dev);
3284 -
3285 - hid = ihid->hid;
3286 - hid_destroy_device(hid);
3287 -
3288 - free_irq(ihid->irq, ihid);
3289 -
3290 - if (ihid->bufsize)
3291 - i2c_hid_free_buffers(ihid);
3292 -
3293 - if (ihid->desc)
3294 - gpiod_put(ihid->desc);
3295 -
3296 - kfree(ihid);
3297 -
3298 - acpi_dev_remove_driver_gpios(ACPI_COMPANION(&client->dev));
3299 -
3300 - return 0;
3301 -}
3302 -
3303 -static void i2c_hid_shutdown(struct i2c_client *client)
3304 -{
3305 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3306 -
3307 - i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
3308 - free_irq(client->irq, ihid);
3309 -}
3310 -
3311 -#ifdef CONFIG_PM_SLEEP
3312 -static int i2c_hid_suspend(struct device *dev)
3313 -{
3314 - struct i2c_client *client = to_i2c_client(dev);
3315 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3316 - struct hid_device *hid = ihid->hid;
3317 - int ret;
3318 - int wake_status;
3319 -
3320 - if (hid->driver && hid->driver->suspend) {
3321 - /*
3322 - * Wake up the device so that IO issues in
3323 - * HID driver's suspend code can succeed.
3324 - */
3325 - ret = pm_runtime_resume(dev);
3326 - if (ret < 0)
3327 - return ret;
3328 -
3329 - ret = hid->driver->suspend(hid, PMSG_SUSPEND);
3330 - if (ret < 0)
3331 - return ret;
3332 - }
3333 -
3334 - if (!pm_runtime_suspended(dev)) {
3335 - /* Save some power */
3336 - i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
3337 -
3338 - disable_irq(ihid->irq);
3339 - }
3340 -
3341 - if (device_may_wakeup(&client->dev)) {
3342 - wake_status = enable_irq_wake(ihid->irq);
3343 - if (!wake_status)
3344 - ihid->irq_wake_enabled = true;
3345 - else
3346 - hid_warn(hid, "Failed to enable irq wake: %d\n",
3347 - wake_status);
3348 - }
3349 -
3350 - return 0;
3351 -}
3352 -
3353 -static int i2c_hid_resume(struct device *dev)
3354 -{
3355 - int ret;
3356 - struct i2c_client *client = to_i2c_client(dev);
3357 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3358 - struct hid_device *hid = ihid->hid;
3359 - int wake_status;
3360 -
3361 - if (device_may_wakeup(&client->dev) && ihid->irq_wake_enabled) {
3362 - wake_status = disable_irq_wake(ihid->irq);
3363 - if (!wake_status)
3364 - ihid->irq_wake_enabled = false;
3365 - else
3366 - hid_warn(hid, "Failed to disable irq wake: %d\n",
3367 - wake_status);
3368 - }
3369 -
3370 - /* We'll resume to full power */
3371 - pm_runtime_disable(dev);
3372 - pm_runtime_set_active(dev);
3373 - pm_runtime_enable(dev);
3374 -
3375 - enable_irq(ihid->irq);
3376 - ret = i2c_hid_hwreset(client);
3377 - if (ret)
3378 - return ret;
3379 -
3380 - if (hid->driver && hid->driver->reset_resume) {
3381 - ret = hid->driver->reset_resume(hid);
3382 - return ret;
3383 - }
3384 -
3385 - return 0;
3386 -}
3387 -#endif
3388 -
3389 -#ifdef CONFIG_PM
3390 -static int i2c_hid_runtime_suspend(struct device *dev)
3391 -{
3392 - struct i2c_client *client = to_i2c_client(dev);
3393 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3394 -
3395 - i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
3396 - disable_irq(ihid->irq);
3397 - return 0;
3398 -}
3399 -
3400 -static int i2c_hid_runtime_resume(struct device *dev)
3401 -{
3402 - struct i2c_client *client = to_i2c_client(dev);
3403 - struct i2c_hid *ihid = i2c_get_clientdata(client);
3404 -
3405 - enable_irq(ihid->irq);
3406 - i2c_hid_set_power(client, I2C_HID_PWR_ON);
3407 - return 0;
3408 -}
3409 -#endif
3410 -
3411 -static const struct dev_pm_ops i2c_hid_pm = {
3412 - SET_SYSTEM_SLEEP_PM_OPS(i2c_hid_suspend, i2c_hid_resume)
3413 - SET_RUNTIME_PM_OPS(i2c_hid_runtime_suspend, i2c_hid_runtime_resume,
3414 - NULL)
3415 -};
3416 -
3417 -static const struct i2c_device_id i2c_hid_id_table[] = {
3418 - { "hid", 0 },
3419 - { "hid-over-i2c", 0 },
3420 - { },
3421 -};
3422 -MODULE_DEVICE_TABLE(i2c, i2c_hid_id_table);
3423 -
3424 -
3425 -static struct i2c_driver i2c_hid_driver = {
3426 - .driver = {
3427 - .name = "i2c_hid",
3428 - .pm = &i2c_hid_pm,
3429 - .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match),
3430 - .of_match_table = of_match_ptr(i2c_hid_of_match),
3431 - },
3432 -
3433 - .probe = i2c_hid_probe,
3434 - .remove = i2c_hid_remove,
3435 - .shutdown = i2c_hid_shutdown,
3436 - .id_table = i2c_hid_id_table,
3437 -};
3438 -
3439 -module_i2c_driver(i2c_hid_driver);
3440 -
3441 -MODULE_DESCRIPTION("HID over I2C core driver");
3442 -MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
3443 -MODULE_LICENSE("GPL");
3444 diff --git a/drivers/hid/i2c-hid/i2c-hid.h b/drivers/hid/i2c-hid/i2c-hid.h
3445 new file mode 100644
3446 index 000000000000..a8c19aef5824
3447 --- /dev/null
3448 +++ b/drivers/hid/i2c-hid/i2c-hid.h
3449 @@ -0,0 +1,20 @@
3450 +/* SPDX-License-Identifier: GPL-2.0+ */
3451 +
3452 +#ifndef I2C_HID_H
3453 +#define I2C_HID_H
3454 +
3455 +
3456 +#ifdef CONFIG_DMI
3457 +struct i2c_hid_desc *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name);
3458 +char *i2c_hid_get_dmi_hid_report_desc_override(uint8_t *i2c_name,
3459 + unsigned int *size);
3460 +#else
3461 +static inline struct i2c_hid_desc
3462 + *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name)
3463 +{ return NULL; }
3464 +static inline char *i2c_hid_get_dmi_hid_report_desc_override(uint8_t *i2c_name,
3465 + unsigned int *size)
3466 +{ return NULL; }
3467 +#endif
3468 +
3469 +#endif
3470 diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c
3471 index 5e9939045852..ec138845a474 100644
3472 --- a/drivers/infiniband/hw/mlx4/alias_GUID.c
3473 +++ b/drivers/infiniband/hw/mlx4/alias_GUID.c
3474 @@ -805,8 +805,8 @@ void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev)
3475 unsigned long flags;
3476
3477 for (i = 0 ; i < dev->num_ports; i++) {
3478 - cancel_delayed_work(&dev->sriov.alias_guid.ports_guid[i].alias_guid_work);
3479 det = &sriov->alias_guid.ports_guid[i];
3480 + cancel_delayed_work_sync(&det->alias_guid_work);
3481 spin_lock_irqsave(&sriov->alias_guid.ag_work_lock, flags);
3482 while (!list_empty(&det->cb_list)) {
3483 cb_ctx = list_entry(det->cb_list.next,
3484 diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
3485 index 63110fbbb410..d51734e0c350 100644
3486 --- a/drivers/iommu/dmar.c
3487 +++ b/drivers/iommu/dmar.c
3488 @@ -143,7 +143,7 @@ dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event)
3489 for (tmp = dev; tmp; tmp = tmp->bus->self)
3490 level++;
3491
3492 - size = sizeof(*info) + level * sizeof(struct acpi_dmar_pci_path);
3493 + size = sizeof(*info) + level * sizeof(info->path[0]);
3494 if (size <= sizeof(dmar_pci_notify_info_buf)) {
3495 info = (struct dmar_pci_notify_info *)dmar_pci_notify_info_buf;
3496 } else {
3497 diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
3498 index 86e349614e21..28feb1744710 100644
3499 --- a/drivers/iommu/intel-iommu.c
3500 +++ b/drivers/iommu/intel-iommu.c
3501 @@ -1636,6 +1636,9 @@ static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu)
3502 u32 pmen;
3503 unsigned long flags;
3504
3505 + if (!cap_plmr(iommu->cap) && !cap_phmr(iommu->cap))
3506 + return;
3507 +
3508 raw_spin_lock_irqsave(&iommu->register_lock, flags);
3509 pmen = readl(iommu->reg + DMAR_PMEN_REG);
3510 pmen &= ~DMA_PMEN_EPM;
3511 diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
3512 index 05d87f60d929..406bfe618448 100644
3513 --- a/drivers/irqchip/irq-mbigen.c
3514 +++ b/drivers/irqchip/irq-mbigen.c
3515 @@ -160,6 +160,9 @@ static void mbigen_write_msg(struct msi_desc *desc, struct msi_msg *msg)
3516 void __iomem *base = d->chip_data;
3517 u32 val;
3518
3519 + if (!msg->address_lo && !msg->address_hi)
3520 + return;
3521 +
3522 base += get_mbigen_vec_reg(d->hwirq);
3523 val = readl_relaxed(base);
3524
3525 diff --git a/drivers/misc/lkdtm.h b/drivers/misc/lkdtm.h
3526 index fdf954c2107f..6abc97b245e4 100644
3527 --- a/drivers/misc/lkdtm.h
3528 +++ b/drivers/misc/lkdtm.h
3529 @@ -40,7 +40,9 @@ void lkdtm_EXEC_KMALLOC(void);
3530 void lkdtm_EXEC_VMALLOC(void);
3531 void lkdtm_EXEC_RODATA(void);
3532 void lkdtm_EXEC_USERSPACE(void);
3533 +void lkdtm_EXEC_NULL(void);
3534 void lkdtm_ACCESS_USERSPACE(void);
3535 +void lkdtm_ACCESS_NULL(void);
3536
3537 /* lkdtm_rodata.c */
3538 void lkdtm_rodata_do_nothing(void);
3539 diff --git a/drivers/misc/lkdtm_core.c b/drivers/misc/lkdtm_core.c
3540 index b2989f2d3126..035e51bea450 100644
3541 --- a/drivers/misc/lkdtm_core.c
3542 +++ b/drivers/misc/lkdtm_core.c
3543 @@ -214,7 +214,9 @@ struct crashtype crashtypes[] = {
3544 CRASHTYPE(EXEC_VMALLOC),
3545 CRASHTYPE(EXEC_RODATA),
3546 CRASHTYPE(EXEC_USERSPACE),
3547 + CRASHTYPE(EXEC_NULL),
3548 CRASHTYPE(ACCESS_USERSPACE),
3549 + CRASHTYPE(ACCESS_NULL),
3550 CRASHTYPE(WRITE_RO),
3551 CRASHTYPE(WRITE_RO_AFTER_INIT),
3552 CRASHTYPE(WRITE_KERN),
3553 diff --git a/drivers/misc/lkdtm_perms.c b/drivers/misc/lkdtm_perms.c
3554 index 45f1c0f96612..1a9dcdaa95f0 100644
3555 --- a/drivers/misc/lkdtm_perms.c
3556 +++ b/drivers/misc/lkdtm_perms.c
3557 @@ -160,6 +160,11 @@ void lkdtm_EXEC_USERSPACE(void)
3558 vm_munmap(user_addr, PAGE_SIZE);
3559 }
3560
3561 +void lkdtm_EXEC_NULL(void)
3562 +{
3563 + execute_location(NULL, CODE_AS_IS);
3564 +}
3565 +
3566 void lkdtm_ACCESS_USERSPACE(void)
3567 {
3568 unsigned long user_addr, tmp = 0;
3569 @@ -191,6 +196,19 @@ void lkdtm_ACCESS_USERSPACE(void)
3570 vm_munmap(user_addr, PAGE_SIZE);
3571 }
3572
3573 +void lkdtm_ACCESS_NULL(void)
3574 +{
3575 + unsigned long tmp;
3576 + unsigned long *ptr = (unsigned long *)NULL;
3577 +
3578 + pr_info("attempting bad read at %px\n", ptr);
3579 + tmp = *ptr;
3580 + tmp += 0xc0dec0de;
3581 +
3582 + pr_info("attempting bad write at %px\n", ptr);
3583 + *ptr = tmp;
3584 +}
3585 +
3586 void __init lkdtm_perms_init(void)
3587 {
3588 /* Make sure we can write to __ro_after_init values during __init */
3589 diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
3590 index 8fa478c3b0db..619457b90dc7 100644
3591 --- a/drivers/mmc/host/davinci_mmc.c
3592 +++ b/drivers/mmc/host/davinci_mmc.c
3593 @@ -1120,7 +1120,7 @@ static inline void mmc_davinci_cpufreq_deregister(struct mmc_davinci_host *host)
3594 {
3595 }
3596 #endif
3597 -static void __init init_mmcsd_host(struct mmc_davinci_host *host)
3598 +static void init_mmcsd_host(struct mmc_davinci_host *host)
3599 {
3600
3601 mmc_davinci_reset_ctrl(host, 1);
3602 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
3603 index fc437d75ac76..b46b56ad7517 100644
3604 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
3605 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
3606 @@ -1747,11 +1747,6 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
3607 if (ret < 0)
3608 pr_warn("%s: failed debugFS registration\n", __func__);
3609 #endif
3610 - /* Start the ball rolling... */
3611 - pr_debug("%s: DMA RX/TX processes started...\n", dev->name);
3612 - priv->hw->dma->start_tx(priv->ioaddr);
3613 - priv->hw->dma->start_rx(priv->ioaddr);
3614 -
3615 /* Dump DMA/MAC registers */
3616 if (netif_msg_hw(priv)) {
3617 priv->hw->mac->dump_regs(priv->hw);
3618 @@ -1779,6 +1774,11 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
3619 if (priv->tso)
3620 priv->hw->dma->enable_tso(priv->ioaddr, 1, STMMAC_CHAN0);
3621
3622 + /* Start the ball rolling... */
3623 + pr_debug("%s: DMA RX/TX processes started...\n", dev->name);
3624 + priv->hw->dma->start_tx(priv->ioaddr);
3625 + priv->hw->dma->start_rx(priv->ioaddr);
3626 +
3627 return 0;
3628 }
3629
3630 diff --git a/drivers/net/wireless/rsi/rsi_common.h b/drivers/net/wireless/rsi/rsi_common.h
3631 index d3fbe33d2324..a13f08fd8690 100644
3632 --- a/drivers/net/wireless/rsi/rsi_common.h
3633 +++ b/drivers/net/wireless/rsi/rsi_common.h
3634 @@ -75,7 +75,6 @@ static inline int rsi_kill_thread(struct rsi_thread *handle)
3635 atomic_inc(&handle->thread_done);
3636 rsi_set_event(&handle->event);
3637
3638 - wait_for_completion(&handle->completion);
3639 return kthread_stop(handle->task);
3640 }
3641
3642 diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
3643 index 9685f9b8be07..a12710c917a1 100644
3644 --- a/drivers/soc/tegra/pmc.c
3645 +++ b/drivers/soc/tegra/pmc.c
3646 @@ -512,16 +512,10 @@ EXPORT_SYMBOL(tegra_powergate_power_off);
3647 */
3648 int tegra_powergate_is_powered(unsigned int id)
3649 {
3650 - int status;
3651 -
3652 if (!tegra_powergate_is_valid(id))
3653 return -EINVAL;
3654
3655 - mutex_lock(&pmc->powergates_lock);
3656 - status = tegra_powergate_state(id);
3657 - mutex_unlock(&pmc->powergates_lock);
3658 -
3659 - return status;
3660 + return tegra_powergate_state(id);
3661 }
3662
3663 /**
3664 diff --git a/drivers/thermal/int340x_thermal/int3400_thermal.c b/drivers/thermal/int340x_thermal/int3400_thermal.c
3665 index 5836e5554433..d4c374cc4f74 100644
3666 --- a/drivers/thermal/int340x_thermal/int3400_thermal.c
3667 +++ b/drivers/thermal/int340x_thermal/int3400_thermal.c
3668 @@ -20,6 +20,13 @@ enum int3400_thermal_uuid {
3669 INT3400_THERMAL_PASSIVE_1,
3670 INT3400_THERMAL_ACTIVE,
3671 INT3400_THERMAL_CRITICAL,
3672 + INT3400_THERMAL_ADAPTIVE_PERFORMANCE,
3673 + INT3400_THERMAL_EMERGENCY_CALL_MODE,
3674 + INT3400_THERMAL_PASSIVE_2,
3675 + INT3400_THERMAL_POWER_BOSS,
3676 + INT3400_THERMAL_VIRTUAL_SENSOR,
3677 + INT3400_THERMAL_COOLING_MODE,
3678 + INT3400_THERMAL_HARDWARE_DUTY_CYCLING,
3679 INT3400_THERMAL_MAXIMUM_UUID,
3680 };
3681
3682 @@ -27,6 +34,13 @@ static u8 *int3400_thermal_uuids[INT3400_THERMAL_MAXIMUM_UUID] = {
3683 "42A441D6-AE6A-462b-A84B-4A8CE79027D3",
3684 "3A95C389-E4B8-4629-A526-C52C88626BAE",
3685 "97C68AE7-15FA-499c-B8C9-5DA81D606E0A",
3686 + "63BE270F-1C11-48FD-A6F7-3AF253FF3E2D",
3687 + "5349962F-71E6-431D-9AE8-0A635B710AEE",
3688 + "9E04115A-AE87-4D1C-9500-0F3E340BFE75",
3689 + "F5A35014-C209-46A4-993A-EB56DE7530A1",
3690 + "6ED722A7-9240-48A5-B479-31EEF723D7CF",
3691 + "16CAF1B7-DD38-40ED-B1C1-1B8A1913D531",
3692 + "BE84BABF-C4D4-403D-B495-3128FD44dAC1",
3693 };
3694
3695 struct int3400_thermal_priv {
3696 @@ -271,10 +285,9 @@ static int int3400_thermal_probe(struct platform_device *pdev)
3697
3698 platform_set_drvdata(pdev, priv);
3699
3700 - if (priv->uuid_bitmap & 1 << INT3400_THERMAL_PASSIVE_1) {
3701 - int3400_thermal_ops.get_mode = int3400_thermal_get_mode;
3702 - int3400_thermal_ops.set_mode = int3400_thermal_set_mode;
3703 - }
3704 + int3400_thermal_ops.get_mode = int3400_thermal_get_mode;
3705 + int3400_thermal_ops.set_mode = int3400_thermal_set_mode;
3706 +
3707 priv->thermal = thermal_zone_device_register("INT3400 Thermal", 0, 0,
3708 priv, &int3400_thermal_ops,
3709 &int3400_thermal_params, 0, 0);
3710 diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
3711 index ffb474c49f0f..eb61a07fcbbc 100644
3712 --- a/drivers/tty/serial/xilinx_uartps.c
3713 +++ b/drivers/tty/serial/xilinx_uartps.c
3714 @@ -1261,7 +1261,7 @@ static void cdns_uart_console_write(struct console *co, const char *s,
3715 *
3716 * Return: 0 on success, negative errno otherwise.
3717 */
3718 -static int __init cdns_uart_console_setup(struct console *co, char *options)
3719 +static int cdns_uart_console_setup(struct console *co, char *options)
3720 {
3721 struct uart_port *port = &cdns_uart_port[co->index];
3722 int baud = 9600;
3723 diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
3724 index 072e7599583a..a8ff43068619 100644
3725 --- a/fs/9p/v9fs.c
3726 +++ b/fs/9p/v9fs.c
3727 @@ -59,6 +59,8 @@ enum {
3728 Opt_cache_loose, Opt_fscache, Opt_mmap,
3729 /* Access options */
3730 Opt_access, Opt_posixacl,
3731 + /* Lock timeout option */
3732 + Opt_locktimeout,
3733 /* Error token */
3734 Opt_err
3735 };
3736 @@ -78,6 +80,7 @@ static const match_table_t tokens = {
3737 {Opt_cachetag, "cachetag=%s"},
3738 {Opt_access, "access=%s"},
3739 {Opt_posixacl, "posixacl"},
3740 + {Opt_locktimeout, "locktimeout=%u"},
3741 {Opt_err, NULL}
3742 };
3743
3744 @@ -126,6 +129,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
3745 #ifdef CONFIG_9P_FSCACHE
3746 v9ses->cachetag = NULL;
3747 #endif
3748 + v9ses->session_lock_timeout = P9_LOCK_TIMEOUT;
3749
3750 if (!opts)
3751 return 0;
3752 @@ -298,6 +302,23 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
3753 #endif
3754 break;
3755
3756 + case Opt_locktimeout:
3757 + r = match_int(&args[0], &option);
3758 + if (r < 0) {
3759 + p9_debug(P9_DEBUG_ERROR,
3760 + "integer field, but no integer?\n");
3761 + ret = r;
3762 + continue;
3763 + }
3764 + if (option < 1) {
3765 + p9_debug(P9_DEBUG_ERROR,
3766 + "locktimeout must be a greater than zero integer.\n");
3767 + ret = -EINVAL;
3768 + continue;
3769 + }
3770 + v9ses->session_lock_timeout = (long)option * HZ;
3771 + break;
3772 +
3773 default:
3774 continue;
3775 }
3776 diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h
3777 index 443d12e02043..ce6ca9f4f683 100644
3778 --- a/fs/9p/v9fs.h
3779 +++ b/fs/9p/v9fs.h
3780 @@ -116,6 +116,7 @@ struct v9fs_session_info {
3781 struct list_head slist; /* list of sessions registered with v9fs */
3782 struct backing_dev_info bdi;
3783 struct rw_semaphore rename_sem;
3784 + long session_lock_timeout; /* retry interval for blocking locks */
3785 };
3786
3787 /* cache_validity flags */
3788 diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c
3789 index 48db9a9f13f9..cb6c4031af55 100644
3790 --- a/fs/9p/vfs_dir.c
3791 +++ b/fs/9p/vfs_dir.c
3792 @@ -105,7 +105,6 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
3793 int err = 0;
3794 struct p9_fid *fid;
3795 int buflen;
3796 - int reclen = 0;
3797 struct p9_rdir *rdir;
3798 struct kvec kvec;
3799
3800 @@ -138,11 +137,10 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
3801 while (rdir->head < rdir->tail) {
3802 err = p9stat_read(fid->clnt, rdir->buf + rdir->head,
3803 rdir->tail - rdir->head, &st);
3804 - if (err) {
3805 + if (err <= 0) {
3806 p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
3807 return -EIO;
3808 }
3809 - reclen = st.size+2;
3810
3811 over = !dir_emit(ctx, st.name, strlen(st.name),
3812 v9fs_qid2ino(&st.qid), dt_type(&st));
3813 @@ -150,8 +148,8 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
3814 if (over)
3815 return 0;
3816
3817 - rdir->head += reclen;
3818 - ctx->pos += reclen;
3819 + rdir->head += err;
3820 + ctx->pos += err;
3821 }
3822 }
3823 }
3824 diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
3825 index 2f035b15180e..79ff727254bb 100644
3826 --- a/fs/9p/vfs_file.c
3827 +++ b/fs/9p/vfs_file.c
3828 @@ -154,6 +154,7 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
3829 uint8_t status = P9_LOCK_ERROR;
3830 int res = 0;
3831 unsigned char fl_type;
3832 + struct v9fs_session_info *v9ses;
3833
3834 fid = filp->private_data;
3835 BUG_ON(fid == NULL);
3836 @@ -189,6 +190,8 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
3837 if (IS_SETLKW(cmd))
3838 flock.flags = P9_LOCK_FLAGS_BLOCK;
3839
3840 + v9ses = v9fs_inode2v9ses(file_inode(filp));
3841 +
3842 /*
3843 * if its a blocked request and we get P9_LOCK_BLOCKED as the status
3844 * for lock request, keep on trying
3845 @@ -202,7 +205,8 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
3846 break;
3847 if (status == P9_LOCK_BLOCKED && !IS_SETLKW(cmd))
3848 break;
3849 - if (schedule_timeout_interruptible(P9_LOCK_TIMEOUT) != 0)
3850 + if (schedule_timeout_interruptible(v9ses->session_lock_timeout)
3851 + != 0)
3852 break;
3853 /*
3854 * p9_client_lock_dotl overwrites flock.client_id with the
3855 diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
3856 index 57c938ffeb6e..a8a2fc9ae056 100644
3857 --- a/fs/cifs/inode.c
3858 +++ b/fs/cifs/inode.c
3859 @@ -771,43 +771,50 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
3860 } else if ((rc == -EACCES) && backup_cred(cifs_sb) &&
3861 (strcmp(server->vals->version_string, SMB1_VERSION_STRING)
3862 == 0)) {
3863 - /*
3864 - * For SMB2 and later the backup intent flag is already
3865 - * sent if needed on open and there is no path based
3866 - * FindFirst operation to use to retry with
3867 - */
3868 + /*
3869 + * For SMB2 and later the backup intent flag is already
3870 + * sent if needed on open and there is no path based
3871 + * FindFirst operation to use to retry with
3872 + */
3873
3874 - srchinf = kzalloc(sizeof(struct cifs_search_info),
3875 - GFP_KERNEL);
3876 - if (srchinf == NULL) {
3877 - rc = -ENOMEM;
3878 - goto cgii_exit;
3879 - }
3880 + srchinf = kzalloc(sizeof(struct cifs_search_info),
3881 + GFP_KERNEL);
3882 + if (srchinf == NULL) {
3883 + rc = -ENOMEM;
3884 + goto cgii_exit;
3885 + }
3886
3887 - srchinf->endOfSearch = false;
3888 + srchinf->endOfSearch = false;
3889 + if (tcon->unix_ext)
3890 + srchinf->info_level = SMB_FIND_FILE_UNIX;
3891 + else if ((tcon->ses->capabilities &
3892 + tcon->ses->server->vals->cap_nt_find) == 0)
3893 + srchinf->info_level = SMB_FIND_FILE_INFO_STANDARD;
3894 + else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
3895 srchinf->info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
3896 + else /* no srvino useful for fallback to some netapp */
3897 + srchinf->info_level = SMB_FIND_FILE_DIRECTORY_INFO;
3898
3899 - srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
3900 - CIFS_SEARCH_CLOSE_AT_END |
3901 - CIFS_SEARCH_BACKUP_SEARCH;
3902 + srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
3903 + CIFS_SEARCH_CLOSE_AT_END |
3904 + CIFS_SEARCH_BACKUP_SEARCH;
3905
3906 - rc = CIFSFindFirst(xid, tcon, full_path,
3907 - cifs_sb, NULL, srchflgs, srchinf, false);
3908 - if (!rc) {
3909 - data =
3910 - (FILE_ALL_INFO *)srchinf->srch_entries_start;
3911 + rc = CIFSFindFirst(xid, tcon, full_path,
3912 + cifs_sb, NULL, srchflgs, srchinf, false);
3913 + if (!rc) {
3914 + data = (FILE_ALL_INFO *)srchinf->srch_entries_start;
3915
3916 - cifs_dir_info_to_fattr(&fattr,
3917 - (FILE_DIRECTORY_INFO *)data, cifs_sb);
3918 - fattr.cf_uniqueid = le64_to_cpu(
3919 - ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
3920 - validinum = true;
3921 + cifs_dir_info_to_fattr(&fattr,
3922 + (FILE_DIRECTORY_INFO *)data, cifs_sb);
3923 + fattr.cf_uniqueid = le64_to_cpu(
3924 + ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
3925 + validinum = true;
3926
3927 - cifs_buf_release(srchinf->ntwrk_buf_start);
3928 - }
3929 - kfree(srchinf);
3930 - if (rc)
3931 - goto cgii_exit;
3932 + cifs_buf_release(srchinf->ntwrk_buf_start);
3933 + }
3934 + kfree(srchinf);
3935 + if (rc)
3936 + goto cgii_exit;
3937 } else
3938 goto cgii_exit;
3939
3940 diff --git a/fs/cifs/smb2maperror.c b/fs/cifs/smb2maperror.c
3941 index 98c25b969ab8..7e93d5706bf6 100644
3942 --- a/fs/cifs/smb2maperror.c
3943 +++ b/fs/cifs/smb2maperror.c
3944 @@ -1034,7 +1034,8 @@ static const struct status_to_posix_error smb2_error_map_table[] = {
3945 {STATUS_UNFINISHED_CONTEXT_DELETED, -EIO,
3946 "STATUS_UNFINISHED_CONTEXT_DELETED"},
3947 {STATUS_NO_TGT_REPLY, -EIO, "STATUS_NO_TGT_REPLY"},
3948 - {STATUS_OBJECTID_NOT_FOUND, -EIO, "STATUS_OBJECTID_NOT_FOUND"},
3949 + /* Note that ENOATTTR and ENODATA are the same errno */
3950 + {STATUS_OBJECTID_NOT_FOUND, -ENODATA, "STATUS_OBJECTID_NOT_FOUND"},
3951 {STATUS_NO_IP_ADDRESSES, -EIO, "STATUS_NO_IP_ADDRESSES"},
3952 {STATUS_WRONG_CREDENTIAL_HANDLE, -EIO,
3953 "STATUS_WRONG_CREDENTIAL_HANDLE"},
3954 diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
3955 index 2880e017cd0a..2ce73287b53c 100644
3956 --- a/fs/ext4/ioctl.c
3957 +++ b/fs/ext4/ioctl.c
3958 @@ -749,6 +749,13 @@ resizefs_out:
3959 if (!blk_queue_discard(q))
3960 return -EOPNOTSUPP;
3961
3962 + /*
3963 + * We haven't replayed the journal, so we cannot use our
3964 + * block-bitmap-guided storage zapping commands.
3965 + */
3966 + if (test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb))
3967 + return -EROFS;
3968 +
3969 if (copy_from_user(&range, (struct fstrim_range __user *)arg,
3970 sizeof(range)))
3971 return -EFAULT;
3972 diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
3973 index 67b359629a66..aef2a24dc9f9 100644
3974 --- a/fs/ext4/resize.c
3975 +++ b/fs/ext4/resize.c
3976 @@ -907,11 +907,18 @@ static int add_new_gdb_meta_bg(struct super_block *sb,
3977 memcpy(n_group_desc, o_group_desc,
3978 EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *));
3979 n_group_desc[gdb_num] = gdb_bh;
3980 +
3981 + BUFFER_TRACE(gdb_bh, "get_write_access");
3982 + err = ext4_journal_get_write_access(handle, gdb_bh);
3983 + if (err) {
3984 + kvfree(n_group_desc);
3985 + brelse(gdb_bh);
3986 + return err;
3987 + }
3988 +
3989 EXT4_SB(sb)->s_group_desc = n_group_desc;
3990 EXT4_SB(sb)->s_gdb_count++;
3991 kvfree(o_group_desc);
3992 - BUFFER_TRACE(gdb_bh, "get_write_access");
3993 - err = ext4_journal_get_write_access(handle, gdb_bh);
3994 return err;
3995 }
3996
3997 @@ -2040,6 +2047,10 @@ out:
3998 free_flex_gd(flex_gd);
3999 if (resize_inode != NULL)
4000 iput(resize_inode);
4001 - ext4_msg(sb, KERN_INFO, "resized filesystem to %llu", n_blocks_count);
4002 + if (err)
4003 + ext4_warning(sb, "error (%d) occurred during "
4004 + "file system resize", err);
4005 + ext4_msg(sb, KERN_INFO, "resized filesystem to %llu",
4006 + ext4_blocks_count(es));
4007 return err;
4008 }
4009 diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
4010 index 83a96334dc07..4ebe69572475 100644
4011 --- a/fs/f2fs/super.c
4012 +++ b/fs/f2fs/super.c
4013 @@ -1489,7 +1489,7 @@ int sanity_check_ckpt(struct f2fs_sb_info *sbi)
4014 unsigned int segment_count_main;
4015 unsigned int cp_pack_start_sum, cp_payload;
4016 block_t user_block_count;
4017 - int i;
4018 + int i, j;
4019
4020 total = le32_to_cpu(raw_super->segment_count);
4021 fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
4022 @@ -1530,11 +1530,43 @@ int sanity_check_ckpt(struct f2fs_sb_info *sbi)
4023 if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs ||
4024 le16_to_cpu(ckpt->cur_node_blkoff[i]) >= blocks_per_seg)
4025 return 1;
4026 + for (j = i + 1; j < NR_CURSEG_NODE_TYPE; j++) {
4027 + if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
4028 + le32_to_cpu(ckpt->cur_node_segno[j])) {
4029 + f2fs_msg(sbi->sb, KERN_ERR,
4030 + "Node segment (%u, %u) has the same "
4031 + "segno: %u", i, j,
4032 + le32_to_cpu(ckpt->cur_node_segno[i]));
4033 + return 1;
4034 + }
4035 + }
4036 }
4037 for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) {
4038 if (le32_to_cpu(ckpt->cur_data_segno[i]) >= main_segs ||
4039 le16_to_cpu(ckpt->cur_data_blkoff[i]) >= blocks_per_seg)
4040 return 1;
4041 + for (j = i + 1; j < NR_CURSEG_DATA_TYPE; j++) {
4042 + if (le32_to_cpu(ckpt->cur_data_segno[i]) ==
4043 + le32_to_cpu(ckpt->cur_data_segno[j])) {
4044 + f2fs_msg(sbi->sb, KERN_ERR,
4045 + "Data segment (%u, %u) has the same "
4046 + "segno: %u", i, j,
4047 + le32_to_cpu(ckpt->cur_data_segno[i]));
4048 + return 1;
4049 + }
4050 + }
4051 + }
4052 + for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
4053 + for (j = i; j < NR_CURSEG_DATA_TYPE; j++) {
4054 + if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
4055 + le32_to_cpu(ckpt->cur_data_segno[j])) {
4056 + f2fs_msg(sbi->sb, KERN_ERR,
4057 + "Data segment (%u) and Data segment (%u)"
4058 + " has the same segno: %u", i, j,
4059 + le32_to_cpu(ckpt->cur_node_segno[i]));
4060 + return 1;
4061 + }
4062 + }
4063 }
4064
4065 sit_bitmap_size = le32_to_cpu(ckpt->sit_ver_bitmap_bytesize);
4066 diff --git a/include/linux/atalk.h b/include/linux/atalk.h
4067 index 73fd8b7e9534..af43ed404ff4 100644
4068 --- a/include/linux/atalk.h
4069 +++ b/include/linux/atalk.h
4070 @@ -150,19 +150,29 @@ extern int sysctl_aarp_retransmit_limit;
4071 extern int sysctl_aarp_resolve_time;
4072
4073 #ifdef CONFIG_SYSCTL
4074 -extern void atalk_register_sysctl(void);
4075 +extern int atalk_register_sysctl(void);
4076 extern void atalk_unregister_sysctl(void);
4077 #else
4078 -#define atalk_register_sysctl() do { } while(0)
4079 -#define atalk_unregister_sysctl() do { } while(0)
4080 +static inline int atalk_register_sysctl(void)
4081 +{
4082 + return 0;
4083 +}
4084 +static inline void atalk_unregister_sysctl(void)
4085 +{
4086 +}
4087 #endif
4088
4089 #ifdef CONFIG_PROC_FS
4090 extern int atalk_proc_init(void);
4091 extern void atalk_proc_exit(void);
4092 #else
4093 -#define atalk_proc_init() ({ 0; })
4094 -#define atalk_proc_exit() do { } while(0)
4095 +static inline int atalk_proc_init(void)
4096 +{
4097 + return 0;
4098 +}
4099 +static inline void atalk_proc_exit(void)
4100 +{
4101 +}
4102 #endif /* CONFIG_PROC_FS */
4103
4104 #endif /* __LINUX_ATALK_H__ */
4105 diff --git a/include/linux/swap.h b/include/linux/swap.h
4106 index 55ff5593c193..2228907d08ff 100644
4107 --- a/include/linux/swap.h
4108 +++ b/include/linux/swap.h
4109 @@ -135,9 +135,9 @@ struct swap_extent {
4110 /*
4111 * Max bad pages in the new format..
4112 */
4113 -#define __swapoffset(x) ((unsigned long)&((union swap_header *)0)->x)
4114 #define MAX_SWAP_BADPAGES \
4115 - ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int))
4116 + ((offsetof(union swap_header, magic.magic) - \
4117 + offsetof(union swap_header, info.badpages)) / sizeof(int))
4118
4119 enum {
4120 SWP_USED = (1 << 0), /* is slot in swap_info[] used? */
4121 diff --git a/kernel/events/core.c b/kernel/events/core.c
4122 index 5cbb2eda80b5..7929526e96e2 100644
4123 --- a/kernel/events/core.c
4124 +++ b/kernel/events/core.c
4125 @@ -6616,6 +6616,7 @@ static void perf_event_mmap_output(struct perf_event *event,
4126 struct perf_output_handle handle;
4127 struct perf_sample_data sample;
4128 int size = mmap_event->event_id.header.size;
4129 + u32 type = mmap_event->event_id.header.type;
4130 int ret;
4131
4132 if (!perf_event_mmap_match(event, data))
4133 @@ -6659,6 +6660,7 @@ static void perf_event_mmap_output(struct perf_event *event,
4134 perf_output_end(&handle);
4135 out:
4136 mmap_event->event_id.header.size = size;
4137 + mmap_event->event_id.header.type = type;
4138 }
4139
4140 static void perf_event_mmap_event(struct perf_mmap_event *mmap_event)
4141 diff --git a/kernel/hung_task.c b/kernel/hung_task.c
4142 index fd781a468f32..fb00cf30abd1 100644
4143 --- a/kernel/hung_task.c
4144 +++ b/kernel/hung_task.c
4145 @@ -15,6 +15,7 @@
4146 #include <linux/lockdep.h>
4147 #include <linux/export.h>
4148 #include <linux/sysctl.h>
4149 +#include <linux/suspend.h>
4150 #include <linux/utsname.h>
4151 #include <trace/events/sched.h>
4152
4153 @@ -221,6 +222,28 @@ void reset_hung_task_detector(void)
4154 }
4155 EXPORT_SYMBOL_GPL(reset_hung_task_detector);
4156
4157 +static bool hung_detector_suspended;
4158 +
4159 +static int hungtask_pm_notify(struct notifier_block *self,
4160 + unsigned long action, void *hcpu)
4161 +{
4162 + switch (action) {
4163 + case PM_SUSPEND_PREPARE:
4164 + case PM_HIBERNATION_PREPARE:
4165 + case PM_RESTORE_PREPARE:
4166 + hung_detector_suspended = true;
4167 + break;
4168 + case PM_POST_SUSPEND:
4169 + case PM_POST_HIBERNATION:
4170 + case PM_POST_RESTORE:
4171 + hung_detector_suspended = false;
4172 + break;
4173 + default:
4174 + break;
4175 + }
4176 + return NOTIFY_OK;
4177 +}
4178 +
4179 /*
4180 * kthread which checks for tasks stuck in D state
4181 */
4182 @@ -235,7 +258,8 @@ static int watchdog(void *dummy)
4183 long t = hung_timeout_jiffies(hung_last_checked, timeout);
4184
4185 if (t <= 0) {
4186 - if (!atomic_xchg(&reset_hung_task, 0))
4187 + if (!atomic_xchg(&reset_hung_task, 0) &&
4188 + !hung_detector_suspended)
4189 check_hung_uninterruptible_tasks(timeout);
4190 hung_last_checked = jiffies;
4191 continue;
4192 @@ -249,6 +273,10 @@ static int watchdog(void *dummy)
4193 static int __init hung_task_init(void)
4194 {
4195 atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
4196 +
4197 + /* Disable hung task detector on suspend */
4198 + pm_notifier(hungtask_pm_notify, 0);
4199 +
4200 watchdog_task = kthread_run(watchdog, NULL, "khungtaskd");
4201
4202 return 0;
4203 diff --git a/lib/div64.c b/lib/div64.c
4204 index 7f345259c32f..c1c1a4c36dd5 100644
4205 --- a/lib/div64.c
4206 +++ b/lib/div64.c
4207 @@ -102,7 +102,7 @@ u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder)
4208 quot = div_u64_rem(dividend, divisor, &rem32);
4209 *remainder = rem32;
4210 } else {
4211 - int n = 1 + fls(high);
4212 + int n = fls(high);
4213 quot = div_u64(dividend >> n, divisor >> n);
4214
4215 if (quot != 0)
4216 @@ -140,7 +140,7 @@ u64 div64_u64(u64 dividend, u64 divisor)
4217 if (high == 0) {
4218 quot = div_u64(dividend, divisor);
4219 } else {
4220 - int n = 1 + fls(high);
4221 + int n = fls(high);
4222 quot = div_u64(dividend >> n, divisor >> n);
4223
4224 if (quot != 0)
4225 diff --git a/net/9p/protocol.c b/net/9p/protocol.c
4226 index 145f80518064..7f1b45c082c9 100644
4227 --- a/net/9p/protocol.c
4228 +++ b/net/9p/protocol.c
4229 @@ -570,9 +570,10 @@ int p9stat_read(struct p9_client *clnt, char *buf, int len, struct p9_wstat *st)
4230 if (ret) {
4231 p9_debug(P9_DEBUG_9P, "<<< p9stat_read failed: %d\n", ret);
4232 trace_9p_protocol_dump(clnt, &fake_pdu);
4233 + return ret;
4234 }
4235
4236 - return ret;
4237 + return fake_pdu.offset;
4238 }
4239 EXPORT_SYMBOL(p9stat_read);
4240
4241 diff --git a/net/appletalk/atalk_proc.c b/net/appletalk/atalk_proc.c
4242 index af46bc49e1e9..b5f84f428aa6 100644
4243 --- a/net/appletalk/atalk_proc.c
4244 +++ b/net/appletalk/atalk_proc.c
4245 @@ -293,7 +293,7 @@ out_interface:
4246 goto out;
4247 }
4248
4249 -void __exit atalk_proc_exit(void)
4250 +void atalk_proc_exit(void)
4251 {
4252 remove_proc_entry("interface", atalk_proc_dir);
4253 remove_proc_entry("route", atalk_proc_dir);
4254 diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
4255 index 10d2bdce686e..e206d98b3b82 100644
4256 --- a/net/appletalk/ddp.c
4257 +++ b/net/appletalk/ddp.c
4258 @@ -1912,12 +1912,16 @@ static const char atalk_err_snap[] __initconst =
4259 /* Called by proto.c on kernel start up */
4260 static int __init atalk_init(void)
4261 {
4262 - int rc = proto_register(&ddp_proto, 0);
4263 + int rc;
4264
4265 - if (rc != 0)
4266 + rc = proto_register(&ddp_proto, 0);
4267 + if (rc)
4268 goto out;
4269
4270 - (void)sock_register(&atalk_family_ops);
4271 + rc = sock_register(&atalk_family_ops);
4272 + if (rc)
4273 + goto out_proto;
4274 +
4275 ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
4276 if (!ddp_dl)
4277 printk(atalk_err_snap);
4278 @@ -1925,12 +1929,33 @@ static int __init atalk_init(void)
4279 dev_add_pack(&ltalk_packet_type);
4280 dev_add_pack(&ppptalk_packet_type);
4281
4282 - register_netdevice_notifier(&ddp_notifier);
4283 + rc = register_netdevice_notifier(&ddp_notifier);
4284 + if (rc)
4285 + goto out_sock;
4286 +
4287 aarp_proto_init();
4288 - atalk_proc_init();
4289 - atalk_register_sysctl();
4290 + rc = atalk_proc_init();
4291 + if (rc)
4292 + goto out_aarp;
4293 +
4294 + rc = atalk_register_sysctl();
4295 + if (rc)
4296 + goto out_proc;
4297 out:
4298 return rc;
4299 +out_proc:
4300 + atalk_proc_exit();
4301 +out_aarp:
4302 + aarp_cleanup_module();
4303 + unregister_netdevice_notifier(&ddp_notifier);
4304 +out_sock:
4305 + dev_remove_pack(&ppptalk_packet_type);
4306 + dev_remove_pack(&ltalk_packet_type);
4307 + unregister_snap_client(ddp_dl);
4308 + sock_unregister(PF_APPLETALK);
4309 +out_proto:
4310 + proto_unregister(&ddp_proto);
4311 + goto out;
4312 }
4313 module_init(atalk_init);
4314
4315 diff --git a/net/appletalk/sysctl_net_atalk.c b/net/appletalk/sysctl_net_atalk.c
4316 index ebb864361f7a..4e6042e0fcac 100644
4317 --- a/net/appletalk/sysctl_net_atalk.c
4318 +++ b/net/appletalk/sysctl_net_atalk.c
4319 @@ -44,9 +44,12 @@ static struct ctl_table atalk_table[] = {
4320
4321 static struct ctl_table_header *atalk_table_header;
4322
4323 -void atalk_register_sysctl(void)
4324 +int __init atalk_register_sysctl(void)
4325 {
4326 atalk_table_header = register_net_sysctl(&init_net, "net/appletalk", atalk_table);
4327 + if (!atalk_table_header)
4328 + return -ENOMEM;
4329 + return 0;
4330 }
4331
4332 void atalk_unregister_sysctl(void)
4333 diff --git a/sound/drivers/opl3/opl3_voice.h b/sound/drivers/opl3/opl3_voice.h
4334 index a371c075ac87..e26702559f61 100644
4335 --- a/sound/drivers/opl3/opl3_voice.h
4336 +++ b/sound/drivers/opl3/opl3_voice.h
4337 @@ -41,7 +41,7 @@ void snd_opl3_timer_func(unsigned long data);
4338
4339 /* Prototypes for opl3_drums.c */
4340 void snd_opl3_load_drums(struct snd_opl3 *opl3);
4341 -void snd_opl3_drum_switch(struct snd_opl3 *opl3, int note, int on_off, int vel, struct snd_midi_channel *chan);
4342 +void snd_opl3_drum_switch(struct snd_opl3 *opl3, int note, int vel, int on_off, struct snd_midi_channel *chan);
4343
4344 /* Prototypes for opl3_oss.c */
4345 #ifdef CONFIG_SND_SEQUENCER_OSS
4346 diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
4347 index ad42d2364199..e75bfc511e3e 100644
4348 --- a/sound/isa/sb/sb8.c
4349 +++ b/sound/isa/sb/sb8.c
4350 @@ -111,6 +111,10 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
4351
4352 /* block the 0x388 port to avoid PnP conflicts */
4353 acard->fm_res = request_region(0x388, 4, "SoundBlaster FM");
4354 + if (!acard->fm_res) {
4355 + err = -EBUSY;
4356 + goto _err;
4357 + }
4358
4359 if (port[dev] != SNDRV_AUTO_PORT) {
4360 if ((err = snd_sbdsp_create(card, port[dev], irq[dev],
4361 diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c
4362 index 286f5e3686a3..d73ee11a32bd 100644
4363 --- a/sound/pci/echoaudio/echoaudio.c
4364 +++ b/sound/pci/echoaudio/echoaudio.c
4365 @@ -1953,6 +1953,11 @@ static int snd_echo_create(struct snd_card *card,
4366 }
4367 chip->dsp_registers = (volatile u32 __iomem *)
4368 ioremap_nocache(chip->dsp_registers_phys, sz);
4369 + if (!chip->dsp_registers) {
4370 + dev_err(chip->card->dev, "ioremap failed\n");
4371 + snd_echo_free(chip);
4372 + return -ENOMEM;
4373 + }
4374
4375 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,
4376 KBUILD_MODNAME, chip)) {
4377 diff --git a/tools/perf/Documentation/perf-config.txt b/tools/perf/Documentation/perf-config.txt
4378 index cb081ac59fd1..bd359a04cb94 100644
4379 --- a/tools/perf/Documentation/perf-config.txt
4380 +++ b/tools/perf/Documentation/perf-config.txt
4381 @@ -112,7 +112,7 @@ Given a $HOME/.perfconfig like this:
4382
4383 [report]
4384 # Defaults
4385 - sort-order = comm,dso,symbol
4386 + sort_order = comm,dso,symbol
4387 percent-limit = 0
4388 queue-size = 0
4389 children = true
4390 diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
4391 index e68c866ae798..cd2900ac473f 100644
4392 --- a/tools/perf/builtin-top.c
4393 +++ b/tools/perf/builtin-top.c
4394 @@ -1323,8 +1323,9 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
4395 goto out_delete_evlist;
4396
4397 symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);
4398 - if (symbol__init(NULL) < 0)
4399 - return -1;
4400 + status = symbol__init(NULL);
4401 + if (status < 0)
4402 + goto out_delete_evlist;
4403
4404 sort__setup_elide(stdout);
4405
4406 diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c
4407 index ea772d41e472..b5d0be524655 100644
4408 --- a/tools/perf/tests/evsel-tp-sched.c
4409 +++ b/tools/perf/tests/evsel-tp-sched.c
4410 @@ -84,5 +84,6 @@ int test__perf_evsel__tp_sched_test(int subtest __maybe_unused)
4411 if (perf_evsel__test_field(evsel, "target_cpu", 4, true))
4412 ret = -1;
4413
4414 + perf_evsel__delete(evsel);
4415 return ret;
4416 }
4417 diff --git a/tools/perf/tests/openat-syscall-all-cpus.c b/tools/perf/tests/openat-syscall-all-cpus.c
4418 index c8d9592eb142..75d504e9eeaf 100644
4419 --- a/tools/perf/tests/openat-syscall-all-cpus.c
4420 +++ b/tools/perf/tests/openat-syscall-all-cpus.c
4421 @@ -38,7 +38,7 @@ int test__openat_syscall_event_on_all_cpus(int subtest __maybe_unused)
4422 if (IS_ERR(evsel)) {
4423 tracing_path__strerror_open_tp(errno, errbuf, sizeof(errbuf), "syscalls", "sys_enter_openat");
4424 pr_debug("%s\n", errbuf);
4425 - goto out_thread_map_delete;
4426 + goto out_cpu_map_delete;
4427 }
4428
4429 if (perf_evsel__open(evsel, cpus, threads) < 0) {
4430 @@ -112,6 +112,8 @@ out_close_fd:
4431 perf_evsel__close_fd(evsel, 1, threads->nr);
4432 out_evsel_delete:
4433 perf_evsel__delete(evsel);
4434 +out_cpu_map_delete:
4435 + cpu_map__put(cpus);
4436 out_thread_map_delete:
4437 thread_map__put(threads);
4438 return err;
4439 diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
4440 index 993ef2762508..32aab95e1459 100644
4441 --- a/tools/perf/util/build-id.c
4442 +++ b/tools/perf/util/build-id.c
4443 @@ -176,6 +176,7 @@ char *build_id_cache__linkname(const char *sbuild_id, char *bf, size_t size)
4444 return bf;
4445 }
4446
4447 +/* The caller is responsible to free the returned buffer. */
4448 char *build_id_cache__origname(const char *sbuild_id)
4449 {
4450 char *linkname;
4451 diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
4452 index 18dae745034f..1d66f8eab9f9 100644
4453 --- a/tools/perf/util/config.c
4454 +++ b/tools/perf/util/config.c
4455 @@ -595,11 +595,10 @@ static int collect_config(const char *var, const char *value,
4456 }
4457
4458 ret = set_value(item, value);
4459 - return ret;
4460
4461 out_free:
4462 free(key);
4463 - return -1;
4464 + return ret;
4465 }
4466
4467 static int perf_config_set__init(struct perf_config_set *set)
4468 diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
4469 index f7128c2a6386..a62f79558146 100644
4470 --- a/tools/perf/util/evsel.c
4471 +++ b/tools/perf/util/evsel.c
4472 @@ -1167,6 +1167,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
4473 {
4474 assert(list_empty(&evsel->node));
4475 assert(evsel->evlist == NULL);
4476 + perf_evsel__free_counts(evsel);
4477 perf_evsel__free_fd(evsel);
4478 perf_evsel__free_id(evsel);
4479 perf_evsel__free_config_terms(evsel);
4480 diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
4481 index ad613ea51434..82833ceba339 100644
4482 --- a/tools/perf/util/hist.c
4483 +++ b/tools/perf/util/hist.c
4484 @@ -1027,8 +1027,10 @@ int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al,
4485
4486 err = sample__resolve_callchain(iter->sample, &callchain_cursor, &iter->parent,
4487 iter->evsel, al, max_stack_depth);
4488 - if (err)
4489 + if (err) {
4490 + map__put(alm);
4491 return err;
4492 + }
4493
4494 err = iter->ops->prepare_entry(iter, al);
4495 if (err)
4496 diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
4497 index 14f111a10650..6193be6d7639 100644
4498 --- a/tools/perf/util/parse-events.c
4499 +++ b/tools/perf/util/parse-events.c
4500 @@ -2104,6 +2104,7 @@ void print_sdt_events(const char *subsys_glob, const char *event_glob,
4501 printf(" %-50s [%s]\n", buf, "SDT event");
4502 free(buf);
4503 }
4504 + free(path);
4505 } else
4506 printf(" %-50s [%s]\n", nd->s, "SDT event");
4507 if (nd2) {
4508 diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
4509 index 5ec2de8f49b4..b4c5d96e54c1 100644
4510 --- a/tools/power/x86/turbostat/turbostat.c
4511 +++ b/tools/power/x86/turbostat/turbostat.c
4512 @@ -3691,6 +3691,9 @@ int fork_it(char **argv)
4513 signal(SIGQUIT, SIG_IGN);
4514 if (waitpid(child_pid, &status, 0) == -1)
4515 err(status, "waitpid");
4516 +
4517 + if (WIFEXITED(status))
4518 + status = WEXITSTATUS(status);
4519 }
4520 /*
4521 * n.b. fork_it() does not check for errors from for_all_cpus()