10cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka/*
20cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka * LED Triggers for USB Activity
30cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka *
40cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka * Copyright 2014 Michal Sojka <sojka@merica.cz>
50cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka *
60cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka * This program is free software; you can redistribute it and/or modify
70cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka * it under the terms of the GNU General Public License version 2 as
80cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka * published by the Free Software Foundation.
90cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka *
100cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka */
110cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
120cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#include <linux/module.h>
130cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#include <linux/kernel.h>
140cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#include <linux/init.h>
150cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#include <linux/leds.h>
160cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#include <linux/usb.h>
170cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
180cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka#define BLINK_DELAY 30
190cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
200cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkastatic unsigned long usb_blink_delay = BLINK_DELAY;
210cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
220cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal SojkaDEFINE_LED_TRIGGER(ledtrig_usb_gadget);
230cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal SojkaDEFINE_LED_TRIGGER(ledtrig_usb_host);
240cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
250cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkavoid usb_led_activity(enum usb_led_event ev)
260cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka{
270cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	struct led_trigger *trig = NULL;
280cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
290cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	switch (ev) {
300cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	case USB_LED_EVENT_GADGET:
310cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka		trig = ledtrig_usb_gadget;
320cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka		break;
330cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	case USB_LED_EVENT_HOST:
340cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka		trig = ledtrig_usb_host;
350cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka		break;
360cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	}
370cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	/* led_trigger_blink_oneshot() handles trig == NULL gracefully */
380cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	led_trigger_blink_oneshot(trig, &usb_blink_delay, &usb_blink_delay, 0);
390cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka}
400cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal SojkaEXPORT_SYMBOL_GPL(usb_led_activity);
410cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
420cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
430cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkastatic int __init ledtrig_usb_init(void)
440cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka{
450cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	led_trigger_register_simple("usb-gadget", &ledtrig_usb_gadget);
460cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	led_trigger_register_simple("usb-host", &ledtrig_usb_host);
470cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	return 0;
480cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka}
490cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
500cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkastatic void __exit ledtrig_usb_exit(void)
510cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka{
520cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	led_trigger_unregister_simple(ledtrig_usb_gadget);
530cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka	led_trigger_unregister_simple(ledtrig_usb_host);
540cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka}
550cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojka
560cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkamodule_init(ledtrig_usb_init);
570cfbd328d60f85b0dcf66df61a3615e9a8e5d4e4Michal Sojkamodule_exit(ledtrig_usb_exit);
58