/* mailbox.h */

#ifndef MAILBOX_H
#define MAILBOX_H

#include <linux/wait.h>
#include <linux/workqueue.h>
#include <linux/blkdev.h>

typedef u32 mbox_msg_t;
typedef void (mbox_receiver_t)(mbox_msg_t msg);
struct omap_mbox;

typedef int __bitwise omap_mbox_irq_t;
#define IRQ_TX ((__force omap_mbox_irq_t) 1)
#define IRQ_RX ((__force omap_mbox_irq_t) 2)

typedef int __bitwise omap_mbox_type_t;
#define OMAP_MBOX_TYPE1 ((__force omap_mbox_type_t) 1)
#define OMAP_MBOX_TYPE2 ((__force omap_mbox_type_t) 2)

struct omap_mbox_ops {
	omap_mbox_type_t	type;
	int		(*startup)(struct omap_mbox *mbox);
	void		(*shutdown)(struct omap_mbox *mbox);
	/* fifo */
	mbox_msg_t	(*fifo_read)(struct omap_mbox *mbox);
	void		(*fifo_write)(struct omap_mbox *mbox, mbox_msg_t msg);
	int		(*fifo_empty)(struct omap_mbox *mbox);
	int		(*fifo_full)(struct omap_mbox *mbox);
	/* irq */
	void		(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
	void		(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
	void		(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
	int		(*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
};

struct omap_mbox_queue {
	spinlock_t		lock;
	struct request_queue	*queue;
	struct work_struct	work;
	int	(*callback)(void *);
	struct omap_mbox	*mbox;
};

struct omap_mbox {
	char			*name;
	unsigned int		irq;

	struct omap_mbox_queue	*txq, *rxq;

	struct omap_mbox_ops	*ops;

	mbox_msg_t		seq_snd, seq_rcv;

	struct device		dev;

	struct omap_mbox	*next;
	void			*priv;

	void			(*err_notify)(void);
};

int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg, void *);
void omap_mbox_init_seq(struct omap_mbox *);

struct omap_mbox *omap_mbox_get(const char *);
void omap_mbox_put(struct omap_mbox *);

int omap_mbox_register(struct omap_mbox *);
int omap_mbox_unregister(struct omap_mbox *);

#endif /* MAILBOX_H */
