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