1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * LEDs driver for Soekris net48xx |
4 | * |
5 | * Copyright (C) 2006 Chris Boot <bootc@bootc.net> |
6 | * |
7 | * Based on leds-ams-delta.c |
8 | */ |
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 20 |
22 | |
23 | static struct platform_device *pdev; |
24 | |
25 | static 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 | |
31 | static struct led_classdev net48xx_error_led = { |
32 | .name = "net48xx::error" , |
33 | .brightness_set = net48xx_error_led_set, |
34 | .flags = LED_CORE_SUSPENDRESUME, |
35 | }; |
36 | |
37 | static int net48xx_led_probe(struct platform_device *pdev) |
38 | { |
39 | return devm_led_classdev_register(parent: &pdev->dev, led_cdev: &net48xx_error_led); |
40 | } |
41 | |
42 | static struct platform_driver net48xx_led_driver = { |
43 | .probe = net48xx_led_probe, |
44 | .driver = { |
45 | .name = DRVNAME, |
46 | }, |
47 | }; |
48 | |
49 | static 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, id: -1, NULL, num: 0); |
64 | if (IS_ERR(ptr: pdev)) { |
65 | ret = PTR_ERR(ptr: pdev); |
66 | platform_driver_unregister(&net48xx_led_driver); |
67 | goto out; |
68 | } |
69 | |
70 | out: |
71 | return ret; |
72 | } |
73 | |
74 | static void __exit net48xx_led_exit(void) |
75 | { |
76 | platform_device_unregister(pdev); |
77 | platform_driver_unregister(&net48xx_led_driver); |
78 | } |
79 | |
80 | module_init(net48xx_led_init); |
81 | module_exit(net48xx_led_exit); |
82 | |
83 | MODULE_AUTHOR("Chris Boot <bootc@bootc.net>" ); |
84 | MODULE_DESCRIPTION("Soekris net48xx LED driver" ); |
85 | MODULE_LICENSE("GPL" ); |
86 | |
87 | |