1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * linux/drivers/leds/leds-locomo.c |
4 | * |
5 | * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> |
6 | */ |
7 | |
8 | #include <linux/kernel.h> |
9 | #include <linux/init.h> |
10 | #include <linux/module.h> |
11 | #include <linux/device.h> |
12 | #include <linux/leds.h> |
13 | |
14 | #include <asm/hardware/locomo.h> |
15 | |
16 | static void locomoled_brightness_set(struct led_classdev *led_cdev, |
17 | enum led_brightness value, int offset) |
18 | { |
19 | struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent); |
20 | unsigned long flags; |
21 | |
22 | local_irq_save(flags); |
23 | if (value) |
24 | locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset); |
25 | else |
26 | locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset); |
27 | local_irq_restore(flags); |
28 | } |
29 | |
30 | static void locomoled_brightness_set0(struct led_classdev *led_cdev, |
31 | enum led_brightness value) |
32 | { |
33 | locomoled_brightness_set(led_cdev, value, offset: LOCOMO_LPT0); |
34 | } |
35 | |
36 | static void locomoled_brightness_set1(struct led_classdev *led_cdev, |
37 | enum led_brightness value) |
38 | { |
39 | locomoled_brightness_set(led_cdev, value, offset: LOCOMO_LPT1); |
40 | } |
41 | |
42 | static struct led_classdev locomo_led0 = { |
43 | .name = "locomo:amber:charge" , |
44 | .default_trigger = "main-battery-charging" , |
45 | .brightness_set = locomoled_brightness_set0, |
46 | }; |
47 | |
48 | static struct led_classdev locomo_led1 = { |
49 | .name = "locomo:green:mail" , |
50 | .default_trigger = "nand-disk" , |
51 | .brightness_set = locomoled_brightness_set1, |
52 | }; |
53 | |
54 | static int locomoled_probe(struct locomo_dev *ldev) |
55 | { |
56 | int ret; |
57 | |
58 | ret = devm_led_classdev_register(parent: &ldev->dev, led_cdev: &locomo_led0); |
59 | if (ret < 0) |
60 | return ret; |
61 | |
62 | return devm_led_classdev_register(parent: &ldev->dev, led_cdev: &locomo_led1); |
63 | } |
64 | |
65 | |
66 | static struct locomo_driver locomoled_driver = { |
67 | .drv = { |
68 | .name = "locomoled" |
69 | }, |
70 | .devid = LOCOMO_DEVID_LED, |
71 | .probe = locomoled_probe, |
72 | }; |
73 | |
74 | static int __init locomoled_init(void) |
75 | { |
76 | return locomo_driver_register(&locomoled_driver); |
77 | } |
78 | module_init(locomoled_init); |
79 | |
80 | MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>" ); |
81 | MODULE_DESCRIPTION("Locomo LED driver" ); |
82 | MODULE_LICENSE("GPL" ); |
83 | |