2013-03-13 06:55:29 +08:00
|
|
|
/*
|
|
|
|
* omap-mbox.h: OMAP mailbox internal definitions
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
2006-12-08 07:43:59 +08:00
|
|
|
|
2013-03-13 06:55:29 +08:00
|
|
|
#ifndef OMAP_MBOX_H
|
|
|
|
#define OMAP_MBOX_H
|
2006-12-08 07:43:59 +08:00
|
|
|
|
2010-06-11 23:51:49 +08:00
|
|
|
#include <linux/device.h>
|
2013-03-13 06:55:29 +08:00
|
|
|
#include <linux/interrupt.h>
|
2010-05-05 23:33:09 +08:00
|
|
|
#include <linux/kfifo.h>
|
2013-03-13 06:55:29 +08:00
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <linux/workqueue.h>
|
|
|
|
#include <linux/omap-mailbox.h>
|
2006-12-08 07:43:59 +08:00
|
|
|
|
|
|
|
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 */
|
2009-11-23 02:11:24 +08:00
|
|
|
void (*enable_irq)(struct omap_mbox *mbox,
|
|
|
|
omap_mbox_irq_t irq);
|
|
|
|
void (*disable_irq)(struct omap_mbox *mbox,
|
|
|
|
omap_mbox_irq_t irq);
|
2006-12-08 07:43:59 +08:00
|
|
|
void (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
|
|
|
|
int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
|
2009-03-24 09:07:26 +08:00
|
|
|
/* ctx */
|
|
|
|
void (*save_ctx)(struct omap_mbox *mbox);
|
|
|
|
void (*restore_ctx)(struct omap_mbox *mbox);
|
2006-12-08 07:43:59 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct omap_mbox_queue {
|
|
|
|
spinlock_t lock;
|
2010-05-05 23:33:09 +08:00
|
|
|
struct kfifo fifo;
|
2006-12-08 07:43:59 +08:00
|
|
|
struct work_struct work;
|
2009-11-23 02:11:24 +08:00
|
|
|
struct tasklet_struct tasklet;
|
2006-12-08 07:43:59 +08:00
|
|
|
struct omap_mbox *mbox;
|
2010-11-30 04:24:11 +08:00
|
|
|
bool full;
|
2006-12-08 07:43:59 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct omap_mbox {
|
2013-01-29 07:21:58 +08:00
|
|
|
const char *name;
|
2014-01-24 07:53:45 +08:00
|
|
|
int irq;
|
2006-12-08 07:43:59 +08:00
|
|
|
struct omap_mbox_queue *txq, *rxq;
|
|
|
|
struct omap_mbox_ops *ops;
|
2009-03-24 09:07:24 +08:00
|
|
|
struct device *dev;
|
2006-12-08 07:43:59 +08:00
|
|
|
void *priv;
|
2010-11-30 04:24:14 +08:00
|
|
|
int use_count;
|
2013-03-13 06:55:29 +08:00
|
|
|
struct blocking_notifier_head notifier;
|
2006-12-08 07:43:59 +08:00
|
|
|
};
|
|
|
|
|
2010-06-11 23:51:46 +08:00
|
|
|
int omap_mbox_register(struct device *parent, struct omap_mbox **);
|
|
|
|
int omap_mbox_unregister(void);
|
2006-12-08 07:43:59 +08:00
|
|
|
|
2013-03-13 06:55:29 +08:00
|
|
|
#endif /* OMAP_MBOX_H */
|