From: Pavel Machek <pavel@ucw.cz>
To: Dmitry Torokhov <dtor@insightbb.com>
Cc: Andi Kleen <ak@suse.de>, Indan Zupancic <indan@nul.nu>,
Linus Torvalds <torvalds@linux-foundation.org>,
Stephen Hemminger <shemminger@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, bwalle@suse.de
Subject: Re: blink driver power saving
Date: Thu, 5 Jul 2007 00:11:22 +0200 [thread overview]
Message-ID: <20070704221122.GA1719@elf.ucw.cz> (raw)
In-Reply-To: <200707030142.36252.dtor@insightbb.com>
Hi!
> > > > > Perhaps one of you geniuses who all hate it can find a better way to
> > > > > solve the "video output dead after kexec; but need visual feedback to the user
> > > > > while crash dumping" problem. I'm waiting for your patches.
> > > > >
> > > >
> > > > I don't don't like it ;) Unfortunately too many people end up enabling
> > >
> > > Yes that's pretty weird. I admit I hadn't expected
> > > that problem. blink is equivalent to "annoy me" and it
> > > is a mystery why so many people should willingly ask their computer to
> > > annoy them.
> >
> > tristate "Keyboard blink driver"
> >
> > ...drivers are not expected to act on their own. I was expecting to
> > get nice /sys/class/led* interface to my keyboard leds.
> >
> > BTW ... I still believe we should have /sys/class/led* interface to
> > those leds. I'd like to make them blink with hdd activity on some
> > machines... of course, that needs non-buggy KBC.
>
> I'll take patches. Ofcourse we'll have to keep the current EV_LED interface
> for compatibility.
Here's a working version. For some reason, it only works with capslock
led. (But so does your code, is that thinkpad problem?)
Andi, by making default trigger "heartbeat", you can get very nice
visual feedback :-).
Signed-off-by: Pavel Machek <pavel@suse.cz>
/*
* LED <-> input subsystem glue
*
* Copyright 2007 Pavel Machek <pavel@suse.cz>
* Copyright 2007 Dmitry Torokhov
* Copyright 2005-2006 Openedhand Ltd.
*
* Author: Pavel Machek <pavel@suse.cz>
* Based on code by: Richard Purdie <rpurdie@openedhand.com>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
#include <linux/init.h>
struct blinker {
struct delayed_work work;
struct input_handle handle;
int state;
};
struct blinker *blinker;
static void inputled_set(struct led_classdev *led_cdev, enum led_brightness value)
{
blinker->state = value;
schedule_delayed_work(&blinker->work, 0);
}
static struct led_classdev input_led = {
.name = "input",
.default_trigger = "none",
.brightness_set = inputled_set,
};
static void blink_task_handler(struct work_struct *work)
{
struct blinker *blinker = container_of(work, struct blinker, work.work);
input_inject_event(&blinker->handle, EV_LED, LED_CAPSL, !!blinker->state);
}
static void blink_event(struct input_handle *handle, unsigned int type,
unsigned int code, int down)
{
/*
* This is a very rare handler that does not process any input
* events; just injects them.
*/
}
static int blink_connect(struct input_handler *handler, struct input_dev *dev,
const struct input_device_id *id)
{
struct input_handle *handle;
int error;
blinker = kzalloc(sizeof(struct blinker), GFP_KERNEL);
if (!blinker)
return -ENOMEM;
INIT_DELAYED_WORK(&blinker->work, blink_task_handler);
handle = &blinker->handle;
handle->dev = dev;
handle->handler = handler;
handle->name = "blink";
handle->private = blinker;
error = input_register_handle(handle);
if (error)
goto err_free_handle;
error = input_open_device(handle);
if (error)
goto err_unregister_handle;
error = led_classdev_register(NULL, &input_led);
if (error < 0)
goto err_input_close_device;
return 0;
err_input_close_device:
input_close_device(handle);
err_unregister_handle:
input_unregister_handle(handle);
err_free_handle:
kfree(handle);
return error;
}
static void blink_disconnect(struct input_handle *handle)
{
struct blinker *blinker = handle->private;
led_classdev_unregister(&input_led);
cancel_rearming_delayed_work(&blinker->work);
input_close_device(handle);
input_unregister_handle(handle);
kfree(blinker);
}
static const struct input_device_id blink_ids[] = {
{
.flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_LEDBIT,
.evbit = { BIT(EV_LED) },
.ledbit = { [LONG(LED_CAPSL)] = BIT(LED_CAPSL) },
},
{ }
};
static struct input_handler blink_handler = {
.event = blink_event,
.connect = blink_connect,
.disconnect = blink_disconnect,
.name = "blink",
.id_table = blink_ids,
};
static int __init blink_handler_init(void)
{
return input_register_handler(&blink_handler);
}
static void __exit blink_handler_exit(void)
{
input_unregister_handler(&blink_handler);
flush_scheduled_work();
}
module_init(blink_handler_init);
module_exit(blink_handler_exit);
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
next prev parent reply other threads:[~2007-07-04 22:11 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-02 11:43 blink driver power saving Indan Zupancic
2007-07-02 11:51 ` Andi Kleen
2007-07-02 12:29 ` Indan Zupancic
2007-07-02 12:31 ` Dmitry Torokhov
2007-07-02 12:39 ` Andi Kleen
2007-07-02 12:56 ` Bernhard Walle
2007-07-02 13:42 ` Dmitry Torokhov
2007-07-02 13:43 ` Dmitry Torokhov
2007-07-02 20:19 ` Bernhard Walle
2007-07-04 21:47 ` Pavel Machek
2007-07-05 5:25 ` Dmitry Torokhov
2007-07-02 23:08 ` Pavel Machek
2007-07-03 5:42 ` Dmitry Torokhov
2007-07-04 21:40 ` Pavel Machek
2007-07-04 21:57 ` Pavel Machek
2007-07-04 22:11 ` Pavel Machek [this message]
2007-07-05 5:38 ` Dmitry Torokhov
2007-07-12 9:10 ` Pavel Machek
2007-07-13 0:42 ` Jiri Kosina
2007-07-04 22:32 ` Pavel Machek
2007-07-04 22:46 ` Linus Torvalds
2007-07-04 22:59 ` Pavel Machek
[not found] ` <alpine.LFD.0.98.0707041610530.9434@woody.linux-foundation.org>
2007-07-04 23:20 ` Pavel Machek
2007-07-03 7:12 ` Bernhard Walle
2007-07-04 19:37 ` Pavel Machek
2007-07-05 20:30 ` Bill Davidsen
[not found] <8CaWr-2o4-19@gated-at.bofh.it>
[not found] ` <8Cfjl-PJ-33@gated-at.bofh.it>
[not found] ` <8CfW1-1TX-23@gated-at.bofh.it>
[not found] ` <8ChEo-4yy-1@gated-at.bofh.it>
2007-07-02 13:11 ` Bodo Eggert
-- strict thread matches above, loose matches on Subject: below --
2007-07-01 16:50 Stephen Hemminger
2007-07-01 18:07 ` Linus Torvalds
2007-07-01 21:29 ` Andi Kleen
2007-07-01 22:14 ` Linus Torvalds
2007-07-01 23:59 ` Andi Kleen
2007-07-02 15:51 ` Linus Torvalds
2007-07-02 16:59 ` Alan Cox
2007-07-02 17:50 ` Stephen Hemminger
2007-07-02 19:03 ` Dmitry Torokhov
2007-07-02 19:08 ` Andi Kleen
2007-07-02 23:18 ` Pavel Machek
2007-07-01 21:26 ` Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070704221122.GA1719@elf.ucw.cz \
--to=pavel@ucw.cz \
--cc=ak@suse.de \
--cc=akpm@linux-foundation.org \
--cc=bwalle@suse.de \
--cc=dtor@insightbb.com \
--cc=indan@nul.nu \
--cc=linux-kernel@vger.kernel.org \
--cc=shemminger@linux-foundation.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox