/*
 * ImgTec IR Raw Decoder found in PowerDown Controller.
 *
 * Copyright 2010-2014 Imagination Technologies Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 */

#ifndef _IMG_IR_RAW_H_
#define _IMG_IR_RAW_H_

struct img_ir_priv;

#ifdef CONFIG_IR_IMG_RAW

/**
 * struct img_ir_priv_raw - Private driver data for raw decoder.
 * @rdev:		Raw remote control device
 * @timer:		Timer to echo samples to keep soft decoders happy.
 * @last_status:	Last raw status bits.
 */
struct img_ir_priv_raw {
	struct rc_dev		*rdev;
	struct timer_list	timer;
	u32			last_status;
};

static inline bool img_ir_raw_enabled(struct img_ir_priv_raw *raw)
{
	return raw->rdev;
};

void img_ir_isr_raw(struct img_ir_priv *priv, u32 irq_status);
void img_ir_setup_raw(struct img_ir_priv *priv);
int img_ir_probe_raw(struct img_ir_priv *priv);
void img_ir_remove_raw(struct img_ir_priv *priv);

#else

struct img_ir_priv_raw {
};
static inline bool img_ir_raw_enabled(struct img_ir_priv_raw *raw)
{
	return false;
};
static inline void img_ir_isr_raw(struct img_ir_priv *priv, u32 irq_status)
{
}
static inline void img_ir_setup_raw(struct img_ir_priv *priv)
{
}
static inline int img_ir_probe_raw(struct img_ir_priv *priv)
{
	return -ENODEV;
}
static inline void img_ir_remove_raw(struct img_ir_priv *priv)
{
}

#endif /* CONFIG_IR_IMG_RAW */

#endif /* _IMG_IR_RAW_H_ */
