[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070704214047.GB1836@elf.ucw.cz>
Date: Wed, 4 Jul 2007 23:40:47 +0200
From: Pavel Machek <pavel@....cz>
To: Dmitry Torokhov <dtor@...ightbb.com>
Cc: Andi Kleen <ak@...e.de>, Indan Zupancic <indan@....nu>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Stephen Hemminger <shemminger@...ux-foundation.org>,
Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org, bwalle@...e.de
Subject: Re: blink driver power saving
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.
It was simpler then I thought... but it has one small problem. It does
not actually work :-(..
it reaches the
printk("Setting led to %d\n", blinker->state);
input_inject_event(&blinker->handle, EV_LED, LED_NUML, blinker->state);
code, but my numlock led does not actually change. Any ideas?
Pavel
(leds-input.c:)
/*
* LED <-> input subsystem glue
*
* Copyright 2007 Pavel Machek <pavel@...e.cz>
* Copyright 2007 Dmitry Torokhov
* Copyright 2005-2006 Openedhand Ltd.
*
* Author: Pavel Machek <pavel@...e.cz>
* Based on code by: Richard Purdie <rpurdie@...nedhand.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 = "sharpsl-charge",
.brightness_set = inputled_set,
};
static void blink_task_handler(struct work_struct *work)
{
struct blinker *blinker = container_of(work, struct blinker, work.work);
printk("Setting led to %d\n", blinker->state);
input_inject_event(&blinker->handle, EV_LED, LED_NUML, 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_NUML)] = BIT(LED_NUML) },
},
{ }
};
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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists