• Home
  • Raw
  • Download

Lines Matching refs:mbox

46 static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox)  in mbox_fifo_read()  argument
48 return mbox->ops->fifo_read(mbox); in mbox_fifo_read()
50 static inline void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) in mbox_fifo_write() argument
52 mbox->ops->fifo_write(mbox, msg); in mbox_fifo_write()
54 static inline int mbox_fifo_empty(struct omap_mbox *mbox) in mbox_fifo_empty() argument
56 return mbox->ops->fifo_empty(mbox); in mbox_fifo_empty()
58 static inline int mbox_fifo_full(struct omap_mbox *mbox) in mbox_fifo_full() argument
60 return mbox->ops->fifo_full(mbox); in mbox_fifo_full()
64 static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in ack_mbox_irq() argument
66 if (mbox->ops->ack_irq) in ack_mbox_irq()
67 mbox->ops->ack_irq(mbox, irq); in ack_mbox_irq()
69 static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in is_mbox_irq() argument
71 return mbox->ops->is_irq(mbox, irq); in is_mbox_irq()
77 static int __mbox_poll_for_space(struct omap_mbox *mbox) in __mbox_poll_for_space() argument
81 while (mbox_fifo_full(mbox)) { in __mbox_poll_for_space()
82 if (mbox->ops->type == OMAP_MBOX_TYPE2) in __mbox_poll_for_space()
91 int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) in omap_mbox_msg_send() argument
93 struct omap_mbox_queue *mq = mbox->txq; in omap_mbox_msg_send()
103 if (kfifo_is_empty(&mq->fifo) && !__mbox_poll_for_space(mbox)) { in omap_mbox_msg_send()
104 mbox_fifo_write(mbox, msg); in omap_mbox_msg_send()
111 tasklet_schedule(&mbox->txq->tasklet); in omap_mbox_msg_send()
121 struct omap_mbox *mbox = (struct omap_mbox *)tx_data; in mbox_tx_tasklet() local
122 struct omap_mbox_queue *mq = mbox->txq; in mbox_tx_tasklet()
127 if (__mbox_poll_for_space(mbox)) { in mbox_tx_tasklet()
128 omap_mbox_enable_irq(mbox, IRQ_TX); in mbox_tx_tasklet()
136 mbox_fifo_write(mbox, msg); in mbox_tx_tasklet()
154 blocking_notifier_call_chain(&mq->mbox->notifier, len, in mbox_rx_work()
159 omap_mbox_enable_irq(mq->mbox, IRQ_RX); in mbox_rx_work()
168 static void __mbox_tx_interrupt(struct omap_mbox *mbox) in __mbox_tx_interrupt() argument
170 omap_mbox_disable_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
171 ack_mbox_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
172 tasklet_schedule(&mbox->txq->tasklet); in __mbox_tx_interrupt()
175 static void __mbox_rx_interrupt(struct omap_mbox *mbox) in __mbox_rx_interrupt() argument
177 struct omap_mbox_queue *mq = mbox->rxq; in __mbox_rx_interrupt()
181 while (!mbox_fifo_empty(mbox)) { in __mbox_rx_interrupt()
183 omap_mbox_disable_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
188 msg = mbox_fifo_read(mbox); in __mbox_rx_interrupt()
193 if (mbox->ops->type == OMAP_MBOX_TYPE1) in __mbox_rx_interrupt()
198 ack_mbox_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
200 schedule_work(&mbox->rxq->work); in __mbox_rx_interrupt()
205 struct omap_mbox *mbox = p; in mbox_interrupt() local
207 if (is_mbox_irq(mbox, IRQ_TX)) in mbox_interrupt()
208 __mbox_tx_interrupt(mbox); in mbox_interrupt()
210 if (is_mbox_irq(mbox, IRQ_RX)) in mbox_interrupt()
211 __mbox_rx_interrupt(mbox); in mbox_interrupt()
216 static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, in mbox_queue_alloc() argument
235 tasklet_init(&mq->tasklet, tasklet, (unsigned long)mbox); in mbox_queue_alloc()
248 static int omap_mbox_startup(struct omap_mbox *mbox) in omap_mbox_startup() argument
255 if (likely(mbox->ops->startup)) { in omap_mbox_startup()
256 ret = mbox->ops->startup(mbox); in omap_mbox_startup()
263 if (!mbox->use_count++) { in omap_mbox_startup()
264 ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, in omap_mbox_startup()
265 mbox->name, mbox); in omap_mbox_startup()
271 mq = mbox_queue_alloc(mbox, NULL, mbox_tx_tasklet); in omap_mbox_startup()
276 mbox->txq = mq; in omap_mbox_startup()
278 mq = mbox_queue_alloc(mbox, mbox_rx_work, NULL); in omap_mbox_startup()
283 mbox->rxq = mq; in omap_mbox_startup()
284 mq->mbox = mbox; in omap_mbox_startup()
290 mbox_queue_free(mbox->txq); in omap_mbox_startup()
292 free_irq(mbox->irq, mbox); in omap_mbox_startup()
294 if (mbox->ops->shutdown) in omap_mbox_startup()
295 mbox->ops->shutdown(mbox); in omap_mbox_startup()
296 mbox->use_count--; in omap_mbox_startup()
303 static void omap_mbox_fini(struct omap_mbox *mbox) in omap_mbox_fini() argument
307 if (!--mbox->use_count) { in omap_mbox_fini()
308 free_irq(mbox->irq, mbox); in omap_mbox_fini()
309 tasklet_kill(&mbox->txq->tasklet); in omap_mbox_fini()
310 flush_work_sync(&mbox->rxq->work); in omap_mbox_fini()
311 mbox_queue_free(mbox->txq); in omap_mbox_fini()
312 mbox_queue_free(mbox->rxq); in omap_mbox_fini()
315 if (likely(mbox->ops->shutdown)) { in omap_mbox_fini()
317 mbox->ops->shutdown(mbox); in omap_mbox_fini()
325 struct omap_mbox *_mbox, *mbox = NULL; in omap_mbox_get() local
333 mbox = _mbox; in omap_mbox_get()
338 if (!mbox) in omap_mbox_get()
341 ret = omap_mbox_startup(mbox); in omap_mbox_get()
346 blocking_notifier_chain_register(&mbox->notifier, nb); in omap_mbox_get()
348 return mbox; in omap_mbox_get()
352 void omap_mbox_put(struct omap_mbox *mbox, struct notifier_block *nb) in omap_mbox_put() argument
354 blocking_notifier_chain_unregister(&mbox->notifier, nb); in omap_mbox_put()
355 omap_mbox_fini(mbox); in omap_mbox_put()
371 struct omap_mbox *mbox = mboxes[i]; in omap_mbox_register() local
372 mbox->dev = device_create(&omap_mbox_class, in omap_mbox_register()
373 parent, 0, mbox, "%s", mbox->name); in omap_mbox_register()
374 if (IS_ERR(mbox->dev)) { in omap_mbox_register()
375 ret = PTR_ERR(mbox->dev); in omap_mbox_register()
379 BLOCKING_INIT_NOTIFIER_HEAD(&mbox->notifier); in omap_mbox_register()