Merge branch 'acpi-video'
* acpi-video: (38 commits) ACPI / video: Make acpi_video_unregister_backlight() private acpi-video-detect: Remove old API toshiba-acpi: Port to new backlight interface selection API thinkpad-acpi: Port to new backlight interface selection API sony-laptop: Port to new backlight interface selection API samsung-laptop: Port to new backlight interface selection API msi-wmi: Port to new backlight interface selection API msi-laptop: Port to new backlight interface selection API intel-oaktrail: Port to new backlight interface selection API ideapad-laptop: Port to new backlight interface selection API fujitsu-laptop: Port to new backlight interface selection API eeepc-laptop: Port to new backlight interface selection API dell-wmi: Port to new backlight interface selection API dell-laptop: Port to new backlight interface selection API compal-laptop: Port to new backlight interface selection API asus-wmi: Port to new backlight interface selection API asus-laptop: Port to new backlight interface selection API apple-gmux: Port to new backlight interface selection API acer-wmi: Port to new backlight interface selection API ACPI / video: Fix acpi_video _register vs _unregister_backlight race ...
This commit is contained in:
commit
4def8a360f
28 changed files with 442 additions and 562 deletions
|
|
@ -52,9 +52,6 @@ acpi-$(CONFIG_X86) += acpi_cmos_rtc.o
|
|||
acpi-$(CONFIG_DEBUG_FS) += debugfs.o
|
||||
acpi-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
|
||||
ifdef CONFIG_ACPI_VIDEO
|
||||
acpi-y += video_detect.o
|
||||
endif
|
||||
acpi-y += acpi_lpat.o
|
||||
acpi-$(CONFIG_ACPI_GENERIC_GSI) += gsi.o
|
||||
|
||||
|
|
@ -95,3 +92,5 @@ obj-$(CONFIG_ACPI_EXTLOG) += acpi_extlog.o
|
|||
obj-$(CONFIG_PMIC_OPREGION) += pmic/intel_pmic.o
|
||||
obj-$(CONFIG_CRC_PMIC_OPREGION) += pmic/intel_pmic_crc.o
|
||||
obj-$(CONFIG_XPOWER_PMIC_OPREGION) += pmic/intel_pmic_xpower.o
|
||||
|
||||
video-objs += acpi_video.o video_detect.o
|
||||
|
|
|
|||
2060
drivers/acpi/acpi_video.c
Normal file
2060
drivers/acpi/acpi_video.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -183,13 +183,6 @@ static inline int suspend_nvs_save(void) { return 0; }
|
|||
static inline void suspend_nvs_restore(void) {}
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Video
|
||||
-------------------------------------------------------------------------- */
|
||||
#if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)
|
||||
bool acpi_osi_is_win8(void);
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Device properties
|
||||
-------------------------------------------------------------------------- */
|
||||
|
|
|
|||
|
|
@ -1680,6 +1680,12 @@ int acpi_resources_are_enforced(void)
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_resources_are_enforced);
|
||||
|
||||
bool acpi_osi_is_win8(void)
|
||||
{
|
||||
return acpi_gbl_osi_data >= ACPI_OSI_WIN_8;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_osi_is_win8);
|
||||
|
||||
/*
|
||||
* Deallocate the memory for a spinlock.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1935,6 +1935,62 @@ bool acpi_dock_match(acpi_handle handle)
|
|||
return acpi_has_method(handle, "_DCK");
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
|
||||
void **return_value)
|
||||
{
|
||||
long *cap = context;
|
||||
|
||||
if (acpi_has_method(handle, "_BCM") &&
|
||||
acpi_has_method(handle, "_BCL")) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
|
||||
"support\n"));
|
||||
*cap |= ACPI_VIDEO_BACKLIGHT;
|
||||
if (!acpi_has_method(handle, "_BQC"))
|
||||
printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, "
|
||||
"cannot determine initial brightness\n");
|
||||
/* We have backlight support, no need to scan further */
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns true if the ACPI object 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(acpi_handle handle)
|
||||
{
|
||||
long video_caps = 0;
|
||||
|
||||
/* Is this device able to support video switching ? */
|
||||
if (acpi_has_method(handle, "_DOD") || acpi_has_method(handle, "_DOS"))
|
||||
video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
|
||||
|
||||
/* Is this device able to retrieve a video ROM ? */
|
||||
if (acpi_has_method(handle, "_ROM"))
|
||||
video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
|
||||
|
||||
/* Is this device able to configure which video head to be POSTed ? */
|
||||
if (acpi_has_method(handle, "_VPO") &&
|
||||
acpi_has_method(handle, "_GPD") &&
|
||||
acpi_has_method(handle, "_SPD"))
|
||||
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, handle,
|
||||
ACPI_UINT32_MAX, acpi_backlight_cap_match, NULL,
|
||||
&video_caps, NULL);
|
||||
|
||||
return video_caps;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_is_video_device);
|
||||
|
||||
const char *acpi_device_hid(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_hardware_id *hid;
|
||||
|
|
|
|||
|
|
@ -712,3 +712,18 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
|
|||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_check_dsm);
|
||||
|
||||
/*
|
||||
* acpi_backlight= handling, this is done here rather then in video_detect.c
|
||||
* because __setup cannot be used in modules.
|
||||
*/
|
||||
char acpi_video_backlight_string[16];
|
||||
EXPORT_SYMBOL(acpi_video_backlight_string);
|
||||
|
||||
static int __init acpi_backlight(char *str)
|
||||
{
|
||||
strlcpy(acpi_video_backlight_string, str,
|
||||
sizeof(acpi_video_backlight_string));
|
||||
return 1;
|
||||
}
|
||||
__setup("acpi_backlight=", acpi_backlight);
|
||||
|
|
|
|||
|
|
@ -1,107 +1,62 @@
|
|||
/*
|
||||
* Copyright (C) 2015 Red Hat Inc.
|
||||
* Hans de Goede <hdegoede@redhat.com>
|
||||
* 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
|
||||
* assigned
|
||||
*
|
||||
* After PCI devices are glued with ACPI devices
|
||||
* acpi_get_pci_dev() 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 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-laptop,
|
||||
* sony_acpi,... can take care about backlight brightness.
|
||||
*
|
||||
* 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.
|
||||
* Backlight drivers can use acpi_video_get_backlight_type() to determine
|
||||
* which driver should handle the backlight.
|
||||
*
|
||||
* If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
|
||||
* this file will not be compiled and acpi_video_get_backlight_type() will
|
||||
* always return acpi_backlight_vendor.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <linux/types.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
ACPI_MODULE_NAME("video");
|
||||
#define _COMPONENT ACPI_VIDEO_COMPONENT
|
||||
|
||||
static long acpi_video_support;
|
||||
static bool acpi_video_caps_checked;
|
||||
void acpi_video_unregister_backlight(void);
|
||||
|
||||
static acpi_status
|
||||
acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
|
||||
void **return_value)
|
||||
static bool backlight_notifier_registered;
|
||||
static struct notifier_block backlight_nb;
|
||||
|
||||
static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
|
||||
static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
|
||||
|
||||
static void acpi_video_parse_cmdline(void)
|
||||
{
|
||||
long *cap = context;
|
||||
|
||||
if (acpi_has_method(handle, "_BCM") &&
|
||||
acpi_has_method(handle, "_BCL")) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
|
||||
"support\n"));
|
||||
*cap |= ACPI_VIDEO_BACKLIGHT;
|
||||
if (!acpi_has_method(handle, "_BQC"))
|
||||
printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, "
|
||||
"cannot determine initial brightness\n");
|
||||
/* We have backlight support, no need to scan further */
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return 0;
|
||||
if (!strcmp("vendor", acpi_video_backlight_string))
|
||||
acpi_backlight_cmdline = acpi_backlight_vendor;
|
||||
if (!strcmp("video", acpi_video_backlight_string))
|
||||
acpi_backlight_cmdline = acpi_backlight_video;
|
||||
if (!strcmp("native", acpi_video_backlight_string))
|
||||
acpi_backlight_cmdline = acpi_backlight_native;
|
||||
if (!strcmp("none", acpi_video_backlight_string))
|
||||
acpi_backlight_cmdline = acpi_backlight_none;
|
||||
}
|
||||
|
||||
/* Returns true if the ACPI object 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(acpi_handle handle)
|
||||
{
|
||||
long video_caps = 0;
|
||||
|
||||
/* Is this device able to support video switching ? */
|
||||
if (acpi_has_method(handle, "_DOD") || acpi_has_method(handle, "_DOS"))
|
||||
video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
|
||||
|
||||
/* Is this device able to retrieve a video ROM ? */
|
||||
if (acpi_has_method(handle, "_ROM"))
|
||||
video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
|
||||
|
||||
/* Is this device able to configure which video head to be POSTed ? */
|
||||
if (acpi_has_method(handle, "_VPO") &&
|
||||
acpi_has_method(handle, "_GPD") &&
|
||||
acpi_has_method(handle, "_SPD"))
|
||||
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, handle,
|
||||
ACPI_UINT32_MAX, acpi_backlight_cap_match, NULL,
|
||||
&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)
|
||||
{
|
||||
|
|
@ -109,7 +64,7 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
struct pci_dev *dev;
|
||||
struct acpi_device *acpi_dev;
|
||||
|
||||
const struct acpi_device_id video_ids[] = {
|
||||
static const struct acpi_device_id video_ids[] = {
|
||||
{ACPI_VIDEO_HID, 0},
|
||||
{"", 0},
|
||||
};
|
||||
|
|
@ -130,11 +85,23 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
* buggy */
|
||||
static int video_detect_force_vendor(const struct dmi_system_id *d)
|
||||
{
|
||||
acpi_video_support |= ACPI_VIDEO_BACKLIGHT_DMI_VENDOR;
|
||||
acpi_backlight_dmi = acpi_backlight_vendor;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id video_detect_dmi_table[] = {
|
||||
static int video_detect_force_video(const struct dmi_system_id *d)
|
||||
{
|
||||
acpi_backlight_dmi = acpi_backlight_video;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int video_detect_force_native(const struct dmi_system_id *d)
|
||||
{
|
||||
acpi_backlight_dmi = acpi_backlight_native;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const 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
|
||||
|
|
@ -174,137 +141,209 @@ static struct dmi_system_id video_detect_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5737"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* These models have a working acpi_video backlight control, and using
|
||||
* native backlight causes a regression where backlight does not work
|
||||
* when userspace is not handling brightness key events. Disable
|
||||
* native_backlight on these to fix this:
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=81691
|
||||
*/
|
||||
{
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "ThinkPad T420",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "ThinkPad T520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "ThinkPad X201s",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
|
||||
},
|
||||
},
|
||||
|
||||
/* The native backlight controls do not work on some older machines */
|
||||
{
|
||||
/* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "HP ENVY 15 Notebook",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "SAMSUNG 870Z5E/880Z5E/680Z5E",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,
|
||||
"370R4E/370R4V/370R5E/3570RE/370R5V"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "SAMSUNG 3570R/370R/470R/450R/510R/4450RV",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,
|
||||
"3570R/370R/470R/450R/510R/4450RV"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "SAMSUNG 730U3E/740U3E",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,
|
||||
"900X3C/900X3D/900X3E/900X4C/900X4D"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "Dell XPS15 L521X",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
|
||||
},
|
||||
},
|
||||
|
||||
/* Non win8 machines which need native backlight nevertheless */
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
|
||||
.callback = video_detect_force_native,
|
||||
.ident = "Lenovo Ideapad Z570",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
|
||||
.callback = video_detect_force_native,
|
||||
.ident = "Apple MacBook Pro 12,1",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
|
||||
},
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
/*
|
||||
* 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
|
||||
* summarized and returned. This is cached and done only once.
|
||||
*/
|
||||
long acpi_video_get_capabilities(acpi_handle graphics_handle)
|
||||
static int acpi_video_backlight_notify(struct notifier_block *nb,
|
||||
unsigned long val, void *bd)
|
||||
{
|
||||
long caps = 0;
|
||||
struct acpi_device *tmp_dev;
|
||||
acpi_status status;
|
||||
struct backlight_device *backlight = bd;
|
||||
|
||||
if (acpi_video_caps_checked && graphics_handle == NULL)
|
||||
return acpi_video_support;
|
||||
/* A raw bl registering may change video -> native */
|
||||
if (backlight->props.type == BACKLIGHT_RAW &&
|
||||
val == BACKLIGHT_REGISTERED &&
|
||||
acpi_video_get_backlight_type() != acpi_backlight_video)
|
||||
acpi_video_unregister_backlight();
|
||||
|
||||
if (!graphics_handle) {
|
||||
/* Only do the global walk through all graphics devices once */
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine which type of backlight interface to use on this system,
|
||||
* First check cmdline, then dmi quirks, then do autodetect.
|
||||
*
|
||||
* The autodetect order is:
|
||||
* 1) Is the acpi-video backlight interface supported ->
|
||||
* no, use a vendor interface
|
||||
* 2) Is this a win8 "ready" BIOS and do we have a native interface ->
|
||||
* yes, use a native interface
|
||||
* 3) Else use the acpi-video interface
|
||||
*
|
||||
* Arguably the native on win8 check should be done first, but that would
|
||||
* be a behavior change, which may causes issues.
|
||||
*/
|
||||
enum acpi_backlight_type acpi_video_get_backlight_type(void)
|
||||
{
|
||||
static DEFINE_MUTEX(init_mutex);
|
||||
static bool init_done;
|
||||
static long video_caps;
|
||||
|
||||
/* Parse cmdline, dmi and acpi only once */
|
||||
mutex_lock(&init_mutex);
|
||||
if (!init_done) {
|
||||
acpi_video_parse_cmdline();
|
||||
dmi_check_system(video_detect_dmi_table);
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_video, NULL,
|
||||
&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_BACKLIGHT_DMI_VENDOR;
|
||||
*}
|
||||
*/
|
||||
|
||||
dmi_check_system(video_detect_dmi_table);
|
||||
} 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, NULL,
|
||||
&caps, NULL);
|
||||
&video_caps, NULL);
|
||||
backlight_nb.notifier_call = acpi_video_backlight_notify;
|
||||
backlight_nb.priority = 0;
|
||||
if (backlight_register_notifier(&backlight_nb) == 0)
|
||||
backlight_notifier_registered = true;
|
||||
init_done = true;
|
||||
}
|
||||
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;
|
||||
mutex_unlock(&init_mutex);
|
||||
|
||||
if (acpi_backlight_cmdline != acpi_backlight_undef)
|
||||
return acpi_backlight_cmdline;
|
||||
|
||||
if (acpi_backlight_dmi != acpi_backlight_undef)
|
||||
return acpi_backlight_dmi;
|
||||
|
||||
if (!(video_caps & ACPI_VIDEO_BACKLIGHT))
|
||||
return acpi_backlight_vendor;
|
||||
|
||||
if (acpi_osi_is_win8() && backlight_device_registered(BACKLIGHT_RAW))
|
||||
return acpi_backlight_native;
|
||||
|
||||
return acpi_backlight_video;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_get_capabilities);
|
||||
|
||||
static void acpi_video_caps_check(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);
|
||||
}
|
||||
|
||||
bool acpi_osi_is_win8(void)
|
||||
{
|
||||
return acpi_gbl_osi_data >= ACPI_OSI_WIN_8;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_osi_is_win8);
|
||||
|
||||
/* 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)
|
||||
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);
|
||||
EXPORT_SYMBOL(acpi_video_get_backlight_type);
|
||||
|
||||
/*
|
||||
* Use acpi_backlight=vendor/video to force that backlight switching
|
||||
* is processed by vendor specific acpi drivers or video.ko driver.
|
||||
* Set the preferred backlight interface type based on DMI info.
|
||||
* This function allows DMI blacklists to be implemented by external
|
||||
* platform drivers instead of putting a big blacklist in video_detect.c
|
||||
*/
|
||||
static int __init acpi_backlight(char *str)
|
||||
void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type)
|
||||
{
|
||||
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_BACKLIGHT_FORCE_VIDEO;
|
||||
}
|
||||
return 1;
|
||||
acpi_backlight_dmi = type;
|
||||
/* Remove acpi-video backlight interface if it is no longer desired */
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_video)
|
||||
acpi_video_unregister_backlight();
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_set_dmi_backlight_type);
|
||||
|
||||
void __exit acpi_video_detect_exit(void)
|
||||
{
|
||||
if (backlight_notifier_registered)
|
||||
backlight_unregister_notifier(&backlight_nb);
|
||||
}
|
||||
__setup("acpi_backlight=", acpi_backlight);
|
||||
|
|
|
|||
|
|
@ -396,16 +396,6 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the vendor backlight interface is not in use and ACPI backlight interface
|
||||
* is broken, do not bother processing backlight change requests from firmware.
|
||||
*/
|
||||
static bool should_ignore_backlight_request(void)
|
||||
{
|
||||
return acpi_video_backlight_support() &&
|
||||
!acpi_video_verify_backlight_support();
|
||||
}
|
||||
|
||||
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
|
@ -414,7 +404,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
|||
|
||||
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
|
||||
|
||||
if (should_ignore_backlight_request()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_native) {
|
||||
DRM_DEBUG_KMS("opregion backlight request ignored\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,9 +71,10 @@ config ASUS_LAPTOP
|
|||
depends on ACPI
|
||||
select LEDS_CLASS
|
||||
select NEW_LEDS
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on INPUT
|
||||
depends on RFKILL || RFKILL = n
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
select INPUT_SPARSEKMAP
|
||||
select INPUT_POLLDEV
|
||||
---help---
|
||||
|
|
@ -95,6 +96,7 @@ config DELL_LAPTOP
|
|||
depends on X86
|
||||
depends on DCDBAS
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on RFKILL || RFKILL = n
|
||||
depends on SERIO_I8042
|
||||
select POWER_SUPPLY
|
||||
|
|
@ -109,6 +111,7 @@ config DELL_WMI
|
|||
tristate "Dell WMI extras"
|
||||
depends on ACPI_WMI
|
||||
depends on INPUT
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
select INPUT_SPARSEKMAP
|
||||
---help---
|
||||
Say Y here if you want to support WMI-based hotkeys on Dell laptops.
|
||||
|
|
@ -144,6 +147,7 @@ config FUJITSU_LAPTOP
|
|||
depends on ACPI
|
||||
depends on INPUT
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on LEDS_CLASS || LEDS_CLASS=n
|
||||
---help---
|
||||
This is a driver for laptops built by Fujitsu:
|
||||
|
|
@ -247,6 +251,7 @@ config MSI_LAPTOP
|
|||
tristate "MSI Laptop Extras"
|
||||
depends on ACPI
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on RFKILL
|
||||
depends on INPUT && SERIO_I8042
|
||||
select INPUT_SPARSEKMAP
|
||||
|
|
@ -280,6 +285,7 @@ config COMPAL_LAPTOP
|
|||
tristate "Compal (and others) Laptop Extras"
|
||||
depends on ACPI
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on RFKILL
|
||||
depends on HWMON
|
||||
depends on POWER_SUPPLY
|
||||
|
|
@ -296,7 +302,8 @@ config COMPAL_LAPTOP
|
|||
config SONY_LAPTOP
|
||||
tristate "Sony Laptop Extras"
|
||||
depends on ACPI
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on INPUT
|
||||
depends on RFKILL
|
||||
---help---
|
||||
|
|
@ -321,6 +328,7 @@ config IDEAPAD_LAPTOP
|
|||
depends on RFKILL && INPUT
|
||||
depends on SERIO_I8042
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
select INPUT_SPARSEKMAP
|
||||
help
|
||||
This is a driver for Lenovo IdeaPad netbooks contains drivers for
|
||||
|
|
@ -331,8 +339,8 @@ config THINKPAD_ACPI
|
|||
depends on ACPI
|
||||
depends on INPUT
|
||||
depends on RFKILL || RFKILL = n
|
||||
select BACKLIGHT_LCD_SUPPORT
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
select HWMON
|
||||
select NVRAM
|
||||
select NEW_LEDS
|
||||
|
|
@ -500,8 +508,9 @@ config EEEPC_LAPTOP
|
|||
depends on ACPI
|
||||
depends on INPUT
|
||||
depends on RFKILL || RFKILL = n
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on HOTPLUG_PCI
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
select HWMON
|
||||
select LEDS_CLASS
|
||||
select NEW_LEDS
|
||||
|
|
@ -587,6 +596,7 @@ config MSI_WMI
|
|||
depends on ACPI_WMI
|
||||
depends on INPUT
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
select INPUT_SPARSEKMAP
|
||||
help
|
||||
Say Y here if you want to support WMI-based hotkeys on MSI laptops.
|
||||
|
|
@ -824,6 +834,7 @@ config MXM_WMI
|
|||
config INTEL_OAKTRAIL
|
||||
tristate "Intel Oaktrail Platform Extras"
|
||||
depends on ACPI
|
||||
depends on ACPI_VIDEO || ACPI_VIDEO = n
|
||||
depends on RFKILL && BACKLIGHT_CLASS_DEVICE && ACPI
|
||||
---help---
|
||||
Intel Oaktrail platform need this driver to provide interfaces to
|
||||
|
|
|
|||
|
|
@ -2246,14 +2246,10 @@ static int __init acer_wmi_init(void)
|
|||
set_quirks();
|
||||
|
||||
if (dmi_check_system(video_vendor_dmi_table))
|
||||
acpi_video_dmi_promote_vendor();
|
||||
if (acpi_video_backlight_support()) {
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
|
||||
interface->capability &= ~ACER_CAP_BRIGHTNESS;
|
||||
pr_info("Brightness must be controlled by acpi video driver\n");
|
||||
} else {
|
||||
pr_info("Disabling ACPI video driver\n");
|
||||
acpi_video_unregister_backlight();
|
||||
}
|
||||
|
||||
if (wmi_has_guid(WMID_GUID3)) {
|
||||
if (ec_raw_mode) {
|
||||
|
|
|
|||
|
|
@ -550,8 +550,7 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
|
|||
* backlight control and supports more levels than other options.
|
||||
* Disable the other backlight choices.
|
||||
*/
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_unregister();
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
apple_bl_unregister();
|
||||
|
||||
gmux_data->power_state = VGA_SWITCHEROO_ON;
|
||||
|
|
@ -645,7 +644,6 @@ static void gmux_remove(struct pnp_dev *pnp)
|
|||
apple_gmux_data = NULL;
|
||||
kfree(gmux_data);
|
||||
|
||||
acpi_video_dmi_demote_vendor();
|
||||
acpi_video_register();
|
||||
apple_bl_register();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define ASUS_LAPTOP_VERSION "0.42"
|
||||
|
||||
|
|
@ -1884,12 +1885,11 @@ static int asus_acpi_add(struct acpi_device *device)
|
|||
if (result)
|
||||
goto fail_platform;
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
result = asus_backlight_init(asus);
|
||||
if (result)
|
||||
goto fail_backlight;
|
||||
} else
|
||||
pr_info("Backlight controlled by ACPI video driver\n");
|
||||
}
|
||||
|
||||
result = asus_input_init(asus);
|
||||
if (result)
|
||||
|
|
|
|||
|
|
@ -1364,7 +1364,7 @@ static void asus_wmi_notify(u32 value, void *context)
|
|||
code = ASUS_WMI_BRN_DOWN;
|
||||
|
||||
if (code == ASUS_WMI_BRN_DOWN || code == ASUS_WMI_BRN_UP) {
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
asus_wmi_backlight_notify(asus, orig_code);
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -1772,17 +1772,16 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|||
stop this from showing up */
|
||||
chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
|
||||
if (chassis_type && !strcmp(chassis_type, "3"))
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
|
||||
if (asus->driver->quirks->wmi_backlight_power)
|
||||
acpi_video_dmi_promote_vendor();
|
||||
if (!acpi_video_backlight_support()) {
|
||||
pr_info("Disabling ACPI video driver\n");
|
||||
acpi_video_unregister();
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
err = asus_wmi_backlight_init(asus);
|
||||
if (err && err != -ENODEV)
|
||||
goto fail_backlight;
|
||||
} else
|
||||
pr_info("Backlight controlled by ACPI video driver\n");
|
||||
}
|
||||
|
||||
status = wmi_install_notify_handler(asus->driver->event_guid,
|
||||
asus_wmi_notify, asus);
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@
|
|||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <acpi/video.h>
|
||||
|
||||
/* ======= */
|
||||
/* Defines */
|
||||
|
|
@ -959,7 +959,7 @@ static int __init compal_init(void)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
struct backlight_properties props;
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <acpi/video.h>
|
||||
#include "../../firmware/dcdbas.h"
|
||||
|
||||
#define BRIGHTNESS_TOKEN 0x7d
|
||||
|
|
@ -1920,13 +1921,8 @@ static int __init dell_init(void)
|
|||
debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL,
|
||||
&dell_debugfs_fops);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
/* In the event of an ACPI backlight being available, don't
|
||||
* register the platform controller.
|
||||
*/
|
||||
if (acpi_video_backlight_support())
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
get_buffer();
|
||||
buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN);
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
|
||||
MODULE_DESCRIPTION("Dell laptop WMI hotkeys driver");
|
||||
|
|
@ -397,7 +398,7 @@ static int __init dell_wmi_init(void)
|
|||
}
|
||||
|
||||
dmi_walk(find_hk_type, NULL);
|
||||
acpi_video = acpi_video_backlight_support();
|
||||
acpi_video = acpi_video_get_backlight_type() != acpi_backlight_vendor;
|
||||
|
||||
err = dell_wmi_input_setup();
|
||||
if (err)
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define EEEPC_LAPTOP_VERSION "0.1"
|
||||
#define EEEPC_LAPTOP_NAME "Eee PC Hotkey Driver"
|
||||
|
|
@ -1433,12 +1434,10 @@ static int eeepc_acpi_add(struct acpi_device *device)
|
|||
if (result)
|
||||
goto fail_platform;
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
result = eeepc_backlight_init(eeepc);
|
||||
if (result)
|
||||
goto fail_backlight;
|
||||
} else {
|
||||
pr_info("Backlight controlled by ACPI video driver\n");
|
||||
}
|
||||
|
||||
result = eeepc_input_init(eeepc);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
|
||||
#include <linux/leds.h>
|
||||
#endif
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define FUJITSU_DRIVER_VERSION "0.6.0"
|
||||
|
||||
|
|
@ -1099,7 +1100,7 @@ static int __init fujitsu_init(void)
|
|||
|
||||
/* Register backlight stuff */
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
struct backlight_properties props;
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
|
|
@ -1137,8 +1138,7 @@ static int __init fujitsu_init(void)
|
|||
}
|
||||
|
||||
/* Sync backlight power status (needs FUJ02E3 device, hence deferred) */
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
if (call_fext_func(FUNC_BACKLIGHT, 0x2, 0x4, 0x0) == 3)
|
||||
fujitsu->bl_device->props.power = FB_BLANK_POWERDOWN;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include <linux/i8042.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/device.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define IDEAPAD_RFKILL_DEV_NUM (3)
|
||||
|
||||
|
|
@ -903,7 +904,7 @@ static int ideapad_acpi_add(struct platform_device *pdev)
|
|||
ideapad_sync_rfk_state(priv);
|
||||
ideapad_sync_touchpad_state(priv);
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
ret = ideapad_backlight_init(priv);
|
||||
if (ret && ret != -ENODEV)
|
||||
goto backlight_failed;
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/rfkill.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define DRIVER_NAME "intel_oaktrail"
|
||||
#define DRIVER_VERSION "0.4ac1"
|
||||
|
|
@ -343,13 +344,11 @@ static int __init oaktrail_init(void)
|
|||
goto err_device_add;
|
||||
}
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
ret = oaktrail_backlight_init();
|
||||
if (ret)
|
||||
goto err_backlight;
|
||||
|
||||
} else
|
||||
pr_info("Backlight controlled by ACPI video driver\n");
|
||||
}
|
||||
|
||||
ret = oaktrail_rfkill_init();
|
||||
if (ret) {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue