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