87 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * LEDs driver for Soekris net48xx4 *5 * Copyright (C) 2006 Chris Boot <bootc@bootc.net>6 *7 * Based on leds-ams-delta.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/nsc_gpio.h>17#include <linux/scx200_gpio.h>18#include <linux/module.h>19 20#define DRVNAME "net48xx-led"21#define NET48XX_ERROR_LED_GPIO 2022 23static struct platform_device *pdev;24 25static void net48xx_error_led_set(struct led_classdev *led_cdev,26 enum led_brightness value)27{28 scx200_gpio_ops.gpio_set(NET48XX_ERROR_LED_GPIO, value ? 1 : 0);29}30 31static struct led_classdev net48xx_error_led = {32 .name = "net48xx::error",33 .brightness_set = net48xx_error_led_set,34 .flags = LED_CORE_SUSPENDRESUME,35};36 37static int net48xx_led_probe(struct platform_device *pdev)38{39 return devm_led_classdev_register(&pdev->dev, &net48xx_error_led);40}41 42static struct platform_driver net48xx_led_driver = {43 .probe = net48xx_led_probe,44 .driver = {45 .name = DRVNAME,46 },47};48 49static int __init net48xx_led_init(void)50{51 int ret;52 53 /* small hack, but scx200_gpio doesn't set .dev if the probe fails */54 if (!scx200_gpio_ops.dev) {55 ret = -ENODEV;56 goto out;57 }58 59 ret = platform_driver_register(&net48xx_led_driver);60 if (ret < 0)61 goto out;62 63 pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);64 if (IS_ERR(pdev)) {65 ret = PTR_ERR(pdev);66 platform_driver_unregister(&net48xx_led_driver);67 goto out;68 }69 70out:71 return ret;72}73 74static void __exit net48xx_led_exit(void)75{76 platform_device_unregister(pdev);77 platform_driver_unregister(&net48xx_led_driver);78}79 80module_init(net48xx_led_init);81module_exit(net48xx_led_exit);82 83MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");84MODULE_DESCRIPTION("Soekris net48xx LED driver");85MODULE_LICENSE("GPL");86 87