Skip to content

Commit

Permalink
samsung-laptop: unregister ACPI video module for some well known laptops
Browse files Browse the repository at this point in the history
On these laptops, the ACPI video is not functional, and very unlikely
to be fixed by the vendor. Note that intel_backlight works for some
of these laptops, and the backlight from samsung-laptop always work.

The good news is that newer laptops have functional ACPI video device
and won't end up growing this list.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Matthew Garrett <[email protected]>
  • Loading branch information
iksaif authored and Matthew Garrett committed Mar 26, 2012
1 parent 5719b81 commit a979e2e
Showing 1 changed file with 76 additions and 4 deletions.
80 changes: 76 additions & 4 deletions drivers/platform/x86/samsung-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
#include <linux/seq_file.h>
#include <linux/debugfs.h>
#include <linux/ctype.h>
#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
#include <acpi/video.h>
#endif

/*
* This driver is needed because a number of Samsung laptops do not hook
Expand Down Expand Up @@ -336,14 +339,23 @@ struct samsung_laptop {
struct work_struct kbd_led_work;

struct samsung_laptop_debug debug;
struct samsung_quirks *quirks;

bool handle_backlight;
bool has_stepping_quirk;

char sdiag[64];
};

struct samsung_quirks {
bool broken_acpi_video;
};

static struct samsung_quirks samsung_unknown = {};

static struct samsung_quirks samsung_broken_acpi_video = {
.broken_acpi_video = true,
};

static bool force;
module_param(force, bool, 0);
Expand Down Expand Up @@ -1416,6 +1428,14 @@ static int __init samsung_platform_init(struct samsung_laptop *samsung)
return 0;
}

static struct samsung_quirks *quirks;

static int __init samsung_dmi_matched(const struct dmi_system_id *d)
{
quirks = d->driver_data;
return 0;
}

static struct dmi_system_id __initdata samsung_dmi_table[] = {
{
.matches = {
Expand Down Expand Up @@ -1445,6 +1465,47 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
},
},
/* Specific DMI ids for laptop with quirks */
{
.callback = samsung_dmi_matched,
.ident = "N150P",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
DMI_MATCH(DMI_PRODUCT_NAME, "N150P"),
DMI_MATCH(DMI_BOARD_NAME, "N150P"),
},
.driver_data = &samsung_broken_acpi_video,
},
{
.callback = samsung_dmi_matched,
.ident = "N145P/N250P/N260P",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
DMI_MATCH(DMI_PRODUCT_NAME, "N145P/N250P/N260P"),
DMI_MATCH(DMI_BOARD_NAME, "N145P/N250P/N260P"),
},
.driver_data = &samsung_broken_acpi_video,
},
{
.callback = samsung_dmi_matched,
.ident = "N150/N210/N220",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
DMI_MATCH(DMI_PRODUCT_NAME, "N150/N210/N220"),
DMI_MATCH(DMI_BOARD_NAME, "N150/N210/N220"),
},
.driver_data = &samsung_broken_acpi_video,
},
{
.callback = samsung_dmi_matched,
.ident = "NF110/NF210/NF310",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
DMI_MATCH(DMI_PRODUCT_NAME, "NF110/NF210/NF310"),
DMI_MATCH(DMI_BOARD_NAME, "NF110/NF210/NF310"),
},
.driver_data = &samsung_broken_acpi_video,
},
{ },
};
MODULE_DEVICE_TABLE(dmi, samsung_dmi_table);
Expand All @@ -1456,6 +1517,7 @@ static int __init samsung_init(void)
struct samsung_laptop *samsung;
int ret;

quirks = &samsung_unknown;
if (!force && !dmi_check_system(samsung_dmi_table))
return -ENODEV;

Expand All @@ -1465,12 +1527,21 @@ static int __init samsung_init(void)

mutex_init(&samsung->sabi_mutex);
samsung->handle_backlight = true;
samsung->quirks = quirks;

#ifdef CONFIG_ACPI

#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
/* Don't handle backlight here if the acpi video already handle it */
if (acpi_video_backlight_support())
samsung->handle_backlight = false;
if (acpi_video_backlight_support()) {
if (samsung->quirks->broken_acpi_video) {
pr_info("Disabling ACPI video driver\n");
acpi_video_unregister();
} else {
samsung->handle_backlight = false;
}
}
#endif

ret = samsung_platform_init(samsung);
if (ret)
goto error_platform;
Expand All @@ -1481,7 +1552,8 @@ static int __init samsung_init(void)

#ifdef CONFIG_ACPI
/* Only log that if we are really on a sabi platform */
if (acpi_video_backlight_support())
if (acpi_video_backlight_support() &&
!samsung->quirks->broken_acpi_video)
pr_info("Backlight controlled by ACPI video driver\n");
#endif

Expand Down

0 comments on commit a979e2e

Please sign in to comment.