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>
Tento commit je obsažen v:
Bjorn Andersson
2017-03-27 22:26:33 -07:00
odevzdal David S. Miller
rodič def499c929
revize 5052de8def
13 změnil soubory, kde provedl 110 přidání a 104 odebrání

Zobrazit soubor

@@ -16,7 +16,7 @@ if QRTR
config QRTR_SMD
tristate "SMD IPC Router channels"
depends on QCOM_SMD || (COMPILE_TEST && QCOM_SMD=n)
depends on RPMSG || (COMPILE_TEST && RPMSG=n)
---help---
Say Y here to support SMD based ipcrouter channels. SMD is the
most common transport for IPC Router.

Zobrazit soubor

@@ -14,21 +14,21 @@
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/soc/qcom/smd.h>
#include <linux/rpmsg.h>
#include "qrtr.h"
struct qrtr_smd_dev {
struct qrtr_endpoint ep;
struct qcom_smd_channel *channel;
struct rpmsg_endpoint *channel;
struct device *dev;
};
/* from smd to qrtr */
static int qcom_smd_qrtr_callback(struct qcom_smd_channel *channel,
const void *data, size_t len)
static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev,
void *data, int len, void *priv, u32 addr)
{
struct qrtr_smd_dev *qdev = qcom_smd_get_drvdata(channel);
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
int rc;
if (!qdev)
@@ -54,7 +54,7 @@ static int qcom_smd_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
if (rc)
goto out;
rc = qcom_smd_send(qdev->channel, skb->data, skb->len);
rc = rpmsg_send(qdev->channel, skb->data, skb->len);
out:
if (rc)
@@ -64,57 +64,55 @@ out:
return rc;
}
static int qcom_smd_qrtr_probe(struct qcom_smd_device *sdev)
static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev)
{
struct qrtr_smd_dev *qdev;
int rc;
qdev = devm_kzalloc(&sdev->dev, sizeof(*qdev), GFP_KERNEL);
qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL);
if (!qdev)
return -ENOMEM;
qdev->channel = sdev->channel;
qdev->dev = &sdev->dev;
qdev->channel = rpdev->ept;
qdev->dev = &rpdev->dev;
qdev->ep.xmit = qcom_smd_qrtr_send;
rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO);
if (rc)
return rc;
qcom_smd_set_drvdata(sdev->channel, qdev);
dev_set_drvdata(&sdev->dev, qdev);
dev_set_drvdata(&rpdev->dev, qdev);
dev_dbg(&sdev->dev, "Qualcomm SMD QRTR driver probed\n");
dev_dbg(&rpdev->dev, "Qualcomm SMD QRTR driver probed\n");
return 0;
}
static void qcom_smd_qrtr_remove(struct qcom_smd_device *sdev)
static void qcom_smd_qrtr_remove(struct rpmsg_device *rpdev)
{
struct qrtr_smd_dev *qdev = dev_get_drvdata(&sdev->dev);
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
qrtr_endpoint_unregister(&qdev->ep);
dev_set_drvdata(&sdev->dev, NULL);
dev_set_drvdata(&rpdev->dev, NULL);
}
static const struct qcom_smd_id qcom_smd_qrtr_smd_match[] = {
static const struct rpmsg_device_id qcom_smd_qrtr_smd_match[] = {
{ "IPCRTR" },
{}
};
static struct qcom_smd_driver qcom_smd_qrtr_driver = {
static struct rpmsg_driver qcom_smd_qrtr_driver = {
.probe = qcom_smd_qrtr_probe,
.remove = qcom_smd_qrtr_remove,
.callback = qcom_smd_qrtr_callback,
.smd_match_table = qcom_smd_qrtr_smd_match,
.driver = {
.id_table = qcom_smd_qrtr_smd_match,
.drv = {
.name = "qcom_smd_qrtr",
.owner = THIS_MODULE,
},
};
module_qcom_smd_driver(qcom_smd_qrtr_driver);
module_rpmsg_driver(qcom_smd_qrtr_driver);
MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver");
MODULE_LICENSE("GPL v2");