Re: [PATCH resend 2] x86, olpc-xo15-sci: Enable lid close wakeupcontrol through sysfs

From: Andrew Morton
Date: Wed Nov 30 2011 - 18:15:53 EST


On Tue, 29 Nov 2011 22:24:47 +0000 (GMT)
Daniel Drake <dsd@xxxxxxxxxx> wrote:

> Like most systems, OLPC's ACPI LID switch wakes up the system when the
> lid is opened, but not when it is closed.
>
> Under OLPC's opportunistic suspend model, the lid may be closed while
> the system was oportunistically suspended with the screen running.
> In this event, we want to wake up to turn the screen off.
>
> Enable control of normal ACPI wakeups through lid close events through
> a new sysfs attribute "lid_wake_on_closed". When set, and when
> LID wakeups are enabled through ACPI, the system will wake up on both
> open and close lid events.
>
> Signed-off-by: Daniel Drake <dsd@xxxxxxxxxx>
> ---
> arch/x86/platform/olpc/olpc-xo15-sci.c | 55 ++++++++++++++++++++++++++++++++
> 1 files changed, 55 insertions(+), 0 deletions(-)
>
> Resending after 6 weeks with no feedback.
>
> diff --git a/arch/x86/platform/olpc/olpc-xo15-sci.c b/arch/x86/platform/olpc/olpc-xo15-sci.c
> index 2b235b7..649230c 100644
> --- a/arch/x86/platform/olpc/olpc-xo15-sci.c
> +++ b/arch/x86/platform/olpc/olpc-xo15-sci.c
> @@ -24,6 +24,50 @@
> #define XO15_SCI_DEVICE_NAME "OLPC XO-1.5 SCI"
>
> static unsigned long xo15_sci_gpe;
> +static bool lid_wake_on_close;

I'd have thought that a few code comments which describe what all this
is doing wouldn't hurt. Oh well.

> +static int set_lid_wake_behavior(bool wake_on_close)
> +{
> + struct acpi_object_list arg_list;
> + union acpi_object arg;
> + acpi_status status;
> +
> + arg_list.count = 1;
> + arg_list.pointer = &arg;
> + arg.type = ACPI_TYPE_INTEGER;
> + arg.integer.value = wake_on_close;
> + status = acpi_evaluate_object(NULL, "\\_SB.PCI0.LID.LIDW", &arg_list,
> + NULL);
> + if (ACPI_FAILURE(status)) {
> + pr_warning(PFX "failed to set lid behaviour\n");
> + return 1;
> + }
> +
> + lid_wake_on_close = wake_on_close;
> + return 0;
> +}
> +
> +static ssize_t lid_wake_on_close_show(struct kobject *s,
> + struct kobj_attribute *attr, char *buf)
> +{
> + return sprintf(buf, "%u\n", lid_wake_on_close);
> +}
> +
> +static ssize_t lid_wake_on_close_store(struct kobject *s,
> + struct kobj_attribute *attr,
> + const char *buf, size_t n)
> +{
> + unsigned int val;
> + if (!sscanf(buf, "%u", &val) == 1)
> + return -EINVAL;
> +
> + set_lid_wake_behavior(!!val);
> + return n;
> +}

Let me fix that for you.

--- a/arch/x86/platform/olpc/olpc-xo15-sci.c~x86-olpc-xo15-sci-enable-lid-close-wakeup-control-through-sysfs-fix
+++ a/arch/x86/platform/olpc/olpc-xo15-sci.c
@@ -58,7 +58,8 @@ static ssize_t lid_wake_on_close_store(s
const char *buf, size_t n)
{
unsigned int val;
- if (!sscanf(buf, "%u", &val) == 1)
+
+ if (sscanf(buf, "%u", &val) != 1)
return -EINVAL;

set_lid_wake_behavior(!!val);

It's kinda irritating that this will cheerfully accept bogus input of
the form "42foo". This happens about eleven billion times in sysfs
write() handlers but afaik we've never implemented a nice
sysfs_int_from_buffer() thingy which handles all the possible errors.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/