0001
0002
0003
0004
0005
0006
0007 #include <linux/init.h>
0008 #include <linux/io.h>
0009 #include <linux/ioport.h>
0010 #include <linux/leds.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/spinlock.h>
0013 #include <linux/types.h>
0014 #include <linux/export.h>
0015
0016 #define LED_WEB 0x04
0017 #define LED_POWER_OFF 0x08
0018
0019 static void __iomem *led_port;
0020 static u8 led_value;
0021 static DEFINE_SPINLOCK(led_value_lock);
0022
0023 static void raq_web_led_set(struct led_classdev *led_cdev,
0024 enum led_brightness brightness)
0025 {
0026 unsigned long flags;
0027
0028 spin_lock_irqsave(&led_value_lock, flags);
0029
0030 if (brightness)
0031 led_value |= LED_WEB;
0032 else
0033 led_value &= ~LED_WEB;
0034 writeb(led_value, led_port);
0035
0036 spin_unlock_irqrestore(&led_value_lock, flags);
0037 }
0038
0039 static struct led_classdev raq_web_led = {
0040 .name = "raq::web",
0041 .brightness_set = raq_web_led_set,
0042 };
0043
0044 static void raq_power_off_led_set(struct led_classdev *led_cdev,
0045 enum led_brightness brightness)
0046 {
0047 unsigned long flags;
0048
0049 spin_lock_irqsave(&led_value_lock, flags);
0050
0051 if (brightness)
0052 led_value |= LED_POWER_OFF;
0053 else
0054 led_value &= ~LED_POWER_OFF;
0055 writeb(led_value, led_port);
0056
0057 spin_unlock_irqrestore(&led_value_lock, flags);
0058 }
0059
0060 static struct led_classdev raq_power_off_led = {
0061 .name = "raq::power-off",
0062 .brightness_set = raq_power_off_led_set,
0063 .default_trigger = "power-off",
0064 };
0065
0066 static int cobalt_raq_led_probe(struct platform_device *pdev)
0067 {
0068 struct resource *res;
0069 int retval;
0070
0071 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0072 if (!res)
0073 return -EBUSY;
0074
0075 led_port = devm_ioremap(&pdev->dev, res->start, resource_size(res));
0076 if (!led_port)
0077 return -ENOMEM;
0078
0079 retval = led_classdev_register(&pdev->dev, &raq_power_off_led);
0080 if (retval)
0081 goto err_null;
0082
0083 retval = led_classdev_register(&pdev->dev, &raq_web_led);
0084 if (retval)
0085 goto err_unregister;
0086
0087 return 0;
0088
0089 err_unregister:
0090 led_classdev_unregister(&raq_power_off_led);
0091
0092 err_null:
0093 led_port = NULL;
0094
0095 return retval;
0096 }
0097
0098 static struct platform_driver cobalt_raq_led_driver = {
0099 .probe = cobalt_raq_led_probe,
0100 .driver = {
0101 .name = "cobalt-raq-leds",
0102 },
0103 };
0104
0105 builtin_platform_driver(cobalt_raq_led_driver);