#ifndef __BACKPORT_LED_DISABLED_SUPPORT
#define __BACKPORT_LED_DISABLED_SUPPORT

/*
 * LED support is strange, with the NEW_LEDS, LEDS_CLASS and LEDS_TRIGGERS
 * Kconfig symbols ... If any of them are not defined, we build our
 * "compatibility" code that really just makes it all non-working but
 * allows compilation.
 */

#ifdef CPTCFG_BACKPORT_BUILD_LEDS
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/rwsem.h>
#include <linux/workqueue.h>

#define led_classdev LINUX_BACKPORT(led_classdev)
#define led_trigger LINUX_BACKPORT(led_trigger)

struct led_classdev {
	const char		*name;
	int			 brightness;
	int			 max_brightness;
	int			 flags;

	/* Lower 16 bits reflect status */
#ifndef LED_SUSPENDED
#define LED_SUSPENDED		(1 << 0)
	/* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME	(1 << 16)
#define LED_BLINK_ONESHOT	(1 << 17)
#define LED_BLINK_ONESHOT_STOP	(1 << 18)
#define LED_BLINK_INVERT	(1 << 19)
#endif

	/* Set LED brightness level */
	/* Must not sleep, use a workqueue if needed */
	void		(*brightness_set)(struct led_classdev *led_cdev,
					  enum led_brightness brightness);
	/* Get LED brightness level */
	enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);

	/*
	 * Activate hardware accelerated blink, delays are in milliseconds
	 * and if both are zero then a sensible default should be chosen.
	 * The call should adjust the timings in that case and if it can't
	 * match the values specified exactly.
	 * Deactivate blinking again when the brightness is set to a fixed
	 * value via the brightness_set() callback.
	 */
	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 */
	const char		*default_trigger;	/* Trigger to use */

	unsigned long		 blink_delay_on, blink_delay_off;
	struct timer_list	 blink_timer;
	int			 blink_brightness;

	struct work_struct	set_brightness_work;
	int			delayed_set_value;

	/* Protects the trigger data below */
	struct rw_semaphore	 trigger_lock;

	struct led_trigger	*trigger;
	struct list_head	 trig_list;
	void			*trigger_data;
	/* true if activated - deactivate routine uses it to do cleanup */
	bool			activated;
};

struct led_trigger {
	const char *name;
	void (*activate)(struct led_classdev *led_cdev);
	void (*deactivate)(struct led_classdev *led_cdev);
	rwlock_t leddev_list_lock;
	struct list_head led_cdevs;
	struct list_head next_trig;
};

#undef led_classdev_register
#define led_classdev_register LINUX_BACKPORT(led_classdev_register)
#undef led_classdev_unregister
#define led_classdev_unregister LINUX_BACKPORT(led_classdev_unregister)
#undef led_blink_set
#define led_blink_set LINUX_BACKPORT(led_blink_set)
#undef led_set_brightness
#define led_set_brightness LINUX_BACKPORT(led_set_brightness)
#undef led_classdev_suspend
#define led_classdev_suspend LINUX_BACKPORT(led_classdev_suspend)
#undef led_classdev_resume
#define led_classdev_resume LINUX_BACKPORT(led_classdev_resume)

#undef led_trigger_register
#define led_trigger_register LINUX_BACKPORT(led_trigger_register)
#undef led_trigger_unregister
#define led_trigger_unregister LINUX_BACKPORT(led_trigger_unregister)
#undef led_trigger_register_simple
#define led_trigger_register_simple LINUX_BACKPORT(led_trigger_register_simple)
#undef led_trigger_unregister_simple
#define led_trigger_unregister_simple LINUX_BACKPORT(led_trigger_unregister_simple)
#undef led_trigger_event
#define led_trigger_event LINUX_BACKPORT(led_trigger_event)

#undef DEFINE_LED_TRIGGER
#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;

static inline int led_classdev_register(struct device *parent,
					struct led_classdev *led_cdev)
{
	return 0;
}

static inline void led_classdev_unregister(struct led_classdev *led_cdev)
{
}

static inline void led_trigger_register_simple(const char *name,
					       struct led_trigger **trigger)
{
}

static inline void led_trigger_unregister_simple(struct led_trigger *trigger)
{
}

static inline void led_blink_set(struct led_classdev *led_cdev,
				 unsigned long *delay_on,
				 unsigned long *delay_off)
{
}

static inline void led_set_brightness(struct led_classdev *led_cdev,
				      enum led_brightness brightness)
{
}

static inline void led_classdev_suspend(struct led_classdev *led_cdev)
{
}

static inline void led_classdev_resume(struct led_classdev *led_cdev)
{
}

static inline int led_trigger_register(struct led_trigger *trigger)
{
	INIT_LIST_HEAD(&trigger->led_cdevs);
	INIT_LIST_HEAD(&trigger->next_trig);
	rwlock_init(&trigger->leddev_list_lock);
	return 0;
}

static inline void led_trigger_unregister(struct led_trigger *trigger)
{
}

static inline void led_trigger_event(struct led_trigger *trigger,
				     enum led_brightness event)
{
}

static inline void led_trigger_blink(struct led_trigger *trigger,
				     unsigned long *delay_on,
				     unsigned long *delay_off)
{
}

static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
					     unsigned long *delay_on,
					     unsigned long *delay_off,
					     int invert)
{
}
#endif

#endif /* __BACKPORT_LED_DISABLED_SUPPORT */
