On Fri, 19 Oct 2007 20:52:52 +0200 Németh Márton wrote: > From: Márton Németh <[EMAIL PROTECTED]> > > The driver supports the mail LED commonly found on different Clevo notebooks. > The driver access the LED through the i8042 hardware and implements the > support for > hardware accelerated blink function. > > Signed-off-by: Márton Németh <[EMAIL PROTECTED]> > --- > diff -uprN linux-2.6.23.orig/drivers/leds/Kconfig > linux-2.6.23/drivers/leds/Kconfig > --- linux-2.6.23.orig/drivers/leds/Kconfig 2007-10-09 22:31:38.000000000 > +0200 > +++ linux-2.6.23/drivers/leds/Kconfig 2007-10-18 07:20:12.000000000 +0200 > @@ -101,6 +101,26 @@ config LEDS_GPIO > outputs. To be useful the particular board must have LEDs > and they must be connected to the GPIO lines. > > +config LEDS_CLEVO_MAIL > + tristate "Mail LED on Clevo notebook (EXPERIMENTAL)" > + depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI && EXPERIMENTAL > + help > + This driver makes the mail LED accessible from userspace > + programs through the leds subsystem. This LED can blink at > + about 0.5Hz and 1Hz.
?: can blink 1 time every 1 or 2 seconds. > + This module can drive the mail LED for the following notebooks: > + > + Clevo D410J > + Clevo D410V > + Clevo D400V/D470V (not tested, but might work) > + Clevo M540N > + Clevo M5x0N (not tested, but might work) > + Positivo Mobile (Clevo M5x0V) > + > + To compile this driver as a module, choose M here: the > + module will be called leds-clevo-mail. > + > comment "LED Triggers" > > config LEDS_TRIGGERS > diff -uprN linux-2.6.23.orig/drivers/leds/leds-clevo-mail.c > linux-2.6.23/drivers/leds/leds-clevo-mail.c > --- linux-2.6.23.orig/drivers/leds/leds-clevo-mail.c 1970-01-01 > 01:00:00.000000000 +0100 > +++ linux-2.6.23/drivers/leds/leds-clevo-mail.c 2007-10-18 > 07:17:56.000000000 +0200 > @@ -0,0 +1,226 @@ > + > +#include <linux/module.h> > + > +#include <linux/platform_device.h> > +#include <linux/err.h> > +#include <linux/leds.h> > + > +#include <linux/io.h> > +#include <linux/dmi.h> > + > +#include <linux/i8042.h> > + > + > +#define TRUE 1 > +#define FALSE 0 Just use true / false. > +#define HANDLED 0 > + > +#define CLEVO_MAIL_LED_OFF 0x0084 > +#define CLEVO_MAIL_LED_BLINK_1HZ 0x008A > +#define CLEVO_MAIL_LED_BLINK_0_5HZ 0x0083 > + > +#define MODULE_FNAME "leds-clevo-mail.c" > +#define DRVNAME "clevo-mail-led" Kbuild provides KBUILD_BASENAME and KBUILD_MODNAME. Can you use one of those? > +#define NO_RESOURCES NULL Just use NULL. > +MODULE_AUTHOR("Márton Németh <[EMAIL PROTECTED]>"); > +MODULE_DESCRIPTION("Clevo mail LED driver"); > +MODULE_LICENSE("GPL"); > + > + > +static int __init clevo_mail_led_dmi_callback(struct dmi_system_id *id) > +{ > + printk(KERN_INFO MODULE_FNAME ": '%s' found\n", id->ident); MODULE_FNAME string looks too long and out of place here. > + return 1; > +} > + > +/** /** introduces kernel-doc, but there is no following kernel-doc...., so just use /*, please. > + * struct mail_led_whitelist - List of known good models > + * > + * Contains the known good models this driver is compatible with. > + * When adding a new model try to be as strict as possible. This > + * makes it possible to keep the false positives (the model is > + * detected as working, but in reality it is not) as low as > + * possible. > + */ > +static struct dmi_system_id __initdata mail_led_whitelist[] = { > + { ... > + { } > +}; > + > + > + > +static struct led_classdev clevo_mail_led = { > + .name = "clevo::mail", What's the purpose of the "::"? > + .brightness_set = clevo_mail_led_set, > + .blink_set = clevo_mail_led_blink, > +}; > + > + > +static struct platform_driver clevo_mail_led_driver = { > + .probe = clevo_mail_led_probe, > + .remove = clevo_mail_led_remove, > +#ifdef CONFIG_PM > + .suspend = clevo_mail_led_suspend, > + .resume = clevo_mail_led_resume, > +#endif > + .driver = { > + .name = DRVNAME, > + }, > +}; We prefer to have clevo_mail_led_susped() and _resume() defined all the time, so that the above ifdef & endif can go away, so do more like: #ifdef CONFIG_PM /* those functions as you have them */ #else #define clevo_mail_led_suspend NULL #define clevo_mail_led_resume NULL #endif > +static int __init clevo_mail_led_init(void) > +{ > + int error = 0; > + int count = 0; > + > + /* Check with the help of DMI if we are running on supported hardware */ > + if (!nodetect) { > + count = dmi_check_system(mail_led_whitelist); > + } else { > + count = 1; > + printk(KERN_ERR MODULE_FNAME ": Skipping DMI detection. " > + "If the driver works on your hardware please " > + "report model and the output of dmidecode in tracker " > + "at http://sourceforge.net/projects/clevo-mailled/\n"); > + } > + > + if (!count) { > + return -ENODEV; > + } Don't use braces on one-statement/one-line "blocks." > + pdev = platform_device_register_simple(DRVNAME, -1, NO_RESOURCES, 0); > + if (!IS_ERR(pdev)) { > + error = platform_driver_probe(&clevo_mail_led_driver, > + clevo_mail_led_probe); > + if (error) { > + printk(KERN_ERR MODULE_FNAME Use the module logical name, not source file name. > + ": Can't probe platform driver\n"); > + platform_device_unregister(pdev); > + } > + } else { > + error = PTR_ERR(pdev); > + } > + > + return error; > +} --- ~Randy - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/