aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/soc/qcom/smd-rpm.c9
-rw-r--r--drivers/soc/qcom/smd.c22
-rw-r--r--drivers/soc/qcom/wcnss_ctrl.c8
-rw-r--r--include/linux/soc/qcom/smd.h7
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 */
34struct qcom_smd_rpm { 34struct 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}
150EXPORT_SYMBOL(qcom_rpm_smd_write); 151EXPORT_SYMBOL(qcom_rpm_smd_write);
151 152
152static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev, 153static 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 */
514static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) 516static 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}
1035EXPORT_SYMBOL(qcom_smd_driver_register); 1036EXPORT_SYMBOL(qcom_smd_driver_register);
1036 1037
1038void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel)
1039{
1040 return channel->drvdata;
1041}
1042EXPORT_SYMBOL(qcom_smd_get_drvdata);
1043
1044void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data)
1045{
1046 channel->drvdata = data;
1047}
1048EXPORT_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 */
1082struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev, 1095struct 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 */
109static int wcnss_ctrl_smd_callback(struct qcom_smd_device *qsdev, 109static 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
29typedef int (*qcom_smd_cb_t)(struct qcom_smd_device *, const void *, size_t); 29typedef 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 {
50int qcom_smd_driver_register(struct qcom_smd_driver *drv); 50int qcom_smd_driver_register(struct qcom_smd_driver *drv);
51void qcom_smd_driver_unregister(struct qcom_smd_driver *drv); 51void qcom_smd_driver_unregister(struct qcom_smd_driver *drv);
52 52
53void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel);
54void 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
57int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len); 60int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len);
58 61
59struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev, 62struct 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