| Hiroshi DOYU | 340a614 | 2006-12-07 15:43:59 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Mailbox internal functions | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 2006 Nokia Corporation | 
|  | 5 | * Written by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | 
|  | 6 | * | 
|  | 7 | * This file is subject to the terms and conditions of the GNU General Public | 
|  | 8 | * License.  See the file "COPYING" in the main directory of this archive | 
|  | 9 | * for more details. | 
|  | 10 | */ | 
|  | 11 |  | 
|  | 12 | #ifndef __ARCH_ARM_PLAT_MAILBOX_H | 
|  | 13 | #define __ARCH_ARM_PLAT_MAILBOX_H | 
|  | 14 |  | 
|  | 15 | /* | 
|  | 16 | * Mailbox sequence bit API | 
|  | 17 | */ | 
|  | 18 | #if defined(CONFIG_ARCH_OMAP1) | 
|  | 19 | #  define MBOX_USE_SEQ_BIT | 
|  | 20 | #elif defined(CONFIG_ARCH_OMAP2) | 
|  | 21 | #  define MBOX_USE_SEQ_BIT | 
|  | 22 | #endif | 
|  | 23 |  | 
|  | 24 | #ifdef MBOX_USE_SEQ_BIT | 
|  | 25 | /* seq_rcv should be initialized with any value other than | 
|  | 26 | * 0 and 1 << 31, to allow either value for the first | 
|  | 27 | * message.  */ | 
|  | 28 | static inline void mbox_seq_init(struct omap_mbox *mbox) | 
|  | 29 | { | 
|  | 30 | /* any value other than 0 and 1 << 31 */ | 
|  | 31 | mbox->seq_rcv = 0xffffffff; | 
|  | 32 | } | 
|  | 33 |  | 
|  | 34 | static inline void mbox_seq_toggle(struct omap_mbox *mbox, mbox_msg_t * msg) | 
|  | 35 | { | 
|  | 36 | /* add seq_snd to msg */ | 
|  | 37 | *msg = (*msg & 0x7fffffff) | mbox->seq_snd; | 
|  | 38 | /* flip seq_snd */ | 
|  | 39 | mbox->seq_snd ^= 1 << 31; | 
|  | 40 | } | 
|  | 41 |  | 
|  | 42 | static inline int mbox_seq_test(struct omap_mbox *mbox, mbox_msg_t msg) | 
|  | 43 | { | 
|  | 44 | mbox_msg_t seq = msg & (1 << 31); | 
|  | 45 | if (seq == mbox->seq_rcv) | 
|  | 46 | return -1; | 
|  | 47 | mbox->seq_rcv = seq; | 
|  | 48 | return 0; | 
|  | 49 | } | 
|  | 50 | #else | 
|  | 51 | static inline void mbox_seq_init(struct omap_mbox *mbox) | 
|  | 52 | { | 
|  | 53 | } | 
|  | 54 | static inline void mbox_seq_toggle(struct omap_mbox *mbox, mbox_msg_t * msg) | 
|  | 55 | { | 
|  | 56 | } | 
|  | 57 | static inline int mbox_seq_test(struct omap_mbox *mbox, mbox_msg_t msg) | 
|  | 58 | { | 
|  | 59 | return 0; | 
|  | 60 | } | 
|  | 61 | #endif | 
|  | 62 |  | 
|  | 63 | /* Mailbox FIFO handle functions */ | 
|  | 64 | static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) | 
|  | 65 | { | 
|  | 66 | return mbox->ops->fifo_read(mbox); | 
|  | 67 | } | 
|  | 68 | static inline void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) | 
|  | 69 | { | 
|  | 70 | mbox->ops->fifo_write(mbox, msg); | 
|  | 71 | } | 
|  | 72 | static inline int mbox_fifo_empty(struct omap_mbox *mbox) | 
|  | 73 | { | 
|  | 74 | return mbox->ops->fifo_empty(mbox); | 
|  | 75 | } | 
|  | 76 | static inline int mbox_fifo_full(struct omap_mbox *mbox) | 
|  | 77 | { | 
|  | 78 | return mbox->ops->fifo_full(mbox); | 
|  | 79 | } | 
|  | 80 |  | 
|  | 81 | /* Mailbox IRQ handle functions */ | 
|  | 82 | static inline void enable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | 
|  | 83 | { | 
|  | 84 | mbox->ops->enable_irq(mbox, irq); | 
|  | 85 | } | 
|  | 86 | static inline void disable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | 
|  | 87 | { | 
|  | 88 | mbox->ops->disable_irq(mbox, irq); | 
|  | 89 | } | 
|  | 90 | static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | 
|  | 91 | { | 
|  | 92 | if (mbox->ops->ack_irq) | 
|  | 93 | mbox->ops->ack_irq(mbox, irq); | 
|  | 94 | } | 
|  | 95 | static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | 
|  | 96 | { | 
|  | 97 | return mbox->ops->is_irq(mbox, irq); | 
|  | 98 | } | 
|  | 99 |  | 
|  | 100 | #endif				/* __ARCH_ARM_PLAT_MAILBOX_H */ |