linux/include/linux/leds.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Driver model for leds and led triggers
   4 *
   5 * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
   6 * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com>
   7 */
   8#ifndef __LINUX_LEDS_H_INCLUDED
   9#define __LINUX_LEDS_H_INCLUDED
  10
  11#include <linux/device.h>
  12#include <linux/kernfs.h>
  13#include <linux/list.h>
  14#include <linux/mutex.h>
  15#include <linux/rwsem.h>
  16#include <linux/spinlock.h>
  17#include <linux/timer.h>
  18#include <linux/workqueue.h>
  19
  20struct device;
  21struct led_pattern;
  22/*
  23 * LED Core
  24 */
  25
  26enum led_brightness {
  27        LED_OFF         = 0,
  28        LED_ON          = 1,
  29        LED_HALF        = 127,
  30        LED_FULL        = 255,
  31};
  32
  33struct led_classdev {
  34        const char              *name;
  35        enum led_brightness      brightness;
  36        enum led_brightness      max_brightness;
  37        int                      flags;
  38
  39        /* Lower 16 bits reflect status */
  40#define LED_SUSPENDED           BIT(0)
  41#define LED_UNREGISTERING       BIT(1)
  42        /* Upper 16 bits reflect control information */
  43#define LED_CORE_SUSPENDRESUME  BIT(16)
  44#define LED_SYSFS_DISABLE       BIT(17)
  45#define LED_DEV_CAP_FLASH       BIT(18)
  46#define LED_HW_PLUGGABLE        BIT(19)
  47#define LED_PANIC_INDICATOR     BIT(20)
  48#define LED_BRIGHT_HW_CHANGED   BIT(21)
  49#define LED_RETAIN_AT_SHUTDOWN  BIT(22)
  50#define LED_INIT_DEFAULT_TRIGGER BIT(23)
  51
  52        /* set_brightness_work / blink_timer flags, atomic, private. */
  53        unsigned long           work_flags;
  54
  55#define LED_BLINK_SW                    0
  56#define LED_BLINK_ONESHOT               1
  57#define LED_BLINK_ONESHOT_STOP          2
  58#define LED_BLINK_INVERT                3
  59#define LED_BLINK_BRIGHTNESS_CHANGE     4
  60#define LED_BLINK_DISABLE               5
  61
  62        /* Set LED brightness level
  63         * Must not sleep. Use brightness_set_blocking for drivers
  64         * that can sleep while setting brightness.
  65         */
  66        void            (*brightness_set)(struct led_classdev *led_cdev,
  67                                          enum led_brightness brightness);
  68        /*
  69         * Set LED brightness level immediately - it can block the caller for
  70         * the time required for accessing a LED device register.
  71         */
  72        int (*brightness_set_blocking)(struct led_classdev *led_cdev,
  73                                       enum led_brightness brightness);
  74        /* Get LED brightness level */
  75        enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
  76
  77        /*
  78         * Activate hardware accelerated blink, delays are in milliseconds
  79         * and if both are zero then a sensible default should be chosen.
  80         * The call should adjust the timings in that case and if it can't
  81         * match the values specified exactly.
  82         * Deactivate blinking again when the brightness is set to LED_OFF
  83         * via the brightness_set() callback.
  84         */
  85        int             (*blink_set)(struct led_classdev *led_cdev,
  86                                     unsigned long *delay_on,
  87                                     unsigned long *delay_off);
  88
  89        int (*pattern_set)(struct led_classdev *led_cdev,
  90                           struct led_pattern *pattern, u32 len, int repeat);
  91        int (*pattern_clear)(struct led_classdev *led_cdev);
  92
  93        struct device           *dev;
  94        const struct attribute_group    **groups;
  95
  96        struct list_head         node;                  /* LED Device list */
  97        const char              *default_trigger;       /* Trigger to use */
  98
  99        unsigned long            blink_delay_on, blink_delay_off;
 100        struct timer_list        blink_timer;
 101        int                      blink_brightness;
 102        int                      new_blink_brightness;
 103        void                    (*flash_resume)(struct led_classdev *led_cdev);
 104
 105        struct work_struct      set_brightness_work;
 106        int                     delayed_set_value;
 107
 108#ifdef CONFIG_LEDS_TRIGGERS
 109        /* Protects the trigger data below */
 110        struct rw_semaphore      trigger_lock;
 111
 112        struct led_trigger      *trigger;
 113        struct list_head         trig_list;
 114        void                    *trigger_data;
 115        /* true if activated - deactivate routine uses it to do cleanup */
 116        bool                    activated;
 117#endif
 118
 119#ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
 120        int                      brightness_hw_changed;
 121        struct kernfs_node      *brightness_hw_changed_kn;
 122#endif
 123
 124        /* Ensures consistent access to the LED Flash Class device */
 125        struct mutex            led_access;
 126};
 127
 128extern int of_led_classdev_register(struct device *parent,
 129                                    struct device_node *np,
 130                                    struct led_classdev *led_cdev);
 131#define led_classdev_register(parent, led_cdev)                         \
 132        of_led_classdev_register(parent, NULL, led_cdev)
 133extern int devm_of_led_classdev_register(struct device *parent,
 134                                         struct device_node *np,
 135                                         struct led_classdev *led_cdev);
 136#define devm_led_classdev_register(parent, led_cdev)                    \
 137        devm_of_led_classdev_register(parent, NULL, led_cdev)
 138extern void led_classdev_unregister(struct led_classdev *led_cdev);
 139extern void devm_led_classdev_unregister(struct device *parent,
 140                                         struct led_classdev *led_cdev);
 141extern void led_classdev_suspend(struct led_classdev *led_cdev);
 142extern void led_classdev_resume(struct led_classdev *led_cdev);
 143
 144/**
 145 * led_blink_set - set blinking with software fallback
 146 * @led_cdev: the LED to start blinking
 147 * @delay_on: the time it should be on (in ms)
 148 * @delay_off: the time it should ble off (in ms)
 149 *
 150 * This function makes the LED blink, attempting to use the
 151 * hardware acceleration if possible, but falling back to
 152 * software blinking if there is no hardware blinking or if
 153 * the LED refuses the passed values.
 154 *
 155 * Note that if software blinking is active, simply calling
 156 * led_cdev->brightness_set() will not stop the blinking,
 157 * use led_classdev_brightness_set() instead.
 158 */
 159extern void led_blink_set(struct led_classdev *led_cdev,
 160                          unsigned long *delay_on,
 161                          unsigned long *delay_off);
 162/**
 163 * led_blink_set_oneshot - do a oneshot software blink
 164 * @led_cdev: the LED to start blinking
 165 * @delay_on: the time it should be on (in ms)
 166 * @delay_off: the time it should ble off (in ms)
 167 * @invert: blink off, then on, leaving the led on
 168 *
 169 * This function makes the LED blink one time for delay_on +
 170 * delay_off time, ignoring the request if another one-shot
 171 * blink is already in progress.
 172 *
 173 * If invert is set, led blinks for delay_off first, then for
 174 * delay_on and leave the led on after the on-off cycle.
 175 */
 176extern void led_blink_set_oneshot(struct led_classdev *led_cdev,
 177                                  unsigned long *delay_on,
 178                                  unsigned long *delay_off,
 179                                  int invert);
 180/**
 181 * led_set_brightness - set LED brightness
 182 * @led_cdev: the LED to set
 183 * @brightness: the brightness to set it to
 184 *
 185 * Set an LED's brightness, and, if necessary, cancel the
 186 * software blink timer that implements blinking when the
 187 * hardware doesn't. This function is guaranteed not to sleep.
 188 */
 189extern void led_set_brightness(struct led_classdev *led_cdev,
 190                               enum led_brightness brightness);
 191
 192/**
 193 * led_set_brightness_sync - set LED brightness synchronously
 194 * @led_cdev: the LED to set
 195 * @brightness: the brightness to set it to
 196 *
 197 * Set an LED's brightness immediately. This function will block
 198 * the caller for the time required for accessing device registers,
 199 * and it can sleep.
 200 *
 201 * Returns: 0 on success or negative error value on failure
 202 */
 203extern int led_set_brightness_sync(struct led_classdev *led_cdev,
 204                                   enum led_brightness value);
 205
 206/**
 207 * led_update_brightness - update LED brightness
 208 * @led_cdev: the LED to query
 209 *
 210 * Get an LED's current brightness and update led_cdev->brightness
 211 * member with the obtained value.
 212 *
 213 * Returns: 0 on success or negative error value on failure
 214 */
 215extern int led_update_brightness(struct led_classdev *led_cdev);
 216
 217/**
 218 * led_get_default_pattern - return default pattern
 219 *
 220 * @led_cdev: the LED to get default pattern for
 221 * @size:     pointer for storing the number of elements in returned array,
 222 *            modified only if return != NULL
 223 *
 224 * Return:    Allocated array of integers with default pattern from device tree
 225 *            or NULL.  Caller is responsible for kfree().
 226 */
 227extern u32 *led_get_default_pattern(struct led_classdev *led_cdev,
 228                                    unsigned int *size);
 229
 230/**
 231 * led_sysfs_disable - disable LED sysfs interface
 232 * @led_cdev: the LED to set
 233 *
 234 * Disable the led_cdev's sysfs interface.
 235 */
 236extern void led_sysfs_disable(struct led_classdev *led_cdev);
 237
 238/**
 239 * led_sysfs_enable - enable LED sysfs interface
 240 * @led_cdev: the LED to set
 241 *
 242 * Enable the led_cdev's sysfs interface.
 243 */
 244extern void led_sysfs_enable(struct led_classdev *led_cdev);
 245
 246/**
 247 * led_sysfs_is_disabled - check if LED sysfs interface is disabled
 248 * @led_cdev: the LED to query
 249 *
 250 * Returns: true if the led_cdev's sysfs interface is disabled.
 251 */
 252static inline bool led_sysfs_is_disabled(struct led_classdev *led_cdev)
 253{
 254        return led_cdev->flags & LED_SYSFS_DISABLE;
 255}
 256
 257/*
 258 * LED Triggers
 259 */
 260/* Registration functions for simple triggers */
 261#define DEFINE_LED_TRIGGER(x)           static struct led_trigger *x;
 262#define DEFINE_LED_TRIGGER_GLOBAL(x)    struct led_trigger *x;
 263
 264#ifdef CONFIG_LEDS_TRIGGERS
 265
 266#define TRIG_NAME_MAX 50
 267
 268struct led_trigger {
 269        /* Trigger Properties */
 270        const char       *name;
 271        int             (*activate)(struct led_classdev *led_cdev);
 272        void            (*deactivate)(struct led_classdev *led_cdev);
 273
 274        /* LEDs under control by this trigger (for simple triggers) */
 275        rwlock_t          leddev_list_lock;
 276        struct list_head  led_cdevs;
 277
 278        /* Link to next registered trigger */
 279        struct list_head  next_trig;
 280
 281        const struct attribute_group **groups;
 282};
 283
 284/*
 285 * Currently the attributes in struct led_trigger::groups are added directly to
 286 * the LED device. As this might change in the future, the following
 287 * macros abstract getting the LED device and its trigger_data from the dev
 288 * parameter passed to the attribute accessor functions.
 289 */
 290#define led_trigger_get_led(dev)        ((struct led_classdev *)dev_get_drvdata((dev)))
 291#define led_trigger_get_drvdata(dev)    (led_get_trigger_data(led_trigger_get_led(dev)))
 292
 293ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
 294                        const char *buf, size_t count);
 295ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr,
 296                        char *buf);
 297
 298/* Registration functions for complex triggers */
 299extern int led_trigger_register(struct led_trigger *trigger);
 300extern void led_trigger_unregister(struct led_trigger *trigger);
 301extern int devm_led_trigger_register(struct device *dev,
 302                                     struct led_trigger *trigger);
 303
 304extern void led_trigger_register_simple(const char *name,
 305                                struct led_trigger **trigger);
 306extern void led_trigger_unregister_simple(struct led_trigger *trigger);
 307extern void led_trigger_event(struct led_trigger *trigger,
 308                                enum led_brightness event);
 309extern void led_trigger_blink(struct led_trigger *trigger,
 310                              unsigned long *delay_on,
 311                              unsigned long *delay_off);
 312extern void led_trigger_blink_oneshot(struct led_trigger *trigger,
 313                                      unsigned long *delay_on,
 314                                      unsigned long *delay_off,
 315                                      int invert);
 316extern void led_trigger_set_default(struct led_classdev *led_cdev);
 317extern int led_trigger_set(struct led_classdev *led_cdev,
 318                           struct led_trigger *trigger);
 319extern void led_trigger_remove(struct led_classdev *led_cdev);
 320
 321static inline void led_set_trigger_data(struct led_classdev *led_cdev,
 322                                        void *trigger_data)
 323{
 324        led_cdev->trigger_data = trigger_data;
 325}
 326
 327static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
 328{
 329        return led_cdev->trigger_data;
 330}
 331
 332/**
 333 * led_trigger_rename_static - rename a trigger
 334 * @name: the new trigger name
 335 * @trig: the LED trigger to rename
 336 *
 337 * Change a LED trigger name by copying the string passed in
 338 * name into current trigger name, which MUST be large
 339 * enough for the new string.
 340 *
 341 * Note that name must NOT point to the same string used
 342 * during LED registration, as that could lead to races.
 343 *
 344 * This is meant to be used on triggers with statically
 345 * allocated name.
 346 */
 347extern void led_trigger_rename_static(const char *name,
 348                                      struct led_trigger *trig);
 349
 350#define module_led_trigger(__led_trigger) \
 351        module_driver(__led_trigger, led_trigger_register, \
 352                      led_trigger_unregister)
 353
 354#else
 355
 356/* Trigger has no members */
 357struct led_trigger {};
 358
 359/* Trigger inline empty functions */
 360static inline void led_trigger_register_simple(const char *name,
 361                                        struct led_trigger **trigger) {}
 362static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
 363static inline void led_trigger_event(struct led_trigger *trigger,
 364                                enum led_brightness event) {}
 365static inline void led_trigger_blink(struct led_trigger *trigger,
 366                                      unsigned long *delay_on,
 367                                      unsigned long *delay_off) {}
 368static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
 369                                      unsigned long *delay_on,
 370                                      unsigned long *delay_off,
 371                                      int invert) {}
 372static inline void led_trigger_set_default(struct led_classdev *led_cdev) {}
 373static inline int led_trigger_set(struct led_classdev *led_cdev,
 374                                  struct led_trigger *trigger)
 375{
 376        return 0;
 377}
 378
 379static inline void led_trigger_remove(struct led_classdev *led_cdev) {}
 380static inline void led_set_trigger_data(struct led_classdev *led_cdev) {}
 381static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
 382{
 383        return NULL;
 384}
 385
 386#endif /* CONFIG_LEDS_TRIGGERS */
 387
 388/* Trigger specific functions */
 389#ifdef CONFIG_LEDS_TRIGGER_DISK
 390extern void ledtrig_disk_activity(bool write);
 391#else
 392static inline void ledtrig_disk_activity(bool write) {}
 393#endif
 394
 395#ifdef CONFIG_LEDS_TRIGGER_MTD
 396extern void ledtrig_mtd_activity(void);
 397#else
 398static inline void ledtrig_mtd_activity(void) {}
 399#endif
 400
 401#if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
 402extern void ledtrig_flash_ctrl(bool on);
 403extern void ledtrig_torch_ctrl(bool on);
 404#else
 405static inline void ledtrig_flash_ctrl(bool on) {}
 406static inline void ledtrig_torch_ctrl(bool on) {}
 407#endif
 408
 409/*
 410 * Generic LED platform data for describing LED names and default triggers.
 411 */
 412struct led_info {
 413        const char      *name;
 414        const char      *default_trigger;
 415        int             flags;
 416};
 417
 418struct led_platform_data {
 419        int             num_leds;
 420        struct led_info *leds;
 421};
 422
 423struct gpio_desc;
 424typedef int (*gpio_blink_set_t)(struct gpio_desc *desc, int state,
 425                                unsigned long *delay_on,
 426                                unsigned long *delay_off);
 427
 428/* For the leds-gpio driver */
 429struct gpio_led {
 430        const char *name;
 431        const char *default_trigger;
 432        unsigned        gpio;
 433        unsigned        active_low : 1;
 434        unsigned        retain_state_suspended : 1;
 435        unsigned        panic_indicator : 1;
 436        unsigned        default_state : 2;
 437        unsigned        retain_state_shutdown : 1;
 438        /* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
 439        struct gpio_desc *gpiod;
 440};
 441#define LEDS_GPIO_DEFSTATE_OFF          0
 442#define LEDS_GPIO_DEFSTATE_ON           1
 443#define LEDS_GPIO_DEFSTATE_KEEP         2
 444
 445struct gpio_led_platform_data {
 446        int             num_leds;
 447        const struct gpio_led *leds;
 448
 449#define GPIO_LED_NO_BLINK_LOW   0       /* No blink GPIO state low */
 450#define GPIO_LED_NO_BLINK_HIGH  1       /* No blink GPIO state high */
 451#define GPIO_LED_BLINK          2       /* Please, blink */
 452        gpio_blink_set_t        gpio_blink_set;
 453};
 454
 455#ifdef CONFIG_NEW_LEDS
 456struct platform_device *gpio_led_register_device(
 457                int id, const struct gpio_led_platform_data *pdata);
 458#else
 459static inline struct platform_device *gpio_led_register_device(
 460                int id, const struct gpio_led_platform_data *pdata)
 461{
 462        return 0;
 463}
 464#endif
 465
 466enum cpu_led_event {
 467        CPU_LED_IDLE_START,     /* CPU enters idle */
 468        CPU_LED_IDLE_END,       /* CPU idle ends */
 469        CPU_LED_START,          /* Machine starts, especially resume */
 470        CPU_LED_STOP,           /* Machine stops, especially suspend */
 471        CPU_LED_HALTED,         /* Machine shutdown */
 472};
 473#ifdef CONFIG_LEDS_TRIGGER_CPU
 474extern void ledtrig_cpu(enum cpu_led_event evt);
 475#else
 476static inline void ledtrig_cpu(enum cpu_led_event evt)
 477{
 478        return;
 479}
 480#endif
 481
 482#ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
 483extern void led_classdev_notify_brightness_hw_changed(
 484        struct led_classdev *led_cdev, enum led_brightness brightness);
 485#else
 486static inline void led_classdev_notify_brightness_hw_changed(
 487        struct led_classdev *led_cdev, enum led_brightness brightness) { }
 488#endif
 489
 490/**
 491 * struct led_pattern - pattern interval settings
 492 * @delta_t: pattern interval delay, in milliseconds
 493 * @brightness: pattern interval brightness
 494 */
 495struct led_pattern {
 496        u32 delta_t;
 497        int brightness;
 498};
 499
 500enum led_audio {
 501        LED_AUDIO_MUTE,         /* master mute LED */
 502        LED_AUDIO_MICMUTE,      /* mic mute LED */
 503        NUM_AUDIO_LEDS
 504};
 505
 506#if IS_ENABLED(CONFIG_LEDS_TRIGGER_AUDIO)
 507enum led_brightness ledtrig_audio_get(enum led_audio type);
 508void ledtrig_audio_set(enum led_audio type, enum led_brightness state);
 509#else
 510static inline enum led_brightness ledtrig_audio_get(enum led_audio type)
 511{
 512        return LED_OFF;
 513}
 514static inline void ledtrig_audio_set(enum led_audio type,
 515                                     enum led_brightness state)
 516{
 517}
 518#endif
 519
 520#endif          /* __LINUX_LEDS_H_INCLUDED */
 521