diff options
-rw-r--r-- | drivers/mailbox/mailbox.c | 28 | ||||
-rw-r--r-- | include/linux/mailbox_client.h | 1 | ||||
-rw-r--r-- | include/linux/mailbox_controller.h | 4 |
3 files changed, 33 insertions, 0 deletions
diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index 08ce9a1ab53a..6abb35ff49fa 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c | |||
@@ -284,6 +284,34 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg) | |||
284 | EXPORT_SYMBOL_GPL(mbox_send_message); | 284 | EXPORT_SYMBOL_GPL(mbox_send_message); |
285 | 285 | ||
286 | /** | 286 | /** |
287 | * mbox_flush - flush a mailbox channel | ||
288 | * @chan: mailbox channel to flush | ||
289 | * @timeout: time, in milliseconds, to allow the flush operation to succeed | ||
290 | * | ||
291 | * Mailbox controllers that need to work in atomic context can implement the | ||
292 | * ->flush() callback to busy loop until a transmission has been completed. | ||
293 | * The implementation must call mbox_chan_txdone() upon success. Clients can | ||
294 | * call the mbox_flush() function at any time after mbox_send_message() to | ||
295 | * flush the transmission. After the function returns success, the mailbox | ||
296 | * transmission is guaranteed to have completed. | ||
297 | * | ||
298 | * Returns: 0 on success or a negative error code on failure. | ||
299 | */ | ||
300 | int mbox_flush(struct mbox_chan *chan, unsigned long timeout) | ||
301 | { | ||
302 | int ret; | ||
303 | |||
304 | if (!chan->mbox->ops->flush) | ||
305 | return -ENOTSUPP; | ||
306 | |||
307 | ret = chan->mbox->ops->flush(chan, timeout); | ||
308 | if (ret < 0) | ||
309 | tx_tick(chan, ret); | ||
310 | |||
311 | return ret; | ||
312 | } | ||
313 | |||
314 | /** | ||
287 | * mbox_request_channel - Request a mailbox channel. | 315 | * mbox_request_channel - Request a mailbox channel. |
288 | * @cl: Identity of the client requesting the channel. | 316 | * @cl: Identity of the client requesting the channel. |
289 | * @index: Index of mailbox specifier in 'mboxes' property. | 317 | * @index: Index of mailbox specifier in 'mboxes' property. |
diff --git a/include/linux/mailbox_client.h b/include/linux/mailbox_client.h index 44348710953f..faa7da3c9c8b 100644 --- a/include/linux/mailbox_client.h +++ b/include/linux/mailbox_client.h | |||
@@ -44,6 +44,7 @@ struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl, | |||
44 | const char *name); | 44 | const char *name); |
45 | struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index); | 45 | struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index); |
46 | int mbox_send_message(struct mbox_chan *chan, void *mssg); | 46 | int mbox_send_message(struct mbox_chan *chan, void *mssg); |
47 | int mbox_flush(struct mbox_chan *chan, unsigned long timeout); | ||
47 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ | 48 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ |
48 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ | 49 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ |
49 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ | 50 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ |
diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h index 9b0b21207345..4994a438444c 100644 --- a/include/linux/mailbox_controller.h +++ b/include/linux/mailbox_controller.h | |||
@@ -24,6 +24,9 @@ struct mbox_chan; | |||
24 | * transmission of data is reported by the controller via | 24 | * transmission of data is reported by the controller via |
25 | * mbox_chan_txdone (if it has some TX ACK irq). It must not | 25 | * mbox_chan_txdone (if it has some TX ACK irq). It must not |
26 | * sleep. | 26 | * sleep. |
27 | * @flush: Called when a client requests transmissions to be blocking but | ||
28 | * the context doesn't allow sleeping. Typically the controller | ||
29 | * will implement a busy loop waiting for the data to flush out. | ||
27 | * @startup: Called when a client requests the chan. The controller | 30 | * @startup: Called when a client requests the chan. The controller |
28 | * could ask clients for additional parameters of communication | 31 | * could ask clients for additional parameters of communication |
29 | * to be provided via client's chan_data. This call may | 32 | * to be provided via client's chan_data. This call may |
@@ -46,6 +49,7 @@ struct mbox_chan; | |||
46 | */ | 49 | */ |
47 | struct mbox_chan_ops { | 50 | struct mbox_chan_ops { |
48 | int (*send_data)(struct mbox_chan *chan, void *data); | 51 | int (*send_data)(struct mbox_chan *chan, void *data); |
52 | int (*flush)(struct mbox_chan *chan, unsigned long timeout); | ||
49 | int (*startup)(struct mbox_chan *chan); | 53 | int (*startup)(struct mbox_chan *chan); |
50 | void (*shutdown)(struct mbox_chan *chan); | 54 | void (*shutdown)(struct mbox_chan *chan); |
51 | bool (*last_tx_done)(struct mbox_chan *chan); | 55 | bool (*last_tx_done)(struct mbox_chan *chan); |