xref: /openbmc/linux/include/linux/rpmsg.h (revision 8ce49c2a)
13e79bfd6SSuman Anna /* SPDX-License-Identifier: BSD-3-Clause */
2bcabbccaSOhad Ben-Cohen /*
3bcabbccaSOhad Ben-Cohen  * Remote processor messaging
4bcabbccaSOhad Ben-Cohen  *
5bcabbccaSOhad Ben-Cohen  * Copyright (C) 2011 Texas Instruments, Inc.
6bcabbccaSOhad Ben-Cohen  * Copyright (C) 2011 Google, Inc.
7bcabbccaSOhad Ben-Cohen  * All rights reserved.
8bcabbccaSOhad Ben-Cohen  */
9bcabbccaSOhad Ben-Cohen 
10bcabbccaSOhad Ben-Cohen #ifndef _LINUX_RPMSG_H
11bcabbccaSOhad Ben-Cohen #define _LINUX_RPMSG_H
12bcabbccaSOhad Ben-Cohen 
13bcabbccaSOhad Ben-Cohen #include <linux/types.h>
14bcabbccaSOhad Ben-Cohen #include <linux/device.h>
152c8a5708SBjorn Andersson #include <linux/err.h>
16bcabbccaSOhad Ben-Cohen #include <linux/mod_devicetable.h>
175a081caaSOhad Ben-Cohen #include <linux/kref.h>
1815fd943aSOhad Ben-Cohen #include <linux/mutex.h>
1984d58132SBjorn Andersson #include <linux/poll.h>
206bef0380SMathieu Poirier #include <linux/rpmsg/byteorder.h>
213093c3c7SArnaud Pouliquen #include <uapi/linux/rpmsg.h>
22bcabbccaSOhad Ben-Cohen 
238a228ecfSBjorn Andersson struct rpmsg_device;
2436b72c7dSBjorn Andersson struct rpmsg_endpoint;
2536b72c7dSBjorn Andersson struct rpmsg_device_ops;
268a228ecfSBjorn Andersson struct rpmsg_endpoint_ops;
27bcabbccaSOhad Ben-Cohen 
28bcabbccaSOhad Ben-Cohen /**
292b263d24SBjorn Andersson  * struct rpmsg_channel_info - channel info representation
302b263d24SBjorn Andersson  * @name: name of service
312b263d24SBjorn Andersson  * @src: local address
322b263d24SBjorn Andersson  * @dst: destination address
332b263d24SBjorn Andersson  */
342b263d24SBjorn Andersson struct rpmsg_channel_info {
352b263d24SBjorn Andersson 	char name[RPMSG_NAME_SIZE];
362b263d24SBjorn Andersson 	u32 src;
372b263d24SBjorn Andersson 	u32 dst;
382b263d24SBjorn Andersson };
392b263d24SBjorn Andersson 
402b263d24SBjorn Andersson /**
4192e1de51SBjorn Andersson  * rpmsg_device - device that belong to the rpmsg bus
42bcabbccaSOhad Ben-Cohen  * @dev: the device struct
43bcabbccaSOhad Ben-Cohen  * @id: device id (used to match between rpmsg drivers and devices)
4442cd402bSKrzysztof Kozlowski  * @driver_override: driver name to force a match; do not set directly,
4542cd402bSKrzysztof Kozlowski  *                   because core frees it; use driver_set_override() to
4642cd402bSKrzysztof Kozlowski  *                   set or clear it.
47bcabbccaSOhad Ben-Cohen  * @src: local address
48bcabbccaSOhad Ben-Cohen  * @dst: destination address
49bcabbccaSOhad Ben-Cohen  * @ept: the rpmsg endpoint of this channel
50bcabbccaSOhad Ben-Cohen  * @announce: if set, rpmsg will announce the creation/removal of this channel
516bef0380SMathieu Poirier  * @little_endian: True if transport is using little endian byte representation
52bcabbccaSOhad Ben-Cohen  */
5392e1de51SBjorn Andersson struct rpmsg_device {
54bcabbccaSOhad Ben-Cohen 	struct device dev;
55bcabbccaSOhad Ben-Cohen 	struct rpmsg_device_id id;
5642cd402bSKrzysztof Kozlowski 	const char *driver_override;
57bcabbccaSOhad Ben-Cohen 	u32 src;
58bcabbccaSOhad Ben-Cohen 	u32 dst;
59bcabbccaSOhad Ben-Cohen 	struct rpmsg_endpoint *ept;
60bcabbccaSOhad Ben-Cohen 	bool announce;
616bef0380SMathieu Poirier 	bool little_endian;
6236b72c7dSBjorn Andersson 
6336b72c7dSBjorn Andersson 	const struct rpmsg_device_ops *ops;
64bcabbccaSOhad Ben-Cohen };
65bcabbccaSOhad Ben-Cohen 
664b83c52aSBjorn Andersson typedef int (*rpmsg_rx_cb_t)(struct rpmsg_device *, void *, int, void *, u32);
67*8ce49c2aSDeepak Kumar Singh typedef int (*rpmsg_flowcontrol_cb_t)(struct rpmsg_device *, void *, bool);
68bcabbccaSOhad Ben-Cohen 
69bcabbccaSOhad Ben-Cohen /**
70bcabbccaSOhad Ben-Cohen  * struct rpmsg_endpoint - binds a local rpmsg address to its user
71bcabbccaSOhad Ben-Cohen  * @rpdev: rpmsg channel device
725a081caaSOhad Ben-Cohen  * @refcount: when this drops to zero, the ept is deallocated
73bcabbccaSOhad Ben-Cohen  * @cb: rx callback handler
74*8ce49c2aSDeepak Kumar Singh  * @flow_cb: remote flow control callback handler
7515fd943aSOhad Ben-Cohen  * @cb_lock: must be taken before accessing/changing @cb
76bcabbccaSOhad Ben-Cohen  * @addr: local rpmsg address
77bcabbccaSOhad Ben-Cohen  * @priv: private data for the driver's use
78bcabbccaSOhad Ben-Cohen  *
79bcabbccaSOhad Ben-Cohen  * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as
80bcabbccaSOhad Ben-Cohen  * it binds an rpmsg address with an rx callback handler.
81bcabbccaSOhad Ben-Cohen  *
82bcabbccaSOhad Ben-Cohen  * Simple rpmsg drivers shouldn't use this struct directly, because
83bcabbccaSOhad Ben-Cohen  * things just work: every rpmsg driver provides an rx callback upon
84bcabbccaSOhad Ben-Cohen  * registering to the bus, and that callback is then bound to its rpmsg
85bcabbccaSOhad Ben-Cohen  * address when the driver is probed. When relevant inbound messages arrive
86bcabbccaSOhad Ben-Cohen  * (i.e. messages which their dst address equals to the src address of
87bcabbccaSOhad Ben-Cohen  * the rpmsg channel), the driver's handler is invoked to process it.
88bcabbccaSOhad Ben-Cohen  *
89bcabbccaSOhad Ben-Cohen  * More complicated drivers though, that do need to allocate additional rpmsg
90bcabbccaSOhad Ben-Cohen  * addresses, and bind them to different rx callbacks, must explicitly
91bcabbccaSOhad Ben-Cohen  * create additional endpoints by themselves (see rpmsg_create_ept()).
92bcabbccaSOhad Ben-Cohen  */
93bcabbccaSOhad Ben-Cohen struct rpmsg_endpoint {
9492e1de51SBjorn Andersson 	struct rpmsg_device *rpdev;
955a081caaSOhad Ben-Cohen 	struct kref refcount;
96bcabbccaSOhad Ben-Cohen 	rpmsg_rx_cb_t cb;
97*8ce49c2aSDeepak Kumar Singh 	rpmsg_flowcontrol_cb_t flow_cb;
9815fd943aSOhad Ben-Cohen 	struct mutex cb_lock;
99bcabbccaSOhad Ben-Cohen 	u32 addr;
100bcabbccaSOhad Ben-Cohen 	void *priv;
1018a228ecfSBjorn Andersson 
1028a228ecfSBjorn Andersson 	const struct rpmsg_endpoint_ops *ops;
1038a228ecfSBjorn Andersson };
1048a228ecfSBjorn Andersson 
1058a228ecfSBjorn Andersson /**
106bcabbccaSOhad Ben-Cohen  * struct rpmsg_driver - rpmsg driver struct
107bcabbccaSOhad Ben-Cohen  * @drv: underlying device driver
108bcabbccaSOhad Ben-Cohen  * @id_table: rpmsg ids serviced by this driver
109bcabbccaSOhad Ben-Cohen  * @probe: invoked when a matching rpmsg channel (i.e. device) is found
110bcabbccaSOhad Ben-Cohen  * @remove: invoked when the rpmsg channel is removed
111bcabbccaSOhad Ben-Cohen  * @callback: invoked when an inbound message is received on the channel
112*8ce49c2aSDeepak Kumar Singh  * @flowcontrol: invoked when remote side flow control request is received
113bcabbccaSOhad Ben-Cohen  */
114bcabbccaSOhad Ben-Cohen struct rpmsg_driver {
115bcabbccaSOhad Ben-Cohen 	struct device_driver drv;
116bcabbccaSOhad Ben-Cohen 	const struct rpmsg_device_id *id_table;
11792e1de51SBjorn Andersson 	int (*probe)(struct rpmsg_device *dev);
11892e1de51SBjorn Andersson 	void (*remove)(struct rpmsg_device *dev);
1194b83c52aSBjorn Andersson 	int (*callback)(struct rpmsg_device *, void *, int, void *, u32);
120*8ce49c2aSDeepak Kumar Singh 	int (*flowcontrol)(struct rpmsg_device *, void *, bool);
121bcabbccaSOhad Ben-Cohen };
122bcabbccaSOhad Ben-Cohen 
rpmsg16_to_cpu(struct rpmsg_device * rpdev,__rpmsg16 val)1236bef0380SMathieu Poirier static inline u16 rpmsg16_to_cpu(struct rpmsg_device *rpdev, __rpmsg16 val)
1246bef0380SMathieu Poirier {
1256bef0380SMathieu Poirier 	if (!rpdev)
1266bef0380SMathieu Poirier 		return __rpmsg16_to_cpu(rpmsg_is_little_endian(), val);
1276bef0380SMathieu Poirier 	else
1286bef0380SMathieu Poirier 		return __rpmsg16_to_cpu(rpdev->little_endian, val);
1296bef0380SMathieu Poirier }
1306bef0380SMathieu Poirier 
cpu_to_rpmsg16(struct rpmsg_device * rpdev,u16 val)1316bef0380SMathieu Poirier static inline __rpmsg16 cpu_to_rpmsg16(struct rpmsg_device *rpdev, u16 val)
1326bef0380SMathieu Poirier {
1336bef0380SMathieu Poirier 	if (!rpdev)
1346bef0380SMathieu Poirier 		return __cpu_to_rpmsg16(rpmsg_is_little_endian(), val);
1356bef0380SMathieu Poirier 	else
1366bef0380SMathieu Poirier 		return __cpu_to_rpmsg16(rpdev->little_endian, val);
1376bef0380SMathieu Poirier }
1386bef0380SMathieu Poirier 
rpmsg32_to_cpu(struct rpmsg_device * rpdev,__rpmsg32 val)1396bef0380SMathieu Poirier static inline u32 rpmsg32_to_cpu(struct rpmsg_device *rpdev, __rpmsg32 val)
1406bef0380SMathieu Poirier {
1416bef0380SMathieu Poirier 	if (!rpdev)
1426bef0380SMathieu Poirier 		return __rpmsg32_to_cpu(rpmsg_is_little_endian(), val);
1436bef0380SMathieu Poirier 	else
1446bef0380SMathieu Poirier 		return __rpmsg32_to_cpu(rpdev->little_endian, val);
1456bef0380SMathieu Poirier }
1466bef0380SMathieu Poirier 
cpu_to_rpmsg32(struct rpmsg_device * rpdev,u32 val)1476bef0380SMathieu Poirier static inline __rpmsg32 cpu_to_rpmsg32(struct rpmsg_device *rpdev, u32 val)
1486bef0380SMathieu Poirier {
1496bef0380SMathieu Poirier 	if (!rpdev)
1506bef0380SMathieu Poirier 		return __cpu_to_rpmsg32(rpmsg_is_little_endian(), val);
1516bef0380SMathieu Poirier 	else
1526bef0380SMathieu Poirier 		return __cpu_to_rpmsg32(rpdev->little_endian, val);
1536bef0380SMathieu Poirier }
1546bef0380SMathieu Poirier 
rpmsg64_to_cpu(struct rpmsg_device * rpdev,__rpmsg64 val)1556bef0380SMathieu Poirier static inline u64 rpmsg64_to_cpu(struct rpmsg_device *rpdev, __rpmsg64 val)
1566bef0380SMathieu Poirier {
1576bef0380SMathieu Poirier 	if (!rpdev)
1586bef0380SMathieu Poirier 		return __rpmsg64_to_cpu(rpmsg_is_little_endian(), val);
1596bef0380SMathieu Poirier 	else
1606bef0380SMathieu Poirier 		return __rpmsg64_to_cpu(rpdev->little_endian, val);
1616bef0380SMathieu Poirier }
1626bef0380SMathieu Poirier 
cpu_to_rpmsg64(struct rpmsg_device * rpdev,u64 val)1636bef0380SMathieu Poirier static inline __rpmsg64 cpu_to_rpmsg64(struct rpmsg_device *rpdev, u64 val)
1646bef0380SMathieu Poirier {
1656bef0380SMathieu Poirier 	if (!rpdev)
1666bef0380SMathieu Poirier 		return __cpu_to_rpmsg64(rpmsg_is_little_endian(), val);
1676bef0380SMathieu Poirier 	else
1686bef0380SMathieu Poirier 		return __cpu_to_rpmsg64(rpdev->little_endian, val);
1696bef0380SMathieu Poirier }
1706bef0380SMathieu Poirier 
1712c8a5708SBjorn Andersson #if IS_ENABLED(CONFIG_RPMSG)
1722c8a5708SBjorn Andersson 
173bb17d110SKrzysztof Kozlowski int rpmsg_register_device_override(struct rpmsg_device *rpdev,
174bb17d110SKrzysztof Kozlowski 				   const char *driver_override);
17555488110SMathieu Poirier int rpmsg_register_device(struct rpmsg_device *rpdev);
17655488110SMathieu Poirier int rpmsg_unregister_device(struct device *parent,
17755488110SMathieu Poirier 			    struct rpmsg_channel_info *chinfo);
178bc3c57c1SAndrew F. Davis int __register_rpmsg_driver(struct rpmsg_driver *drv, struct module *owner);
179bcabbccaSOhad Ben-Cohen void unregister_rpmsg_driver(struct rpmsg_driver *drv);
180bcabbccaSOhad Ben-Cohen void rpmsg_destroy_ept(struct rpmsg_endpoint *);
18192e1de51SBjorn Andersson struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *,
1822b263d24SBjorn Andersson 					rpmsg_rx_cb_t cb, void *priv,
1832b263d24SBjorn Andersson 					struct rpmsg_channel_info chinfo);
184bcabbccaSOhad Ben-Cohen 
1852c8a5708SBjorn Andersson int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len);
1862c8a5708SBjorn Andersson int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
1872c8a5708SBjorn Andersson int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
1882c8a5708SBjorn Andersson 			  void *data, int len);
1892c8a5708SBjorn Andersson 
1902c8a5708SBjorn Andersson int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len);
1912c8a5708SBjorn Andersson int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
1922c8a5708SBjorn Andersson int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
1932c8a5708SBjorn Andersson 			     void *data, int len);
1942c8a5708SBjorn Andersson 
195afc9a42bSAl Viro __poll_t rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
19684d58132SBjorn Andersson 			poll_table *wait);
19784d58132SBjorn Andersson 
198e279317eSArnaud Pouliquen ssize_t rpmsg_get_mtu(struct rpmsg_endpoint *ept);
199e279317eSArnaud Pouliquen 
200*8ce49c2aSDeepak Kumar Singh int rpmsg_set_flow_control(struct rpmsg_endpoint *ept, bool pause, u32 dst);
201*8ce49c2aSDeepak Kumar Singh 
2022c8a5708SBjorn Andersson #else
2032c8a5708SBjorn Andersson 
rpmsg_register_device_override(struct rpmsg_device * rpdev,const char * driver_override)204bb17d110SKrzysztof Kozlowski static inline int rpmsg_register_device_override(struct rpmsg_device *rpdev,
205bb17d110SKrzysztof Kozlowski 						 const char *driver_override)
206bb17d110SKrzysztof Kozlowski {
207bb17d110SKrzysztof Kozlowski 	return -ENXIO;
208bb17d110SKrzysztof Kozlowski }
209bb17d110SKrzysztof Kozlowski 
rpmsg_register_device(struct rpmsg_device * rpdev)21055488110SMathieu Poirier static inline int rpmsg_register_device(struct rpmsg_device *rpdev)
2112c8a5708SBjorn Andersson {
2122c8a5708SBjorn Andersson 	return -ENXIO;
2132c8a5708SBjorn Andersson }
2142c8a5708SBjorn Andersson 
rpmsg_unregister_device(struct device * parent,struct rpmsg_channel_info * chinfo)21555488110SMathieu Poirier static inline int rpmsg_unregister_device(struct device *parent,
21655488110SMathieu Poirier 					  struct rpmsg_channel_info *chinfo)
2172c8a5708SBjorn Andersson {
2182c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2192c8a5708SBjorn Andersson 	WARN_ON(1);
22055488110SMathieu Poirier 
22155488110SMathieu Poirier 	return -ENXIO;
2222c8a5708SBjorn Andersson }
2232c8a5708SBjorn Andersson 
__register_rpmsg_driver(struct rpmsg_driver * drv,struct module * owner)2242c8a5708SBjorn Andersson static inline int __register_rpmsg_driver(struct rpmsg_driver *drv,
2252c8a5708SBjorn Andersson 					  struct module *owner)
2262c8a5708SBjorn Andersson {
2272c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2282c8a5708SBjorn Andersson 	WARN_ON(1);
2292c8a5708SBjorn Andersson 
2302c8a5708SBjorn Andersson 	return -ENXIO;
2312c8a5708SBjorn Andersson }
2322c8a5708SBjorn Andersson 
unregister_rpmsg_driver(struct rpmsg_driver * drv)2332c8a5708SBjorn Andersson static inline void unregister_rpmsg_driver(struct rpmsg_driver *drv)
2342c8a5708SBjorn Andersson {
2352c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2362c8a5708SBjorn Andersson 	WARN_ON(1);
2372c8a5708SBjorn Andersson }
2382c8a5708SBjorn Andersson 
rpmsg_destroy_ept(struct rpmsg_endpoint * ept)2392c8a5708SBjorn Andersson static inline void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
2402c8a5708SBjorn Andersson {
2412c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2422c8a5708SBjorn Andersson 	WARN_ON(1);
2432c8a5708SBjorn Andersson }
2442c8a5708SBjorn Andersson 
rpmsg_create_ept(struct rpmsg_device * rpdev,rpmsg_rx_cb_t cb,void * priv,struct rpmsg_channel_info chinfo)2452c8a5708SBjorn Andersson static inline struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev,
2462c8a5708SBjorn Andersson 						      rpmsg_rx_cb_t cb,
2472c8a5708SBjorn Andersson 						      void *priv,
2482c8a5708SBjorn Andersson 						      struct rpmsg_channel_info chinfo)
2492c8a5708SBjorn Andersson {
2502c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2512c8a5708SBjorn Andersson 	WARN_ON(1);
2522c8a5708SBjorn Andersson 
253537d3af1SArnaud Pouliquen 	return NULL;
2542c8a5708SBjorn Andersson }
2552c8a5708SBjorn Andersson 
rpmsg_send(struct rpmsg_endpoint * ept,void * data,int len)2562c8a5708SBjorn Andersson static inline int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len)
2572c8a5708SBjorn Andersson {
2582c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2592c8a5708SBjorn Andersson 	WARN_ON(1);
2602c8a5708SBjorn Andersson 
2612c8a5708SBjorn Andersson 	return -ENXIO;
2622c8a5708SBjorn Andersson }
2632c8a5708SBjorn Andersson 
rpmsg_sendto(struct rpmsg_endpoint * ept,void * data,int len,u32 dst)2642c8a5708SBjorn Andersson static inline int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len,
2652c8a5708SBjorn Andersson 			       u32 dst)
2662c8a5708SBjorn Andersson {
2672c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2682c8a5708SBjorn Andersson 	WARN_ON(1);
2692c8a5708SBjorn Andersson 
2702c8a5708SBjorn Andersson 	return -ENXIO;
2712c8a5708SBjorn Andersson 
2722c8a5708SBjorn Andersson }
2732c8a5708SBjorn Andersson 
rpmsg_send_offchannel(struct rpmsg_endpoint * ept,u32 src,u32 dst,void * data,int len)2742c8a5708SBjorn Andersson static inline int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src,
2752c8a5708SBjorn Andersson 					u32 dst, void *data, int len)
2762c8a5708SBjorn Andersson {
2772c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2782c8a5708SBjorn Andersson 	WARN_ON(1);
2792c8a5708SBjorn Andersson 
2802c8a5708SBjorn Andersson 	return -ENXIO;
2812c8a5708SBjorn Andersson }
2822c8a5708SBjorn Andersson 
rpmsg_trysend(struct rpmsg_endpoint * ept,void * data,int len)2832c8a5708SBjorn Andersson static inline int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len)
2842c8a5708SBjorn Andersson {
2852c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2862c8a5708SBjorn Andersson 	WARN_ON(1);
2872c8a5708SBjorn Andersson 
2882c8a5708SBjorn Andersson 	return -ENXIO;
2892c8a5708SBjorn Andersson }
2902c8a5708SBjorn Andersson 
rpmsg_trysendto(struct rpmsg_endpoint * ept,void * data,int len,u32 dst)2912c8a5708SBjorn Andersson static inline int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data,
2922c8a5708SBjorn Andersson 				  int len, u32 dst)
2932c8a5708SBjorn Andersson {
2942c8a5708SBjorn Andersson 	/* This shouldn't be possible */
2952c8a5708SBjorn Andersson 	WARN_ON(1);
2962c8a5708SBjorn Andersson 
2972c8a5708SBjorn Andersson 	return -ENXIO;
2982c8a5708SBjorn Andersson }
2992c8a5708SBjorn Andersson 
rpmsg_trysend_offchannel(struct rpmsg_endpoint * ept,u32 src,u32 dst,void * data,int len)3002c8a5708SBjorn Andersson static inline int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src,
3012c8a5708SBjorn Andersson 					   u32 dst, void *data, int len)
3022c8a5708SBjorn Andersson {
3032c8a5708SBjorn Andersson 	/* This shouldn't be possible */
3042c8a5708SBjorn Andersson 	WARN_ON(1);
3052c8a5708SBjorn Andersson 
3062c8a5708SBjorn Andersson 	return -ENXIO;
3072c8a5708SBjorn Andersson }
3082c8a5708SBjorn Andersson 
rpmsg_poll(struct rpmsg_endpoint * ept,struct file * filp,poll_table * wait)309afc9a42bSAl Viro static inline __poll_t rpmsg_poll(struct rpmsg_endpoint *ept,
31084d58132SBjorn Andersson 				      struct file *filp, poll_table *wait)
31184d58132SBjorn Andersson {
31284d58132SBjorn Andersson 	/* This shouldn't be possible */
31384d58132SBjorn Andersson 	WARN_ON(1);
31484d58132SBjorn Andersson 
31584d58132SBjorn Andersson 	return 0;
31684d58132SBjorn Andersson }
31784d58132SBjorn Andersson 
rpmsg_get_mtu(struct rpmsg_endpoint * ept)318e279317eSArnaud Pouliquen static inline ssize_t rpmsg_get_mtu(struct rpmsg_endpoint *ept)
319e279317eSArnaud Pouliquen {
320e279317eSArnaud Pouliquen 	/* This shouldn't be possible */
321e279317eSArnaud Pouliquen 	WARN_ON(1);
322e279317eSArnaud Pouliquen 
323e279317eSArnaud Pouliquen 	return -ENXIO;
324e279317eSArnaud Pouliquen }
325e279317eSArnaud Pouliquen 
rpmsg_set_flow_control(struct rpmsg_endpoint * ept,bool pause,u32 dst)326*8ce49c2aSDeepak Kumar Singh static inline int rpmsg_set_flow_control(struct rpmsg_endpoint *ept, bool pause, u32 dst)
327*8ce49c2aSDeepak Kumar Singh {
328*8ce49c2aSDeepak Kumar Singh 	/* This shouldn't be possible */
329*8ce49c2aSDeepak Kumar Singh 	WARN_ON(1);
330*8ce49c2aSDeepak Kumar Singh 
331*8ce49c2aSDeepak Kumar Singh 	return -ENXIO;
332*8ce49c2aSDeepak Kumar Singh }
333*8ce49c2aSDeepak Kumar Singh 
3342c8a5708SBjorn Andersson #endif /* IS_ENABLED(CONFIG_RPMSG) */
3352c8a5708SBjorn Andersson 
336bc3c57c1SAndrew F. Davis /* use a macro to avoid include chaining to get THIS_MODULE */
337bc3c57c1SAndrew F. Davis #define register_rpmsg_driver(drv) \
338bc3c57c1SAndrew F. Davis 	__register_rpmsg_driver(drv, THIS_MODULE)
339bc3c57c1SAndrew F. Davis 
340bcabbccaSOhad Ben-Cohen /**
341f3d9f1ceSAndrew F. Davis  * module_rpmsg_driver() - Helper macro for registering an rpmsg driver
342f3d9f1ceSAndrew F. Davis  * @__rpmsg_driver: rpmsg_driver struct
343f3d9f1ceSAndrew F. Davis  *
344f3d9f1ceSAndrew F. Davis  * Helper macro for rpmsg drivers which do not do anything special in module
345f3d9f1ceSAndrew F. Davis  * init/exit. This eliminates a lot of boilerplate.  Each module may only
346f3d9f1ceSAndrew F. Davis  * use this macro once, and calling it replaces module_init() and module_exit()
347f3d9f1ceSAndrew F. Davis  */
348f3d9f1ceSAndrew F. Davis #define module_rpmsg_driver(__rpmsg_driver) \
349f3d9f1ceSAndrew F. Davis 	module_driver(__rpmsg_driver, register_rpmsg_driver, \
350f3d9f1ceSAndrew F. Davis 			unregister_rpmsg_driver)
351f3d9f1ceSAndrew F. Davis 
352bcabbccaSOhad Ben-Cohen #endif /* _LINUX_RPMSG_H */
353