| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ | 
|---|
| 2 | /* | 
|---|
| 3 | * Copyright (C) 2013-2014 Linaro Ltd. | 
|---|
| 4 | * Author: Jassi Brar <jassisinghbrar@gmail.com> | 
|---|
| 5 | */ | 
|---|
| 6 |  | 
|---|
| 7 | #ifndef __MAILBOX_CLIENT_H | 
|---|
| 8 | #define __MAILBOX_CLIENT_H | 
|---|
| 9 |  | 
|---|
| 10 | #include <linux/device.h> | 
|---|
| 11 | #include <linux/of.h> | 
|---|
| 12 |  | 
|---|
| 13 | struct mbox_chan; | 
|---|
| 14 |  | 
|---|
| 15 | /** | 
|---|
| 16 | * struct mbox_client - User of a mailbox | 
|---|
| 17 | * @dev:		The client device | 
|---|
| 18 | * @tx_block:		If the mbox_send_message should block until data is | 
|---|
| 19 | *			transmitted. | 
|---|
| 20 | * @tx_tout:		Max block period in ms before TX is assumed failure | 
|---|
| 21 | * @knows_txdone:	If the client could run the TX state machine. Usually | 
|---|
| 22 | *			if the client receives some ACK packet for transmission. | 
|---|
| 23 | *			Unused if the controller already has TX_Done/RTR IRQ. | 
|---|
| 24 | * @rx_callback:	Atomic callback to provide client the data received | 
|---|
| 25 | * @tx_prepare: 	Atomic callback to ask client to prepare the payload | 
|---|
| 26 | *			before initiating the transmission if required. | 
|---|
| 27 | * @tx_done:		Atomic callback to tell client of data transmission | 
|---|
| 28 | */ | 
|---|
| 29 | struct mbox_client { | 
|---|
| 30 | struct device *dev; | 
|---|
| 31 | bool tx_block; | 
|---|
| 32 | unsigned long tx_tout; | 
|---|
| 33 | bool knows_txdone; | 
|---|
| 34 |  | 
|---|
| 35 | void (*rx_callback)(struct mbox_client *cl, void *mssg); | 
|---|
| 36 | void (*tx_prepare)(struct mbox_client *cl, void *mssg); | 
|---|
| 37 | void (*tx_done)(struct mbox_client *cl, void *mssg, int r); | 
|---|
| 38 | }; | 
|---|
| 39 |  | 
|---|
| 40 | int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl); | 
|---|
| 41 | struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl, | 
|---|
| 42 | const char *name); | 
|---|
| 43 | struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index); | 
|---|
| 44 | int mbox_send_message(struct mbox_chan *chan, void *mssg); | 
|---|
| 45 | int mbox_flush(struct mbox_chan *chan, unsigned long timeout); | 
|---|
| 46 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ | 
|---|
| 47 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ | 
|---|
| 48 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ | 
|---|
| 49 |  | 
|---|
| 50 | #endif /* __MAILBOX_CLIENT_H */ | 
|---|
| 51 |  | 
|---|