xref: /OK3568_Linux_fs/kernel/drivers/thunderbolt/quirks.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Thunderbolt driver - quirks
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2020 Mario Limonciello <mario.limonciello@dell.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "tb.h"
9*4882a593Smuzhiyun 
quirk_force_power_link(struct tb_switch * sw)10*4882a593Smuzhiyun static void quirk_force_power_link(struct tb_switch *sw)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	sw->quirks |= QUIRK_FORCE_POWER_LINK_CONTROLLER;
13*4882a593Smuzhiyun }
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct tb_quirk {
16*4882a593Smuzhiyun 	u16 vendor;
17*4882a593Smuzhiyun 	u16 device;
18*4882a593Smuzhiyun 	void (*hook)(struct tb_switch *sw);
19*4882a593Smuzhiyun };
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static const struct tb_quirk tb_quirks[] = {
22*4882a593Smuzhiyun 	/* Dell WD19TB supports self-authentication on unplug */
23*4882a593Smuzhiyun 	{ 0x00d4, 0xb070, quirk_force_power_link },
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /**
27*4882a593Smuzhiyun  * tb_check_quirks() - Check for quirks to apply
28*4882a593Smuzhiyun  * @sw: Thunderbolt switch
29*4882a593Smuzhiyun  *
30*4882a593Smuzhiyun  * Apply any quirks for the Thunderbolt controller.
31*4882a593Smuzhiyun  */
tb_check_quirks(struct tb_switch * sw)32*4882a593Smuzhiyun void tb_check_quirks(struct tb_switch *sw)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	int i;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(tb_quirks); i++) {
37*4882a593Smuzhiyun 		const struct tb_quirk *q = &tb_quirks[i];
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 		if (sw->device == q->device && sw->vendor == q->vendor)
40*4882a593Smuzhiyun 			q->hook(sw);
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun }
43