From 1a87d9425e0347c0e880254816d8e9f41a0e2b0c Mon Sep 17 00:00:00 2001 From: Chris Boot Date: Mon, 10 Jul 2006 04:45:34 -0700 Subject: [PATCH] LED Class support for Soekris net48xx Add 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. [akpm@osdl.org: fixlets, cleanups] Signed-off-by: Chris Boot Cc: Ben Dooks Cc: Richard Purdie Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/leds/Kconfig | 7 +++ drivers/leds/Makefile | 1 + drivers/leds/leds-net48xx.c | 115 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 drivers/leds/leds-net48xx.c (limited to 'drivers/leds') diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 96509989e92..9c39b98d5a5 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -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 diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 88d3b6eaa6a..6aa2aed7539 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4xx-gpio.o 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 diff --git a/drivers/leds/leds-net48xx.c b/drivers/leds/leds-net48xx.c new file mode 100644 index 00000000000..35ee52f9b79 --- /dev/null +++ b/drivers/leds/leds-net48xx.c @@ -0,0 +1,115 @@ +/* + * LEDs driver for Soekris net48xx + * + * Copyright (C) 2006 Chris Boot + * + * 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 +#include +#include +#include +#include +#include +#include + +#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) +{ + led_classdev_suspend(&net48xx_error_led); + return 0; +} + +static int net48xx_led_resume(struct platform_device *dev) +{ + led_classdev_resume(&net48xx_error_led); + return 0; +} +#else +#define net48xx_led_suspend NULL +#define net48xx_led_resume NULL +#endif + +static int net48xx_led_probe(struct platform_device *pdev) +{ + 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 = { + .driver.owner = THIS_MODULE, + .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 "); +MODULE_DESCRIPTION("Soekris net48xx LED driver"); +MODULE_LICENSE("GPL"); + -- cgit v1.2.3 From bca3bffec9f37d4cb60b80fd0067f9c7550b5d57 Mon Sep 17 00:00:00 2001 From: Chris Boot Date: Fri, 14 Jul 2006 00:24:21 -0700 Subject: [PATCH] net48xx LED cleanups Add the DRVNAME define to remove the two separate references of the driver name by string, and move the .driver.owner into the existing .driver sub-structure. Signed-off-by: Chris Boot Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/leds/leds-net48xx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'drivers/leds') diff --git a/drivers/leds/leds-net48xx.c b/drivers/leds/leds-net48xx.c index 35ee52f9b79..713c4a8aa77 100644 --- a/drivers/leds/leds-net48xx.c +++ b/drivers/leds/leds-net48xx.c @@ -18,6 +18,7 @@ #include #include +#define DRVNAME "net48xx-led" #define NET48XX_ERROR_LED_GPIO 20 static struct platform_device *pdev; @@ -66,13 +67,13 @@ static int net48xx_led_remove(struct platform_device *pdev) } static struct platform_driver net48xx_led_driver = { - .driver.owner = THIS_MODULE, .probe = net48xx_led_probe, .remove = net48xx_led_remove, .suspend = net48xx_led_suspend, .resume = net48xx_led_resume, .driver = { - .name = "net48xx-led", + .name = DRVNAME, + .owner = THIS_MODULE, }, }; @@ -89,7 +90,7 @@ static int __init net48xx_led_init(void) if (ret < 0) goto out; - pdev = platform_device_register_simple("net48xx-led", -1, NULL, 0); + pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); if (IS_ERR(pdev)) { ret = PTR_ERR(pdev); platform_driver_unregister(&net48xx_led_driver); -- cgit v1.2.3