1 /* 2 * LEDs driver for PCEngines WRAP 3 * 4 * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org> 5 * 6 * Based on leds-net48xx.c 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <linux/platform_device.h> 16 #include <linux/leds.h> 17 #include <linux/err.h> 18 #include <asm/io.h> 19 #include <linux/scx200_gpio.h> 20 21 #define DRVNAME "wrap-led" 22 #define WRAP_POWER_LED_GPIO 2 23 #define WRAP_ERROR_LED_GPIO 3 24 #define WRAP_EXTRA_LED_GPIO 18 25 26 static struct platform_device *pdev; 27 28 static void wrap_power_led_set(struct led_classdev *led_cdev, 29 enum led_brightness value) 30 { 31 if (value) 32 scx200_gpio_set_low(WRAP_POWER_LED_GPIO); 33 else 34 scx200_gpio_set_high(WRAP_POWER_LED_GPIO); 35 } 36 37 static void wrap_error_led_set(struct led_classdev *led_cdev, 38 enum led_brightness value) 39 { 40 if (value) 41 scx200_gpio_set_low(WRAP_ERROR_LED_GPIO); 42 else 43 scx200_gpio_set_high(WRAP_ERROR_LED_GPIO); 44 } 45 46 static void wrap_extra_led_set(struct led_classdev *led_cdev, 47 enum led_brightness value) 48 { 49 if (value) 50 scx200_gpio_set_low(WRAP_EXTRA_LED_GPIO); 51 else 52 scx200_gpio_set_high(WRAP_EXTRA_LED_GPIO); 53 } 54 55 static struct led_classdev wrap_power_led = { 56 .name = "wrap::power", 57 .brightness_set = wrap_power_led_set, 58 }; 59 60 static struct led_classdev wrap_error_led = { 61 .name = "wrap::error", 62 .brightness_set = wrap_error_led_set, 63 }; 64 65 static struct led_classdev wrap_extra_led = { 66 .name = "wrap::extra", 67 .brightness_set = wrap_extra_led_set, 68 }; 69 70 #ifdef CONFIG_PM 71 static int wrap_led_suspend(struct platform_device *dev, 72 pm_message_t state) 73 { 74 led_classdev_suspend(&wrap_power_led); 75 led_classdev_suspend(&wrap_error_led); 76 led_classdev_suspend(&wrap_extra_led); 77 return 0; 78 } 79 80 static int wrap_led_resume(struct platform_device *dev) 81 { 82 led_classdev_resume(&wrap_power_led); 83 led_classdev_resume(&wrap_error_led); 84 led_classdev_resume(&wrap_extra_led); 85 return 0; 86 } 87 #else 88 #define wrap_led_suspend NULL 89 #define wrap_led_resume NULL 90 #endif 91 92 static int wrap_led_probe(struct platform_device *pdev) 93 { 94 int ret; 95 96 ret = led_classdev_register(&pdev->dev, &wrap_power_led); 97 if (ret < 0) 98 return ret; 99 100 ret = led_classdev_register(&pdev->dev, &wrap_error_led); 101 if (ret < 0) 102 goto err1; 103 104 ret = led_classdev_register(&pdev->dev, &wrap_extra_led); 105 if (ret < 0) 106 goto err2; 107 108 return ret; 109 110 err2: 111 led_classdev_unregister(&wrap_error_led); 112 err1: 113 led_classdev_unregister(&wrap_power_led); 114 115 return ret; 116 } 117 118 static int wrap_led_remove(struct platform_device *pdev) 119 { 120 led_classdev_unregister(&wrap_power_led); 121 led_classdev_unregister(&wrap_error_led); 122 led_classdev_unregister(&wrap_extra_led); 123 return 0; 124 } 125 126 static struct platform_driver wrap_led_driver = { 127 .probe = wrap_led_probe, 128 .remove = wrap_led_remove, 129 .suspend = wrap_led_suspend, 130 .resume = wrap_led_resume, 131 .driver = { 132 .name = DRVNAME, 133 .owner = THIS_MODULE, 134 }, 135 }; 136 137 static int __init wrap_led_init(void) 138 { 139 int ret; 140 141 if (!scx200_gpio_present()) { 142 ret = -ENODEV; 143 goto out; 144 } 145 146 ret = platform_driver_register(&wrap_led_driver); 147 if (ret < 0) 148 goto out; 149 150 pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); 151 if (IS_ERR(pdev)) { 152 ret = PTR_ERR(pdev); 153 platform_driver_unregister(&wrap_led_driver); 154 goto out; 155 } 156 157 out: 158 return ret; 159 } 160 161 static void __exit wrap_led_exit(void) 162 { 163 platform_device_unregister(pdev); 164 platform_driver_unregister(&wrap_led_driver); 165 } 166 167 module_init(wrap_led_init); 168 module_exit(wrap_led_exit); 169 170 MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>"); 171 MODULE_DESCRIPTION("PCEngines WRAP LED driver"); 172 MODULE_LICENSE("GPL"); 173 174