diff options
| -rw-r--r-- | drivers/soc/qcom/smd-rpm.c | 9 | ||||
| -rw-r--r-- | drivers/soc/qcom/smd.c | 22 | ||||
| -rw-r--r-- | drivers/soc/qcom/wcnss_ctrl.c | 8 | ||||
| -rw-r--r-- | include/linux/soc/qcom/smd.h | 7 |
4 files changed, 33 insertions, 13 deletions
diff --git a/drivers/soc/qcom/smd-rpm.c b/drivers/soc/qcom/smd-rpm.c index 731fa066f712..6609d7e0edb0 100644 --- a/drivers/soc/qcom/smd-rpm.c +++ b/drivers/soc/qcom/smd-rpm.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | */ | 33 | */ |
| 34 | struct qcom_smd_rpm { | 34 | struct qcom_smd_rpm { |
| 35 | struct qcom_smd_channel *rpm_channel; | 35 | struct qcom_smd_channel *rpm_channel; |
| 36 | struct device *dev; | ||
| 36 | 37 | ||
| 37 | struct completion ack; | 38 | struct completion ack; |
| 38 | struct mutex lock; | 39 | struct mutex lock; |
| @@ -149,14 +150,14 @@ out: | |||
| 149 | } | 150 | } |
| 150 | EXPORT_SYMBOL(qcom_rpm_smd_write); | 151 | EXPORT_SYMBOL(qcom_rpm_smd_write); |
| 151 | 152 | ||
| 152 | static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev, | 153 | static int qcom_smd_rpm_callback(struct qcom_smd_channel *channel, |
| 153 | const void *data, | 154 | const void *data, |
| 154 | size_t count) | 155 | size_t count) |
| 155 | { | 156 | { |
| 156 | const struct qcom_rpm_header *hdr = data; | 157 | const struct qcom_rpm_header *hdr = data; |
| 157 | size_t hdr_length = le32_to_cpu(hdr->length); | 158 | size_t hdr_length = le32_to_cpu(hdr->length); |
| 158 | const struct qcom_rpm_message *msg; | 159 | const struct qcom_rpm_message *msg; |
| 159 | struct qcom_smd_rpm *rpm = dev_get_drvdata(&qsdev->dev); | 160 | struct qcom_smd_rpm *rpm = qcom_smd_get_drvdata(channel); |
| 160 | const u8 *buf = data + sizeof(struct qcom_rpm_header); | 161 | const u8 *buf = data + sizeof(struct qcom_rpm_header); |
| 161 | const u8 *end = buf + hdr_length; | 162 | const u8 *end = buf + hdr_length; |
| 162 | char msgbuf[32]; | 163 | char msgbuf[32]; |
| @@ -165,7 +166,7 @@ static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev, | |||
| 165 | 166 | ||
| 166 | if (le32_to_cpu(hdr->service_type) != RPM_SERVICE_TYPE_REQUEST || | 167 | if (le32_to_cpu(hdr->service_type) != RPM_SERVICE_TYPE_REQUEST || |
| 167 | hdr_length < sizeof(struct qcom_rpm_message)) { | 168 | hdr_length < sizeof(struct qcom_rpm_message)) { |
| 168 | dev_err(&qsdev->dev, "invalid request\n"); | 169 | dev_err(rpm->dev, "invalid request\n"); |
| 169 | return 0; | 170 | return 0; |
| 170 | } | 171 | } |
| 171 | 172 | ||
| @@ -206,7 +207,9 @@ static int qcom_smd_rpm_probe(struct qcom_smd_device *sdev) | |||
| 206 | mutex_init(&rpm->lock); | 207 | mutex_init(&rpm->lock); |
| 207 | init_completion(&rpm->ack); | 208 | init_completion(&rpm->ack); |
| 208 | 209 | ||
| 210 | rpm->dev = &sdev->dev; | ||
| 209 | rpm->rpm_channel = sdev->channel; | 211 | rpm->rpm_channel = sdev->channel; |
| 212 | qcom_smd_set_drvdata(sdev->channel, rpm); | ||
| 210 | 213 | ||
| 211 | dev_set_drvdata(&sdev->dev, rpm); | 214 | dev_set_drvdata(&sdev->dev, rpm); |
| 212 | 215 | ||
diff --git a/drivers/soc/qcom/smd.c b/drivers/soc/qcom/smd.c index b6434c4be86a..ac1957dfdf24 100644 --- a/drivers/soc/qcom/smd.c +++ b/drivers/soc/qcom/smd.c | |||
| @@ -194,6 +194,8 @@ struct qcom_smd_channel { | |||
| 194 | 194 | ||
| 195 | int pkt_size; | 195 | int pkt_size; |
| 196 | 196 | ||
| 197 | void *drvdata; | ||
| 198 | |||
| 197 | struct list_head list; | 199 | struct list_head list; |
| 198 | struct list_head dev_list; | 200 | struct list_head dev_list; |
| 199 | }; | 201 | }; |
| @@ -513,7 +515,6 @@ static void qcom_smd_channel_advance(struct qcom_smd_channel *channel, | |||
| 513 | */ | 515 | */ |
| 514 | static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) | 516 | static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) |
| 515 | { | 517 | { |
| 516 | struct qcom_smd_device *qsdev = channel->qsdev; | ||
| 517 | unsigned tail; | 518 | unsigned tail; |
| 518 | size_t len; | 519 | size_t len; |
| 519 | void *ptr; | 520 | void *ptr; |
| @@ -533,7 +534,7 @@ static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) | |||
| 533 | len = channel->pkt_size; | 534 | len = channel->pkt_size; |
| 534 | } | 535 | } |
| 535 | 536 | ||
| 536 | ret = channel->cb(qsdev, ptr, len); | 537 | ret = channel->cb(channel, ptr, len); |
| 537 | if (ret < 0) | 538 | if (ret < 0) |
| 538 | return ret; | 539 | return ret; |
| 539 | 540 | ||
| @@ -1034,6 +1035,18 @@ int qcom_smd_driver_register(struct qcom_smd_driver *qsdrv) | |||
| 1034 | } | 1035 | } |
| 1035 | EXPORT_SYMBOL(qcom_smd_driver_register); | 1036 | EXPORT_SYMBOL(qcom_smd_driver_register); |
| 1036 | 1037 | ||
| 1038 | void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel) | ||
| 1039 | { | ||
| 1040 | return channel->drvdata; | ||
| 1041 | } | ||
| 1042 | EXPORT_SYMBOL(qcom_smd_get_drvdata); | ||
| 1043 | |||
| 1044 | void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data) | ||
| 1045 | { | ||
| 1046 | channel->drvdata = data; | ||
| 1047 | } | ||
| 1048 | EXPORT_SYMBOL(qcom_smd_set_drvdata); | ||
| 1049 | |||
| 1037 | /** | 1050 | /** |
| 1038 | * qcom_smd_driver_unregister - unregister a smd driver | 1051 | * qcom_smd_driver_unregister - unregister a smd driver |
| 1039 | * @qsdrv: qcom_smd_driver struct | 1052 | * @qsdrv: qcom_smd_driver struct |
| @@ -1079,12 +1092,13 @@ qcom_smd_find_channel(struct qcom_smd_edge *edge, const char *name) | |||
| 1079 | * Returns a channel handle on success, or -EPROBE_DEFER if the channel isn't | 1092 | * Returns a channel handle on success, or -EPROBE_DEFER if the channel isn't |
| 1080 | * ready. | 1093 | * ready. |
| 1081 | */ | 1094 | */ |
| 1082 | struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev, | 1095 | struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *parent, |
| 1083 | const char *name, | 1096 | const char *name, |
| 1084 | qcom_smd_cb_t cb) | 1097 | qcom_smd_cb_t cb) |
| 1085 | { | 1098 | { |
| 1086 | struct qcom_smd_channel *channel; | 1099 | struct qcom_smd_channel *channel; |
| 1087 | struct qcom_smd_edge *edge = sdev->channel->edge; | 1100 | struct qcom_smd_device *sdev = parent->qsdev; |
| 1101 | struct qcom_smd_edge *edge = parent->edge; | ||
| 1088 | int ret; | 1102 | int ret; |
| 1089 | 1103 | ||
| 1090 | /* Wait up to HZ for the channel to appear */ | 1104 | /* Wait up to HZ for the channel to appear */ |
diff --git a/drivers/soc/qcom/wcnss_ctrl.c b/drivers/soc/qcom/wcnss_ctrl.c index 7a986f881d5c..c544f3d2c6ee 100644 --- a/drivers/soc/qcom/wcnss_ctrl.c +++ b/drivers/soc/qcom/wcnss_ctrl.c | |||
| @@ -100,17 +100,17 @@ struct wcnss_download_nv_resp { | |||
| 100 | 100 | ||
| 101 | /** | 101 | /** |
| 102 | * wcnss_ctrl_smd_callback() - handler from SMD responses | 102 | * wcnss_ctrl_smd_callback() - handler from SMD responses |
| 103 | * @qsdev: smd device handle | 103 | * @channel: smd channel handle |
| 104 | * @data: pointer to the incoming data packet | 104 | * @data: pointer to the incoming data packet |
| 105 | * @count: size of the incoming data packet | 105 | * @count: size of the incoming data packet |
| 106 | * | 106 | * |
| 107 | * Handles any incoming packets from the remote WCNSS_CTRL service. | 107 | * Handles any incoming packets from the remote WCNSS_CTRL service. |
| 108 | */ | 108 | */ |
| 109 | static int wcnss_ctrl_smd_callback(struct qcom_smd_device *qsdev, | 109 | static int wcnss_ctrl_smd_callback(struct qcom_smd_channel *channel, |
| 110 | const void *data, | 110 | const void *data, |
| 111 | size_t count) | 111 | size_t count) |
| 112 | { | 112 | { |
| 113 | struct wcnss_ctrl *wcnss = dev_get_drvdata(&qsdev->dev); | 113 | struct wcnss_ctrl *wcnss = qcom_smd_get_drvdata(channel); |
| 114 | const struct wcnss_download_nv_resp *nvresp; | 114 | const struct wcnss_download_nv_resp *nvresp; |
| 115 | const struct wcnss_version_resp *version; | 115 | const struct wcnss_version_resp *version; |
| 116 | const struct wcnss_msg_hdr *hdr = data; | 116 | const struct wcnss_msg_hdr *hdr = data; |
| @@ -246,7 +246,7 @@ static int wcnss_ctrl_probe(struct qcom_smd_device *sdev) | |||
| 246 | init_completion(&wcnss->ack); | 246 | init_completion(&wcnss->ack); |
| 247 | INIT_WORK(&wcnss->download_nv_work, wcnss_download_nv); | 247 | INIT_WORK(&wcnss->download_nv_work, wcnss_download_nv); |
| 248 | 248 | ||
| 249 | dev_set_drvdata(&sdev->dev, wcnss); | 249 | qcom_smd_set_drvdata(sdev->channel, wcnss); |
| 250 | 250 | ||
| 251 | return wcnss_request_version(wcnss); | 251 | return wcnss_request_version(wcnss); |
| 252 | } | 252 | } |
diff --git a/include/linux/soc/qcom/smd.h b/include/linux/soc/qcom/smd.h index bd51c8a9d807..cb2f81559bc0 100644 --- a/include/linux/soc/qcom/smd.h +++ b/include/linux/soc/qcom/smd.h | |||
| @@ -26,7 +26,7 @@ struct qcom_smd_device { | |||
| 26 | struct qcom_smd_channel *channel; | 26 | struct qcom_smd_channel *channel; |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | typedef int (*qcom_smd_cb_t)(struct qcom_smd_device *, const void *, size_t); | 29 | typedef int (*qcom_smd_cb_t)(struct qcom_smd_channel *, const void *, size_t); |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * struct qcom_smd_driver - smd driver struct | 32 | * struct qcom_smd_driver - smd driver struct |
| @@ -50,13 +50,16 @@ struct qcom_smd_driver { | |||
| 50 | int qcom_smd_driver_register(struct qcom_smd_driver *drv); | 50 | int qcom_smd_driver_register(struct qcom_smd_driver *drv); |
| 51 | void qcom_smd_driver_unregister(struct qcom_smd_driver *drv); | 51 | void qcom_smd_driver_unregister(struct qcom_smd_driver *drv); |
| 52 | 52 | ||
| 53 | void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel); | ||
| 54 | void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data); | ||
| 55 | |||
| 53 | #define module_qcom_smd_driver(__smd_driver) \ | 56 | #define module_qcom_smd_driver(__smd_driver) \ |
| 54 | module_driver(__smd_driver, qcom_smd_driver_register, \ | 57 | module_driver(__smd_driver, qcom_smd_driver_register, \ |
| 55 | qcom_smd_driver_unregister) | 58 | qcom_smd_driver_unregister) |
| 56 | 59 | ||
| 57 | int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len); | 60 | int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len); |
| 58 | 61 | ||
| 59 | struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev, | 62 | struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *channel, |
| 60 | const char *name, | 63 | const char *name, |
| 61 | qcom_smd_cb_t cb); | 64 | qcom_smd_cb_t cb); |
| 62 | 65 | ||
