1c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie/* 2c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * Driver model for leds and led triggers 3c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * 4c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> 5c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com> 6c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * 7c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * This program is free software; you can redistribute it and/or modify 8c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * it under the terms of the GNU General Public License version 2 as 9c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * published by the Free Software Foundation. 10c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * 11c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie */ 12c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie#ifndef __LINUX_LEDS_H_INCLUDED 13c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie#define __LINUX_LEDS_H_INCLUDED 14c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 15af410fc13d95f079910fc3dca7496590c3275967Johannes Berg#include <linux/list.h> 16dc47206e552c0850ad11f7e9a1fca0a3c92f5d65Richard Purdie#include <linux/rwsem.h> 17047133066e6c2549403fe5a2d619f47ba4212ef5Jacek Anaszewski#include <linux/spinlock.h> 189067359faf890b3a18ab38c792d458fba77b32b4Jiri Kosina#include <linux/timer.h> 19d23a22a74fded23a12434c9463fe66cec2b0afcdFabio Baltieri#include <linux/workqueue.h> 20af410fc13d95f079910fc3dca7496590c3275967Johannes Berg 21c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdiestruct device; 22c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie/* 23c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie * LED Core 24c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie */ 25c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 26c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdieenum led_brightness { 27fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks LED_OFF = 0, 28fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks LED_HALF = 127, 29fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks LED_FULL = 255, 30c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie}; 31c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 32c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdiestruct led_classdev { 33fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks const char *name; 34d8082827d8a214343b761f2c4554d2a7d1573d63Jacek Anaszewski enum led_brightness brightness; 35d8082827d8a214343b761f2c4554d2a7d1573d63Jacek Anaszewski enum led_brightness max_brightness; 36fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks int flags; 37c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 38859cb7f2a4244ea6da206d3fe9cc8a6810947a68Richard Purdie /* Lower 16 bits reflect status */ 39fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks#define LED_SUSPENDED (1 << 0) 40859cb7f2a4244ea6da206d3fe9cc8a6810947a68Richard Purdie /* Upper 16 bits reflect control information */ 41859cb7f2a4244ea6da206d3fe9cc8a6810947a68Richard Purdie#define LED_CORE_SUSPENDRESUME (1 << 16) 425bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri#define LED_BLINK_ONESHOT (1 << 17) 435bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri#define LED_BLINK_ONESHOT_STOP (1 << 18) 445bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri#define LED_BLINK_INVERT (1 << 19) 45c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 46fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks /* Set LED brightness level */ 472e214e0fa21465cf2749ca7d5a072cf8591f3213Richard Purdie /* Must not sleep, use a workqueue if needed */ 48fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks void (*brightness_set)(struct led_classdev *led_cdev, 49fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks enum led_brightness brightness); 5029d76dfa29fe22583aefddccda0bc56aa81035dcHenrique de Moraes Holschuh /* Get LED brightness level */ 5129d76dfa29fe22583aefddccda0bc56aa81035dcHenrique de Moraes Holschuh enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); 52fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks 535ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg /* 545ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * Activate hardware accelerated blink, delays are in milliseconds 555ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * and if both are zero then a sensible default should be chosen. 565ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * The call should adjust the timings in that case and if it can't 575ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * match the values specified exactly. 585ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * Deactivate blinking again when the brightness is set to a fixed 595ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * value via the brightness_set() callback. 605ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg */ 614c79141d28bc290ae307e3f81f5bc909c26faf6eMárton Németh int (*blink_set)(struct led_classdev *led_cdev, 624c79141d28bc290ae307e3f81f5bc909c26faf6eMárton Németh unsigned long *delay_on, 634c79141d28bc290ae307e3f81f5bc909c26faf6eMárton Németh unsigned long *delay_off); 644c79141d28bc290ae307e3f81f5bc909c26faf6eMárton Németh 65f8a7c6fe14f556ca8eeddce258cb21392d0c3a2fRichard Purdie struct device *dev; 66d0d480cce8f522b37c2c1de38230fc9ad15fa506Johan Hovold const struct attribute_group **groups; 67d0d480cce8f522b37c2c1de38230fc9ad15fa506Johan Hovold 68fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct list_head node; /* LED Device list */ 69781a54e7664cc0089287a90d27086e9656ac68a1Anton Vorontsov const char *default_trigger; /* Trigger to use */ 70c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 715ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg unsigned long blink_delay_on, blink_delay_off; 729067359faf890b3a18ab38c792d458fba77b32b4Jiri Kosina struct timer_list blink_timer; 735ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg int blink_brightness; 745ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg 75d23a22a74fded23a12434c9463fe66cec2b0afcdFabio Baltieri struct work_struct set_brightness_work; 76d23a22a74fded23a12434c9463fe66cec2b0afcdFabio Baltieri int delayed_set_value; 77d23a22a74fded23a12434c9463fe66cec2b0afcdFabio Baltieri 78c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie#ifdef CONFIG_LEDS_TRIGGERS 79c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie /* Protects the trigger data below */ 80dc47206e552c0850ad11f7e9a1fca0a3c92f5d65Richard Purdie struct rw_semaphore trigger_lock; 81c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 82fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct led_trigger *trigger; 83fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct list_head trig_list; 84fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks void *trigger_data; 85b00961824a33aadec4a825eaeccfbe3db8ec7032Shuah Khan /* true if activated - deactivate routine uses it to do cleanup */ 86b00961824a33aadec4a825eaeccfbe3db8ec7032Shuah Khan bool activated; 87c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie#endif 88c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie}; 89c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 90c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdieextern int led_classdev_register(struct device *parent, 91fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct led_classdev *led_cdev); 92e2387d6c20752ccdb2895ba5de664fa39652f4ccWolfram Sangextern void led_classdev_unregister(struct led_classdev *led_cdev); 93c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdieextern void led_classdev_suspend(struct led_classdev *led_cdev); 94c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdieextern void led_classdev_resume(struct led_classdev *led_cdev); 95c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie 965ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg/** 975ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * led_blink_set - set blinking with software fallback 985ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * @led_cdev: the LED to start blinking 995ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * @delay_on: the time it should be on (in ms) 1005ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * @delay_off: the time it should ble off (in ms) 1015ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * 1025ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * This function makes the LED blink, attempting to use the 1035ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * hardware acceleration if possible, but falling back to 1045ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * software blinking if there is no hardware blinking or if 1055ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * the LED refuses the passed values. 1065ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * 1075ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * Note that if software blinking is active, simply calling 1085ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * led_cdev->brightness_set() will not stop the blinking, 1095ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * use led_classdev_brightness_set() instead. 1105ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg */ 1115ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Bergextern void led_blink_set(struct led_classdev *led_cdev, 1125ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg unsigned long *delay_on, 1135ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg unsigned long *delay_off); 1145ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg/** 1155bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * led_blink_set_oneshot - do a oneshot software blink 1165bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * @led_cdev: the LED to start blinking 1175bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * @delay_on: the time it should be on (in ms) 1185bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * @delay_off: the time it should ble off (in ms) 1195bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * @invert: blink off, then on, leaving the led on 1205bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * 1215bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * This function makes the LED blink one time for delay_on + 1225bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * delay_off time, ignoring the request if another one-shot 1235bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * blink is already in progress. 1245bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * 1255bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * If invert is set, led blinks for delay_off first, then for 1265bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri * delay_on and leave the led on after the on-off cycle. 1275bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri */ 1285bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieriextern void led_blink_set_oneshot(struct led_classdev *led_cdev, 1295bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri unsigned long *delay_on, 1305bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri unsigned long *delay_off, 1315bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri int invert); 1325bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri/** 13319cd67e2d51225b164560b54b85f943e07deee8aShuah Khan * led_set_brightness - set LED brightness 1345ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * @led_cdev: the LED to set 1355ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * @brightness: the brightness to set it to 1365ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * 1375ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * Set an LED's brightness, and, if necessary, cancel the 1385ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * software blink timer that implements blinking when the 1395ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg * hardware doesn't. 1405ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg */ 14119cd67e2d51225b164560b54b85f943e07deee8aShuah Khanextern void led_set_brightness(struct led_classdev *led_cdev, 1425ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg enum led_brightness brightness); 1433ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski/** 1443ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * led_update_brightness - update LED brightness 1453ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * @led_cdev: the LED to query 1463ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * 1473ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * Get an LED's current brightness and update led_cdev->brightness 1483ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * member with the obtained value. 1493ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * 1503ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski * Returns: 0 on success or negative error value on failure 1513ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewski */ 1523ef7de5304edf60d0b8674dd7cdacc104e15a93cJacek Anaszewskiextern int led_update_brightness(struct led_classdev *led_cdev); 1535ada28bf76752e33dce3d807bf0dfbe6d1b943adJohannes Berg 154c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie/* 155c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie * LED Triggers 156c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie */ 15739f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo/* Registration functions for simple triggers */ 15839f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x; 15939f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo#define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x; 16039f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo 161c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie#ifdef CONFIG_LEDS_TRIGGERS 162c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 163c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie#define TRIG_NAME_MAX 50 164c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 165c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdiestruct led_trigger { 166c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie /* Trigger Properties */ 167fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks const char *name; 168fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks void (*activate)(struct led_classdev *led_cdev); 169fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks void (*deactivate)(struct led_classdev *led_cdev); 170c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 171c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie /* LEDs under control by this trigger (for simple triggers) */ 172fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks rwlock_t leddev_list_lock; 173fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct list_head led_cdevs; 174c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 175c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie /* Link to next registered trigger */ 176fb5035dbbea8826cdbeb5c43d7605255eb6f0baaBen Dooks struct list_head next_trig; 177c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie}; 178c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 179c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie/* Registration functions for complex triggers */ 180c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdieextern int led_trigger_register(struct led_trigger *trigger); 181c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdieextern void led_trigger_unregister(struct led_trigger *trigger); 182c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 183c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdieextern void led_trigger_register_simple(const char *name, 184c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie struct led_trigger **trigger); 185c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdieextern void led_trigger_unregister_simple(struct led_trigger *trigger); 186c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdieextern void led_trigger_event(struct led_trigger *trigger, 187c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie enum led_brightness event); 1880b9536c957095eb1497828aa51b34ac695f67eaeVasily Khoruzhickextern void led_trigger_blink(struct led_trigger *trigger, 1890b9536c957095eb1497828aa51b34ac695f67eaeVasily Khoruzhick unsigned long *delay_on, 1900b9536c957095eb1497828aa51b34ac695f67eaeVasily Khoruzhick unsigned long *delay_off); 1915bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieriextern void led_trigger_blink_oneshot(struct led_trigger *trigger, 1925bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri unsigned long *delay_on, 1935bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri unsigned long *delay_off, 1945bb629c504394f4d42c53a25d75ccb02a393f92fFabio Baltieri int invert); 195057407c732b7761cf417a1e6633a02d9d473340dJingoo Han/** 196057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * led_trigger_rename_static - rename a trigger 197057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * @name: the new trigger name 198057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * @trig: the LED trigger to rename 199057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * 200057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * Change a LED trigger name by copying the string passed in 201057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * name into current trigger name, which MUST be large 202057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * enough for the new string. 203057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * 204057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * Note that name must NOT point to the same string used 205057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * during LED registration, as that could lead to races. 206057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * 207057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * This is meant to be used on triggers with statically 208057407c732b7761cf417a1e6633a02d9d473340dJingoo Han * allocated name. 209057407c732b7761cf417a1e6633a02d9d473340dJingoo Han */ 210057407c732b7761cf417a1e6633a02d9d473340dJingoo Hanextern void led_trigger_rename_static(const char *name, 211057407c732b7761cf417a1e6633a02d9d473340dJingoo Han struct led_trigger *trig); 212c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 213c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie#else 214c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 21539f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo/* Trigger has no members */ 21639f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milostruct led_trigger {}; 217c3bc9956ec52fb2c70f29aa894d8eec766116584Richard Purdie 21839f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo/* Trigger inline empty functions */ 21939f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milostatic inline void led_trigger_register_simple(const char *name, 22039f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo struct led_trigger **trigger) {} 22139f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milostatic inline void led_trigger_unregister_simple(struct led_trigger *trigger) {} 22239f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milostatic inline void led_trigger_event(struct led_trigger *trigger, 22339f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo enum led_brightness event) {} 22439f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milo#endif /* CONFIG_LEDS_TRIGGERS */ 2252bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie 2262bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie/* Trigger specific functions */ 2272bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie#ifdef CONFIG_LEDS_TRIGGER_IDE_DISK 2282bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdieextern void ledtrig_ide_activity(void); 2292bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie#else 23039f7e08af3fd9ca1cb94a8270354afb2ea5cfcd3Kim, Milostatic inline void ledtrig_ide_activity(void) {} 2312bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie#endif 2322bfb646cdf348cb77c572f06d5b9d17ea205c7e2Richard Purdie 23348a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milo#if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE) 23448a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Miloextern void ledtrig_flash_ctrl(bool on); 23548a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Miloextern void ledtrig_torch_ctrl(bool on); 23648a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milo#else 23748a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milostatic inline void ledtrig_flash_ctrl(bool on) {} 23848a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milostatic inline void ledtrig_torch_ctrl(bool on) {} 23948a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milo#endif 24048a1d032c954b9b06c3adbf35ef4735dd70ab757Kim, Milo 241f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case/* 242f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case * Generic LED platform data for describing LED names and default triggers. 243f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case */ 244f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Casestruct led_info { 245f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case const char *name; 246326bb8a5a12c6298a6bf6c74af490b1858b2f12cTrent Piepho const char *default_trigger; 247f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case int flags; 248f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case}; 249f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case 250f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Casestruct led_platform_data { 251f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case int num_leds; 252f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case struct led_info *leds; 253f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case}; 254f46e9203d9a100bae216cc06e17f2e77351aa8d8Nate Case 25522e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat/* For the leds-gpio driver */ 25622e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenatstruct gpio_led { 25722e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat const char *name; 258326bb8a5a12c6298a6bf6c74af490b1858b2f12cTrent Piepho const char *default_trigger; 25922e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat unsigned gpio; 260ed88bae6918fa990cbfe47316bd0f790121aaf00Trent Piepho unsigned active_low : 1; 261ed88bae6918fa990cbfe47316bd0f790121aaf00Trent Piepho unsigned retain_state_suspended : 1; 262ed88bae6918fa990cbfe47316bd0f790121aaf00Trent Piepho unsigned default_state : 2; 263ed88bae6918fa990cbfe47316bd0f790121aaf00Trent Piepho /* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */ 26422e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat}; 2652146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt#define LEDS_GPIO_DEFSTATE_OFF 0 2662146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt#define LEDS_GPIO_DEFSTATE_ON 1 2672146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt#define LEDS_GPIO_DEFSTATE_KEEP 2 26822e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat 26922e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenatstruct gpio_led_platform_data { 27022e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat int num_leds; 2719517f925f2eb9ffca78b3f0f9389fc675bcb572cUwe Kleine-König const struct gpio_led *leds; 2722146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt 2732146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt#define GPIO_LED_NO_BLINK_LOW 0 /* No blink GPIO state low */ 2742146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt#define GPIO_LED_NO_BLINK_HIGH 1 /* No blink GPIO state high */ 2759517f925f2eb9ffca78b3f0f9389fc675bcb572cUwe Kleine-König#define GPIO_LED_BLINK 2 /* Please, blink */ 2762146325df2c2640059a9e064890c30c6e259b458Benjamin Herrenschmidt int (*gpio_blink_set)(unsigned gpio, int state, 277ca3259b3603539e72faacc6821050ee889a52103Herbert Valerio Riedel unsigned long *delay_on, 278ca3259b3603539e72faacc6821050ee889a52103Herbert Valerio Riedel unsigned long *delay_off); 27922e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat}; 28022e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat 2814440673a95e63ad888a41db596edaa0c55d3a332Uwe Kleine-Königstruct platform_device *gpio_led_register_device( 2824440673a95e63ad888a41db596edaa0c55d3a332Uwe Kleine-König int id, const struct gpio_led_platform_data *pdata); 28322e03f3b58dfcca30f0c8de185022132459638d1Raphael Assenat 2848f88731d052d2b14f332249a9332690ac1b365acBryan Wuenum cpu_led_event { 2858f88731d052d2b14f332249a9332690ac1b365acBryan Wu CPU_LED_IDLE_START, /* CPU enters idle */ 2868f88731d052d2b14f332249a9332690ac1b365acBryan Wu CPU_LED_IDLE_END, /* CPU idle ends */ 2878f88731d052d2b14f332249a9332690ac1b365acBryan Wu CPU_LED_START, /* Machine starts, especially resume */ 2888f88731d052d2b14f332249a9332690ac1b365acBryan Wu CPU_LED_STOP, /* Machine stops, especially suspend */ 2898f88731d052d2b14f332249a9332690ac1b365acBryan Wu CPU_LED_HALTED, /* Machine shutdown */ 2908f88731d052d2b14f332249a9332690ac1b365acBryan Wu}; 2918f88731d052d2b14f332249a9332690ac1b365acBryan Wu#ifdef CONFIG_LEDS_TRIGGER_CPU 2928f88731d052d2b14f332249a9332690ac1b365acBryan Wuextern void ledtrig_cpu(enum cpu_led_event evt); 2938f88731d052d2b14f332249a9332690ac1b365acBryan Wu#else 2948f88731d052d2b14f332249a9332690ac1b365acBryan Wustatic inline void ledtrig_cpu(enum cpu_led_event evt) 2958f88731d052d2b14f332249a9332690ac1b365acBryan Wu{ 2968f88731d052d2b14f332249a9332690ac1b365acBryan Wu return; 2978f88731d052d2b14f332249a9332690ac1b365acBryan Wu} 2988f88731d052d2b14f332249a9332690ac1b365acBryan Wu#endif 2998f88731d052d2b14f332249a9332690ac1b365acBryan Wu 300c72a1d608dd0eb3d553a08bfdf1c0041bebaa8a0Richard Purdie#endif /* __LINUX_LEDS_H_INCLUDED */ 301