From: Len Brown <len.brown@intel.com>
Date: Wed, 12 Nov 2008 02:15:50 +0000 (-0500)
Subject: Merge branch 'video' into release
X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=f398778aa336a2919ee04ba45d915007230c6957;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git

Merge branch 'video' into release

Conflicts:
	Documentation/kernel-parameters.txt

Signed-off-by: Len Brown <len.brown@intel.com>
---

f398778aa336a2919ee04ba45d915007230c6957
diff --cc Documentation/kernel-parameters.txt
index 4782fe7ac7d0,dd5013f974d8..c600c4ffc657
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@@ -198,30 -198,71 +198,42 @@@ and is between 256 and 4096 characters
  			that require a timer override, but don't have
  			HPET
  
+ 	acpi_backlight=	[HW,ACPI]
+ 			acpi_backlight=vendor
+ 			acpi_backlight=video
+ 			If set to vendor, prefer vendor specific driver
+ 			(e.g. thinkpad_acpi, sony_acpi, etc.) instead
+ 			of the ACPI video.ko driver.
+ 
+ 	acpi_display_output=	[HW,ACPI]
+ 			acpi_display_output=vendor
+ 			acpi_display_output=video
+ 			See above.
+ 
 -	acpi.debug_layer=	[HW,ACPI]
 +	acpi.debug_layer=	[HW,ACPI,ACPI_DEBUG]
 +	acpi.debug_level=	[HW,ACPI,ACPI_DEBUG]
  			Format: <int>
 -			Each bit of the <int> indicates an ACPI debug layer,
 -			1: enable, 0: disable. It is useful for boot time
 -			debugging. After system has booted up, it can be set
 -			via /sys/module/acpi/parameters/debug_layer.
 -			CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
 -			Available bits (add the numbers together) to enable debug output
 -			for specific parts of the ACPI subsystem:
 -			0x01 utilities 0x02 hardware 0x04 events 0x08 tables
 -			0x10 namespace 0x20 parser 0x40 dispatcher
 -			0x80 executer 0x100 resources 0x200 acpica debugger
 -			0x400 os services 0x800 acpica disassembler.
 -			The number can be in decimal or prefixed with 0x in hex.
 -			Warning: Many of these options can produce a lot of
 -			output and make your system unusable. Be very careful.
 -
 -	acpi.debug_level=	[HW,ACPI]
 -			Format: <int>
 -			Each bit of the <int> indicates an ACPI debug level,
 -			which corresponds to the level in an ACPI_DEBUG_PRINT
 -			statement.  After system has booted up, this mask
 -			can be set via /sys/module/acpi/parameters/debug_level.
 -
 -			CONFIG_ACPI_DEBUG must be enabled for this to produce
 -			any output.  The number can be in decimal or prefixed
 -			with 0x in hex.  Some of these options produce so much
 -			output that the system is unusable.
 -
 -			The following global components are defined by the
 -			ACPI CA:
 -			       0x01 error
 -			       0x02 warn
 -			       0x04 init
 -			       0x08 debug object
 -			       0x10 info
 -			       0x20 init names
 -			       0x40 parse
 -			       0x80 load
 -			      0x100 dispatch
 -			      0x200 execute
 -			      0x400 names
 -			      0x800 operation region
 -			     0x1000 bfield
 -			     0x2000 tables
 -			     0x4000 values
 -			     0x8000 objects
 -			    0x10000 resources
 -			    0x20000 user requests
 -			    0x40000 package
 - 			The number can be in decimal or prefixed with 0x in hex.
 - 			Warning: Many of these options can produce a lot of
 - 			output and make your system unusable. Be very careful.
 +			CONFIG_ACPI_DEBUG must be enabled to produce any ACPI
 +			debug output.  Bits in debug_layer correspond to a
 +			_COMPONENT in an ACPI source file, e.g.,
 +			    #define _COMPONENT ACPI_PCI_COMPONENT
 +			Bits in debug_level correspond to a level in
 +			ACPI_DEBUG_PRINT statements, e.g.,
 +			    ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
 +			See Documentation/acpi/debug.txt for more information
 +			about debug layers and levels.
 +
 +			Enable AML "Debug" output, i.e., stores to the Debug
 +			object while interpreting AML:
 +			    acpi.debug_layer=0xffffffff acpi.debug_level=0x2
 +			Enable PCI/PCI interrupt routing info messages:
 +			    acpi.debug_layer=0x400000 acpi.debug_level=0x4
 +			Enable all messages related to ACPI hardware:
 +			    acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
 +
 +			Some values produce so much output that the system is
 +			unusable.  The "log_buf_len" parameter may be useful
 +			if you need to capture more output.
  
   	acpi.power_nocheck=	[HW,ACPI]
   			Format: 1/0 enable/disable the check of power state.
diff --cc drivers/acpi/video_detect.c
index 000000000000,70b1e91ae2ab..f022eb6f5637
mode 000000,100644..100644
--- a/drivers/acpi/video_detect.c
+++ b/drivers/acpi/video_detect.c
@@@ -1,0 -1,268 +1,267 @@@
+ /*
+  *  Copyright (C) 2008       SuSE Linux Products GmbH
+  *                           Thomas Renninger <trenn@suse.de>
+  *
+  *  May be copied or modified under the terms of the GNU General Public License
+  *
+  * video_detect.c:
+  * Provides acpi_is_video_device() for early scanning of ACPI devices in scan.c
+  * There a Linux specific (Spec does not provide a HID for video devices) is
+  * assinged
+  *
+  * After PCI devices are glued with ACPI devices
+  * acpi_get_physical_pci_device() can be called to identify ACPI graphics
+  * devices for which a real graphics card is plugged in
+  *
+  * Now acpi_video_get_capabilities() can be called to check which
+  * capabilities the graphics cards plugged in support. The check for general
+  * video capabilities will be triggered by the first caller of
+  * acpi_video_get_capabilities(NULL); which will happen when the first
+  * backlight (or display output) switching supporting driver calls:
+  * acpi_video_backlight_support();
+  *
+  * Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B)
+  * are available, video.ko should be used to handle the device.
+  *
+  * Otherwise vendor specific drivers like thinkpad_acpi, asus_acpi,
+  * sony_acpi,... can take care about backlight brightness and display output
+  * switching.
+  *
+  * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
+  * this file will not be compiled, acpi_video_get_capabilities() and
+  * acpi_video_backlight_support() will always return 0 and vendor specific
+  * drivers always can handle backlight.
+  *
+  */
+ 
+ #include <linux/acpi.h>
+ #include <linux/dmi.h>
+ 
+ ACPI_MODULE_NAME("video");
 -#define ACPI_VIDEO_COMPONENT		0x08000000
+ #define _COMPONENT		ACPI_VIDEO_COMPONENT
+ 
+ static long acpi_video_support;
+ static bool acpi_video_caps_checked;
+ 
+ static acpi_status
+ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
+ 			  void **retyurn_value)
+ {
+ 	long *cap = context;
+ 	acpi_handle h_dummy;
+ 
+ 	if (ACPI_SUCCESS(acpi_get_handle(handle, "_BCM", &h_dummy)) &&
+ 	    ACPI_SUCCESS(acpi_get_handle(handle, "_BCL", &h_dummy))) {
+ 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
+ 				  "support\n"));
+ 		*cap |= ACPI_VIDEO_BACKLIGHT;
+ 		/* We have backlight support, no need to scan further */
+ 		return AE_CTRL_TERMINATE;
+ 	}
+ 	return 0;
+ }
+ 
+ /* Returns true if the device is a video device which can be handled by
+  * video.ko.
+  * The device will get a Linux specific CID added in scan.c to
+  * identify the device as an ACPI graphics device
+  * Be aware that the graphics device may not be physically present
+  * Use acpi_video_get_capabilities() to detect general ACPI video
+  * capabilities of present cards
+  */
+ long acpi_is_video_device(struct acpi_device *device)
+ {
+ 	acpi_handle h_dummy;
+ 	long video_caps = 0;
+ 
+ 	if (!device)
+ 		return 0;
+ 
+ 	/* Does this device able to support video switching ? */
+ 	if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) &&
+ 	    ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy)))
+ 		video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
+ 
+ 	/* Does this device able to retrieve a video ROM ? */
+ 	if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy)))
+ 		video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
+ 
+ 	/* Does this device able to configure which video head to be POSTed ? */
+ 	if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) &&
+ 	    ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) &&
+ 	    ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy)))
+ 		video_caps |= ACPI_VIDEO_DEVICE_POSTING;
+ 
+ 	/* Only check for backlight functionality if one of the above hit. */
+ 	if (video_caps)
+ 		acpi_walk_namespace(ACPI_TYPE_DEVICE, device->handle,
+ 				    ACPI_UINT32_MAX, acpi_backlight_cap_match,
+ 				    &video_caps, NULL);
+ 
+ 	return video_caps;
+ }
+ EXPORT_SYMBOL(acpi_is_video_device);
+ 
+ static acpi_status
+ find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+ 	long *cap = context;
+ 	struct device *dev;
+ 	struct acpi_device *acpi_dev;
+ 
+ 	const struct acpi_device_id video_ids[] = {
+ 		{ACPI_VIDEO_HID, 0},
+ 		{"", 0},
+ 	};
+ 	if (acpi_bus_get_device(handle, &acpi_dev))
+ 		return AE_OK;
+ 
+ 	if (!acpi_match_device_ids(acpi_dev, video_ids)) {
+ 		dev = acpi_get_physical_pci_device(handle);
+ 		if (!dev)
+ 			return AE_OK;
+ 		put_device(dev);
+ 		*cap |= acpi_is_video_device(acpi_dev);
+ 	}
+ 	return AE_OK;
+ }
+ 
+ /*
+  * Returns the video capabilities of a specific ACPI graphics device
+  *
+  * if NULL is passed as argument all ACPI devices are enumerated and
+  * all graphics capabilities of physically present devices are
+  * summerized and returned. This is cached and done only once.
+  */
+ long acpi_video_get_capabilities(acpi_handle graphics_handle)
+ {
+ 	long caps = 0;
+ 	struct acpi_device *tmp_dev;
+ 	acpi_status status;
+ 
+ 	if (acpi_video_caps_checked && graphics_handle == NULL)
+ 		return acpi_video_support;
+ 
+ 	if (!graphics_handle) {
+ 		/* Only do the global walk through all graphics devices once */
+ 		acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+ 				    ACPI_UINT32_MAX, find_video,
+ 				    &caps, NULL);
+ 		/* There might be boot param flags set already... */
+ 		acpi_video_support |= caps;
+ 		acpi_video_caps_checked = 1;
+ 		/* Add blacklists here. Be careful to use the right *DMI* bits
+ 		 * to still be able to override logic via boot params, e.g.:
+ 		 *
+ 		 *   if (dmi_name_in_vendors("XY")) {
+ 		 *	acpi_video_support |=
+ 		 *		ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR;
+ 		 *	acpi_video_support |=
+ 		 *		ACPI_VIDEO_BACKLIGHT_DMI_VENDOR;
+ 		 *}
+ 		 */
+ 	} else {
+ 		status = acpi_bus_get_device(graphics_handle, &tmp_dev);
+ 		if (ACPI_FAILURE(status)) {
+ 			ACPI_EXCEPTION((AE_INFO, status, "Invalid device"));
+ 			return 0;
+ 		}
+ 		acpi_walk_namespace(ACPI_TYPE_DEVICE, graphics_handle,
+ 				    ACPI_UINT32_MAX, find_video,
+ 				    &caps, NULL);
+ 	}
+ 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "We have 0x%lX video support %s %s\n",
+ 			  graphics_handle ? caps : acpi_video_support,
+ 			  graphics_handle ? "on device " : "in general",
+ 			  graphics_handle ? acpi_device_bid(tmp_dev) : ""));
+ 	return caps;
+ }
+ EXPORT_SYMBOL(acpi_video_get_capabilities);
+ 
+ /* Returns true if video.ko can do backlight switching */
+ int acpi_video_backlight_support(void)
+ {
+ 	/*
+ 	 * We must check whether the ACPI graphics device is physically plugged
+ 	 * in. Therefore this must be called after binding PCI and ACPI devices
+ 	 */
+ 	if (!acpi_video_caps_checked)
+ 		acpi_video_get_capabilities(NULL);
+ 
+ 	/* First check for boot param -> highest prio */
+ 	if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR)
+ 		return 0;
+ 	else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO)
+ 		return 1;
+ 
+ 	/* Then check for DMI blacklist -> second highest prio */
+ 	if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VENDOR)
+ 		return 0;
+ 	else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VIDEO)
+ 		return 1;
+ 
+ 	/* Then go the default way */
+ 	return acpi_video_support & ACPI_VIDEO_BACKLIGHT;
+ }
+ EXPORT_SYMBOL(acpi_video_backlight_support);
+ 
+ /*
+  * Returns true if video.ko can do display output switching.
+  * This does not work well/at all with binary graphics drivers
+  * which disable system io ranges and do it on their own.
+  */
+ int acpi_video_display_switch_support(void)
+ {
+ 	if (!acpi_video_caps_checked)
+ 		acpi_video_get_capabilities(NULL);
+ 
+ 	if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR)
+ 		return 0;
+ 	else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO)
+ 		return 1;
+ 
+ 	if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR)
+ 		return 0;
+ 	else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO)
+ 		return 1;
+ 
+ 	return acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING;
+ }
+ EXPORT_SYMBOL(acpi_video_display_switch_support);
+ 
+ /*
+  * Use acpi_display_output=vendor/video or acpi_backlight=vendor/video
+  * To force that backlight or display output switching is processed by vendor
+  * specific acpi drivers or video.ko driver.
+  */
+ int __init acpi_backlight(char *str)
+ {
+ 	if (str == NULL || *str == '\0')
+ 		return 1;
+ 	else {
+ 		if (!strcmp("vendor", str))
+ 			acpi_video_support |=
+ 				ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR;
+ 		if (!strcmp("video", str))
+ 			acpi_video_support |=
+ 				ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO;
+ 	}
+ 	return 1;
+ }
+ __setup("acpi_backlight=", acpi_backlight);
+ 
+ int __init acpi_display_output(char *str)
+ {
+ 	if (str == NULL || *str == '\0')
+ 		return 1;
+ 	else {
+ 		if (!strcmp("vendor", str))
+ 			acpi_video_support |=
+ 				ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR;
+ 		if (!strcmp("video", str))
+ 			acpi_video_support |=
+ 				ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO;
+ 	}
+ 	return 1;
+ }
+ __setup("acpi_display_output=", acpi_display_output);