| #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 |