1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 22b6d83e2SJassi Brar /* 32b6d83e2SJassi Brar * Copyright (C) 2013-2014 Linaro Ltd. 42b6d83e2SJassi Brar * Author: Jassi Brar <[email protected]> 52b6d83e2SJassi Brar */ 62b6d83e2SJassi Brar 72b6d83e2SJassi Brar #ifndef __MAILBOX_CLIENT_H 82b6d83e2SJassi Brar #define __MAILBOX_CLIENT_H 92b6d83e2SJassi Brar 102b6d83e2SJassi Brar #include <linux/device.h> 11*db824c11STudor Ambarus #include <linux/of.h> 122b6d83e2SJassi Brar 132b6d83e2SJassi Brar struct mbox_chan; 142b6d83e2SJassi Brar 152b6d83e2SJassi Brar /** 162b6d83e2SJassi Brar * struct mbox_client - User of a mailbox 172b6d83e2SJassi Brar * @dev: The client device 182b6d83e2SJassi Brar * @tx_block: If the mbox_send_message should block until data is 192b6d83e2SJassi Brar * transmitted. 202b6d83e2SJassi Brar * @tx_tout: Max block period in ms before TX is assumed failure 212b6d83e2SJassi Brar * @knows_txdone: If the client could run the TX state machine. Usually 222b6d83e2SJassi Brar * if the client receives some ACK packet for transmission. 232b6d83e2SJassi Brar * Unused if the controller already has TX_Done/RTR IRQ. 242b6d83e2SJassi Brar * @rx_callback: Atomic callback to provide client the data received 2597b0c7bdSSudeep Holla * @tx_prepare: Atomic callback to ask client to prepare the payload 2697b0c7bdSSudeep Holla * before initiating the transmission if required. 272b6d83e2SJassi Brar * @tx_done: Atomic callback to tell client of data transmission 282b6d83e2SJassi Brar */ 292b6d83e2SJassi Brar struct mbox_client { 302b6d83e2SJassi Brar struct device *dev; 312b6d83e2SJassi Brar bool tx_block; 322b6d83e2SJassi Brar unsigned long tx_tout; 332b6d83e2SJassi Brar bool knows_txdone; 342b6d83e2SJassi Brar 352b6d83e2SJassi Brar void (*rx_callback)(struct mbox_client *cl, void *mssg); 3697b0c7bdSSudeep Holla void (*tx_prepare)(struct mbox_client *cl, void *mssg); 372b6d83e2SJassi Brar void (*tx_done)(struct mbox_client *cl, void *mssg, int r); 382b6d83e2SJassi Brar }; 392b6d83e2SJassi Brar 4085a95380SElliot Berman int mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl); 41dfabde20SLee Jones struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl, 42dfabde20SLee Jones const char *name); 432b6d83e2SJassi Brar struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index); 442b6d83e2SJassi Brar int mbox_send_message(struct mbox_chan *chan, void *mssg); 45a8803d74SThierry Reding int mbox_flush(struct mbox_chan *chan, unsigned long timeout); 462b6d83e2SJassi Brar void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ 472b6d83e2SJassi Brar bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ 482b6d83e2SJassi Brar void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ 492b6d83e2SJassi Brar 502b6d83e2SJassi Brar #endif /* __MAILBOX_CLIENT_H */ 51