123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #ifndef __QCOM_SMD_H__
- #define __QCOM_SMD_H__
- #include <linux/device.h>
- #include <linux/mod_devicetable.h>
- struct qcom_smd;
- struct qcom_smd_channel;
- struct qcom_smd_lookup;
- /**
- * struct qcom_smd_id - struct used for matching a smd device
- * @name: name of the channel
- */
- struct qcom_smd_id {
- char name[20];
- };
- /**
- * struct qcom_smd_device - smd device struct
- * @dev: the device struct
- * @channel: handle to the smd channel for this device
- */
- struct qcom_smd_device {
- struct device dev;
- struct qcom_smd_channel *channel;
- };
- typedef int (*qcom_smd_cb_t)(struct qcom_smd_channel *, const void *, size_t);
- /**
- * struct qcom_smd_driver - smd driver struct
- * @driver: underlying device driver
- * @smd_match_table: static channel match table
- * @probe: invoked when the smd channel is found
- * @remove: invoked when the smd channel is closed
- * @callback: invoked when an inbound message is received on the channel,
- * should return 0 on success or -EBUSY if the data cannot be
- * consumed at this time
- */
- struct qcom_smd_driver {
- struct device_driver driver;
- const struct qcom_smd_id *smd_match_table;
- int (*probe)(struct qcom_smd_device *dev);
- void (*remove)(struct qcom_smd_device *dev);
- qcom_smd_cb_t callback;
- };
- #if IS_ENABLED(CONFIG_QCOM_SMD)
- int qcom_smd_driver_register(struct qcom_smd_driver *drv);
- void qcom_smd_driver_unregister(struct qcom_smd_driver *drv);
- struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *channel,
- const char *name,
- qcom_smd_cb_t cb);
- void qcom_smd_close_channel(struct qcom_smd_channel *channel);
- void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel);
- void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data);
- int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len);
- struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent,
- struct device_node *node);
- int qcom_smd_unregister_edge(struct qcom_smd_edge *edge);
- #else
- static inline int qcom_smd_driver_register(struct qcom_smd_driver *drv)
- {
- return -ENXIO;
- }
- static inline void qcom_smd_driver_unregister(struct qcom_smd_driver *drv)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- }
- static inline struct qcom_smd_channel *
- qcom_smd_open_channel(struct qcom_smd_channel *channel,
- const char *name,
- qcom_smd_cb_t cb)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- return NULL;
- }
- static inline void qcom_smd_close_channel(struct qcom_smd_channel *channel)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- }
- static inline void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- return NULL;
- }
- static inline void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- }
- static inline int qcom_smd_send(struct qcom_smd_channel *channel,
- const void *data, int len)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- return -ENXIO;
- }
- static inline struct qcom_smd_edge *
- qcom_smd_register_edge(struct device *parent,
- struct device_node *node)
- {
- return ERR_PTR(-ENXIO);
- }
- static inline int qcom_smd_unregister_edge(struct qcom_smd_edge *edge)
- {
- /* This shouldn't be possible */
- WARN_ON(1);
- return -ENXIO;
- }
- #endif
- #define module_qcom_smd_driver(__smd_driver) \
- module_driver(__smd_driver, qcom_smd_driver_register, \
- qcom_smd_driver_unregister)
- #endif
|