Lines Matching refs:mbox

84 	struct omap_mbox	*mbox;  member
153 static mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) in mbox_fifo_read() argument
155 struct omap_mbox_fifo *fifo = &mbox->rx_fifo; in mbox_fifo_read()
156 return (mbox_msg_t) mbox_read_reg(mbox->parent, fifo->msg); in mbox_fifo_read()
159 static void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) in mbox_fifo_write() argument
161 struct omap_mbox_fifo *fifo = &mbox->tx_fifo; in mbox_fifo_write()
162 mbox_write_reg(mbox->parent, msg, fifo->msg); in mbox_fifo_write()
165 static int mbox_fifo_empty(struct omap_mbox *mbox) in mbox_fifo_empty() argument
167 struct omap_mbox_fifo *fifo = &mbox->rx_fifo; in mbox_fifo_empty()
168 return (mbox_read_reg(mbox->parent, fifo->msg_stat) == 0); in mbox_fifo_empty()
171 static int mbox_fifo_full(struct omap_mbox *mbox) in mbox_fifo_full() argument
173 struct omap_mbox_fifo *fifo = &mbox->tx_fifo; in mbox_fifo_full()
174 return mbox_read_reg(mbox->parent, fifo->fifo_stat); in mbox_fifo_full()
178 static void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in ack_mbox_irq() argument
181 &mbox->tx_fifo : &mbox->rx_fifo; in ack_mbox_irq()
185 mbox_write_reg(mbox->parent, bit, irqstatus); in ack_mbox_irq()
188 mbox_read_reg(mbox->parent, irqstatus); in ack_mbox_irq()
191 static int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in is_mbox_irq() argument
194 &mbox->tx_fifo : &mbox->rx_fifo; in is_mbox_irq()
199 u32 enable = mbox_read_reg(mbox->parent, irqenable); in is_mbox_irq()
200 u32 status = mbox_read_reg(mbox->parent, irqstatus); in is_mbox_irq()
209 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_save_ctx() local
211 if (WARN_ON(!mbox)) in omap_mbox_save_ctx()
214 if (mbox->intr_type) in omap_mbox_save_ctx()
219 mbox->ctx[i] = mbox_read_reg(mbox->parent, i * sizeof(u32)); in omap_mbox_save_ctx()
221 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, in omap_mbox_save_ctx()
222 i, mbox->ctx[i]); in omap_mbox_save_ctx()
231 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_restore_ctx() local
233 if (WARN_ON(!mbox)) in omap_mbox_restore_ctx()
236 if (mbox->intr_type) in omap_mbox_restore_ctx()
241 mbox_write_reg(mbox->parent, mbox->ctx[i], i * sizeof(u32)); in omap_mbox_restore_ctx()
242 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, in omap_mbox_restore_ctx()
243 i, mbox->ctx[i]); in omap_mbox_restore_ctx()
248 static void _omap_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in _omap_mbox_enable_irq() argument
252 &mbox->tx_fifo : &mbox->rx_fifo; in _omap_mbox_enable_irq()
256 l = mbox_read_reg(mbox->parent, irqenable); in _omap_mbox_enable_irq()
258 mbox_write_reg(mbox->parent, l, irqenable); in _omap_mbox_enable_irq()
261 static void _omap_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) in _omap_mbox_disable_irq() argument
264 &mbox->tx_fifo : &mbox->rx_fifo; in _omap_mbox_disable_irq()
272 if (!mbox->intr_type) in _omap_mbox_disable_irq()
273 bit = mbox_read_reg(mbox->parent, irqdisable) & ~bit; in _omap_mbox_disable_irq()
275 mbox_write_reg(mbox->parent, bit, irqdisable); in _omap_mbox_disable_irq()
280 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_enable_irq() local
282 if (WARN_ON(!mbox)) in omap_mbox_enable_irq()
285 _omap_mbox_enable_irq(mbox, irq); in omap_mbox_enable_irq()
291 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_disable_irq() local
293 if (WARN_ON(!mbox)) in omap_mbox_disable_irq()
296 _omap_mbox_disable_irq(mbox, irq); in omap_mbox_disable_irq()
314 mbox_chan_received_data(mq->mbox->chan, (void *)msg); in mbox_rx_work()
318 _omap_mbox_enable_irq(mq->mbox, IRQ_RX); in mbox_rx_work()
327 static void __mbox_tx_interrupt(struct omap_mbox *mbox) in __mbox_tx_interrupt() argument
329 _omap_mbox_disable_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
330 ack_mbox_irq(mbox, IRQ_TX); in __mbox_tx_interrupt()
331 mbox_chan_txdone(mbox->chan, 0); in __mbox_tx_interrupt()
334 static void __mbox_rx_interrupt(struct omap_mbox *mbox) in __mbox_rx_interrupt() argument
336 struct omap_mbox_queue *mq = mbox->rxq; in __mbox_rx_interrupt()
340 while (!mbox_fifo_empty(mbox)) { in __mbox_rx_interrupt()
342 _omap_mbox_disable_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
347 msg = mbox_fifo_read(mbox); in __mbox_rx_interrupt()
354 ack_mbox_irq(mbox, IRQ_RX); in __mbox_rx_interrupt()
356 schedule_work(&mbox->rxq->work); in __mbox_rx_interrupt()
361 struct omap_mbox *mbox = p; in mbox_interrupt() local
363 if (is_mbox_irq(mbox, IRQ_TX)) in mbox_interrupt()
364 __mbox_tx_interrupt(mbox); in mbox_interrupt()
366 if (is_mbox_irq(mbox, IRQ_RX)) in mbox_interrupt()
367 __mbox_rx_interrupt(mbox); in mbox_interrupt()
372 static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, in mbox_queue_alloc() argument
403 static int omap_mbox_startup(struct omap_mbox *mbox) in omap_mbox_startup() argument
408 mq = mbox_queue_alloc(mbox, mbox_rx_work); in omap_mbox_startup()
411 mbox->rxq = mq; in omap_mbox_startup()
412 mq->mbox = mbox; in omap_mbox_startup()
414 ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, in omap_mbox_startup()
415 mbox->name, mbox); in omap_mbox_startup()
421 _omap_mbox_enable_irq(mbox, IRQ_RX); in omap_mbox_startup()
426 mbox_queue_free(mbox->rxq); in omap_mbox_startup()
430 static void omap_mbox_fini(struct omap_mbox *mbox) in omap_mbox_fini() argument
432 _omap_mbox_disable_irq(mbox, IRQ_RX); in omap_mbox_fini()
433 free_irq(mbox->irq, mbox); in omap_mbox_fini()
434 flush_work(&mbox->rxq->work); in omap_mbox_fini()
435 mbox_queue_free(mbox->rxq); in omap_mbox_fini()
441 struct omap_mbox *_mbox, *mbox = NULL; in omap_mbox_device_find() local
450 mbox = _mbox; in omap_mbox_device_find()
454 return mbox; in omap_mbox_device_find()
461 struct omap_mbox *mbox = NULL; in omap_mbox_request_channel() local
478 mbox = omap_mbox_device_find(mdev, chan_name); in omap_mbox_request_channel()
479 if (mbox) in omap_mbox_request_channel()
484 if (!mbox || !mbox->chan) in omap_mbox_request_channel()
487 chan = mbox->chan; in omap_mbox_request_channel()
496 ret = chan->mbox->ops->startup(chan); in omap_mbox_request_channel()
520 struct omap_mbox *mbox = mboxes[i]; in omap_mbox_register() local
521 mbox->dev = device_create(&omap_mbox_class, mdev->dev, in omap_mbox_register()
522 0, mbox, "%s", mbox->name); in omap_mbox_register()
523 if (IS_ERR(mbox->dev)) { in omap_mbox_register()
524 ret = PTR_ERR(mbox->dev); in omap_mbox_register()
565 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_startup() local
566 struct omap_mbox_device *mdev = mbox->parent; in omap_mbox_chan_startup()
571 ret = omap_mbox_startup(mbox); in omap_mbox_chan_startup()
580 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_shutdown() local
581 struct omap_mbox_device *mdev = mbox->parent; in omap_mbox_chan_shutdown()
584 omap_mbox_fini(mbox); in omap_mbox_chan_shutdown()
591 struct omap_mbox *mbox = mbox_chan_to_omap_mbox(chan); in omap_mbox_chan_send_data() local
594 if (!mbox) in omap_mbox_chan_send_data()
597 if (!mbox_fifo_full(mbox)) { in omap_mbox_chan_send_data()
598 mbox_fifo_write(mbox, (mbox_msg_t)data); in omap_mbox_chan_send_data()
603 _omap_mbox_enable_irq(mbox, IRQ_TX); in omap_mbox_chan_send_data()
638 struct omap_mbox *mbox; in omap_mbox_of_xlate() local
651 mbox = omap_mbox_device_find(mdev, node->name); in omap_mbox_of_xlate()
653 return mbox ? mbox->chan : NULL; in omap_mbox_of_xlate()
661 struct omap_mbox **list, *mbox, *mboxblk; in omap_mbox_probe() local
770 mboxblk = devm_kzalloc(&pdev->dev, info_count * sizeof(*mbox), in omap_mbox_probe()
775 mbox = mboxblk; in omap_mbox_probe()
778 fifo = &mbox->tx_fifo; in omap_mbox_probe()
786 fifo = &mbox->rx_fifo; in omap_mbox_probe()
794 mbox->intr_type = intr_type; in omap_mbox_probe()
796 mbox->parent = mdev; in omap_mbox_probe()
797 mbox->name = finfo->name; in omap_mbox_probe()
798 mbox->irq = platform_get_irq(pdev, finfo->tx_irq); in omap_mbox_probe()
799 if (mbox->irq < 0) in omap_mbox_probe()
800 return mbox->irq; in omap_mbox_probe()
801 mbox->chan = &chnls[i]; in omap_mbox_probe()
802 chnls[i].con_priv = mbox; in omap_mbox_probe()
803 list[i] = mbox++; in omap_mbox_probe()