mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-13 14:04:05 +08:00
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
@ -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
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include <acpi/video.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "internal.h"
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
#define ACPI_VIDEO_BUS_NAME "Video Bus"
|
||||
#define ACPI_VIDEO_DEVICE_NAME "Video Device"
|
||||
@ -78,26 +78,17 @@ module_param(brightness_switch_enabled, bool, 0644);
|
||||
static bool allow_duplicates;
|
||||
module_param(allow_duplicates, bool, 0644);
|
||||
|
||||
/*
|
||||
* For Windows 8 systems: used to decide if video module
|
||||
* should skip registering backlight interface of its own.
|
||||
*/
|
||||
enum {
|
||||
NATIVE_BACKLIGHT_NOT_SET = -1,
|
||||
NATIVE_BACKLIGHT_OFF,
|
||||
NATIVE_BACKLIGHT_ON,
|
||||
};
|
||||
|
||||
static int use_native_backlight_param = NATIVE_BACKLIGHT_NOT_SET;
|
||||
module_param_named(use_native_backlight, use_native_backlight_param, int, 0444);
|
||||
static int use_native_backlight_dmi = NATIVE_BACKLIGHT_NOT_SET;
|
||||
static int disable_backlight_sysfs_if = -1;
|
||||
module_param(disable_backlight_sysfs_if, int, 0444);
|
||||
|
||||
static int register_count;
|
||||
static DEFINE_MUTEX(register_count_mutex);
|
||||
static struct mutex video_list_lock;
|
||||
static struct list_head video_bus_head;
|
||||
static int acpi_video_bus_add(struct acpi_device *device);
|
||||
static int acpi_video_bus_remove(struct acpi_device *device);
|
||||
static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
|
||||
void acpi_video_detect_exit(void);
|
||||
|
||||
static const struct acpi_device_id video_device_ids[] = {
|
||||
{ACPI_VIDEO_HID, 0},
|
||||
@ -157,7 +148,6 @@ struct acpi_video_enumerated_device {
|
||||
struct acpi_video_bus {
|
||||
struct acpi_device *device;
|
||||
bool backlight_registered;
|
||||
bool backlight_notifier_registered;
|
||||
u8 dos_setting;
|
||||
struct acpi_video_enumerated_device *attached_array;
|
||||
u8 attached_count;
|
||||
@ -170,7 +160,6 @@ struct acpi_video_bus {
|
||||
struct input_dev *input;
|
||||
char phys[32]; /* for input device */
|
||||
struct notifier_block pm_nb;
|
||||
struct notifier_block backlight_nb;
|
||||
};
|
||||
|
||||
struct acpi_video_device_flags {
|
||||
@ -241,24 +230,6 @@ static int acpi_video_get_next_level(struct acpi_video_device *device,
|
||||
u32 level_current, u32 event);
|
||||
static void acpi_video_switch_brightness(struct work_struct *work);
|
||||
|
||||
static bool acpi_video_use_native_backlight(void)
|
||||
{
|
||||
if (use_native_backlight_param != NATIVE_BACKLIGHT_NOT_SET)
|
||||
return use_native_backlight_param;
|
||||
else if (use_native_backlight_dmi != NATIVE_BACKLIGHT_NOT_SET)
|
||||
return use_native_backlight_dmi;
|
||||
return acpi_osi_is_win8();
|
||||
}
|
||||
|
||||
bool acpi_video_verify_backlight_support(void)
|
||||
{
|
||||
if (acpi_video_use_native_backlight() &&
|
||||
backlight_device_registered(BACKLIGHT_RAW))
|
||||
return false;
|
||||
return acpi_video_backlight_support();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_video_verify_backlight_support);
|
||||
|
||||
/* backlight device sysfs support */
|
||||
static int acpi_video_get_brightness(struct backlight_device *bd)
|
||||
{
|
||||
@ -413,25 +384,21 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
|
||||
*/
|
||||
|
||||
static int bqc_offset_aml_bug_workaround;
|
||||
static int __init video_set_bqc_offset(const struct dmi_system_id *d)
|
||||
static int video_set_bqc_offset(const struct dmi_system_id *d)
|
||||
{
|
||||
bqc_offset_aml_bug_workaround = 9;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init video_disable_native_backlight(const struct dmi_system_id *d)
|
||||
static int video_disable_backlight_sysfs_if(
|
||||
const struct dmi_system_id *d)
|
||||
{
|
||||
use_native_backlight_dmi = NATIVE_BACKLIGHT_OFF;
|
||||
if (disable_backlight_sysfs_if == -1)
|
||||
disable_backlight_sysfs_if = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init video_enable_native_backlight(const struct dmi_system_id *d)
|
||||
{
|
||||
use_native_backlight_dmi = NATIVE_BACKLIGHT_ON;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
static struct dmi_system_id video_dmi_table[] = {
|
||||
/*
|
||||
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
||||
*/
|
||||
@ -477,110 +444,19 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
},
|
||||
|
||||
/*
|
||||
* 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
|
||||
* Some machines have a broken acpi-video interface for brightness
|
||||
* control, but still need an acpi_video_device_lcd_set_level() call
|
||||
* on resume to turn the backlight power on. We Enable backlight
|
||||
* control on these systems, but do not register a backlight sysfs
|
||||
* as brightness control does not work.
|
||||
*/
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "ThinkPad T420",
|
||||
/* https://bugs.freedesktop.org/show_bug.cgi?id=82634 */
|
||||
.callback = video_disable_backlight_sysfs_if,
|
||||
.ident = "Toshiba Portege R830",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "ThinkPad T520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_disable_native_backlight,
|
||||
.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_enable_native_backlight,
|
||||
.ident = "Lenovo Ideapad Z570",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
@ -1382,7 +1258,7 @@ acpi_video_switch_brightness(struct work_struct *work)
|
||||
int result = -EINVAL;
|
||||
|
||||
/* no warning message if acpi_backlight=vendor or a quirk is used */
|
||||
if (!acpi_video_verify_backlight_support())
|
||||
if (!device->backlight)
|
||||
return;
|
||||
|
||||
if (!device->brightness)
|
||||
@ -1657,8 +1533,9 @@ static int acpi_video_resume(struct notifier_block *nb,
|
||||
|
||||
for (i = 0; i < video->attached_count; i++) {
|
||||
video_device = video->attached_array[i].bind_info;
|
||||
if (video_device && video_device->backlight)
|
||||
acpi_video_set_brightness(video_device->backlight);
|
||||
if (video_device && video_device->brightness)
|
||||
acpi_video_device_lcd_set_level(video_device,
|
||||
video_device->brightness->curr);
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
@ -1707,6 +1584,10 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
|
||||
result = acpi_video_init_brightness(device);
|
||||
if (result)
|
||||
return;
|
||||
|
||||
if (disable_backlight_sysfs_if > 0)
|
||||
return;
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
|
||||
if (!name)
|
||||
return;
|
||||
@ -1729,8 +1610,10 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
|
||||
&acpi_backlight_ops,
|
||||
&props);
|
||||
kfree(name);
|
||||
if (IS_ERR(device->backlight))
|
||||
if (IS_ERR(device->backlight)) {
|
||||
device->backlight = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save current brightness level in case we have to restore it
|
||||
@ -1787,7 +1670,7 @@ static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
|
||||
|
||||
acpi_video_run_bcl_for_osi(video);
|
||||
|
||||
if (!acpi_video_verify_backlight_support())
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_video)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&video->device_list_lock);
|
||||
@ -1931,56 +1814,6 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
|
||||
video->input = NULL;
|
||||
}
|
||||
|
||||
static int acpi_video_backlight_notify(struct notifier_block *nb,
|
||||
unsigned long val, void *bd)
|
||||
{
|
||||
struct backlight_device *backlight = bd;
|
||||
struct acpi_video_bus *video;
|
||||
|
||||
/* acpi_video_verify_backlight_support only cares about raw devices */
|
||||
if (backlight->props.type != BACKLIGHT_RAW)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
video = container_of(nb, struct acpi_video_bus, backlight_nb);
|
||||
|
||||
switch (val) {
|
||||
case BACKLIGHT_REGISTERED:
|
||||
if (!acpi_video_verify_backlight_support())
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
break;
|
||||
case BACKLIGHT_UNREGISTERED:
|
||||
acpi_video_bus_register_backlight(video);
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_add_backlight_notify_handler(
|
||||
struct acpi_video_bus *video)
|
||||
{
|
||||
int error;
|
||||
|
||||
video->backlight_nb.notifier_call = acpi_video_backlight_notify;
|
||||
video->backlight_nb.priority = 0;
|
||||
error = backlight_register_notifier(&video->backlight_nb);
|
||||
if (error == 0)
|
||||
video->backlight_notifier_registered = true;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_remove_backlight_notify_handler(
|
||||
struct acpi_video_bus *video)
|
||||
{
|
||||
if (!video->backlight_notifier_registered)
|
||||
return 0;
|
||||
|
||||
video->backlight_notifier_registered = false;
|
||||
|
||||
return backlight_unregister_notifier(&video->backlight_nb);
|
||||
}
|
||||
|
||||
static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
|
||||
{
|
||||
struct acpi_video_device *dev, *next;
|
||||
@ -2062,7 +1895,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
||||
|
||||
acpi_video_bus_register_backlight(video);
|
||||
acpi_video_bus_add_notify_handler(video);
|
||||
acpi_video_bus_add_backlight_notify_handler(video);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -2086,7 +1918,6 @@ static int acpi_video_bus_remove(struct acpi_device *device)
|
||||
|
||||
video = acpi_driver_data(device);
|
||||
|
||||
acpi_video_bus_remove_backlight_notify_handler(video);
|
||||
acpi_video_bus_remove_notify_handler(video);
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
acpi_video_bus_put_devices(video);
|
||||
@ -2134,22 +1965,25 @@ static int __init intel_opregion_present(void)
|
||||
|
||||
int acpi_video_register(void)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(®ister_count_mutex);
|
||||
if (register_count) {
|
||||
/*
|
||||
* if the function of acpi_video_register is already called,
|
||||
* don't register the acpi_vide_bus again and return no error.
|
||||
*/
|
||||
return 0;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
mutex_init(&video_list_lock);
|
||||
INIT_LIST_HEAD(&video_bus_head);
|
||||
|
||||
dmi_check_system(video_dmi_table);
|
||||
|
||||
ret = acpi_bus_register_driver(&acpi_video_bus);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto leave;
|
||||
|
||||
/*
|
||||
* When the acpi_video_bus is loaded successfully, increase
|
||||
@ -2157,24 +1991,20 @@ int acpi_video_register(void)
|
||||
*/
|
||||
register_count = 1;
|
||||
|
||||
return 0;
|
||||
leave:
|
||||
mutex_unlock(®ister_count_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_register);
|
||||
|
||||
void acpi_video_unregister(void)
|
||||
{
|
||||
if (!register_count) {
|
||||
/*
|
||||
* If the acpi video bus is already unloaded, don't
|
||||
* unload it again and return directly.
|
||||
*/
|
||||
return;
|
||||
mutex_lock(®ister_count_mutex);
|
||||
if (register_count) {
|
||||
acpi_bus_unregister_driver(&acpi_video_bus);
|
||||
register_count = 0;
|
||||
}
|
||||
acpi_bus_unregister_driver(&acpi_video_bus);
|
||||
|
||||
register_count = 0;
|
||||
|
||||
return;
|
||||
mutex_unlock(®ister_count_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_unregister);
|
||||
|
||||
@ -2182,15 +2012,15 @@ void acpi_video_unregister_backlight(void)
|
||||
{
|
||||
struct acpi_video_bus *video;
|
||||
|
||||
if (!register_count)
|
||||
return;
|
||||
|
||||
mutex_lock(&video_list_lock);
|
||||
list_for_each_entry(video, &video_bus_head, entry)
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
mutex_unlock(&video_list_lock);
|
||||
mutex_lock(®ister_count_mutex);
|
||||
if (register_count) {
|
||||
mutex_lock(&video_list_lock);
|
||||
list_for_each_entry(video, &video_bus_head, entry)
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
mutex_unlock(&video_list_lock);
|
||||
}
|
||||
mutex_unlock(®ister_count_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_unregister_backlight);
|
||||
|
||||
/*
|
||||
* This is kind of nasty. Hardware using Intel chipsets may require
|
||||
@ -2212,8 +2042,6 @@ static int __init acpi_video_init(void)
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
dmi_check_system(video_dmi_table);
|
||||
|
||||
if (intel_opregion_present())
|
||||
return 0;
|
||||
|
||||
@ -2222,6 +2050,7 @@ static int __init acpi_video_init(void)
|
||||
|
||||
static void __exit acpi_video_exit(void)
|
||||
{
|
||||
acpi_video_detect_exit();
|
||||
acpi_video_unregister();
|
||||
|
||||
return;
|
@ -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) {
|
||||
|
@ -64,6 +64,7 @@
|
||||
#include <linux/i8042.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/sparse-keymap.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define MSI_DRIVER_VERSION "0.5"
|
||||
|
||||
@ -1069,9 +1070,8 @@ static int __init msi_init(void)
|
||||
|
||||
/* Register backlight stuff */
|
||||
|
||||
if (!quirks->old_ec_model || acpi_video_backlight_support()) {
|
||||
pr_info("Brightness ignored, must be controlled by ACPI video driver\n");
|
||||
} else {
|
||||
if (quirks->old_ec_model ||
|
||||
acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
struct backlight_properties props;
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
MODULE_AUTHOR("Thomas Renninger <trenn@suse.de>");
|
||||
MODULE_DESCRIPTION("MSI laptop WMI hotkeys driver");
|
||||
@ -320,7 +321,8 @@ static int __init msi_wmi_init(void)
|
||||
break;
|
||||
}
|
||||
|
||||
if (wmi_has_guid(MSIWMI_BIOS_GUID) && !acpi_video_backlight_support()) {
|
||||
if (wmi_has_guid(MSIWMI_BIOS_GUID) &&
|
||||
acpi_video_get_backlight_type() == acpi_backlight_vendor) {
|
||||
err = msi_wmi_backlight_setup();
|
||||
if (err) {
|
||||
pr_err("Unable to setup backlight device\n");
|
||||
|
@ -1720,27 +1720,14 @@ static int __init samsung_init(void)
|
||||
samsung->handle_backlight = true;
|
||||
samsung->quirks = quirks;
|
||||
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
if (samsung->quirks->broken_acpi_video)
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
if (samsung->quirks->use_native_backlight)
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_native);
|
||||
|
||||
/* Don't handle backlight here if the acpi video already handle it */
|
||||
if (acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
|
||||
samsung->handle_backlight = false;
|
||||
} else if (samsung->quirks->broken_acpi_video) {
|
||||
pr_info("Disabling ACPI video driver\n");
|
||||
acpi_video_unregister();
|
||||
}
|
||||
|
||||
if (samsung->quirks->use_native_backlight) {
|
||||
pr_info("Using native backlight driver\n");
|
||||
/* Tell acpi-video to not handle the backlight */
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_unregister();
|
||||
/* And also do not handle it ourselves */
|
||||
samsung->handle_backlight = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = samsung_platform_init(samsung);
|
||||
@ -1751,12 +1738,6 @@ static int __init samsung_init(void)
|
||||
if (ret)
|
||||
goto error_sabi;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
/* Only log that if we are really on a sabi platform */
|
||||
if (acpi_video_backlight_support())
|
||||
pr_info("Backlight controlled by ACPI video driver\n");
|
||||
#endif
|
||||
|
||||
ret = samsung_sysfs_init(samsung);
|
||||
if (ret)
|
||||
goto error_sysfs;
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include <linux/miscdevice.h>
|
||||
#endif
|
||||
#include <asm/uaccess.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#define dprintk(fmt, ...) \
|
||||
do { \
|
||||
@ -3198,12 +3199,8 @@ static int sony_nc_add(struct acpi_device *device)
|
||||
sony_nc_function_setup(device, sony_pf_device);
|
||||
}
|
||||
|
||||
/* setup input devices and helper fifo */
|
||||
if (acpi_video_backlight_support()) {
|
||||
pr_info("brightness ignored, must be controlled by ACPI video driver\n");
|
||||
} else {
|
||||
if (acpi_video_get_backlight_type() == acpi_backlight_vendor)
|
||||
sony_nc_backlight_setup();
|
||||
}
|
||||
|
||||
/* create sony_pf sysfs attributes related to the SNC device */
|
||||
for (item = sony_nc_values; item->name; ++item) {
|
||||
|
@ -83,6 +83,7 @@
|
||||
#include <sound/control.h>
|
||||
#include <sound/initval.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
/* ThinkPad CMOS commands */
|
||||
#define TP_CMOS_VOLUME_DOWN 0
|
||||
@ -3487,7 +3488,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||
/* Do not issue duplicate brightness change events to
|
||||
* userspace. tpacpi_detect_brightness_capabilities() must have
|
||||
* been called before this point */
|
||||
if (acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor) {
|
||||
pr_info("This ThinkPad has standard ACPI backlight "
|
||||
"brightness control, supported by the ACPI "
|
||||
"video driver\n");
|
||||
@ -6491,7 +6492,7 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (acpi_video_backlight_support()) {
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor) {
|
||||
if (brightness_enable > 1) {
|
||||
pr_info("Standard ACPI backlight interface "
|
||||
"available, not loading native one\n");
|
||||
|
@ -2640,14 +2640,11 @@ static int toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
|
||||
*/
|
||||
if (dev->tr_backlight_supported ||
|
||||
dmi_check_system(toshiba_vendor_backlight_dmi))
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
|
||||
|
||||
if (acpi_video_backlight_support())
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
|
||||
return 0;
|
||||
|
||||
/* acpi-video may have loaded before we called dmi_promote_vendor() */
|
||||
acpi_video_unregister_backlight();
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
|
||||
|
@ -16,23 +16,36 @@ struct acpi_device;
|
||||
#define ACPI_VIDEO_DISPLAY_LEGACY_PANEL 0x0110
|
||||
#define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200
|
||||
|
||||
enum acpi_backlight_type {
|
||||
acpi_backlight_undef = -1,
|
||||
acpi_backlight_none = 0,
|
||||
acpi_backlight_video,
|
||||
acpi_backlight_vendor,
|
||||
acpi_backlight_native,
|
||||
};
|
||||
|
||||
#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
|
||||
extern int acpi_video_register(void);
|
||||
extern void acpi_video_unregister(void);
|
||||
extern void acpi_video_unregister_backlight(void);
|
||||
extern int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||
int device_id, void **edid);
|
||||
extern bool acpi_video_verify_backlight_support(void);
|
||||
extern enum acpi_backlight_type acpi_video_get_backlight_type(void);
|
||||
extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type);
|
||||
#else
|
||||
static inline int acpi_video_register(void) { return 0; }
|
||||
static inline void acpi_video_unregister(void) { return; }
|
||||
static inline void acpi_video_unregister_backlight(void) { return; }
|
||||
static inline int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||
int device_id, void **edid)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline bool acpi_video_verify_backlight_support(void) { return false; }
|
||||
static inline enum acpi_backlight_type acpi_video_get_backlight_type(void)
|
||||
{
|
||||
return acpi_backlight_vendor;
|
||||
}
|
||||
static void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -253,50 +253,12 @@ extern bool wmi_has_guid(const char *guid);
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800
|
||||
|
||||
#if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)
|
||||
|
||||
extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle);
|
||||
extern char acpi_video_backlight_string[];
|
||||
extern long acpi_is_video_device(acpi_handle handle);
|
||||
extern void acpi_video_dmi_promote_vendor(void);
|
||||
extern void acpi_video_dmi_demote_vendor(void);
|
||||
extern int acpi_video_backlight_support(void);
|
||||
extern int acpi_video_display_switch_support(void);
|
||||
|
||||
#else
|
||||
|
||||
static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long acpi_is_video_device(acpi_handle handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void acpi_video_dmi_promote_vendor(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void acpi_video_dmi_demote_vendor(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int acpi_video_backlight_support(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int acpi_video_display_switch_support(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) */
|
||||
|
||||
extern int acpi_blacklisted(void);
|
||||
extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
|
||||
extern void acpi_osi_setup(char *str);
|
||||
extern bool acpi_osi_is_win8(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
int acpi_get_node(acpi_handle handle);
|
||||
|
Loading…
Reference in New Issue
Block a user