Lines Matching refs:mbox

86 	struct omap_mbox	*mbox;  member
157 static mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) in mbox_fifo_read() argument
159 struct omap_mbox_fifo *fifo = &mbox->rx_fifo; in mbox_fifo_read()
160 return (mbox_msg_t) mbox_read_reg(mbox->parent, fifo->msg); in mbox_fifo_read()
163 static void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) in mbox_fifo_write() argument
165 struct omap_mbox_fifo *fifo = &mbox->tx_fifo; in mbox_fifo_write()
166 mbox_write_reg(mbox->parent, msg, fifo->msg); in mbox_fifo_write()
169 static int mbox_fifo_empty(struct omap_mbox *mbox) in mbox_fifo_empty() argument
171 struct omap_mbox_fifo *fifo = &mbox->rx_fifo; in mbox_fifo_empty()
172 return (mbox_read_reg(mbox->parent, fifo->msg_stat) == 0); in mbox_fifo_empty()
175 static int mbox_fifo_full(struct omap_mbox *mbox) in mbox_fifo_full() argument
177 struct omap_mbox_fifo *fifo = &mbox->tx_fifo; in mbox_fifo_full()
178 return mbox_read_reg(mbox->parent, fifo->fifo_stat); in mbox_fifo_full()
182 static void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in ack_mbox_irq() argument
185 &mbox->tx_fifo : &mbox->rx_fifo; in ack_mbox_irq()
189 mbox_write_reg(mbox->parent, bit, irqstatus); in ack_mbox_irq()
192 mbox_read_reg(mbox->parent, irqstatus); in ack_mbox_irq()
195 static int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in is_mbox_irq() argument
198 &mbox->tx_fifo : &mbox->rx_fifo; in is_mbox_irq()
203 u32 enable = mbox_read_reg(mbox->parent, irqenable); in is_mbox_irq()
204 u32 status = mbox_read_reg(mbox->parent, irqstatus); in is_mbox_irq()
213 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_save_ctx() local
215 if (WARN_ON(!mbox)) in omap_mbox_save_ctx()
218 if (mbox->intr_type) in omap_mbox_save_ctx()
223 mbox->ctx[i] = mbox_read_reg(mbox->parent, i * sizeof(u32)); in omap_mbox_save_ctx()
225 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, in omap_mbox_save_ctx()
226 i, mbox->ctx[i]); in omap_mbox_save_ctx()
235 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_restore_ctx() local
237 if (WARN_ON(!mbox)) in omap_mbox_restore_ctx()
240 if (mbox->intr_type) in omap_mbox_restore_ctx()
245 mbox_write_reg(mbox->parent, mbox->ctx[i], i * sizeof(u32)); in omap_mbox_restore_ctx()
246 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, in omap_mbox_restore_ctx()
247 i, mbox->ctx[i]); in omap_mbox_restore_ctx()
252 static void _omap_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in _omap_mbox_enable_irq() argument
256 &mbox->tx_fifo : &mbox->rx_fifo; in _omap_mbox_enable_irq()
260 l = mbox_read_reg(mbox->parent, irqenable); in _omap_mbox_enable_irq()
262 mbox_write_reg(mbox->parent, l, irqenable); in _omap_mbox_enable_irq()
265 static void _omap_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in _omap_mbox_disable_irq() argument
268 &mbox->tx_fifo : &mbox->rx_fifo; in _omap_mbox_disable_irq()
276 if (!mbox->intr_type) in _omap_mbox_disable_irq()
277 bit = mbox_read_reg(mbox->parent, irqdisable) & ~bit; in _omap_mbox_disable_irq()
279 mbox_write_reg(mbox->parent, bit, irqdisable); in _omap_mbox_disable_irq()
284 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_enable_irq() local
286 if (WARN_ON(!mbox)) in omap_mbox_enable_irq()
289 _omap_mbox_enable_irq(mbox, irq); in omap_mbox_enable_irq()
295 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_disable_irq() local
297 if (WARN_ON(!mbox)) in omap_mbox_disable_irq()
300 _omap_mbox_disable_irq(mbox, irq); in omap_mbox_disable_irq()
318 mbox_chan_received_data(mq->mbox->chan, (void *)msg); in mbox_rx_work()
322 _omap_mbox_enable_irq(mq->mbox, IRQ_RX); in mbox_rx_work()
331 static void __mbox_tx_interrupt(struct omap_mbox *mbox) in __mbox_tx_interrupt() argument
333 _omap_mbox_disable_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
334 ack_mbox_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
335 mbox_chan_txdone(mbox->chan, 0); in __mbox_tx_interrupt()
338 static void __mbox_rx_interrupt(struct omap_mbox *mbox) in __mbox_rx_interrupt() argument
340 struct omap_mbox_queue *mq = mbox->rxq; in __mbox_rx_interrupt()
344 while (!mbox_fifo_empty(mbox)) { in __mbox_rx_interrupt()
346 _omap_mbox_disable_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
351 msg = mbox_fifo_read(mbox); in __mbox_rx_interrupt()
358 ack_mbox_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
360 schedule_work(&mbox->rxq->work); in __mbox_rx_interrupt()
365 struct omap_mbox *mbox = p; in mbox_interrupt() local
367 if (is_mbox_irq(mbox, IRQ_TX)) in mbox_interrupt()
368 __mbox_tx_interrupt(mbox); in mbox_interrupt()
370 if (is_mbox_irq(mbox, IRQ_RX)) in mbox_interrupt()
371 __mbox_rx_interrupt(mbox); in mbox_interrupt()
376 static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, in mbox_queue_alloc() argument
407 static int omap_mbox_startup(struct omap_mbox *mbox) in omap_mbox_startup() argument
412 mq = mbox_queue_alloc(mbox, mbox_rx_work); in omap_mbox_startup()
415 mbox->rxq = mq; in omap_mbox_startup()
416 mq->mbox = mbox; in omap_mbox_startup()
418 ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, in omap_mbox_startup()
419 mbox->name, mbox); in omap_mbox_startup()
425 if (mbox->send_no_irq) in omap_mbox_startup()
426 mbox->chan->txdone_method = TXDONE_BY_ACK; in omap_mbox_startup()
428 _omap_mbox_enable_irq(mbox, IRQ_RX); in omap_mbox_startup()
433 mbox_queue_free(mbox->rxq); in omap_mbox_startup()
437 static void omap_mbox_fini(struct omap_mbox *mbox) in omap_mbox_fini() argument
439 _omap_mbox_disable_irq(mbox, IRQ_RX); in omap_mbox_fini()
440 free_irq(mbox->irq, mbox); in omap_mbox_fini()
441 flush_work(&mbox->rxq->work); in omap_mbox_fini()
442 mbox_queue_free(mbox->rxq); in omap_mbox_fini()
448 struct omap_mbox *_mbox, *mbox = NULL; in omap_mbox_device_find() local
457 mbox = _mbox; in omap_mbox_device_find()
461 return mbox; in omap_mbox_device_find()
468 struct omap_mbox *mbox = NULL; in omap_mbox_request_channel() local
485 mbox = omap_mbox_device_find(mdev, chan_name); in omap_mbox_request_channel()
486 if (mbox) in omap_mbox_request_channel()
491 if (!mbox || !mbox->chan) in omap_mbox_request_channel()
494 chan = mbox->chan; in omap_mbox_request_channel()
503 ret = chan->mbox->ops->startup(chan); in omap_mbox_request_channel()
527 struct omap_mbox *mbox = mboxes[i]; in omap_mbox_register() local
528 mbox->dev = device_create(&omap_mbox_class, mdev->dev, in omap_mbox_register()
529 0, mbox, "%s", mbox->name); in omap_mbox_register()
530 if (IS_ERR(mbox->dev)) { in omap_mbox_register()
531 ret = PTR_ERR(mbox->dev); in omap_mbox_register()
572 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_startup() local
573 struct omap_mbox_device *mdev = mbox->parent; in omap_mbox_chan_startup()
578 ret = omap_mbox_startup(mbox); in omap_mbox_chan_startup()
587 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_shutdown() local
588 struct omap_mbox_device *mdev = mbox->parent; in omap_mbox_chan_shutdown()
591 omap_mbox_fini(mbox); in omap_mbox_chan_shutdown()
596 static int omap_mbox_chan_send_noirq(struct omap_mbox *mbox, void *data) in omap_mbox_chan_send_noirq() argument
600 if (!mbox_fifo_full(mbox)) { in omap_mbox_chan_send_noirq()
601 _omap_mbox_enable_irq(mbox, IRQ_RX); in omap_mbox_chan_send_noirq()
602 mbox_fifo_write(mbox, (mbox_msg_t)data); in omap_mbox_chan_send_noirq()
604 _omap_mbox_disable_irq(mbox, IRQ_RX); in omap_mbox_chan_send_noirq()
607 mbox_fifo_read(mbox); in omap_mbox_chan_send_noirq()
608 ack_mbox_irq(mbox, IRQ_RX); in omap_mbox_chan_send_noirq()
614 static int omap_mbox_chan_send(struct omap_mbox *mbox, void *data) in omap_mbox_chan_send() argument
618 if (!mbox_fifo_full(mbox)) { in omap_mbox_chan_send()
619 mbox_fifo_write(mbox, (mbox_msg_t)data); in omap_mbox_chan_send()
624 _omap_mbox_enable_irq(mbox, IRQ_TX); in omap_mbox_chan_send()
630 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_send_data() local
633 if (!mbox) in omap_mbox_chan_send_data()
636 if (mbox->send_no_irq) in omap_mbox_chan_send_data()
637 ret = omap_mbox_chan_send_noirq(mbox, data); in omap_mbox_chan_send_data()
639 ret = omap_mbox_chan_send(mbox, data); in omap_mbox_chan_send_data()
675 struct omap_mbox *mbox; in omap_mbox_of_xlate() local
688 mbox = omap_mbox_device_find(mdev, node->name); in omap_mbox_of_xlate()
690 return mbox ? mbox->chan : ERR_PTR(-ENOENT); in omap_mbox_of_xlate()
698 struct omap_mbox **list, *mbox, *mboxblk; in omap_mbox_probe() local
810 mboxblk = devm_kzalloc(&pdev->dev, info_count * sizeof(*mbox), in omap_mbox_probe()
815 mbox = mboxblk; in omap_mbox_probe()
818 fifo = &mbox->tx_fifo; in omap_mbox_probe()
826 fifo = &mbox->rx_fifo; in omap_mbox_probe()
834 mbox->send_no_irq = finfo->send_no_irq; in omap_mbox_probe()
835 mbox->intr_type = intr_type; in omap_mbox_probe()
837 mbox->parent = mdev; in omap_mbox_probe()
838 mbox->name = finfo->name; in omap_mbox_probe()
839 mbox->irq = platform_get_irq(pdev, finfo->tx_irq); in omap_mbox_probe()
840 if (mbox->irq < 0) in omap_mbox_probe()
841 return mbox->irq; in omap_mbox_probe()
842 mbox->chan = &chnls[i]; in omap_mbox_probe()
843 chnls[i].con_priv = mbox; in omap_mbox_probe()
844 list[i] = mbox++; in omap_mbox_probe()