[PATCH 11/11] apple_gmux: Wait for switch completion
Matthew Garrett
matthew.garrett at nebula.com
Sun Jun 1 09:38:43 PDT 2014
The GMUX doesn't appear to switch instantly, which can trigger problems in
panel detection and setup. Wait for an interrupt or 200msec, whichever comes
first.
Signed-off-by: Matthew Garrett <matthew.garrett at nebula.com>
---
drivers/platform/x86/apple-gmux.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c
index 17f906d..6826ede 100644
--- a/drivers/platform/x86/apple-gmux.c
+++ b/drivers/platform/x86/apple-gmux.c
@@ -38,6 +38,7 @@ struct apple_gmux_data {
int gpe;
enum vga_switcheroo_client_id resume_client_id;
enum vga_switcheroo_state power_state;
+ struct completion switch_done;
struct completion powerchange_done;
};
@@ -283,6 +284,8 @@ static int gmux_switch_ddc(enum vga_switcheroo_client_id id)
static int gmux_switchto(enum vga_switcheroo_client_id id)
{
+ reinit_completion(&apple_gmux_data->switch_done);
+
if (id == VGA_SWITCHEROO_IGD) {
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DDC, 1);
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2);
@@ -293,6 +296,11 @@ static int gmux_switchto(enum vga_switcheroo_client_id id)
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3);
}
+ if (apple_gmux_data->gpe >= 0 &&
+ !wait_for_completion_interruptible_timeout(&apple_gmux_data->switch_done,
+ msecs_to_jiffies(200)))
+ pr_warn("Timeout waiting for gmux GPU switch to complete\n");
+
return 0;
}
@@ -401,6 +409,9 @@ static void gmux_notify_handler(acpi_handle device, u32 value, void *context)
gmux_clear_interrupts(gmux_data);
gmux_enable_interrupts(gmux_data);
+ if (status & GMUX_INTERRUPT_STATUS_DISPLAY)
+ complete(&gmux_data->switch_done);
+
if (status & GMUX_INTERRUPT_STATUS_POWER)
complete(&gmux_data->powerchange_done);
}
@@ -565,6 +576,7 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
}
apple_gmux_data = gmux_data;
+ init_completion(&gmux_data->switch_done);
init_completion(&gmux_data->powerchange_done);
gmux_enable_interrupts(gmux_data);
--
1.8.5.3
More information about the dri-devel
mailing list