Lines Matching refs:chan

27 static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
32 spin_lock_irqsave(&chan->lock, flags);
35 if (chan->msg_count == MBOX_TX_QUEUE_LEN) {
36 spin_unlock_irqrestore(&chan->lock, flags);
40 idx = chan->msg_free;
41 chan->msg_data[idx] = mssg;
42 chan->msg_count++;
45 chan->msg_free = 0;
47 chan->msg_free++;
49 spin_unlock_irqrestore(&chan->lock, flags);
54 static void msg_submit(struct mbox_chan *chan)
61 spin_lock_irqsave(&chan->lock, flags);
63 if (!chan->msg_count || chan->active_req)
66 count = chan->msg_count;
67 idx = chan->msg_free;
73 data = chan->msg_data[idx];
75 if (chan->cl->tx_prepare)
76 chan->cl->tx_prepare(chan->cl, data);
78 err = chan->mbox->ops->send_data(chan, data);
80 chan->active_req = data;
81 chan->msg_count--;
84 spin_unlock_irqrestore(&chan->lock, flags);
86 if (!err && (chan->txdone_method & TXDONE_BY_POLL)) {
88 spin_lock_irqsave(&chan->mbox->poll_hrt_lock, flags);
89 hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL);
90 spin_unlock_irqrestore(&chan->mbox->poll_hrt_lock, flags);
94 static void tx_tick(struct mbox_chan *chan, int r)
99 spin_lock_irqsave(&chan->lock, flags);
100 mssg = chan->active_req;
101 chan->active_req = NULL;
102 spin_unlock_irqrestore(&chan->lock, flags);
105 msg_submit(chan);
111 if (chan->cl->tx_done)
112 chan->cl->tx_done(chan->cl, mssg, r);
114 if (r != -ETIME && chan->cl->tx_block)
115 complete(&chan->tx_complete);
127 struct mbox_chan *chan = &mbox->chans[i];
129 if (chan->active_req && chan->cl) {
130 txdone = chan->mbox->ops->last_tx_done(chan);
132 tx_tick(chan, 0);
152 * @chan: Pointer to the mailbox channel on which RX happened.
155 * After startup and before shutdown any data received on the chan
159 void mbox_chan_received_data(struct mbox_chan *chan, void *mssg)
162 if (chan->cl->rx_callback)
163 chan->cl->rx_callback(chan->cl, mssg);
170 * @chan: Pointer to the mailbox chan on which TX happened.
177 void mbox_chan_txdone(struct mbox_chan *chan, int r)
179 if (unlikely(!(chan->txdone_method & TXDONE_BY_IRQ))) {
180 dev_err(chan->mbox->dev,
185 tx_tick(chan, r);
191 * @chan: Mailbox channel assigned to this client.
198 void mbox_client_txdone(struct mbox_chan *chan, int r)
200 if (unlikely(!(chan->txdone_method & TXDONE_BY_ACK))) {
201 dev_err(chan->mbox->dev, "Client can't run the TX ticker\n");
205 tx_tick(chan, r);
212 * @chan: Mailbox channel assigned to this client.
224 bool mbox_client_peek_data(struct mbox_chan *chan)
226 if (chan->mbox->ops->peek_data)
227 return chan->mbox->ops->peek_data(chan);
236 * @chan: Mailbox channel assigned to this client.
249 * over the chan, i.e, tx_done() is made.
254 * or transmission over chan (blocking mode).
257 int mbox_send_message(struct mbox_chan *chan, void *mssg)
261 if (!chan || !chan->cl)
264 t = add_to_rbuf(chan, mssg);
266 dev_err(chan->mbox->dev, "Try increasing MBOX_TX_QUEUE_LEN\n");
270 msg_submit(chan);
272 if (chan->cl->tx_block) {
276 if (!chan->cl->tx_tout) /* wait forever */
279 wait = msecs_to_jiffies(chan->cl->tx_tout);
281 ret = wait_for_completion_timeout(&chan->tx_complete, wait);
284 tx_tick(chan, t);
294 * @chan: mailbox channel to flush
306 int mbox_flush(struct mbox_chan *chan, unsigned long timeout)
310 if (!chan->mbox->ops->flush)
313 ret = chan->mbox->ops->flush(chan, timeout);
315 tx_tick(chan, ret);
321 static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
327 if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) {
332 spin_lock_irqsave(&chan->lock, flags);
333 chan->msg_free = 0;
334 chan->msg_count = 0;
335 chan->active_req = NULL;
336 chan->cl = cl;
337 init_completion(&chan->tx_complete);
339 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone)
340 chan->txdone_method = TXDONE_BY_ACK;
342 spin_unlock_irqrestore(&chan->lock, flags);
344 if (chan->mbox->ops->startup) {
345 ret = chan->mbox->ops->startup(chan);
348 dev_err(dev, "Unable to startup the chan (%d)\n", ret);
349 mbox_free_channel(chan);
359 * @chan: The mailbox channel to bind the client to.
374 int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
379 ret = __mbox_bind_client(chan, cl);
408 struct mbox_chan *chan;
425 chan = ERR_PTR(-EPROBE_DEFER);
428 chan = mbox->of_xlate(mbox, &spec);
429 if (!IS_ERR(chan))
435 if (IS_ERR(chan)) {
437 return chan;
440 ret = __mbox_bind_client(chan, cl);
442 chan = ERR_PTR(ret);
445 return chan;
483 * @chan: The mailbox channel to be freed.
485 void mbox_free_channel(struct mbox_chan *chan)
489 if (!chan || !chan->cl)
492 if (chan->mbox->ops->shutdown)
493 chan->mbox->ops->shutdown(chan);
496 spin_lock_irqsave(&chan->lock, flags);
497 chan->cl = NULL;
498 chan->active_req = NULL;
499 if (chan->txdone_method == TXDONE_BY_ACK)
500 chan->txdone_method = TXDONE_BY_POLL;
502 module_put(chan->mbox->dev->driver->owner);
503 spin_unlock_irqrestore(&chan->lock, flags);
554 struct mbox_chan *chan = &mbox->chans[i];
556 chan->cl = NULL;
557 chan->mbox = mbox;
558 chan->txdone_method = txdone;
559 spin_lock_init(&chan->lock);