summaryrefslogtreecommitdiffstats
path: root/net/qrtr
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2017-03-28 01:26:33 -0400
committerDavid S. Miller <davem@davemloft.net>2017-03-28 20:58:07 -0400
commit5052de8deff5619a9b7071f00084fd0264b58e17 (patch)
tree0e41afc71799e9635d3005b184ae47a5684f428a /net/qrtr
parentdef499c929a72ba11b25e26e26e900ba3d5c2762 (diff)
soc: qcom: smd: Transition client drivers from smd to rpmsg
By moving these client drivers to use RPMSG instead of the direct SMD API we can reuse them ontop of the newly added GLINK wire-protocol support found in the 820 and 835 Qualcomm platforms. As the new (RPMSG-based) and old SMD implementations are mutually exclusive we have to change all client drivers in one commit, to make sure we have a working system before and after this transition. Acked-by: Andy Gross <andy.gross@linaro.org> Acked-by: Kalle Valo <kvalo@codeaurora.org> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/qrtr')
-rw-r--r--net/qrtr/Kconfig2
-rw-r--r--net/qrtr/smd.c42
2 files changed, 21 insertions, 23 deletions
diff --git a/net/qrtr/Kconfig b/net/qrtr/Kconfig
index b83c6807a5ae..326fd97444f5 100644
--- a/net/qrtr/Kconfig
+++ b/net/qrtr/Kconfig
@@ -16,7 +16,7 @@ if QRTR
16 16
17config QRTR_SMD 17config QRTR_SMD
18 tristate "SMD IPC Router channels" 18 tristate "SMD IPC Router channels"
19 depends on QCOM_SMD || (COMPILE_TEST && QCOM_SMD=n) 19 depends on RPMSG || (COMPILE_TEST && RPMSG=n)
20 ---help--- 20 ---help---
21 Say Y here to support SMD based ipcrouter channels. SMD is the 21 Say Y here to support SMD based ipcrouter channels. SMD is the
22 most common transport for IPC Router. 22 most common transport for IPC Router.
diff --git a/net/qrtr/smd.c b/net/qrtr/smd.c
index 0d11132b3370..50615d5efac1 100644
--- a/net/qrtr/smd.c
+++ b/net/qrtr/smd.c
@@ -14,21 +14,21 @@
14 14
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/skbuff.h> 16#include <linux/skbuff.h>
17#include <linux/soc/qcom/smd.h> 17#include <linux/rpmsg.h>
18 18
19#include "qrtr.h" 19#include "qrtr.h"
20 20
21struct qrtr_smd_dev { 21struct qrtr_smd_dev {
22 struct qrtr_endpoint ep; 22 struct qrtr_endpoint ep;
23 struct qcom_smd_channel *channel; 23 struct rpmsg_endpoint *channel;
24 struct device *dev; 24 struct device *dev;
25}; 25};
26 26
27/* from smd to qrtr */ 27/* from smd to qrtr */
28static int qcom_smd_qrtr_callback(struct qcom_smd_channel *channel, 28static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev,
29 const void *data, size_t len) 29 void *data, int len, void *priv, u32 addr)
30{ 30{
31 struct qrtr_smd_dev *qdev = qcom_smd_get_drvdata(channel); 31 struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
32 int rc; 32 int rc;
33 33
34 if (!qdev) 34 if (!qdev)
@@ -54,7 +54,7 @@ static int qcom_smd_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
54 if (rc) 54 if (rc)
55 goto out; 55 goto out;
56 56
57 rc = qcom_smd_send(qdev->channel, skb->data, skb->len); 57 rc = rpmsg_send(qdev->channel, skb->data, skb->len);
58 58
59out: 59out:
60 if (rc) 60 if (rc)
@@ -64,57 +64,55 @@ out:
64 return rc; 64 return rc;
65} 65}
66 66
67static int qcom_smd_qrtr_probe(struct qcom_smd_device *sdev) 67static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev)
68{ 68{
69 struct qrtr_smd_dev *qdev; 69 struct qrtr_smd_dev *qdev;
70 int rc; 70 int rc;
71 71
72 qdev = devm_kzalloc(&sdev->dev, sizeof(*qdev), GFP_KERNEL); 72 qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL);
73 if (!qdev) 73 if (!qdev)
74 return -ENOMEM; 74 return -ENOMEM;
75 75
76 qdev->channel = sdev->channel; 76 qdev->channel = rpdev->ept;
77 qdev->dev = &sdev->dev; 77 qdev->dev = &rpdev->dev;
78 qdev->ep.xmit = qcom_smd_qrtr_send; 78 qdev->ep.xmit = qcom_smd_qrtr_send;
79 79
80 rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO); 80 rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO);
81 if (rc) 81 if (rc)
82 return rc; 82 return rc;
83 83
84 qcom_smd_set_drvdata(sdev->channel, qdev); 84 dev_set_drvdata(&rpdev->dev, qdev);
85 dev_set_drvdata(&sdev->dev, qdev);
86 85
87 dev_dbg(&sdev->dev, "Qualcomm SMD QRTR driver probed\n"); 86 dev_dbg(&rpdev->dev, "Qualcomm SMD QRTR driver probed\n");
88 87
89 return 0; 88 return 0;
90} 89}
91 90
92static void qcom_smd_qrtr_remove(struct qcom_smd_device *sdev) 91static void qcom_smd_qrtr_remove(struct rpmsg_device *rpdev)
93{ 92{
94 struct qrtr_smd_dev *qdev = dev_get_drvdata(&sdev->dev); 93 struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
95 94
96 qrtr_endpoint_unregister(&qdev->ep); 95 qrtr_endpoint_unregister(&qdev->ep);
97 96
98 dev_set_drvdata(&sdev->dev, NULL); 97 dev_set_drvdata(&rpdev->dev, NULL);
99} 98}
100 99
101static const struct qcom_smd_id qcom_smd_qrtr_smd_match[] = { 100static const struct rpmsg_device_id qcom_smd_qrtr_smd_match[] = {
102 { "IPCRTR" }, 101 { "IPCRTR" },
103 {} 102 {}
104}; 103};
105 104
106static struct qcom_smd_driver qcom_smd_qrtr_driver = { 105static struct rpmsg_driver qcom_smd_qrtr_driver = {
107 .probe = qcom_smd_qrtr_probe, 106 .probe = qcom_smd_qrtr_probe,
108 .remove = qcom_smd_qrtr_remove, 107 .remove = qcom_smd_qrtr_remove,
109 .callback = qcom_smd_qrtr_callback, 108 .callback = qcom_smd_qrtr_callback,
110 .smd_match_table = qcom_smd_qrtr_smd_match, 109 .id_table = qcom_smd_qrtr_smd_match,
111 .driver = { 110 .drv = {
112 .name = "qcom_smd_qrtr", 111 .name = "qcom_smd_qrtr",
113 .owner = THIS_MODULE,
114 }, 112 },
115}; 113};
116 114
117module_qcom_smd_driver(qcom_smd_qrtr_driver); 115module_rpmsg_driver(qcom_smd_qrtr_driver);
118 116
119MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver"); 117MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver");
120MODULE_LICENSE("GPL v2"); 118MODULE_LICENSE("GPL v2");