131 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * LEDs driver for PCEngines WRAP4 *5 * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org>6 *7 * Based on leds-net48xx.c8 */9 10#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/platform_device.h>13#include <linux/leds.h>14#include <linux/err.h>15#include <linux/io.h>16#include <linux/scx200_gpio.h>17#include <linux/module.h>18 19#define DRVNAME "wrap-led"20#define WRAP_POWER_LED_GPIO 221#define WRAP_ERROR_LED_GPIO 322#define WRAP_EXTRA_LED_GPIO 1823 24static struct platform_device *pdev;25 26static void wrap_power_led_set(struct led_classdev *led_cdev,27 enum led_brightness value)28{29 if (value)30 scx200_gpio_set_low(WRAP_POWER_LED_GPIO);31 else32 scx200_gpio_set_high(WRAP_POWER_LED_GPIO);33}34 35static void wrap_error_led_set(struct led_classdev *led_cdev,36 enum led_brightness value)37{38 if (value)39 scx200_gpio_set_low(WRAP_ERROR_LED_GPIO);40 else41 scx200_gpio_set_high(WRAP_ERROR_LED_GPIO);42}43 44static void wrap_extra_led_set(struct led_classdev *led_cdev,45 enum led_brightness value)46{47 if (value)48 scx200_gpio_set_low(WRAP_EXTRA_LED_GPIO);49 else50 scx200_gpio_set_high(WRAP_EXTRA_LED_GPIO);51}52 53static struct led_classdev wrap_power_led = {54 .name = "wrap::power",55 .brightness_set = wrap_power_led_set,56 .default_trigger = "default-on",57 .flags = LED_CORE_SUSPENDRESUME,58};59 60static struct led_classdev wrap_error_led = {61 .name = "wrap::error",62 .brightness_set = wrap_error_led_set,63 .flags = LED_CORE_SUSPENDRESUME,64};65 66static struct led_classdev wrap_extra_led = {67 .name = "wrap::extra",68 .brightness_set = wrap_extra_led_set,69 .flags = LED_CORE_SUSPENDRESUME,70};71 72static int wrap_led_probe(struct platform_device *pdev)73{74 int ret;75 76 ret = devm_led_classdev_register(&pdev->dev, &wrap_power_led);77 if (ret < 0)78 return ret;79 80 ret = devm_led_classdev_register(&pdev->dev, &wrap_error_led);81 if (ret < 0)82 return ret;83 84 return devm_led_classdev_register(&pdev->dev, &wrap_extra_led);85}86 87static struct platform_driver wrap_led_driver = {88 .probe = wrap_led_probe,89 .driver = {90 .name = DRVNAME,91 },92};93 94static int __init wrap_led_init(void)95{96 int ret;97 98 if (!scx200_gpio_present()) {99 ret = -ENODEV;100 goto out;101 }102 103 ret = platform_driver_register(&wrap_led_driver);104 if (ret < 0)105 goto out;106 107 pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);108 if (IS_ERR(pdev)) {109 ret = PTR_ERR(pdev);110 platform_driver_unregister(&wrap_led_driver);111 goto out;112 }113 114out:115 return ret;116}117 118static void __exit wrap_led_exit(void)119{120 platform_device_unregister(pdev);121 platform_driver_unregister(&wrap_led_driver);122}123 124module_init(wrap_led_init);125module_exit(wrap_led_exit);126 127MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>");128MODULE_DESCRIPTION("PCEngines WRAP LED driver");129MODULE_LICENSE("GPL");130 131