diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2016-04-25 17:50:41 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2016-04-25 17:50:41 -0400 |
| commit | d3e2442b51c33c77a7d409ddcec4805b7ad991c4 (patch) | |
| tree | 873168f5bad4a7d6cbf4a8e7f627d98e4c6c883b /drivers/soc | |
| parent | c6ba3f693297fb900ad7435cc963abd2582b1176 (diff) | |
| parent | b853cb9628bfbcc4017da46d5f5b46e3eba9d8c6 (diff) | |
Merge tag 'qcom-soc-for-4.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux into next/drivers
Merge "Qualcomm ARM Based SoC Updates for v4.7 part 2" from Andy Gross:
* Change SMD callback parameters
* Use writecombine mapping for SMEM
* tag 'qcom-soc-for-4.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux:
soc: qcom: smd: Make callback pass channel reference
soc: qcom: smem: Use write-combine remap for SMEM
Diffstat (limited to 'drivers/soc')
| -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/smem.c | 3 | ||||
| -rw-r--r-- | drivers/soc/qcom/wcnss_ctrl.c | 8 |
4 files changed, 29 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/smem.c b/drivers/soc/qcom/smem.c index 19019aa092e8..2e1aa9f130f4 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c | |||
| @@ -684,8 +684,7 @@ static int qcom_smem_map_memory(struct qcom_smem *smem, struct device *dev, | |||
| 684 | 684 | ||
| 685 | smem->regions[i].aux_base = (u32)r.start; | 685 | smem->regions[i].aux_base = (u32)r.start; |
| 686 | smem->regions[i].size = resource_size(&r); | 686 | smem->regions[i].size = resource_size(&r); |
| 687 | smem->regions[i].virt_base = devm_ioremap_nocache(dev, r.start, | 687 | smem->regions[i].virt_base = devm_ioremap_wc(dev, r.start, resource_size(&r)); |
| 688 | resource_size(&r)); | ||
| 689 | if (!smem->regions[i].virt_base) | 688 | if (!smem->regions[i].virt_base) |
| 690 | return -ENOMEM; | 689 | return -ENOMEM; |
| 691 | 690 | ||
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 | } |
