forked from mirrors/linux
		
	 85a9538065
			
		
	
	
		85a9538065
		
	
	
	
	
		
			
			Support virtual mailbox controllers and clients which are not platform devices or come from the devicetree by allowing them to match client to channel via some other mechanism. Tested-by: Sudeep Holla <sudeep.holla@arm.com> (pcc) Signed-off-by: Elliot Berman <quic_eberman@quicinc.com> Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0-only */
 | |
| /*
 | |
|  * Copyright (C) 2013-2014 Linaro Ltd.
 | |
|  * Author: Jassi Brar <jassisinghbrar@gmail.com>
 | |
|  */
 | |
| 
 | |
| #ifndef __MAILBOX_CLIENT_H
 | |
| #define __MAILBOX_CLIENT_H
 | |
| 
 | |
| #include <linux/of.h>
 | |
| #include <linux/device.h>
 | |
| 
 | |
| struct mbox_chan;
 | |
| 
 | |
| /**
 | |
|  * struct mbox_client - User of a mailbox
 | |
|  * @dev:		The client device
 | |
|  * @tx_block:		If the mbox_send_message should block until data is
 | |
|  *			transmitted.
 | |
|  * @tx_tout:		Max block period in ms before TX is assumed failure
 | |
|  * @knows_txdone:	If the client could run the TX state machine. Usually
 | |
|  *			if the client receives some ACK packet for transmission.
 | |
|  *			Unused if the controller already has TX_Done/RTR IRQ.
 | |
|  * @rx_callback:	Atomic callback to provide client the data received
 | |
|  * @tx_prepare: 	Atomic callback to ask client to prepare the payload
 | |
|  *			before initiating the transmission if required.
 | |
|  * @tx_done:		Atomic callback to tell client of data transmission
 | |
|  */
 | |
| struct mbox_client {
 | |
| 	struct device *dev;
 | |
| 	bool tx_block;
 | |
| 	unsigned long tx_tout;
 | |
| 	bool knows_txdone;
 | |
| 
 | |
| 	void (*rx_callback)(struct mbox_client *cl, void *mssg);
 | |
| 	void (*tx_prepare)(struct mbox_client *cl, void *mssg);
 | |
| 	void (*tx_done)(struct mbox_client *cl, void *mssg, int r);
 | |
| };
 | |
| 
 | |
| int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl);
 | |
| struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl,
 | |
| 					      const char *name);
 | |
| struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index);
 | |
| int mbox_send_message(struct mbox_chan *chan, void *mssg);
 | |
| int mbox_flush(struct mbox_chan *chan, unsigned long timeout);
 | |
| void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */
 | |
| bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */
 | |
| void mbox_free_channel(struct mbox_chan *chan); /* may sleep */
 | |
| 
 | |
| #endif /* __MAILBOX_CLIENT_H */
 |