Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

thunderbolt: Add wake from DisplayPort

Latest USB4 spec added a new wake bit for DisplayPort so add this to the
driver when runtime suspending. This way wake up the domain when a new
monitor is plugged in to any of the device routers.

Also do the same for pre-USB4 devices through the link controller
registers as documented in chapter 13 of the USB4 spec.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>

+14 -5
+4 -2
drivers/thunderbolt/lc.c
··· 208 208 if (ret) 209 209 return ret; 210 210 211 - ctrl &= ~(TB_LC_SX_CTRL_WOC | TB_LC_SX_CTRL_WOD | TB_LC_SX_CTRL_WOP | 212 - TB_LC_SX_CTRL_WOU4); 211 + ctrl &= ~(TB_LC_SX_CTRL_WOC | TB_LC_SX_CTRL_WOD | TB_LC_SX_CTRL_WODPC | 212 + TB_LC_SX_CTRL_WODPD | TB_LC_SX_CTRL_WOP | TB_LC_SX_CTRL_WOU4); 213 213 214 214 if (flags & TB_WAKE_ON_CONNECT) 215 215 ctrl |= TB_LC_SX_CTRL_WOC | TB_LC_SX_CTRL_WOD; ··· 217 217 ctrl |= TB_LC_SX_CTRL_WOU4; 218 218 if (flags & TB_WAKE_ON_PCIE) 219 219 ctrl |= TB_LC_SX_CTRL_WOP; 220 + if (flags & TB_WAKE_ON_DP) 221 + ctrl |= TB_LC_SX_CTRL_WODPC | TB_LC_SX_CTRL_WODPD; 220 222 221 223 return tb_sw_write(sw, &ctrl, TB_CFG_SWITCH, offset + TB_LC_SX_CTRL, 1); 222 224 }
+2 -1
drivers/thunderbolt/switch.c
··· 2844 2844 if (runtime) { 2845 2845 /* Trigger wake when something is plugged in/out */ 2846 2846 flags |= TB_WAKE_ON_CONNECT | TB_WAKE_ON_DISCONNECT; 2847 - flags |= TB_WAKE_ON_USB4 | TB_WAKE_ON_USB3 | TB_WAKE_ON_PCIE; 2847 + flags |= TB_WAKE_ON_USB4; 2848 + flags |= TB_WAKE_ON_USB3 | TB_WAKE_ON_PCIE | TB_WAKE_ON_DP; 2848 2849 } else if (device_may_wakeup(&sw->dev)) { 2849 2850 flags |= TB_WAKE_ON_USB4 | TB_WAKE_ON_USB3 | TB_WAKE_ON_PCIE; 2850 2851 }
+1
drivers/thunderbolt/tb.h
··· 347 347 #define TB_WAKE_ON_USB4 BIT(2) 348 348 #define TB_WAKE_ON_USB3 BIT(3) 349 349 #define TB_WAKE_ON_PCIE BIT(4) 350 + #define TB_WAKE_ON_DP BIT(5) 350 351 351 352 /** 352 353 * struct tb_cm_ops - Connection manager specific operations vector
+3
drivers/thunderbolt/tb_regs.h
··· 195 195 #define ROUTER_CS_5_SLP BIT(0) 196 196 #define ROUTER_CS_5_WOP BIT(1) 197 197 #define ROUTER_CS_5_WOU BIT(2) 198 + #define ROUTER_CS_5_WOD BIT(3) 198 199 #define ROUTER_CS_5_C3S BIT(23) 199 200 #define ROUTER_CS_5_PTO BIT(24) 200 201 #define ROUTER_CS_5_UTO BIT(25) ··· 459 458 #define TB_LC_SX_CTRL 0x96 460 459 #define TB_LC_SX_CTRL_WOC BIT(1) 461 460 #define TB_LC_SX_CTRL_WOD BIT(2) 461 + #define TB_LC_SX_CTRL_WODPC BIT(3) 462 + #define TB_LC_SX_CTRL_WODPD BIT(4) 462 463 #define TB_LC_SX_CTRL_WOU4 BIT(5) 463 464 #define TB_LC_SX_CTRL_WOP BIT(6) 464 465 #define TB_LC_SX_CTRL_L1C BIT(16)
+4 -2
drivers/thunderbolt/usb4.c
··· 413 413 } 414 414 415 415 /* 416 - * Enable wakes from PCIe and USB 3.x on this router. Only 416 + * Enable wakes from PCIe, USB 3.x and DP on this router. Only 417 417 * needed for device routers. 418 418 */ 419 419 if (route) { ··· 421 421 if (ret) 422 422 return ret; 423 423 424 - val &= ~(ROUTER_CS_5_WOP | ROUTER_CS_5_WOU); 424 + val &= ~(ROUTER_CS_5_WOP | ROUTER_CS_5_WOU | ROUTER_CS_5_WOD); 425 425 if (flags & TB_WAKE_ON_USB3) 426 426 val |= ROUTER_CS_5_WOU; 427 427 if (flags & TB_WAKE_ON_PCIE) 428 428 val |= ROUTER_CS_5_WOP; 429 + if (flags & TB_WAKE_ON_DP) 430 + val |= ROUTER_CS_5_WOD; 429 431 430 432 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 431 433 if (ret)