Source
13
13
#include <linux/mfd/ipaq-micro.h>
14
14
#include <linux/leds.h>
15
15
16
16
#define LED_YELLOW 0x00
17
17
#define LED_GREEN 0x01
18
18
19
19
#define LED_EN (1 << 4) /* LED ON/OFF 0:off, 1:on */
20
20
#define LED_AUTOSTOP (1 << 5) /* LED ON/OFF auto stop set 0:disable, 1:enable */
21
21
#define LED_ALWAYS (1 << 6) /* LED Interrupt Mask 0:No mask, 1:mask */
22
22
23
-
static void micro_leds_brightness_set(struct led_classdev *led_cdev,
23
+
static int micro_leds_brightness_set(struct led_classdev *led_cdev,
24
24
enum led_brightness value)
25
25
{
26
26
struct ipaq_micro *micro = dev_get_drvdata(led_cdev->dev->parent->parent);
27
27
/*
28
28
* In this message:
29
29
* Byte 0 = LED color: 0 = yellow, 1 = green
30
30
* yellow LED is always ~30 blinks per minute
31
31
* Byte 1 = duration (flags?) appears to be ignored
32
32
* Byte 2 = green ontime in 1/10 sec (deciseconds)
33
33
* 1 = 1/10 second
43
43
44
44
msg.tx_data[0] = LED_GREEN;
45
45
msg.tx_data[1] = 0;
46
46
if (value) {
47
47
msg.tx_data[2] = 0; /* Duty cycle 256 */
48
48
msg.tx_data[3] = 1;
49
49
} else {
50
50
msg.tx_data[2] = 1;
51
51
msg.tx_data[3] = 0; /* Duty cycle 256 */
52
52
}
53
-
ipaq_micro_tx_msg_sync(micro, &msg);
53
+
return ipaq_micro_tx_msg_sync(micro, &msg);
54
54
}
55
55
56
56
/* Maximum duty cycle in ms 256/10 sec = 25600 ms */
57
57
#define IPAQ_LED_MAX_DUTY 25600
58
58
59
59
static int micro_leds_blink_set(struct led_classdev *led_cdev,
60
60
unsigned long *delay_on,
61
61
unsigned long *delay_off)
62
62
{
63
63
struct ipaq_micro *micro = dev_get_drvdata(led_cdev->dev->parent->parent);
95
95
msg.tx_data[2] = (u8) DIV_ROUND_CLOSEST(*delay_on, 100);
96
96
if (*delay_off >= IPAQ_LED_MAX_DUTY)
97
97
msg.tx_data[3] = 0;
98
98
else
99
99
msg.tx_data[3] = (u8) DIV_ROUND_CLOSEST(*delay_off, 100);
100
100
return ipaq_micro_tx_msg_sync(micro, &msg);
101
101
}
102
102
103
103
static struct led_classdev micro_led = {
104
104
.name = "led-ipaq-micro",
105
-
.brightness_set = micro_leds_brightness_set,
105
+
.brightness_set_blocking = micro_leds_brightness_set,
106
106
.blink_set = micro_leds_blink_set,
107
107
.flags = LED_CORE_SUSPENDRESUME,
108
108
};
109
109
110
110
static int micro_leds_probe(struct platform_device *pdev)
111
111
{
112
112
int ret;
113
113
114
114
ret = devm_led_classdev_register(&pdev->dev, µ_led);
115
115
if (ret) {