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. */ 28static 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 34static 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 42static 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 51static inline void mbox_seq_init(struct omap_mbox *mbox) 52{ 53} 54static inline void mbox_seq_toggle(struct omap_mbox *mbox, mbox_msg_t * msg) 55{ 56} 57static 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 */ 64static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) 65{ 66 return mbox->ops->fifo_read(mbox); 67} 68static inline void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) 69{ 70 mbox->ops->fifo_write(mbox, msg); 71} 72static inline int mbox_fifo_empty(struct omap_mbox *mbox) 73{ 74 return mbox->ops->fifo_empty(mbox); 75} 76static inline int mbox_fifo_full(struct omap_mbox *mbox) 77{ 78 return mbox->ops->fifo_full(mbox); 79} 80 81/* Mailbox IRQ handle functions */ 82static inline void enable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) 83{ 84 mbox->ops->enable_irq(mbox, irq); 85} 86static inline void disable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) 87{ 88 mbox->ops->disable_irq(mbox, irq); 89} 90static 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} 95static 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 */ 101