![Rafael J. Wysocki](/assets/img/avatar_default.png)
After 2.6.24 there was a plan to make the PM core acquire all device semaphores during a suspend/hibernation to protect itself from concurrent operations involving device objects. That proved to be too heavy-handed and we found a better way to achieve the goal, but before it happened, we had introduced the functions device_pm_schedule_removal() and destroy_suspended_device() to allow drivers to "safely" destroy a suspended device and we had adapted some drivers to use them. Now that these functions are no longer necessary, it seems reasonable to remove them and modify their users to use the normal device unregistration instead. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
133 lines
3.3 KiB
C
133 lines
3.3 KiB
C
/*
|
|
* Driver model for leds and led triggers
|
|
*
|
|
* Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
|
|
* Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
*/
|
|
#ifndef __LINUX_LEDS_H_INCLUDED
|
|
#define __LINUX_LEDS_H_INCLUDED
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/rwsem.h>
|
|
|
|
struct device;
|
|
/*
|
|
* LED Core
|
|
*/
|
|
|
|
enum led_brightness {
|
|
LED_OFF = 0,
|
|
LED_HALF = 127,
|
|
LED_FULL = 255,
|
|
};
|
|
|
|
struct led_classdev {
|
|
const char *name;
|
|
int brightness;
|
|
int flags;
|
|
|
|
#define LED_SUSPENDED (1 << 0)
|
|
|
|
/* Set LED brightness level */
|
|
void (*brightness_set)(struct led_classdev *led_cdev,
|
|
enum led_brightness brightness);
|
|
|
|
/* Activate hardware accelerated blink */
|
|
int (*blink_set)(struct led_classdev *led_cdev,
|
|
unsigned long *delay_on,
|
|
unsigned long *delay_off);
|
|
|
|
struct device *dev;
|
|
struct list_head node; /* LED Device list */
|
|
char *default_trigger; /* Trigger to use */
|
|
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
/* Protects the trigger data below */
|
|
struct rw_semaphore trigger_lock;
|
|
|
|
struct led_trigger *trigger;
|
|
struct list_head trig_list;
|
|
void *trigger_data;
|
|
#endif
|
|
};
|
|
|
|
extern int led_classdev_register(struct device *parent,
|
|
struct led_classdev *led_cdev);
|
|
extern void led_classdev_unregister(struct led_classdev *lcd);
|
|
extern void led_classdev_suspend(struct led_classdev *led_cdev);
|
|
extern void led_classdev_resume(struct led_classdev *led_cdev);
|
|
|
|
/*
|
|
* LED Triggers
|
|
*/
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
|
|
#define TRIG_NAME_MAX 50
|
|
|
|
struct led_trigger {
|
|
/* Trigger Properties */
|
|
const char *name;
|
|
void (*activate)(struct led_classdev *led_cdev);
|
|
void (*deactivate)(struct led_classdev *led_cdev);
|
|
|
|
/* LEDs under control by this trigger (for simple triggers) */
|
|
rwlock_t leddev_list_lock;
|
|
struct list_head led_cdevs;
|
|
|
|
/* Link to next registered trigger */
|
|
struct list_head next_trig;
|
|
};
|
|
|
|
/* Registration functions for complex triggers */
|
|
extern int led_trigger_register(struct led_trigger *trigger);
|
|
extern void led_trigger_unregister(struct led_trigger *trigger);
|
|
|
|
/* Registration functions for simple triggers */
|
|
#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;
|
|
#define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x;
|
|
extern void led_trigger_register_simple(const char *name,
|
|
struct led_trigger **trigger);
|
|
extern void led_trigger_unregister_simple(struct led_trigger *trigger);
|
|
extern void led_trigger_event(struct led_trigger *trigger,
|
|
enum led_brightness event);
|
|
|
|
#else
|
|
|
|
/* Triggers aren't active - null macros */
|
|
#define DEFINE_LED_TRIGGER(x)
|
|
#define DEFINE_LED_TRIGGER_GLOBAL(x)
|
|
#define led_trigger_register_simple(x, y) do {} while(0)
|
|
#define led_trigger_unregister_simple(x) do {} while(0)
|
|
#define led_trigger_event(x, y) do {} while(0)
|
|
|
|
#endif
|
|
|
|
/* Trigger specific functions */
|
|
#ifdef CONFIG_LEDS_TRIGGER_IDE_DISK
|
|
extern void ledtrig_ide_activity(void);
|
|
#else
|
|
#define ledtrig_ide_activity() do {} while(0)
|
|
#endif
|
|
|
|
/* For the leds-gpio driver */
|
|
struct gpio_led {
|
|
const char *name;
|
|
char *default_trigger;
|
|
unsigned gpio;
|
|
u8 active_low;
|
|
};
|
|
|
|
struct gpio_led_platform_data {
|
|
int num_leds;
|
|
struct gpio_led *leds;
|
|
};
|
|
|
|
|
|
#endif /* __LINUX_LEDS_H_INCLUDED */
|