Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'qcom-soc-for-4.7-2' into net-next

This merges the Qualcomm SOC tree with the net-next, solving the
merge conflict in the SMD API between the two.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>

+280 -79
+3
MAINTAINERS
··· 1470 1470 F: arch/arm/boot/dts/qcom-*.dtsi 1471 1471 F: arch/arm/mach-qcom/ 1472 1472 F: arch/arm64/boot/dts/qcom/* 1473 + F: drivers/i2c/busses/i2c-qup.c 1474 + F: drivers/clk/qcom/ 1473 1475 F: drivers/soc/qcom/ 1476 + F: drivers/spi/spi-qup.c 1474 1477 F: drivers/tty/serial/msm_serial.h 1475 1478 F: drivers/tty/serial/msm_serial.c 1476 1479 F: drivers/*/pm8???-*
+6 -3
drivers/soc/qcom/smd-rpm.c
··· 33 33 */ 34 34 struct qcom_smd_rpm { 35 35 struct qcom_smd_channel *rpm_channel; 36 + struct device *dev; 36 37 37 38 struct completion ack; 38 39 struct mutex lock; ··· 150 149 } 151 150 EXPORT_SYMBOL(qcom_rpm_smd_write); 152 151 153 - static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev, 152 + static int qcom_smd_rpm_callback(struct qcom_smd_channel *channel, 154 153 const void *data, 155 154 size_t count) 156 155 { 157 156 const struct qcom_rpm_header *hdr = data; 158 157 size_t hdr_length = le32_to_cpu(hdr->length); 159 158 const struct qcom_rpm_message *msg; 160 - struct qcom_smd_rpm *rpm = dev_get_drvdata(&qsdev->dev); 159 + struct qcom_smd_rpm *rpm = qcom_smd_get_drvdata(channel); 161 160 const u8 *buf = data + sizeof(struct qcom_rpm_header); 162 161 const u8 *end = buf + hdr_length; 163 162 char msgbuf[32]; ··· 166 165 167 166 if (le32_to_cpu(hdr->service_type) != RPM_SERVICE_TYPE_REQUEST || 168 167 hdr_length < sizeof(struct qcom_rpm_message)) { 169 - dev_err(&qsdev->dev, "invalid request\n"); 168 + dev_err(rpm->dev, "invalid request\n"); 170 169 return 0; 171 170 } 172 171 ··· 207 206 mutex_init(&rpm->lock); 208 207 init_completion(&rpm->ack); 209 208 209 + rpm->dev = &sdev->dev; 210 210 rpm->rpm_channel = sdev->channel; 211 + qcom_smd_set_drvdata(sdev->channel, rpm); 211 212 212 213 dev_set_drvdata(&sdev->dev, rpm); 213 214
+190 -61
drivers/soc/qcom/smd.c
··· 106 106 * @channels: list of all channels detected on this edge 107 107 * @channels_lock: guard for modifications of @channels 108 108 * @allocated: array of bitmaps representing already allocated channels 109 - * @need_rescan: flag that the @work needs to scan smem for new channels 110 109 * @smem_available: last available amount of smem triggering a channel scan 111 - * @work: work item for edge house keeping 110 + * @scan_work: work item for discovering new channels 111 + * @state_work: work item for edge state changes 112 112 */ 113 113 struct qcom_smd_edge { 114 114 struct qcom_smd *smd; ··· 127 127 128 128 DECLARE_BITMAP(allocated[SMD_ALLOC_TBL_COUNT], SMD_ALLOC_TBL_SIZE); 129 129 130 - bool need_rescan; 131 130 unsigned smem_available; 132 131 133 - struct work_struct work; 132 + wait_queue_head_t new_channel_event; 133 + 134 + struct work_struct scan_work; 135 + struct work_struct state_work; 134 136 }; 135 137 136 138 /* ··· 188 186 int fifo_size; 189 187 190 188 void *bounce_buffer; 191 - int (*cb)(struct qcom_smd_device *, const void *, size_t); 189 + qcom_smd_cb_t cb; 192 190 193 191 spinlock_t recv_lock; 194 192 195 193 int pkt_size; 196 194 195 + void *drvdata; 196 + 197 197 struct list_head list; 198 + struct list_head dev_list; 198 199 }; 199 200 200 201 /** ··· 383 378 } 384 379 385 380 /* 381 + * Set the callback for a channel, with appropriate locking 382 + */ 383 + static void qcom_smd_channel_set_callback(struct qcom_smd_channel *channel, 384 + qcom_smd_cb_t cb) 385 + { 386 + unsigned long flags; 387 + 388 + spin_lock_irqsave(&channel->recv_lock, flags); 389 + channel->cb = cb; 390 + spin_unlock_irqrestore(&channel->recv_lock, flags); 391 + }; 392 + 393 + /* 386 394 * Calculate the amount of data available in the rx fifo 387 395 */ 388 396 static size_t qcom_smd_channel_get_rx_avail(struct qcom_smd_channel *channel) ··· 515 497 */ 516 498 static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) 517 499 { 518 - struct qcom_smd_device *qsdev = channel->qsdev; 519 500 unsigned tail; 520 501 size_t len; 521 502 void *ptr; ··· 534 517 len = channel->pkt_size; 535 518 } 536 519 537 - ret = channel->cb(qsdev, ptr, len); 520 + ret = channel->cb(channel, ptr, len); 538 521 if (ret < 0) 539 522 return ret; 540 523 ··· 618 601 struct qcom_smd_edge *edge = data; 619 602 struct qcom_smd_channel *channel; 620 603 unsigned available; 621 - bool kick_worker = false; 604 + bool kick_scanner = false; 605 + bool kick_state = false; 622 606 623 607 /* 624 608 * Handle state changes or data on each of the channels on this edge ··· 627 609 spin_lock(&edge->channels_lock); 628 610 list_for_each_entry(channel, &edge->channels, list) { 629 611 spin_lock(&channel->recv_lock); 630 - kick_worker |= qcom_smd_channel_intr(channel); 612 + kick_state |= qcom_smd_channel_intr(channel); 631 613 spin_unlock(&channel->recv_lock); 632 614 } 633 615 spin_unlock(&edge->channels_lock); ··· 640 622 available = qcom_smem_get_free_space(edge->remote_pid); 641 623 if (available != edge->smem_available) { 642 624 edge->smem_available = available; 643 - edge->need_rescan = true; 644 - kick_worker = true; 625 + kick_scanner = true; 645 626 } 646 627 647 - if (kick_worker) 648 - schedule_work(&edge->work); 628 + if (kick_scanner) 629 + schedule_work(&edge->scan_work); 630 + if (kick_state) 631 + schedule_work(&edge->state_work); 649 632 650 633 return IRQ_HANDLED; 651 634 } ··· 812 793 } 813 794 814 795 /* 796 + * Helper for opening a channel 797 + */ 798 + static int qcom_smd_channel_open(struct qcom_smd_channel *channel, 799 + qcom_smd_cb_t cb) 800 + { 801 + size_t bb_size; 802 + 803 + /* 804 + * Packets are maximum 4k, but reduce if the fifo is smaller 805 + */ 806 + bb_size = min(channel->fifo_size, SZ_4K); 807 + channel->bounce_buffer = kmalloc(bb_size, GFP_KERNEL); 808 + if (!channel->bounce_buffer) 809 + return -ENOMEM; 810 + 811 + qcom_smd_channel_set_callback(channel, cb); 812 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENING); 813 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENED); 814 + 815 + return 0; 816 + } 817 + 818 + /* 819 + * Helper for closing and resetting a channel 820 + */ 821 + static void qcom_smd_channel_close(struct qcom_smd_channel *channel) 822 + { 823 + qcom_smd_channel_set_callback(channel, NULL); 824 + 825 + kfree(channel->bounce_buffer); 826 + channel->bounce_buffer = NULL; 827 + 828 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 829 + qcom_smd_channel_reset(channel); 830 + } 831 + 832 + /* 815 833 * Probe the smd client. 816 834 * 817 835 * The remote side have indicated that it want the channel to be opened, so ··· 859 803 struct qcom_smd_device *qsdev = to_smd_device(dev); 860 804 struct qcom_smd_driver *qsdrv = to_smd_driver(dev); 861 805 struct qcom_smd_channel *channel = qsdev->channel; 862 - size_t bb_size; 863 806 int ret; 864 807 865 - /* 866 - * Packets are maximum 4k, but reduce if the fifo is smaller 867 - */ 868 - bb_size = min(channel->fifo_size, SZ_4K); 869 - channel->bounce_buffer = kmalloc(bb_size, GFP_KERNEL); 870 - if (!channel->bounce_buffer) 871 - return -ENOMEM; 872 - 873 - channel->cb = qsdrv->callback; 874 - 875 - qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENING); 876 - 877 - qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENED); 808 + ret = qcom_smd_channel_open(channel, qsdrv->callback); 809 + if (ret) 810 + return ret; 878 811 879 812 ret = qsdrv->probe(qsdev); 880 813 if (ret) ··· 876 831 err: 877 832 dev_err(&qsdev->dev, "probe failed\n"); 878 833 879 - channel->cb = NULL; 880 - kfree(channel->bounce_buffer); 881 - channel->bounce_buffer = NULL; 882 - 883 - qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 834 + qcom_smd_channel_close(channel); 884 835 return ret; 885 836 } 886 837 ··· 891 850 struct qcom_smd_device *qsdev = to_smd_device(dev); 892 851 struct qcom_smd_driver *qsdrv = to_smd_driver(dev); 893 852 struct qcom_smd_channel *channel = qsdev->channel; 894 - unsigned long flags; 853 + struct qcom_smd_channel *tmp; 854 + struct qcom_smd_channel *ch; 895 855 896 856 qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSING); 897 857 898 858 /* 899 859 * Make sure we don't race with the code receiving data. 900 860 */ 901 - spin_lock_irqsave(&channel->recv_lock, flags); 902 - channel->cb = NULL; 903 - spin_unlock_irqrestore(&channel->recv_lock, flags); 861 + qcom_smd_channel_set_callback(channel, NULL); 904 862 905 863 /* Wake up any sleepers in qcom_smd_send() */ 906 864 wake_up_interruptible(&channel->fblockread_event); ··· 912 872 qsdrv->remove(qsdev); 913 873 914 874 /* 915 - * The client is now gone, cleanup and reset the channel state. 875 + * The client is now gone, close and release all channels associated 876 + * with this sdev 916 877 */ 917 - channel->qsdev = NULL; 918 - kfree(channel->bounce_buffer); 919 - channel->bounce_buffer = NULL; 920 - 921 - qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 922 - 923 - qcom_smd_channel_reset(channel); 878 + list_for_each_entry_safe(ch, tmp, &channel->dev_list, dev_list) { 879 + qcom_smd_channel_close(ch); 880 + list_del(&ch->dev_list); 881 + ch->qsdev = NULL; 882 + } 924 883 925 884 return 0; 926 885 } ··· 1035 996 } 1036 997 EXPORT_SYMBOL(qcom_smd_driver_register); 1037 998 999 + void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel) 1000 + { 1001 + return channel->drvdata; 1002 + } 1003 + EXPORT_SYMBOL(qcom_smd_get_drvdata); 1004 + 1005 + void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data) 1006 + { 1007 + channel->drvdata = data; 1008 + } 1009 + EXPORT_SYMBOL(qcom_smd_set_drvdata); 1010 + 1038 1011 /** 1039 1012 * qcom_smd_driver_unregister - unregister a smd driver 1040 1013 * @qsdrv: qcom_smd_driver struct ··· 1056 1005 driver_unregister(&qsdrv->driver); 1057 1006 } 1058 1007 EXPORT_SYMBOL(qcom_smd_driver_unregister); 1008 + 1009 + static struct qcom_smd_channel * 1010 + qcom_smd_find_channel(struct qcom_smd_edge *edge, const char *name) 1011 + { 1012 + struct qcom_smd_channel *channel; 1013 + struct qcom_smd_channel *ret = NULL; 1014 + unsigned long flags; 1015 + unsigned state; 1016 + 1017 + spin_lock_irqsave(&edge->channels_lock, flags); 1018 + list_for_each_entry(channel, &edge->channels, list) { 1019 + if (strcmp(channel->name, name)) 1020 + continue; 1021 + 1022 + state = GET_RX_CHANNEL_INFO(channel, state); 1023 + if (state != SMD_CHANNEL_OPENING && 1024 + state != SMD_CHANNEL_OPENED) 1025 + continue; 1026 + 1027 + ret = channel; 1028 + break; 1029 + } 1030 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1031 + 1032 + return ret; 1033 + } 1034 + 1035 + /** 1036 + * qcom_smd_open_channel() - claim additional channels on the same edge 1037 + * @sdev: smd_device handle 1038 + * @name: channel name 1039 + * @cb: callback method to use for incoming data 1040 + * 1041 + * Returns a channel handle on success, or -EPROBE_DEFER if the channel isn't 1042 + * ready. 1043 + */ 1044 + struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *parent, 1045 + const char *name, 1046 + qcom_smd_cb_t cb) 1047 + { 1048 + struct qcom_smd_channel *channel; 1049 + struct qcom_smd_device *sdev = parent->qsdev; 1050 + struct qcom_smd_edge *edge = parent->edge; 1051 + int ret; 1052 + 1053 + /* Wait up to HZ for the channel to appear */ 1054 + ret = wait_event_interruptible_timeout(edge->new_channel_event, 1055 + (channel = qcom_smd_find_channel(edge, name)) != NULL, 1056 + HZ); 1057 + if (!ret) 1058 + return ERR_PTR(-ETIMEDOUT); 1059 + 1060 + if (channel->state != SMD_CHANNEL_CLOSED) { 1061 + dev_err(&sdev->dev, "channel %s is busy\n", channel->name); 1062 + return ERR_PTR(-EBUSY); 1063 + } 1064 + 1065 + channel->qsdev = sdev; 1066 + ret = qcom_smd_channel_open(channel, cb); 1067 + if (ret) { 1068 + channel->qsdev = NULL; 1069 + return ERR_PTR(ret); 1070 + } 1071 + 1072 + /* 1073 + * Append the list of channel to the channels associated with the sdev 1074 + */ 1075 + list_add_tail(&channel->dev_list, &sdev->channel->dev_list); 1076 + 1077 + return channel; 1078 + } 1079 + EXPORT_SYMBOL(qcom_smd_open_channel); 1059 1080 1060 1081 /* 1061 1082 * Allocate the qcom_smd_channel object for a newly found smd channel, ··· 1150 1027 if (!channel) 1151 1028 return ERR_PTR(-ENOMEM); 1152 1029 1030 + INIT_LIST_HEAD(&channel->dev_list); 1153 1031 channel->edge = edge; 1154 1032 channel->name = devm_kstrdup(smd->dev, name, GFP_KERNEL); 1155 1033 if (!channel->name) ··· 1213 1089 * qcom_smd_create_channel() to create representations of these and add 1214 1090 * them to the edge's list of channels. 1215 1091 */ 1216 - static void qcom_discover_channels(struct qcom_smd_edge *edge) 1092 + static void qcom_channel_scan_worker(struct work_struct *work) 1217 1093 { 1094 + struct qcom_smd_edge *edge = container_of(work, struct qcom_smd_edge, scan_work); 1218 1095 struct qcom_smd_alloc_entry *alloc_tbl; 1219 1096 struct qcom_smd_alloc_entry *entry; 1220 1097 struct qcom_smd_channel *channel; ··· 1265 1140 1266 1141 dev_dbg(smd->dev, "new channel found: '%s'\n", channel->name); 1267 1142 set_bit(i, edge->allocated[tbl]); 1143 + 1144 + wake_up_interruptible(&edge->new_channel_event); 1268 1145 } 1269 1146 } 1270 1147 1271 - schedule_work(&edge->work); 1148 + schedule_work(&edge->state_work); 1272 1149 } 1273 1150 1274 1151 /* ··· 1278 1151 * then scans all registered channels for state changes that should be handled 1279 1152 * by creating or destroying smd client devices for the registered channels. 1280 1153 * 1281 - * LOCKING: edge->channels_lock is not needed to be held during the traversal 1282 - * of the channels list as it's done synchronously with the only writer. 1154 + * LOCKING: edge->channels_lock only needs to cover the list operations, as the 1155 + * worker is killed before any channels are deallocated 1283 1156 */ 1284 1157 static void qcom_channel_state_worker(struct work_struct *work) 1285 1158 { 1286 1159 struct qcom_smd_channel *channel; 1287 1160 struct qcom_smd_edge *edge = container_of(work, 1288 1161 struct qcom_smd_edge, 1289 - work); 1162 + state_work); 1290 1163 unsigned remote_state; 1291 - 1292 - /* 1293 - * Rescan smem if we have reason to belive that there are new channels. 1294 - */ 1295 - if (edge->need_rescan) { 1296 - edge->need_rescan = false; 1297 - qcom_discover_channels(edge); 1298 - } 1164 + unsigned long flags; 1299 1165 1300 1166 /* 1301 1167 * Register a device for any closed channel where the remote processor 1302 1168 * is showing interest in opening the channel. 1303 1169 */ 1170 + spin_lock_irqsave(&edge->channels_lock, flags); 1304 1171 list_for_each_entry(channel, &edge->channels, list) { 1305 1172 if (channel->state != SMD_CHANNEL_CLOSED) 1306 1173 continue; ··· 1304 1183 remote_state != SMD_CHANNEL_OPENED) 1305 1184 continue; 1306 1185 1186 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1307 1187 qcom_smd_create_device(channel); 1188 + spin_lock_irqsave(&edge->channels_lock, flags); 1308 1189 } 1309 1190 1310 1191 /* ··· 1323 1200 remote_state == SMD_CHANNEL_OPENED) 1324 1201 continue; 1325 1202 1203 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1326 1204 qcom_smd_destroy_device(channel); 1205 + spin_lock_irqsave(&edge->channels_lock, flags); 1327 1206 } 1207 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1328 1208 } 1329 1209 1330 1210 /* ··· 1345 1219 INIT_LIST_HEAD(&edge->channels); 1346 1220 spin_lock_init(&edge->channels_lock); 1347 1221 1348 - INIT_WORK(&edge->work, qcom_channel_state_worker); 1222 + INIT_WORK(&edge->scan_work, qcom_channel_scan_worker); 1223 + INIT_WORK(&edge->state_work, qcom_channel_state_worker); 1349 1224 1350 1225 edge->of_node = of_node_get(node); 1351 1226 ··· 1430 1303 for_each_available_child_of_node(pdev->dev.of_node, node) { 1431 1304 edge = &smd->edges[i++]; 1432 1305 edge->smd = smd; 1306 + init_waitqueue_head(&edge->new_channel_event); 1433 1307 1434 1308 ret = qcom_smd_parse_edge(&pdev->dev, node, edge); 1435 1309 if (ret) 1436 1310 continue; 1437 1311 1438 - edge->need_rescan = true; 1439 - schedule_work(&edge->work); 1312 + schedule_work(&edge->scan_work); 1440 1313 } 1441 1314 1442 1315 platform_set_drvdata(pdev, smd); ··· 1459 1332 edge = &smd->edges[i]; 1460 1333 1461 1334 disable_irq(edge->irq); 1462 - cancel_work_sync(&edge->work); 1335 + cancel_work_sync(&edge->scan_work); 1336 + cancel_work_sync(&edge->state_work); 1463 1337 1338 + /* No need to lock here, because the writer is gone */ 1464 1339 list_for_each_entry(channel, &edge->channels, list) { 1465 1340 if (!channel->qsdev) 1466 1341 continue;
+1 -2
drivers/soc/qcom/smem.c
··· 684 684 685 685 smem->regions[i].aux_base = (u32)r.start; 686 686 smem->regions[i].size = resource_size(&r); 687 - smem->regions[i].virt_base = devm_ioremap_nocache(dev, r.start, 688 - resource_size(&r)); 687 + smem->regions[i].virt_base = devm_ioremap_wc(dev, r.start, resource_size(&r)); 689 688 if (!smem->regions[i].virt_base) 690 689 return -ENOMEM; 691 690
+3 -5
drivers/soc/qcom/spm.c
··· 2 2 * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 3 3 * Copyright (c) 2014,2015, Linaro Ltd. 4 4 * 5 + * SAW power controller driver 6 + * 5 7 * This program is free software; you can redistribute it and/or modify 6 8 * it under the terms of the GNU General Public License version 2 and 7 9 * only version 2 as published by the Free Software Foundation. ··· 14 12 * GNU General Public License for more details. 15 13 */ 16 14 17 - #include <linux/module.h> 18 15 #include <linux/kernel.h> 19 16 #include <linux/init.h> 20 17 #include <linux/io.h> ··· 379 378 .of_match_table = spm_match_table, 380 379 }, 381 380 }; 382 - module_platform_driver(spm_driver); 383 381 384 - MODULE_LICENSE("GPL v2"); 385 - MODULE_DESCRIPTION("SAW power controller driver"); 386 - MODULE_ALIAS("platform:saw"); 382 + builtin_platform_driver(spm_driver);
+4 -4
drivers/soc/qcom/wcnss_ctrl.c
··· 100 100 101 101 /** 102 102 * wcnss_ctrl_smd_callback() - handler from SMD responses 103 - * @qsdev: smd device handle 103 + * @channel: smd channel handle 104 104 * @data: pointer to the incoming data packet 105 105 * @count: size of the incoming data packet 106 106 * 107 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 110 const void *data, 111 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 114 const struct wcnss_download_nv_resp *nvresp; 115 115 const struct wcnss_version_resp *version; 116 116 const struct wcnss_msg_hdr *hdr = data; ··· 246 246 init_completion(&wcnss->ack); 247 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 251 return wcnss_request_version(wcnss); 252 252 }
+32 -1
include/linux/soc/qcom/smd.h
··· 26 26 struct qcom_smd_channel *channel; 27 27 }; 28 28 29 + typedef int (*qcom_smd_cb_t)(struct qcom_smd_channel *, const void *, size_t); 30 + 29 31 /** 30 32 * struct qcom_smd_driver - smd driver struct 31 33 * @driver: underlying device driver ··· 44 42 45 43 int (*probe)(struct qcom_smd_device *dev); 46 44 void (*remove)(struct qcom_smd_device *dev); 47 - int (*callback)(struct qcom_smd_device *, const void *, size_t); 45 + qcom_smd_cb_t callback; 48 46 }; 49 47 50 48 #if IS_ENABLED(CONFIG_QCOM_SMD) ··· 52 50 int qcom_smd_driver_register(struct qcom_smd_driver *drv); 53 51 void qcom_smd_driver_unregister(struct qcom_smd_driver *drv); 54 52 53 + struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *channel, 54 + const char *name, 55 + qcom_smd_cb_t cb); 56 + void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel); 57 + void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data); 55 58 int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len); 59 + 56 60 57 61 #else 58 62 ··· 68 60 } 69 61 70 62 static inline void qcom_smd_driver_unregister(struct qcom_smd_driver *drv) 63 + { 64 + /* This shouldn't be possible */ 65 + WARN_ON(1); 66 + } 67 + 68 + static inline struct qcom_smd_channel * 69 + qcom_smd_open_channel(struct qcom_smd_channel *channel, 70 + const char *name, 71 + qcom_smd_cb_t cb) 72 + { 73 + /* This shouldn't be possible */ 74 + WARN_ON(1); 75 + return NULL; 76 + } 77 + 78 + void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel) 79 + { 80 + /* This shouldn't be possible */ 81 + WARN_ON(1); 82 + return NULL; 83 + } 84 + 85 + void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data) 71 86 { 72 87 /* This shouldn't be possible */ 73 88 WARN_ON(1);
+35
include/linux/soc/qcom/smem_state.h
··· 1 1 #ifndef __QCOM_SMEM_STATE__ 2 2 #define __QCOM_SMEM_STATE__ 3 3 4 + #include <linux/errno.h> 5 + 6 + struct device_node; 4 7 struct qcom_smem_state; 5 8 6 9 struct qcom_smem_state_ops { 7 10 int (*update_bits)(void *, u32, u32); 8 11 }; 12 + 13 + #ifdef CONFIG_QCOM_SMEM_STATE 9 14 10 15 struct qcom_smem_state *qcom_smem_state_get(struct device *dev, const char *con_id, unsigned *bit); 11 16 void qcom_smem_state_put(struct qcom_smem_state *); ··· 19 14 20 15 struct qcom_smem_state *qcom_smem_state_register(struct device_node *of_node, const struct qcom_smem_state_ops *ops, void *data); 21 16 void qcom_smem_state_unregister(struct qcom_smem_state *state); 17 + 18 + #else 19 + 20 + static inline struct qcom_smem_state *qcom_smem_state_get(struct device *dev, 21 + const char *con_id, unsigned *bit) 22 + { 23 + return ERR_PTR(-EINVAL); 24 + } 25 + 26 + static inline void qcom_smem_state_put(struct qcom_smem_state *state) 27 + { 28 + } 29 + 30 + static inline int qcom_smem_state_update_bits(struct qcom_smem_state *state, 31 + u32 mask, u32 value) 32 + { 33 + return -EINVAL; 34 + } 35 + 36 + static inline struct qcom_smem_state *qcom_smem_state_register(struct device_node *of_node, 37 + const struct qcom_smem_state_ops *ops, void *data) 38 + { 39 + return ERR_PTR(-EINVAL); 40 + } 41 + 42 + static inline void qcom_smem_state_unregister(struct qcom_smem_state *state) 43 + { 44 + } 45 + 46 + #endif 22 47 23 48 #endif
+6 -3
net/qrtr/smd.c
··· 21 21 struct qrtr_smd_dev { 22 22 struct qrtr_endpoint ep; 23 23 struct qcom_smd_channel *channel; 24 + struct device *dev; 24 25 }; 25 26 26 27 /* from smd to qrtr */ 27 - static int qcom_smd_qrtr_callback(struct qcom_smd_device *sdev, 28 + static int qcom_smd_qrtr_callback(struct qcom_smd_channel *channel, 28 29 const void *data, size_t len) 29 30 { 30 - struct qrtr_smd_dev *qdev = dev_get_drvdata(&sdev->dev); 31 + struct qrtr_smd_dev *qdev = qcom_smd_get_drvdata(channel); 31 32 int rc; 32 33 33 34 if (!qdev) ··· 36 35 37 36 rc = qrtr_endpoint_post(&qdev->ep, data, len); 38 37 if (rc == -EINVAL) { 39 - dev_err(&sdev->dev, "invalid ipcrouter packet\n"); 38 + dev_err(qdev->dev, "invalid ipcrouter packet\n"); 40 39 /* return 0 to let smd drop the packet */ 41 40 rc = 0; 42 41 } ··· 74 73 return -ENOMEM; 75 74 76 75 qdev->channel = sdev->channel; 76 + qdev->dev = &sdev->dev; 77 77 qdev->ep.xmit = qcom_smd_qrtr_send; 78 78 79 79 rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO); 80 80 if (rc) 81 81 return rc; 82 82 83 + qcom_smd_set_drvdata(sdev->channel, qdev); 83 84 dev_set_drvdata(&sdev->dev, qdev); 84 85 85 86 dev_dbg(&sdev->dev, "Qualcomm SMD QRTR driver probed\n");