diff options
Diffstat (limited to 'drivers/acpi/video_detect.c')
| -rw-r--r-- | drivers/acpi/video_detect.c | 60 | 
1 files changed, 58 insertions, 2 deletions
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index 45d8097ef4c..b728880ef10 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c @@ -132,6 +132,33 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv)  	return AE_OK;  } +/* Force to use vendor driver when the ACPI device is known to be + * buggy */ +static int video_detect_force_vendor(const struct dmi_system_id *d) +{ +	acpi_video_support |= ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; +	return 0; +} + +static struct dmi_system_id video_detect_dmi_table[] = { +	/* On Samsung X360, the BIOS will set a flag (VDRV) if generic +	 * ACPI backlight device is used. This flag will definitively break +	 * the backlight interface (even the vendor interface) untill next +	 * reboot. It's why we should prevent video.ko from being used here +	 * and we can't rely on a later call to acpi_video_unregister(). +	 */ +	{ +	 .callback = video_detect_force_vendor, +	 .ident = "X360", +	 .matches = { +		DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), +		DMI_MATCH(DMI_PRODUCT_NAME, "X360"), +		DMI_MATCH(DMI_BOARD_NAME, "X360"), +		}, +	}, +	{ }, +}; +  /*   * Returns the video capabilities of a specific ACPI graphics device   * @@ -164,6 +191,8 @@ long acpi_video_get_capabilities(acpi_handle graphics_handle)  		 *		ACPI_VIDEO_BACKLIGHT_DMI_VENDOR;  		 *}  		 */ + +		dmi_check_system(video_detect_dmi_table);  	} else {  		status = acpi_bus_get_device(graphics_handle, &tmp_dev);  		if (ACPI_FAILURE(status)) { @@ -182,8 +211,7 @@ long acpi_video_get_capabilities(acpi_handle graphics_handle)  }  EXPORT_SYMBOL(acpi_video_get_capabilities); -/* Returns true if video.ko can do backlight switching */ -int acpi_video_backlight_support(void) +static void acpi_video_caps_check(void)  {  	/*  	 * We must check whether the ACPI graphics device is physically plugged @@ -191,6 +219,34 @@ int acpi_video_backlight_support(void)  	 */  	if (!acpi_video_caps_checked)  		acpi_video_get_capabilities(NULL); +} + +/* Promote the vendor interface instead of the generic video module. + * This function allow DMI blacklists to be implemented by externals + * platform drivers instead of putting a big blacklist in video_detect.c + * After calling this function you will probably want to call + * acpi_video_unregister() to make sure the video module is not loaded + */ +void acpi_video_dmi_promote_vendor(void) +{ +	acpi_video_caps_check(); +	acpi_video_support |= ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; +} +EXPORT_SYMBOL(acpi_video_dmi_promote_vendor); + +/* To be called when a driver who previously promoted the vendor + * interface */ +void acpi_video_dmi_demote_vendor(void) +{ +	acpi_video_caps_check(); +	acpi_video_support &= ~ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; +} +EXPORT_SYMBOL(acpi_video_dmi_demote_vendor); + +/* Returns true if video.ko can do backlight switching */ +int acpi_video_backlight_support(void) +{ +	acpi_video_caps_check();  	/* First check for boot param -> highest prio */  	if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR)  |