Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa3b88a3 authored by Frederick van der Wyck's avatar Frederick van der Wyck Committed by Matthew Garrett
Browse files

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: default avatarFrederick van der Wyck <fvanderwyck@gmail.com>
Signed-off-by: default avatarMatthew Garrett <matthew.garrett@nebula.com>
parent fcb44e12
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+21 −44
Original line number Diff line number Diff line
@@ -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);