platform samsung-q10: use ACPI instead of direct EC calls
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>
This commit is contained in:
parent
fcb44e12d3
commit
aa3b88a3a4
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
@ -33,21 +29,26 @@ 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 = {
|
||||
|
@ -55,28 +56,6 @@ static const struct backlight_ops samsungq10_bl_ops = {
|
|||
.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)
|
||||
{
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue