Commit c9797dba authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-6.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI fixes from Rafael Wysocki:
 "Fix the ACPI backlight override mechanism for the cases when
  acpi_backlight=video is set through the kernel command line or a DMI
  quirk and add backlight quirks for Apple iMac14,1 and iMac14,2 and
  Lenovo ThinkPad W530 (Hans de Goede)"

* tag 'acpi-6.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: video: Add acpi_backlight=video quirk for Lenovo ThinkPad W530
  ACPI: video: Add acpi_backlight=video quirk for Apple iMac14,1 and iMac14,2
  ACPI: video: Make acpi_backlight=video work independent from GPU driver
  ACPI: video: Add auto_detect arg to __acpi_video_get_backlight_type()
parents d523dc7b a5b2781d
...@@ -1984,6 +1984,7 @@ static int instance; ...@@ -1984,6 +1984,7 @@ static int instance;
static int acpi_video_bus_add(struct acpi_device *device) static int acpi_video_bus_add(struct acpi_device *device)
{ {
struct acpi_video_bus *video; struct acpi_video_bus *video;
bool auto_detect;
int error; int error;
acpi_status status; acpi_status status;
...@@ -2045,10 +2046,20 @@ static int acpi_video_bus_add(struct acpi_device *device) ...@@ -2045,10 +2046,20 @@ static int acpi_video_bus_add(struct acpi_device *device)
mutex_unlock(&video_list_lock); mutex_unlock(&video_list_lock);
/* /*
* The userspace visible backlight_device gets registered separately * If backlight-type auto-detection is used then a native backlight may
* from acpi_video_register_backlight(). * show up later and this may change the result from video to native.
* Therefor normally the userspace visible /sys/class/backlight device
* gets registered separately by the GPU driver calling
* acpi_video_register_backlight() when an internal panel is detected.
* Register the backlight now when not using auto-detection, so that
* when the kernel cmdline or DMI-quirks are used the backlight will
* get registered even if acpi_video_register_backlight() is not called.
*/ */
acpi_video_run_bcl_for_osi(video); acpi_video_run_bcl_for_osi(video);
if (__acpi_video_get_backlight_type(false, &auto_detect) == acpi_backlight_video &&
!auto_detect)
acpi_video_bus_register_backlight(video);
acpi_video_bus_add_notify_handler(video); acpi_video_bus_add_notify_handler(video);
return 0; return 0;
......
...@@ -276,6 +276,43 @@ static const struct dmi_system_id video_detect_dmi_table[] = { ...@@ -276,6 +276,43 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
}, },
}, },
/*
* Models which need acpi_video backlight control where the GPU drivers
* do not call acpi_video_register_backlight() because no internal panel
* is detected. Typically these are all-in-ones (monitors with builtin
* PC) where the panel connection shows up as regular DP instead of eDP.
*/
{
.callback = video_detect_force_video,
/* Apple iMac14,1 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "iMac14,1"),
},
},
{
.callback = video_detect_force_video,
/* Apple iMac14,2 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "iMac14,2"),
},
},
/*
* Older models with nvidia GPU which need acpi_video backlight
* control and where the old nvidia binary driver series does not
* call acpi_video_register_backlight().
*/
{
.callback = video_detect_force_video,
/* ThinkPad W530 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W530"),
},
},
/* /*
* These models have a working acpi_video backlight control, and using * These models have a working acpi_video backlight control, and using
* native backlight causes a regression where backlight does not work * native backlight causes a regression where backlight does not work
...@@ -782,7 +819,7 @@ static bool prefer_native_over_acpi_video(void) ...@@ -782,7 +819,7 @@ static bool prefer_native_over_acpi_video(void)
* Determine which type of backlight interface to use on this system, * Determine which type of backlight interface to use on this system,
* First check cmdline, then dmi quirks, then do autodetect. * First check cmdline, then dmi quirks, then do autodetect.
*/ */
static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native) enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, bool *auto_detect)
{ {
static DEFINE_MUTEX(init_mutex); static DEFINE_MUTEX(init_mutex);
static bool nvidia_wmi_ec_present; static bool nvidia_wmi_ec_present;
...@@ -807,6 +844,9 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native) ...@@ -807,6 +844,9 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
native_available = true; native_available = true;
mutex_unlock(&init_mutex); mutex_unlock(&init_mutex);
if (auto_detect)
*auto_detect = false;
/* /*
* The below heuristics / detection steps are in order of descending * The below heuristics / detection steps are in order of descending
* presedence. The commandline takes presedence over anything else. * presedence. The commandline takes presedence over anything else.
...@@ -818,6 +858,9 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native) ...@@ -818,6 +858,9 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
if (acpi_backlight_dmi != acpi_backlight_undef) if (acpi_backlight_dmi != acpi_backlight_undef)
return acpi_backlight_dmi; return acpi_backlight_dmi;
if (auto_detect)
*auto_detect = true;
/* Special cases such as nvidia_wmi_ec and apple gmux. */ /* Special cases such as nvidia_wmi_ec and apple gmux. */
if (nvidia_wmi_ec_present) if (nvidia_wmi_ec_present)
return acpi_backlight_nvidia_wmi_ec; return acpi_backlight_nvidia_wmi_ec;
...@@ -837,15 +880,4 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native) ...@@ -837,15 +880,4 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
/* No ACPI video/native (old hw), use vendor specific fw methods. */ /* No ACPI video/native (old hw), use vendor specific fw methods. */
return acpi_backlight_vendor; return acpi_backlight_vendor;
} }
EXPORT_SYMBOL(__acpi_video_get_backlight_type);
enum acpi_backlight_type acpi_video_get_backlight_type(void)
{
return __acpi_video_get_backlight_type(false);
}
EXPORT_SYMBOL(acpi_video_get_backlight_type);
bool acpi_video_backlight_use_native(void)
{
return __acpi_video_get_backlight_type(true) == acpi_backlight_native;
}
EXPORT_SYMBOL(acpi_video_backlight_use_native);
...@@ -59,8 +59,6 @@ extern void acpi_video_unregister(void); ...@@ -59,8 +59,6 @@ extern void acpi_video_unregister(void);
extern void acpi_video_register_backlight(void); extern void acpi_video_register_backlight(void);
extern int acpi_video_get_edid(struct acpi_device *device, int type, extern int acpi_video_get_edid(struct acpi_device *device, int type,
int device_id, void **edid); int device_id, void **edid);
extern enum acpi_backlight_type acpi_video_get_backlight_type(void);
extern bool acpi_video_backlight_use_native(void);
/* /*
* Note: The value returned by acpi_video_handles_brightness_key_presses() * Note: The value returned by acpi_video_handles_brightness_key_presses()
* may change over time and should not be cached. * may change over time and should not be cached.
...@@ -69,6 +67,19 @@ extern bool acpi_video_handles_brightness_key_presses(void); ...@@ -69,6 +67,19 @@ extern bool acpi_video_handles_brightness_key_presses(void);
extern int acpi_video_get_levels(struct acpi_device *device, extern int acpi_video_get_levels(struct acpi_device *device,
struct acpi_video_device_brightness **dev_br, struct acpi_video_device_brightness **dev_br,
int *pmax_level); int *pmax_level);
extern enum acpi_backlight_type __acpi_video_get_backlight_type(bool native,
bool *auto_detect);
static inline enum acpi_backlight_type acpi_video_get_backlight_type(void)
{
return __acpi_video_get_backlight_type(false, NULL);
}
static inline bool acpi_video_backlight_use_native(void)
{
return __acpi_video_get_backlight_type(true, NULL) == acpi_backlight_native;
}
#else #else
static inline void acpi_video_report_nolcd(void) { return; }; static inline void acpi_video_report_nolcd(void) { return; };
static inline int acpi_video_register(void) { return -ENODEV; } static inline int acpi_video_register(void) { return -ENODEV; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment