mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge branches 'acpi-resource' and 'acpi-video'
Merge ACPI resource handling quirks and ACPI backlight handling fixes for 6.2-rc2: - Add ACPI IRQ override quirks for Asus ExpertBook B2502, Lenovo 14ALC7, and XMG Core 15 (Hans de Goede, Adrian Freund, Erik Schumacher). - Adjust ACPI video detection fallback path to prevent non-operational ACPI backlight devices from being created on systems where the native driver does not detect a suitable panel (Mario Limonciello). - Fix Apple GMUX backlight detection (Hans de Goede). * acpi-resource: ACPI: resource: Add Asus ExpertBook B2502 to Asus quirks ACPI: resource: do IRQ override on Lenovo 14ALC7 ACPI: resource: do IRQ override on XMG Core 15 * acpi-video: ACPI: video: Fix Apple GMUX backlight detection ACPI: video: Don't enable fallback path for creating ACPI backlight by default drm/amd/display: Report to ACPI video if no panels were found ACPI: video: Allow GPU drivers to report no panels
This commit is contained in:
@@ -70,11 +70,7 @@ module_param(device_id_scheme, bool, 0444);
|
|||||||
static int only_lcd = -1;
|
static int only_lcd = -1;
|
||||||
module_param(only_lcd, int, 0444);
|
module_param(only_lcd, int, 0444);
|
||||||
|
|
||||||
/*
|
static int register_backlight_delay;
|
||||||
* Display probing is known to take up to 5 seconds, so delay the fallback
|
|
||||||
* backlight registration by 5 seconds + 3 seconds for some extra margin.
|
|
||||||
*/
|
|
||||||
static int register_backlight_delay = 8;
|
|
||||||
module_param(register_backlight_delay, int, 0444);
|
module_param(register_backlight_delay, int, 0444);
|
||||||
MODULE_PARM_DESC(register_backlight_delay,
|
MODULE_PARM_DESC(register_backlight_delay,
|
||||||
"Delay in seconds before doing fallback (non GPU driver triggered) "
|
"Delay in seconds before doing fallback (non GPU driver triggered) "
|
||||||
@@ -2176,6 +2172,17 @@ static bool should_check_lcd_flag(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At least one graphics driver has reported that no LCD is connected
|
||||||
|
* via the native interface. cancel the registration for fallback acpi_video0.
|
||||||
|
* If another driver still deems this necessary, it can explicitly register it.
|
||||||
|
*/
|
||||||
|
void acpi_video_report_nolcd(void)
|
||||||
|
{
|
||||||
|
cancel_delayed_work(&video_bus_register_backlight_work);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(acpi_video_report_nolcd);
|
||||||
|
|
||||||
int acpi_video_register(void)
|
int acpi_video_register(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|||||||
@@ -432,10 +432,24 @@ static const struct dmi_system_id asus_laptop[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Asus ExpertBook B2502",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct dmi_system_id lenovo_82ra[] = {
|
static const struct dmi_system_id lenovo_laptop[] = {
|
||||||
|
{
|
||||||
|
.ident = "LENOVO IdeaPad Flex 5 14ALC7",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "82R9"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.ident = "LENOVO IdeaPad Flex 5 16ALC7",
|
.ident = "LENOVO IdeaPad Flex 5 16ALC7",
|
||||||
.matches = {
|
.matches = {
|
||||||
@@ -446,6 +460,17 @@ static const struct dmi_system_id lenovo_82ra[] = {
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct dmi_system_id schenker_gm_rg[] = {
|
||||||
|
{
|
||||||
|
.ident = "XMG CORE 15 (M22)",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "GMxRGxx"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
struct irq_override_cmp {
|
struct irq_override_cmp {
|
||||||
const struct dmi_system_id *system;
|
const struct dmi_system_id *system;
|
||||||
unsigned char irq;
|
unsigned char irq;
|
||||||
@@ -458,8 +483,9 @@ struct irq_override_cmp {
|
|||||||
static const struct irq_override_cmp override_table[] = {
|
static const struct irq_override_cmp override_table[] = {
|
||||||
{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
|
{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
|
||||||
{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
|
{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
|
||||||
{ lenovo_82ra, 6, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
{ lenovo_laptop, 6, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
||||||
{ lenovo_82ra, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
{ lenovo_laptop, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
||||||
|
{ schenker_gm_rg, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
|
static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/platform_data/x86/nvidia-wmi-ec-backlight.h>
|
#include <linux/platform_data/x86/nvidia-wmi-ec-backlight.h>
|
||||||
|
#include <linux/pnp.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <acpi/video.h>
|
#include <acpi/video.h>
|
||||||
@@ -105,6 +106,26 @@ static bool nvidia_wmi_ec_supported(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool apple_gmux_backlight_present(void)
|
||||||
|
{
|
||||||
|
struct acpi_device *adev;
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
adev = acpi_dev_get_first_match_dev(GMUX_ACPI_HID, NULL, -1);
|
||||||
|
if (!adev)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dev = acpi_get_first_physical_node(adev);
|
||||||
|
if (!dev)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* drivers/platform/x86/apple-gmux.c only supports old style
|
||||||
|
* Apple GMUX with an IO-resource.
|
||||||
|
*/
|
||||||
|
return pnp_get_resource(to_pnp_dev(dev), IORESOURCE_IO, 0) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Force to use vendor driver when the ACPI device is known to be
|
/* Force to use vendor driver when the ACPI device is known to be
|
||||||
* buggy */
|
* buggy */
|
||||||
static int video_detect_force_vendor(const struct dmi_system_id *d)
|
static int video_detect_force_vendor(const struct dmi_system_id *d)
|
||||||
@@ -767,7 +788,7 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
|
|||||||
if (nvidia_wmi_ec_present)
|
if (nvidia_wmi_ec_present)
|
||||||
return acpi_backlight_nvidia_wmi_ec;
|
return acpi_backlight_nvidia_wmi_ec;
|
||||||
|
|
||||||
if (apple_gmux_present())
|
if (apple_gmux_backlight_present())
|
||||||
return acpi_backlight_apple_gmux;
|
return acpi_backlight_apple_gmux;
|
||||||
|
|
||||||
/* Use ACPI video if available, except when native should be preferred. */
|
/* Use ACPI video if available, except when native should be preferred. */
|
||||||
|
|||||||
@@ -4360,6 +4360,10 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
|||||||
amdgpu_set_panel_orientation(&aconnector->base);
|
amdgpu_set_panel_orientation(&aconnector->base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we didn't find a panel, notify the acpi video detection */
|
||||||
|
if (dm->adev->flags & AMD_IS_APU && dm->num_of_edps == 0)
|
||||||
|
acpi_video_report_nolcd();
|
||||||
|
|
||||||
/* Software is initialized. Now we can register interrupt handlers. */
|
/* Software is initialized. Now we can register interrupt handlers. */
|
||||||
switch (adev->asic_type) {
|
switch (adev->asic_type) {
|
||||||
#if defined(CONFIG_DRM_AMD_DC_SI)
|
#if defined(CONFIG_DRM_AMD_DC_SI)
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ enum acpi_backlight_type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_ACPI_VIDEO)
|
#if IS_ENABLED(CONFIG_ACPI_VIDEO)
|
||||||
|
extern void acpi_video_report_nolcd(void);
|
||||||
extern int acpi_video_register(void);
|
extern int acpi_video_register(void);
|
||||||
extern void acpi_video_unregister(void);
|
extern void acpi_video_unregister(void);
|
||||||
extern void acpi_video_register_backlight(void);
|
extern void acpi_video_register_backlight(void);
|
||||||
@@ -69,6 +70,7 @@ 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);
|
||||||
#else
|
#else
|
||||||
|
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; }
|
||||||
static inline void acpi_video_unregister(void) { return; }
|
static inline void acpi_video_unregister(void) { return; }
|
||||||
static inline void acpi_video_register_backlight(void) { return; }
|
static inline void acpi_video_register_backlight(void) { return; }
|
||||||
|
|||||||
Reference in New Issue
Block a user