Skip to content

Commit

Permalink
platform samsung-q10: use ACPI instead of direct EC calls
Browse files Browse the repository at this point in the history
This patch changes the Samsung Q10 backlight driver to use ACPI methods
(the same ones as triggered by the brightness up/down function keys)
instead of direct EC calls. The advantage is that the brightness setting
is not lost on shutdown.

Signed-off-by: Frederick van der Wyck <fvanderwyck@gmail.com>
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
  • Loading branch information
Frederick van der Wyck authored and Matthew Garrett committed Sep 5, 2013
1 parent fcb44e1 commit aa3b88a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 45 deletions.
2 changes: 1 addition & 1 deletion drivers/platform/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -764,7 +764,7 @@ config INTEL_OAKTRAIL

config SAMSUNG_Q10
tristate "Samsung Q10 Extras"
depends on SERIO_I8042
depends on ACPI
select BACKLIGHT_CLASS_DEVICE
---help---
This driver provides support for backlight control on Samsung Q10
Expand Down
65 changes: 21 additions & 44 deletions drivers/platform/x86/samsung-q10.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,12 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/backlight.h>
#include <linux/i8042.h>
#include <linux/dmi.h>
#include <acpi/acpi_drivers.h>

#define SAMSUNGQ10_BL_MAX_INTENSITY 255
#define SAMSUNGQ10_BL_DEFAULT_INTENSITY 185
#define SAMSUNGQ10_BL_MAX_INTENSITY 7

#define SAMSUNGQ10_BL_8042_CMD 0xbe
#define SAMSUNGQ10_BL_8042_DATA { 0x89, 0x91 }

static int samsungq10_bl_brightness;
static acpi_handle ec_handle;

static bool force;
module_param(force, bool, 0);
Expand All @@ -33,50 +29,33 @@ MODULE_PARM_DESC(force,
static int samsungq10_bl_set_intensity(struct backlight_device *bd)
{

int brightness = bd->props.brightness;
unsigned char c[3] = SAMSUNGQ10_BL_8042_DATA;
acpi_status status;
int i;

c[2] = (unsigned char)brightness;
i8042_lock_chip();
i8042_command(c, (0x30 << 8) | SAMSUNGQ10_BL_8042_CMD);
i8042_unlock_chip();
samsungq10_bl_brightness = brightness;
for (i = 0; i < SAMSUNGQ10_BL_MAX_INTENSITY; i++) {
status = acpi_evaluate_object(ec_handle, "_Q63", NULL, NULL);
if (ACPI_FAILURE(status))
return -EIO;
}
for (i = 0; i < bd->props.brightness; i++) {
status = acpi_evaluate_object(ec_handle, "_Q64", NULL, NULL);
if (ACPI_FAILURE(status))
return -EIO;
}

return 0;
}

static int samsungq10_bl_get_intensity(struct backlight_device *bd)
{
return samsungq10_bl_brightness;
return bd->props.brightness;
}

static const struct backlight_ops samsungq10_bl_ops = {
.get_brightness = samsungq10_bl_get_intensity,
.update_status = samsungq10_bl_set_intensity,
};

#ifdef CONFIG_PM_SLEEP
static int samsungq10_suspend(struct device *dev)
{
return 0;
}

static int samsungq10_resume(struct device *dev)
{

struct backlight_device *bd = dev_get_drvdata(dev);

samsungq10_bl_set_intensity(bd);
return 0;
}
#else
#define samsungq10_suspend NULL
#define samsungq10_resume NULL
#endif

static SIMPLE_DEV_PM_OPS(samsungq10_pm_ops,
samsungq10_suspend, samsungq10_resume);

static int samsungq10_probe(struct platform_device *pdev)
{

Expand All @@ -93,9 +72,6 @@ static int samsungq10_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, bd);

bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY;
samsungq10_bl_set_intensity(bd);

return 0;
}

Expand All @@ -104,9 +80,6 @@ static int samsungq10_remove(struct platform_device *pdev)

struct backlight_device *bd = platform_get_drvdata(pdev);

bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY;
samsungq10_bl_set_intensity(bd);

backlight_device_unregister(bd);

return 0;
Expand All @@ -116,7 +89,6 @@ static struct platform_driver samsungq10_driver = {
.driver = {
.name = KBUILD_MODNAME,
.owner = THIS_MODULE,
.pm = &samsungq10_pm_ops,
},
.probe = samsungq10_probe,
.remove = samsungq10_remove,
Expand Down Expand Up @@ -172,6 +144,11 @@ static int __init samsungq10_init(void)
if (!force && !dmi_check_system(samsungq10_dmi_table))
return -ENODEV;

ec_handle = ec_get_handle();

if (!ec_handle)
return -ENODEV;

samsungq10_device = platform_create_bundle(&samsungq10_driver,
samsungq10_probe,
NULL, 0, NULL, 0);
Expand Down

0 comments on commit aa3b88a

Please sign in to comment.