linux/drivers/platform/x86
Lukas Wunner 3e46304e74 apple-gmux: Track switch state
gmux has 3 switch registers:

* GMUX_PORT_SWITCH_DISPLAY switches the panel
* GMUX_PORT_SWITCH_DDC switches the panel's DDC lines
  (only on pre-retinas; on retinas this is a no-op)
* GMUX_PORT_SWITCH_EXTERNAL switches the external DP port(s)
  (only on models without Thunderbolt, i.e. introduced before 2011;
  those with Thunderbolt switch only HPD/AUX, not the main link)

Currently we switch all 3 registers in unison.

gmux does not preserve the switch state during suspend, so we currently
read GMUX_PORT_SWITCH_DISPLAY before suspend and restore all 3 registers
to this value on resume.

With the upcoming ->switch_ddc callback, GMUX_PORT_SWITCH_DDC may
temporarily contain a different value than the other 2 registers.
If we happen to suspend at this moment, we'll write an incorrect
value to GMUX_PORT_SWITCH_DDC on resume.

Also, on models with Thunderbolt the integrated GPU is unable to drive
the external DP port(s), so we want to keep GMUX_PORT_SWITCH_EXTERNAL
permanently switched to the discrete GPU on those machines.

Consequently we can no longer assume that GMUX_PORT_SWITCH_DISPLAY
represents the correct value for all 3 registers on suspend.

Track the state of all 3 registers: Add gmux_read_switch_state() and
gmux_write_switch_state(). Instead of reading the switch state on
every suspend, read it once on driver initialization so that we know
the current switch state all the time. (This allows us to use some
optimizations and shortcuts, e.g. we can skip switching DDC if we
know that it's already switched to the requested GPU.) Change the
->switchto callback to use gmux_write_switch_state().

Tested-by: Lukas Wunner <lukas@wunner.de>
    [MBP  9,1 2012  intel IVB + nvidia GK107  pre-retina  15"]
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Reviewed-by: Darren Hart <dvhart@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/5679f414cb0ddf1654dcc359571f3764b275edf0.1452525860.git.lukas@wunner.de
2016-02-09 11:21:08 +01:00
..
Kconfig surface pro 4: Add support for Surface Pro 4 Buttons 2016-01-19 17:35:52 -08:00
Makefile platform:x86: Add Intel Telemetry Debugfs interfaces 2016-01-19 17:35:51 -08:00
acer-wmi.c acer-wmi: remove threeg and interface sysfs interfaces 2015-10-06 23:38:08 +01:00
acerhdf.c thermal: consistently use int for temperatures 2015-08-03 23:15:50 +08:00
alienware-wmi.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
amilo-rfkill.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
apple-gmux.c apple-gmux: Track switch state 2016-02-09 11:21:08 +01:00
asus-laptop.c asus-laptop: Add key found on Asus F3M 2015-08-10 21:24:23 -07:00
asus-nb-wmi.c asus-nb-wmi: Add wapf=4 quirk for X456UA/X456UF 2015-09-06 10:44:48 -07:00
asus-wireless.c asus-wireless: Add ACPI HID ATK4001 2016-01-19 17:35:46 -08:00
asus-wmi.c asus-wmi: drop to_platform_driver macro 2016-01-19 17:35:45 -08:00
asus-wmi.h asus-wmi: always report brightness key events 2013-02-27 08:30:37 -05:00
classmate-laptop.c classmate-laptop: Fix sparse warning (0 as NULL) 2015-02-07 12:12:00 -08:00
compal-laptop.c compal-laptop: Add charge control limit 2015-10-03 08:44:57 -07:00
dell-laptop.c dell-laptop: Do not cache hwswitch state 2015-07-06 15:35:23 -07:00
dell-rbtn.c dell-rbtn: Export notifier for other kernel modules 2015-06-10 22:04:11 -07:00
dell-rbtn.h dell-rbtn: Export notifier for other kernel modules 2015-06-10 22:04:11 -07:00
dell-smo8800.c dell-smo8800: Add more ACPI ids and change description of driver 2014-12-03 10:10:19 -08:00
dell-wmi-aio.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
dell-wmi.c platform-drivers-x86 for 4.5-1 2016-01-19 17:54:15 -08:00
eeepc-laptop.c eeepc-laptop: Port to new backlight interface selection API 2015-06-19 01:11:56 +02:00
eeepc-wmi.c eeepc-wmi: Constify asus_quirks[] DMI table 2014-08-16 01:23:52 -07:00
fujitsu-laptop.c fujitsu-laptop: Port to new backlight interface selection API 2015-06-19 01:12:01 +02:00
fujitsu-tablet.c Input: use more descriptive KEY_ROTATE_DISPLAY instead of KEY_DIRECTION 2015-03-06 17:18:16 -08:00
hdaps.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
hp-wireless.c hp-wireless: remove unneeded goto/label in hpwl_init 2015-08-25 23:34:15 -07:00
hp-wmi.c hp-wmi: limit hotkey enable 2015-09-17 18:14:11 -07:00
hp_accel.c hp_accel: Add support for HP ZBook 15 2014-12-03 10:10:12 -08:00
ibm_rtl.c move io-64-nonatomic*.h out of asm-generic 2015-10-15 00:21:07 +02:00
ideapad-laptop.c ideapad-laptop: Add Lenovo Yoga 700 to no_hw_rfkill dmi list 2016-01-24 10:15:01 -08:00
intel-hid.c intel-hid: new hid event driver for hotkeys 2016-01-19 17:35:36 -08:00
intel-rst.c intel-rst: Clean up ACPI add function 2014-09-17 13:55:54 -07:00
intel-smartconnect.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
intel_ips.c move io-64-nonatomic*.h out of asm-generic 2015-10-15 00:21:07 +02:00
intel_ips.h
intel_menlow.c linux/thermal.h: rename KELVIN_TO_CELSIUS to DECI_KELVIN_TO_CELSIUS 2015-10-10 11:32:30 +08:00
intel_mid_powerbtn.c intel_mid_powerbtn: Remove misuse of IRQF_NO_SUSPEND flag 2015-10-03 09:40:30 -07:00
intel_mid_thermal.c thermal: consistently use int for temperatures 2015-08-03 23:15:50 +08:00
intel_oaktrail.c intel-oaktrail: Port to new backlight interface selection API 2015-06-19 01:12:11 +02:00
intel_pmc_ipc.c platform:x86: Add Intel telemetry platform device 2016-01-19 17:35:51 -08:00
intel_pmic_gpio.c gpio: change member .dev to .parent 2015-11-19 09:24:35 +01:00
intel_punit_ipc.c intel_punit_ipc: add NULL check for input parameters 2016-01-19 17:35:49 -08:00
intel_scu_ipc.c intel_scu_ipc: Protect dev member assignment on ->remove() 2015-10-15 08:23:30 -07:00
intel_scu_ipcutil.c intel_scu_ipc: Remove Moorestown support 2012-03-20 12:02:02 -04:00
intel_telemetry_core.c platform/x86: Add Intel Telemetry Core Driver 2016-01-19 17:35:50 -08:00
intel_telemetry_debugfs.c intel_telemetry_debugfs: Fix unused warnings in telemetry debugfs 2016-01-24 10:14:53 -08:00
intel_telemetry_pltdrv.c platform:x86: Add Intel telemetry platform driver 2016-01-19 17:35:50 -08:00
msi-laptop.c msi-laptop: Port to new backlight interface selection API 2015-06-19 01:12:16 +02:00
msi-wmi.c msi-wmi: Port to new backlight interface selection API 2015-06-19 01:12:20 +02:00
mxm-wmi.c Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86 2014-01-29 18:54:05 -08:00
panasonic-laptop.c Fix sleep / suspend keys for Toughbook CF-51 2014-04-06 12:58:11 -04:00
pvpanic.c pvpanic: handle missing _STA correctly 2015-06-07 21:30:12 -07:00
samsung-laptop.c samsung-laptop: Port to new backlight interface selection API 2015-06-19 01:12:25 +02:00
samsung-q10.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
sony-laptop.c Keyboard backlight control for some Vaio Fit models 2016-01-19 15:49:37 -08:00
surfacepro3_button.c surface pro 4: fix compare_const_fl.cocci warnings 2016-01-19 17:35:52 -08:00
tc1100-wmi.c tc1100-wmi: fix build warning when CONFIG_PM not enabled 2016-01-19 17:35:47 -08:00
thinkpad_acpi.c More power management and ACPI updates for v4.5-rc1 2016-01-20 19:06:49 -08:00
topstar-laptop.c platform:x86: Remove OOM message after input_allocate_device 2013-11-20 18:51:03 -05:00
toshiba-wmi.c platform/x86: Toshiba WMI Hotkey Driver 2015-10-03 10:07:08 -07:00
toshiba_acpi.c toshiba_acpi: Fix keyboard backlight sysfs entries not being updated 2016-01-19 15:49:21 -08:00
toshiba_bluetooth.c toshiba_bluetooth: Add missing newline in toshiba_bluetooth_present function 2015-11-20 15:20:08 -08:00
toshiba_haps.c toshiba_haps: Make use of DEVICE_ATTR_{RW, WO} macros 2015-05-11 10:38:22 -07:00
wmi.c wmi: Remove private %pUL implementation 2015-09-10 09:07:04 -07:00
xo1-rfkill.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
xo15-ebook.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00