LED Class support for Soekris net48xx
Subsystems (2)
Chris Boot
maintainerRFC PATCH 1/1 LED Class support for Soekris net48xx
Hi all,
After many years using Linux and hanging about on LKML without having done much actual kernel hacking, I've decided to have a go! The module below adds LED Class device support for the Soekris net48xx Error LED. Tested only on a net4801, but should work on a net4826 as well. I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
The patch is attached because Thunderbird kills tabs.
Signature · 3 lines
Chris Boot [email protected] http://www.bootc.net/
MAINTAINERS +5 -0
@@ -2666,6 +2666,11 @@ M: [email protected] L: [email protected] S: Maintained +SOEKRIS NET48XX LED SUPPORT +P: Chris Boot +M: [email protected] +S: Maintained + SPARC (sparc32): P: William L. Irwin M: [email protected]
drivers/leds/Kconfig +7 -0
@@ -69,6 +69,13 @@ config LEDS_AMS_DELTA help This option enables support for the LEDs on Amstrad Delta (E3). +config LEDS_NET48XX + tristate "LED Support for Soekris net48xx series Error LED" + depends on LEDS_CLASS && SCx200_GPIO + help + This option enables support for the Soekris net4801 and net4826 error + LED. + comment "LED Triggers" config LEDS_TRIGGERS
drivers/leds/Makefile +1 -0
@@ -12,6 +12,7 @@ obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4x obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o +obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o # LED Triggers obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
drivers/leds/leds-net48xx.c new file +116 -0
116 lines not on this page · raw message
Quoted 6 lines · Chris Boot
Hi all,
After many years using Linux and hanging about on LKML without having done much actual kernel hacking, I've decided to have a go! The module below adds LED Class device support for the Soekris net48xx Error LED. Tested only on a net4801, but should work on a net4826 as well. I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
The patch is attached because Thunderbird kills tabs.
FWIW, the vintage scx200_gpio driver manipulates the LED just fine.
# cat /etc/modprobe.d/gpio # assign last 2 dynamic devnums to gpio (255..240) options scx200_gpio major=240 options pc8736x_gpio major=241
soekris:~# ll /dev/led crw-r--r-- 1 root root 240, 20 Jun 24 2005 /dev/led
echo 1 > /dev/led
Is this insufficient ?
Chris Boot
maintainerQuoted 14 lines · Jim Cromie
Quoted 6 lines · Chris Boot
Hi all,
After many years using Linux and hanging about on LKML without having done much actual kernel hacking, I've decided to have a go! The module below adds LED Class device support for the Soekris net48xx Error LED. Tested only on a net4801, but should work on a net4826 as well. I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
The patch is attached because Thunderbird kills tabs.
FWIW, the vintage
scx200_gpiodriver manipulates the LED just fine.# cat /etc/modprobe.d/gpio # assign last 2 dynamic devnums to gpio (255..240) options scx200_gpio major=240 options pc8736x_gpio major=241
Quoted 7 lines
soekris:~# ll /dev/led crw-r--r-- 1 root root 240, 20 Jun 24 2005 /dev/ledecho 1 >
/dev/ledIs this insufficient ?
It works indeed very well, and this driver actually uses the scx200_gpio module to do its work. But no it isn't enough, since this code ties into the existing LED framework and can do nice built-in functionality like blinking according to a timer, IDE disk activity, and a heatbeat-style load indicator. For free.
Chris
Signature · 3 lines
Chris Boot [email protected] http://www.bootc.net/
Chris Boot
maintainerQuoted 9 lines · Chris Boot
Hi all,
After many years using Linux and hanging about on LKML without having done much actual kernel hacking, I've decided to have a go! The module below adds LED Class device support for the Soekris net48xx Error LED. Tested only on a net4801, but should work on a net4826 as well. I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
The patch is attached because Thunderbird kills tabs.
------------------------------------------------------------------------
And here's the really belated sign-off!
Quoted 168 lines
MAINTAINERS +5
-0@@ -2666,6 +2666,11 @@ M: [email protected] L: [email protected] S: Maintained +SOEKRIS NET48XX LED SUPPORT +P: Chris Boot +M: [email protected] +S: Maintained + SPARC (sparc32): P: William L. Irwin M: [email protected]drivers/leds/Kconfig +7
-0@@ -69,6 +69,13 @@ config LEDS_AMS_DELTA help This option enables support for the LEDs on Amstrad Delta (E3). +config LEDS_NET48XX + tristate "LED Support for Soekris net48xx series Error LED" + depends on LEDS_CLASS && SCx200_GPIO + help + This option enables support for the Soekris net4801 and net4826 error + LED. + comment "LED Triggers" config LEDS_TRIGGERSdrivers/leds/Makefile +1
-0@@ -12,6 +12,7 @@ obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4x obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o +obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o # LED Triggers obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.odrivers/leds/leds-net48xx.c new file +116
-0@@ -0,0 +1,116 @@ +/* +* LEDs driver for Soekris net48xx +* +* Copyright (C) 2006 Chris Boot <[email protected]> +* +* Based on leds-ams-delta.c +* +* 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/err.h> +#include <asm/io.h> +#include <linux/scx200_gpio.h> + +#define NET48XX_ERROR_LED_GPIO 20 + +static struct platform_device *pdev; + +static void net48xx_error_led_set (struct led_classdev *led_cdev, +enum led_brightness value) +{ +if (value) +scx200_gpio_set_high (NET48XX_ERROR_LED_GPIO ); +else +scx200_gpio_set_low (NET48XX_ERROR_LED_GPIO ); +} + +static struct led_classdev net48xx_error_led = { + .name ="net48xx:error" , + .brightness_set = net48xx_error_led_set, +}; + +#ifdef CONFIG_PM +static int net48xx_led_suspend (struct platform_device *dev, +pm_message_t state) +{ +return led_classdev_suspend (&net48xx_error_led); +} + +static int net48xx_led_resume (struct platform_device *dev) +{ +return led_classdev_resume (&net48xx_error_led); +} +#else +#define net48xx_led_suspend NULL +#define net48xx_led_resume NULL +#endif + +static int net48xx_led_probe (struct platform_device *pdev) +{ +if (!scx200_gpio_present ()) +return ENODEV ; + +return led_classdev_register (&pdev->dev, + &net48xx_error_led); +} + +static int net48xx_led_remove (struct platform_device *pdev) +{ +led_classdev_unregister (&net48xx_error_led); +return 0 ; +} + +static struct platform_driver net48xx_led_driver = { + .probe = net48xx_led_probe, + .remove = net48xx_led_remove, + .suspend = net48xx_led_suspend, + .resume = net48xx_led_resume, + .driver = { + .name ="net48xx-led" , + }, +}; + +static int __init net48xx_led_init (void ) +{ +int ret; + +if (!scx200_gpio_present ()) { + ret =ENODEV ; + goto out; + } + + ret =platform_driver_register (&net48xx_led_driver); +if (ret <0 ) + goto out; + + pdev =platform_device_register_simple ("net48xx-led" ,-1 ,NULL ,0 ); +if (IS_ERR (pdev)) { + ret =PTR_ERR (pdev); +platform_driver_unregister (&net48xx_led_driver); + goto out; + } + +out: +return ret; +} + +static void __exit net48xx_led_exit(void) +{ +platform_device_unregister (pdev); +platform_driver_unregister (&net48xx_led_driver); +} + +module_init (net48xx_led_init); +module_exit (net48xx_led_exit); + +MODULE_AUTHOR ("Chris Boot <[email protected]>" ); +MODULE_DESCRIPTION ("Soekris net48xx LED driver" ); +MODULE_LICENSE ("GPL" ); +
Signature · 3 lines
Chris Boot [email protected] http://www.bootc.net/
Quoted 2 lines · Chris Boot
I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
You could do ugly things like this:
int i;
char *bios = __va(0xf0000);
for(i = 0; i < 0x10000 - 19; i++) {
if(memcmp(bios + i, "Soekris Engineering", 19) == 0) {
printk("soekris string found at 0x%x\n", i);
}
}The string "net4801" is also in there (although I'm using a 4826).
If anyone knows a better way, I'd like to know it too.
Eric
Chris Boot
maintainerQuoted 15 lines · Eric Lammerts
Quoted 2 lines · Chris Boot
I'd love to find a way of detecting a Soekris net48xx device but there is no DMI or any Soekris-specific PCI devices.
You could do ugly things like this:
int i; char *bios = __va(0xf0000); for(i = 0; i < 0x10000 - 19; i++) { if(memcmp(bios + i, "Soekris Engineering", 19) == 0) { printk("soekris string found at 0x%x\n", i); } }
Quoted 3 lines
The string "net4801" is also in there (although I'm using a 4826).
If anyone knows a better way, I'd like to know it too.
Hmm, very ugly indeed! Where did you dig those offsets up from? Are they likely to work properly in non-Soekris devices? I think just relying on people not loading the module when not in the correct hardware is probably the best option at the moment...
Chris
Signature · 3 lines
Chris Boot [email protected] http://www.bootc.net/
Quoted 6 lines · Chris Boot
Quoted 3 lines · Eric Lammerts
char *bios = __va(0xf0000); for(i = 0; i < 0x10000 - 19; i++) {Hmm, very ugly indeed! Where did you dig those offsets up from? Are they likely to work properly in non-Soekris devices?
That's where the standard PC BIOS ROM is located (0xf0000-0xfffff). I use the same kernel on normal PC mainboards too and haven't seen any problems so far.
Eric