Lines Matching refs:chan
26 static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
31 spin_lock_irqsave(&chan->lock, flags);
34 if (chan->msg_count == MBOX_TX_QUEUE_LEN) {
35 spin_unlock_irqrestore(&chan->lock, flags);
39 idx = chan->msg_free;
40 chan->msg_data[idx] = mssg;
41 chan->msg_count++;
44 chan->msg_free = 0;
46 chan->msg_free++;
48 spin_unlock_irqrestore(&chan->lock, flags);
53 static void msg_submit(struct mbox_chan *chan)
60 spin_lock_irqsave(&chan->lock, flags);
62 if (!chan->msg_count || chan->active_req)
65 count = chan->msg_count;
66 idx = chan->msg_free;
72 data = chan->msg_data[idx];
74 if (chan->cl->tx_prepare)
75 chan->cl->tx_prepare(chan->cl, data);
77 err = chan->mbox->ops->send_data(chan, data);
79 chan->active_req = data;
80 chan->msg_count--;
83 spin_unlock_irqrestore(&chan->lock, flags);
85 if (!err && (chan->txdone_method & TXDONE_BY_POLL)) {
87 spin_lock_irqsave(&chan->mbox->poll_hrt_lock, flags);
88 hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL);
89 spin_unlock_irqrestore(&chan->mbox->poll_hrt_lock, flags);
93 static void tx_tick(struct mbox_chan *chan, int r)
98 spin_lock_irqsave(&chan->lock, flags);
99 mssg = chan->active_req;
100 chan->active_req = NULL;
101 spin_unlock_irqrestore(&chan->lock, flags);
104 msg_submit(chan);
110 if (chan->cl->tx_done)
111 chan->cl->tx_done(chan->cl, mssg, r);
113 if (r != -ETIME && chan->cl->tx_block)
114 complete(&chan->tx_complete);
126 struct mbox_chan *chan = &mbox->chans[i];
128 if (chan->active_req && chan->cl) {
129 txdone = chan->mbox->ops->last_tx_done(chan);
131 tx_tick(chan, 0);
151 * @chan: Pointer to the mailbox channel on which RX happened.
154 * After startup and before shutdown any data received on the chan
158 void mbox_chan_received_data(struct mbox_chan *chan, void *mssg)
161 if (chan->cl->rx_callback)
162 chan->cl->rx_callback(chan->cl, mssg);
169 * @chan: Pointer to the mailbox chan on which TX happened.
176 void mbox_chan_txdone(struct mbox_chan *chan, int r)
178 if (unlikely(!(chan->txdone_method & TXDONE_BY_IRQ))) {
179 dev_err(chan->mbox->dev,
184 tx_tick(chan, r);
190 * @chan: Mailbox channel assigned to this client.
197 void mbox_client_txdone(struct mbox_chan *chan, int r)
199 if (unlikely(!(chan->txdone_method & TXDONE_BY_ACK))) {
200 dev_err(chan->mbox->dev, "Client can't run the TX ticker\n");
204 tx_tick(chan, r);
211 * @chan: Mailbox channel assigned to this client.
223 bool mbox_client_peek_data(struct mbox_chan *chan)
225 if (chan->mbox->ops->peek_data)
226 return chan->mbox->ops->peek_data(chan);
235 * @chan: Mailbox channel assigned to this client.
248 * over the chan, i.e, tx_done() is made.
253 * or transmission over chan (blocking mode).
256 int mbox_send_message(struct mbox_chan *chan, void *mssg)
260 if (!chan || !chan->cl)
263 t = add_to_rbuf(chan, mssg);
265 dev_err(chan->mbox->dev, "Try increasing MBOX_TX_QUEUE_LEN\n");
269 msg_submit(chan);
271 if (chan->cl->tx_block) {
275 if (!chan->cl->tx_tout) /* wait forever */
278 wait = msecs_to_jiffies(chan->cl->tx_tout);
280 ret = wait_for_completion_timeout(&chan->tx_complete, wait);
283 tx_tick(chan, t);
293 * @chan: mailbox channel to flush
305 int mbox_flush(struct mbox_chan *chan, unsigned long timeout)
309 if (!chan->mbox->ops->flush)
312 ret = chan->mbox->ops->flush(chan, timeout);
314 tx_tick(chan, ret);
342 struct mbox_chan *chan;
360 chan = ERR_PTR(-EPROBE_DEFER);
363 chan = mbox->of_xlate(mbox, &spec);
364 if (!IS_ERR(chan))
370 if (IS_ERR(chan)) {
372 return chan;
375 if (chan->cl || !try_module_get(mbox->dev->driver->owner)) {
381 spin_lock_irqsave(&chan->lock, flags);
382 chan->msg_free = 0;
383 chan->msg_count = 0;
384 chan->active_req = NULL;
385 chan->cl = cl;
386 init_completion(&chan->tx_complete);
388 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone)
389 chan->txdone_method = TXDONE_BY_ACK;
391 spin_unlock_irqrestore(&chan->lock, flags);
393 if (chan->mbox->ops->startup) {
394 ret = chan->mbox->ops->startup(chan);
397 dev_err(dev, "Unable to startup the chan (%d)\n", ret);
398 mbox_free_channel(chan);
399 chan = ERR_PTR(ret);
404 return chan;
442 * @chan: The mailbox channel to be freed.
444 void mbox_free_channel(struct mbox_chan *chan)
448 if (!chan || !chan->cl)
451 if (chan->mbox->ops->shutdown)
452 chan->mbox->ops->shutdown(chan);
455 spin_lock_irqsave(&chan->lock, flags);
456 chan->cl = NULL;
457 chan->active_req = NULL;
458 if (chan->txdone_method == TXDONE_BY_ACK)
459 chan->txdone_method = TXDONE_BY_POLL;
461 module_put(chan->mbox->dev->driver->owner);
462 spin_unlock_irqrestore(&chan->lock, flags);
513 struct mbox_chan *chan = &mbox->chans[i];
515 chan->cl = NULL;
516 chan->mbox = mbox;
517 chan->txdone_method = txdone;
518 spin_lock_init(&chan->lock);