|
@@ -30,6 +30,7 @@
|
|
|
|
|
|
#define pr_fmt(fmt) "vga_switcheroo: " fmt
|
|
|
|
|
|
+#include <linux/apple-gmux.h>
|
|
|
#include <linux/console.h>
|
|
|
#include <linux/debugfs.h>
|
|
|
#include <linux/fb.h>
|
|
@@ -308,7 +309,8 @@ static int register_client(struct pci_dev *pdev,
|
|
|
*
|
|
|
* Register vga client (GPU). Enable vga_switcheroo if another GPU and a
|
|
|
* handler have already registered. The power state of the client is assumed
|
|
|
- * to be ON.
|
|
|
+ * to be ON. Beforehand, vga_switcheroo_client_probe_defer() shall be called
|
|
|
+ * to ensure that all prerequisites are met.
|
|
|
*
|
|
|
* Return: 0 on success, -ENOMEM on memory allocation error.
|
|
|
*/
|
|
@@ -375,6 +377,31 @@ find_active_client(struct list_head *head)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * vga_switcheroo_client_probe_defer() - whether to defer probing a given client
|
|
|
+ * @pdev: client pci device
|
|
|
+ *
|
|
|
+ * Determine whether any prerequisites are not fulfilled to probe a given
|
|
|
+ * client. Drivers shall invoke this early on in their ->probe callback
|
|
|
+ * and return %-EPROBE_DEFER if it evaluates to %true. Thou shalt not
|
|
|
+ * register the client ere thou hast called this.
|
|
|
+ *
|
|
|
+ * Return: %true if probing should be deferred, otherwise %false.
|
|
|
+ */
|
|
|
+bool vga_switcheroo_client_probe_defer(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * apple-gmux is needed on pre-retina MacBook Pro
|
|
|
+ * to probe the panel if pdev is the inactive GPU.
|
|
|
+ */
|
|
|
+ if (apple_gmux_present() && pdev != vga_default_device() &&
|
|
|
+ !vgasr_priv.handler_flags)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(vga_switcheroo_client_probe_defer);
|
|
|
+
|
|
|
/**
|
|
|
* vga_switcheroo_get_client_state() - obtain power state of a given client
|
|
|
* @pdev: client pci device
|