Exemplo n.º 1
0
static void __mbox_rx_interrupt(struct omap_mbox *mbox)
{
	struct request *rq;
	mbox_msg_t msg;
	struct request_queue *q = mbox->rxq->queue;

	disable_mbox_irq(mbox, IRQ_RX);

	while (!mbox_fifo_empty(mbox)) {
		rq = blk_get_request(q, WRITE, GFP_ATOMIC);
		if (unlikely(!rq))
			goto nomem;

		msg = mbox_fifo_read(mbox);
		rq->data = (void *)msg;

		if (unlikely(mbox_seq_test(mbox, msg))) {
			pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
			if (mbox->err_notify)
				mbox->err_notify();
		}

		blk_insert_request(q, rq, 0, NULL);
		if (mbox->ops->type == OMAP_MBOX_TYPE1)
			break;
	}

	/* no more messages in the fifo. clear IRQ source. */
	ack_mbox_irq(mbox, IRQ_RX);
	enable_mbox_irq(mbox, IRQ_RX);
nomem:
	schedule_work(&mbox->rxq->work);
}
Exemplo n.º 2
0
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
{

	struct request *rq;
	struct request_queue *q = mbox->txq->queue;

	rq = blk_get_request(q, WRITE, GFP_ATOMIC);
	if (unlikely(!rq))
		return -ENOMEM;

	blk_insert_request(q, rq, 0, (void *) msg);
	tasklet_schedule(&mbox->txq->tasklet);

	return 0;
}
Exemplo n.º 3
0
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg)
{
    struct request *rq;
    struct request_queue *q = mbox->txq->queue;
    int ret = 0;

    rq = blk_get_request(q, WRITE, GFP_ATOMIC);
    if (unlikely(!rq)) {
        ret = -ENOMEM;
        goto fail;
    }

    rq->data = (void *)msg;
    blk_insert_request(q, rq, 0, arg);

    schedule_work(&mbox->txq->work);
 fail:
    return ret;
}
Exemplo n.º 4
0
static void __mbox_rx_interrupt(struct omap_mbox *mbox)
{
	struct request *rq;
	mbox_msg_t msg;
	struct request_queue *q = mbox->rxq->queue;

	while (!mbox_fifo_empty(mbox)) {
		rq = blk_get_request(q, WRITE, GFP_ATOMIC);
		if (unlikely(!rq))
			goto nomem;

		msg = mbox_fifo_read(mbox);


		blk_insert_request(q, rq, 0, (void *)msg);
		if (mbox->ops->type == OMAP_MBOX_TYPE1)
			break;
	}

	/* no more messages in the fifo. clear IRQ source. */
	ack_mbox_irq(mbox, IRQ_RX);
nomem:
	schedule_work(&mbox->rxq->work);
}