]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/mailbox/mailbox.c
ACPI / power: Delay turning off unused power resources after suspend
[karo-tx-linux.git] / drivers / mailbox / mailbox.c
1 /*
2  * Mailbox: Common code for Mailbox controllers and users
3  *
4  * Copyright (C) 2013-2014 Linaro Ltd.
5  * Author: Jassi Brar <jassisinghbrar@gmail.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #include <linux/interrupt.h>
13 #include <linux/spinlock.h>
14 #include <linux/mutex.h>
15 #include <linux/delay.h>
16 #include <linux/slab.h>
17 #include <linux/err.h>
18 #include <linux/module.h>
19 #include <linux/device.h>
20 #include <linux/bitops.h>
21 #include <linux/mailbox_client.h>
22 #include <linux/mailbox_controller.h>
23
24 #include "mailbox.h"
25
26 static LIST_HEAD(mbox_cons);
27 static DEFINE_MUTEX(con_mutex);
28
29 static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
30 {
31         int idx;
32         unsigned long flags;
33
34         spin_lock_irqsave(&chan->lock, flags);
35
36         /* See if there is any space left */
37         if (chan->msg_count == MBOX_TX_QUEUE_LEN) {
38                 spin_unlock_irqrestore(&chan->lock, flags);
39                 return -ENOBUFS;
40         }
41
42         idx = chan->msg_free;
43         chan->msg_data[idx] = mssg;
44         chan->msg_count++;
45
46         if (idx == MBOX_TX_QUEUE_LEN - 1)
47                 chan->msg_free = 0;
48         else
49                 chan->msg_free++;
50
51         spin_unlock_irqrestore(&chan->lock, flags);
52
53         return idx;
54 }
55
56 static void msg_submit(struct mbox_chan *chan)
57 {
58         unsigned count, idx;
59         unsigned long flags;
60         void *data;
61         int err = -EBUSY;
62
63         spin_lock_irqsave(&chan->lock, flags);
64
65         if (!chan->msg_count || chan->active_req)
66                 goto exit;
67
68         count = chan->msg_count;
69         idx = chan->msg_free;
70         if (idx >= count)
71                 idx -= count;
72         else
73                 idx += MBOX_TX_QUEUE_LEN - count;
74
75         data = chan->msg_data[idx];
76
77         if (chan->cl->tx_prepare)
78                 chan->cl->tx_prepare(chan->cl, data);
79         /* Try to submit a message to the MBOX controller */
80         err = chan->mbox->ops->send_data(chan, data);
81         if (!err) {
82                 chan->active_req = data;
83                 chan->msg_count--;
84         }
85 exit:
86         spin_unlock_irqrestore(&chan->lock, flags);
87
88         if (!err && (chan->txdone_method & TXDONE_BY_POLL))
89                 /* kick start the timer immediately to avoid delays */
90                 hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL);
91 }
92
93 static void tx_tick(struct mbox_chan *chan, int r)
94 {
95         unsigned long flags;
96         void *mssg;
97
98         spin_lock_irqsave(&chan->lock, flags);
99         mssg = chan->active_req;
100         chan->active_req = NULL;
101         spin_unlock_irqrestore(&chan->lock, flags);
102
103         /* Submit next message */
104         msg_submit(chan);
105
106         /* Notify the client */
107         if (mssg && chan->cl->tx_done)
108                 chan->cl->tx_done(chan->cl, mssg, r);
109
110         if (chan->cl->tx_block)
111                 complete(&chan->tx_complete);
112 }
113
114 static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)
115 {
116         struct mbox_controller *mbox =
117                 container_of(hrtimer, struct mbox_controller, poll_hrt);
118         bool txdone, resched = false;
119         int i;
120
121         for (i = 0; i < mbox->num_chans; i++) {
122                 struct mbox_chan *chan = &mbox->chans[i];
123
124                 if (chan->active_req && chan->cl) {
125                         txdone = chan->mbox->ops->last_tx_done(chan);
126                         if (txdone)
127                                 tx_tick(chan, 0);
128                         else
129                                 resched = true;
130                 }
131         }
132
133         if (resched) {
134                 hrtimer_forward_now(hrtimer, ms_to_ktime(mbox->txpoll_period));
135                 return HRTIMER_RESTART;
136         }
137         return HRTIMER_NORESTART;
138 }
139
140 /**
141  * mbox_chan_received_data - A way for controller driver to push data
142  *                              received from remote to the upper layer.
143  * @chan: Pointer to the mailbox channel on which RX happened.
144  * @mssg: Client specific message typecasted as void *
145  *
146  * After startup and before shutdown any data received on the chan
147  * is passed on to the API via atomic mbox_chan_received_data().
148  * The controller should ACK the RX only after this call returns.
149  */
150 void mbox_chan_received_data(struct mbox_chan *chan, void *mssg)
151 {
152         /* No buffering the received data */
153         if (chan->cl->rx_callback)
154                 chan->cl->rx_callback(chan->cl, mssg);
155 }
156 EXPORT_SYMBOL_GPL(mbox_chan_received_data);
157
158 /**
159  * mbox_chan_txdone - A way for controller driver to notify the
160  *                      framework that the last TX has completed.
161  * @chan: Pointer to the mailbox chan on which TX happened.
162  * @r: Status of last TX - OK or ERROR
163  *
164  * The controller that has IRQ for TX ACK calls this atomic API
165  * to tick the TX state machine. It works only if txdone_irq
166  * is set by the controller.
167  */
168 void mbox_chan_txdone(struct mbox_chan *chan, int r)
169 {
170         if (unlikely(!(chan->txdone_method & TXDONE_BY_IRQ))) {
171                 dev_err(chan->mbox->dev,
172                        "Controller can't run the TX ticker\n");
173                 return;
174         }
175
176         tx_tick(chan, r);
177 }
178 EXPORT_SYMBOL_GPL(mbox_chan_txdone);
179
180 /**
181  * mbox_client_txdone - The way for a client to run the TX state machine.
182  * @chan: Mailbox channel assigned to this client.
183  * @r: Success status of last transmission.
184  *
185  * The client/protocol had received some 'ACK' packet and it notifies
186  * the API that the last packet was sent successfully. This only works
187  * if the controller can't sense TX-Done.
188  */
189 void mbox_client_txdone(struct mbox_chan *chan, int r)
190 {
191         if (unlikely(!(chan->txdone_method & TXDONE_BY_ACK))) {
192                 dev_err(chan->mbox->dev, "Client can't run the TX ticker\n");
193                 return;
194         }
195
196         tx_tick(chan, r);
197 }
198 EXPORT_SYMBOL_GPL(mbox_client_txdone);
199
200 /**
201  * mbox_client_peek_data - A way for client driver to pull data
202  *                      received from remote by the controller.
203  * @chan: Mailbox channel assigned to this client.
204  *
205  * A poke to controller driver for any received data.
206  * The data is actually passed onto client via the
207  * mbox_chan_received_data()
208  * The call can be made from atomic context, so the controller's
209  * implementation of peek_data() must not sleep.
210  *
211  * Return: True, if controller has, and is going to push after this,
212  *          some data.
213  *         False, if controller doesn't have any data to be read.
214  */
215 bool mbox_client_peek_data(struct mbox_chan *chan)
216 {
217         if (chan->mbox->ops->peek_data)
218                 return chan->mbox->ops->peek_data(chan);
219
220         return false;
221 }
222 EXPORT_SYMBOL_GPL(mbox_client_peek_data);
223
224 /**
225  * mbox_send_message -  For client to submit a message to be
226  *                              sent to the remote.
227  * @chan: Mailbox channel assigned to this client.
228  * @mssg: Client specific message typecasted.
229  *
230  * For client to submit data to the controller destined for a remote
231  * processor. If the client had set 'tx_block', the call will return
232  * either when the remote receives the data or when 'tx_tout' millisecs
233  * run out.
234  *  In non-blocking mode, the requests are buffered by the API and a
235  * non-negative token is returned for each queued request. If the request
236  * is not queued, a negative token is returned. Upon failure or successful
237  * TX, the API calls 'tx_done' from atomic context, from which the client
238  * could submit yet another request.
239  * The pointer to message should be preserved until it is sent
240  * over the chan, i.e, tx_done() is made.
241  * This function could be called from atomic context as it simply
242  * queues the data and returns a token against the request.
243  *
244  * Return: Non-negative integer for successful submission (non-blocking mode)
245  *      or transmission over chan (blocking mode).
246  *      Negative value denotes failure.
247  */
248 int mbox_send_message(struct mbox_chan *chan, void *mssg)
249 {
250         int t;
251
252         if (!chan || !chan->cl)
253                 return -EINVAL;
254
255         t = add_to_rbuf(chan, mssg);
256         if (t < 0) {
257                 dev_err(chan->mbox->dev, "Try increasing MBOX_TX_QUEUE_LEN\n");
258                 return t;
259         }
260
261         msg_submit(chan);
262
263         if (chan->cl->tx_block && chan->active_req) {
264                 unsigned long wait;
265                 int ret;
266
267                 if (!chan->cl->tx_tout) /* wait forever */
268                         wait = msecs_to_jiffies(3600000);
269                 else
270                         wait = msecs_to_jiffies(chan->cl->tx_tout);
271
272                 ret = wait_for_completion_timeout(&chan->tx_complete, wait);
273                 if (ret == 0) {
274                         t = -EIO;
275                         tx_tick(chan, -EIO);
276                 }
277         }
278
279         return t;
280 }
281 EXPORT_SYMBOL_GPL(mbox_send_message);
282
283 /**
284  * mbox_request_channel - Request a mailbox channel.
285  * @cl: Identity of the client requesting the channel.
286  * @index: Index of mailbox specifier in 'mboxes' property.
287  *
288  * The Client specifies its requirements and capabilities while asking for
289  * a mailbox channel. It can't be called from atomic context.
290  * The channel is exclusively allocated and can't be used by another
291  * client before the owner calls mbox_free_channel.
292  * After assignment, any packet received on this channel will be
293  * handed over to the client via the 'rx_callback'.
294  * The framework holds reference to the client, so the mbox_client
295  * structure shouldn't be modified until the mbox_free_channel returns.
296  *
297  * Return: Pointer to the channel assigned to the client if successful.
298  *              ERR_PTR for request failure.
299  */
300 struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
301 {
302         struct device *dev = cl->dev;
303         struct mbox_controller *mbox;
304         struct of_phandle_args spec;
305         struct mbox_chan *chan;
306         unsigned long flags;
307         int ret;
308
309         if (!dev || !dev->of_node) {
310                 pr_debug("%s: No owner device node\n", __func__);
311                 return ERR_PTR(-ENODEV);
312         }
313
314         mutex_lock(&con_mutex);
315
316         if (of_parse_phandle_with_args(dev->of_node, "mboxes",
317                                        "#mbox-cells", index, &spec)) {
318                 dev_dbg(dev, "%s: can't parse \"mboxes\" property\n", __func__);
319                 mutex_unlock(&con_mutex);
320                 return ERR_PTR(-ENODEV);
321         }
322
323         chan = ERR_PTR(-EPROBE_DEFER);
324         list_for_each_entry(mbox, &mbox_cons, node)
325                 if (mbox->dev->of_node == spec.np) {
326                         chan = mbox->of_xlate(mbox, &spec);
327                         break;
328                 }
329
330         of_node_put(spec.np);
331
332         if (IS_ERR(chan)) {
333                 mutex_unlock(&con_mutex);
334                 return chan;
335         }
336
337         if (chan->cl || !try_module_get(mbox->dev->driver->owner)) {
338                 dev_dbg(dev, "%s: mailbox not free\n", __func__);
339                 mutex_unlock(&con_mutex);
340                 return ERR_PTR(-EBUSY);
341         }
342
343         spin_lock_irqsave(&chan->lock, flags);
344         chan->msg_free = 0;
345         chan->msg_count = 0;
346         chan->active_req = NULL;
347         chan->cl = cl;
348         init_completion(&chan->tx_complete);
349
350         if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone)
351                 chan->txdone_method |= TXDONE_BY_ACK;
352
353         spin_unlock_irqrestore(&chan->lock, flags);
354
355         ret = chan->mbox->ops->startup(chan);
356         if (ret) {
357                 dev_err(dev, "Unable to startup the chan (%d)\n", ret);
358                 mbox_free_channel(chan);
359                 chan = ERR_PTR(ret);
360         }
361
362         mutex_unlock(&con_mutex);
363         return chan;
364 }
365 EXPORT_SYMBOL_GPL(mbox_request_channel);
366
367 struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl,
368                                               const char *name)
369 {
370         struct device_node *np = cl->dev->of_node;
371         struct property *prop;
372         const char *mbox_name;
373         int index = 0;
374
375         if (!np) {
376                 dev_err(cl->dev, "%s() currently only supports DT\n", __func__);
377                 return ERR_PTR(-EINVAL);
378         }
379
380         if (!of_get_property(np, "mbox-names", NULL)) {
381                 dev_err(cl->dev,
382                         "%s() requires an \"mbox-names\" property\n", __func__);
383                 return ERR_PTR(-EINVAL);
384         }
385
386         of_property_for_each_string(np, "mbox-names", prop, mbox_name) {
387                 if (!strncmp(name, mbox_name, strlen(name)))
388                         break;
389                 index++;
390         }
391
392         return mbox_request_channel(cl, index);
393 }
394 EXPORT_SYMBOL_GPL(mbox_request_channel_byname);
395
396 /**
397  * mbox_free_channel - The client relinquishes control of a mailbox
398  *                      channel by this call.
399  * @chan: The mailbox channel to be freed.
400  */
401 void mbox_free_channel(struct mbox_chan *chan)
402 {
403         unsigned long flags;
404
405         if (!chan || !chan->cl)
406                 return;
407
408         chan->mbox->ops->shutdown(chan);
409
410         /* The queued TX requests are simply aborted, no callbacks are made */
411         spin_lock_irqsave(&chan->lock, flags);
412         chan->cl = NULL;
413         chan->active_req = NULL;
414         if (chan->txdone_method == (TXDONE_BY_POLL | TXDONE_BY_ACK))
415                 chan->txdone_method = TXDONE_BY_POLL;
416
417         module_put(chan->mbox->dev->driver->owner);
418         spin_unlock_irqrestore(&chan->lock, flags);
419 }
420 EXPORT_SYMBOL_GPL(mbox_free_channel);
421
422 static struct mbox_chan *
423 of_mbox_index_xlate(struct mbox_controller *mbox,
424                     const struct of_phandle_args *sp)
425 {
426         int ind = sp->args[0];
427
428         if (ind >= mbox->num_chans)
429                 return ERR_PTR(-EINVAL);
430
431         return &mbox->chans[ind];
432 }
433
434 /**
435  * mbox_controller_register - Register the mailbox controller
436  * @mbox:       Pointer to the mailbox controller.
437  *
438  * The controller driver registers its communication channels
439  */
440 int mbox_controller_register(struct mbox_controller *mbox)
441 {
442         int i, txdone;
443
444         /* Sanity check */
445         if (!mbox || !mbox->dev || !mbox->ops || !mbox->num_chans)
446                 return -EINVAL;
447
448         if (mbox->txdone_irq)
449                 txdone = TXDONE_BY_IRQ;
450         else if (mbox->txdone_poll)
451                 txdone = TXDONE_BY_POLL;
452         else /* It has to be ACK then */
453                 txdone = TXDONE_BY_ACK;
454
455         if (txdone == TXDONE_BY_POLL) {
456                 hrtimer_init(&mbox->poll_hrt, CLOCK_MONOTONIC,
457                              HRTIMER_MODE_REL);
458                 mbox->poll_hrt.function = txdone_hrtimer;
459         }
460
461         for (i = 0; i < mbox->num_chans; i++) {
462                 struct mbox_chan *chan = &mbox->chans[i];
463
464                 chan->cl = NULL;
465                 chan->mbox = mbox;
466                 chan->txdone_method = txdone;
467                 spin_lock_init(&chan->lock);
468         }
469
470         if (!mbox->of_xlate)
471                 mbox->of_xlate = of_mbox_index_xlate;
472
473         mutex_lock(&con_mutex);
474         list_add_tail(&mbox->node, &mbox_cons);
475         mutex_unlock(&con_mutex);
476
477         return 0;
478 }
479 EXPORT_SYMBOL_GPL(mbox_controller_register);
480
481 /**
482  * mbox_controller_unregister - Unregister the mailbox controller
483  * @mbox:       Pointer to the mailbox controller.
484  */
485 void mbox_controller_unregister(struct mbox_controller *mbox)
486 {
487         int i;
488
489         if (!mbox)
490                 return;
491
492         mutex_lock(&con_mutex);
493
494         list_del(&mbox->node);
495
496         for (i = 0; i < mbox->num_chans; i++)
497                 mbox_free_channel(&mbox->chans[i]);
498
499         if (mbox->txdone_poll)
500                 hrtimer_cancel(&mbox->poll_hrt);
501
502         mutex_unlock(&con_mutex);
503 }
504 EXPORT_SYMBOL_GPL(mbox_controller_unregister);