|
@@ -14,10 +14,10 @@
|
|
#include <linux/firmware.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
-#include <linux/soc/qcom/smd.h>
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
+#include <linux/rpmsg.h>
|
|
#include <linux/soc/qcom/wcnss_ctrl.h>
|
|
#include <linux/soc/qcom/wcnss_ctrl.h>
|
|
|
|
|
|
#define WCNSS_REQUEST_TIMEOUT (5 * HZ)
|
|
#define WCNSS_REQUEST_TIMEOUT (5 * HZ)
|
|
@@ -40,7 +40,7 @@
|
|
*/
|
|
*/
|
|
struct wcnss_ctrl {
|
|
struct wcnss_ctrl {
|
|
struct device *dev;
|
|
struct device *dev;
|
|
- struct qcom_smd_channel *channel;
|
|
|
|
|
|
+ struct rpmsg_endpoint *channel;
|
|
|
|
|
|
struct completion ack;
|
|
struct completion ack;
|
|
struct completion cbc;
|
|
struct completion cbc;
|
|
@@ -122,11 +122,13 @@ struct wcnss_download_nv_resp {
|
|
*
|
|
*
|
|
* Handles any incoming packets from the remote WCNSS_CTRL service.
|
|
* Handles any incoming packets from the remote WCNSS_CTRL service.
|
|
*/
|
|
*/
|
|
-static int wcnss_ctrl_smd_callback(struct qcom_smd_channel *channel,
|
|
|
|
- const void *data,
|
|
|
|
- size_t count)
|
|
|
|
|
|
+static int wcnss_ctrl_smd_callback(struct rpmsg_device *rpdev,
|
|
|
|
+ void *data,
|
|
|
|
+ int count,
|
|
|
|
+ void *priv,
|
|
|
|
+ u32 addr)
|
|
{
|
|
{
|
|
- struct wcnss_ctrl *wcnss = qcom_smd_get_drvdata(channel);
|
|
|
|
|
|
+ struct wcnss_ctrl *wcnss = dev_get_drvdata(&rpdev->dev);
|
|
const struct wcnss_download_nv_resp *nvresp;
|
|
const struct wcnss_download_nv_resp *nvresp;
|
|
const struct wcnss_version_resp *version;
|
|
const struct wcnss_version_resp *version;
|
|
const struct wcnss_msg_hdr *hdr = data;
|
|
const struct wcnss_msg_hdr *hdr = data;
|
|
@@ -180,7 +182,7 @@ static int wcnss_request_version(struct wcnss_ctrl *wcnss)
|
|
|
|
|
|
msg.type = WCNSS_VERSION_REQ;
|
|
msg.type = WCNSS_VERSION_REQ;
|
|
msg.len = sizeof(msg);
|
|
msg.len = sizeof(msg);
|
|
- ret = qcom_smd_send(wcnss->channel, &msg, sizeof(msg));
|
|
|
|
|
|
+ ret = rpmsg_send(wcnss->channel, &msg, sizeof(msg));
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
@@ -238,7 +240,7 @@ static int wcnss_download_nv(struct wcnss_ctrl *wcnss, bool *expect_cbc)
|
|
|
|
|
|
memcpy(req->fragment, data, req->frag_size);
|
|
memcpy(req->fragment, data, req->frag_size);
|
|
|
|
|
|
- ret = qcom_smd_send(wcnss->channel, req, req->hdr.len);
|
|
|
|
|
|
+ ret = rpmsg_send(wcnss->channel, req, req->hdr.len);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
dev_err(wcnss->dev, "failed to send smd packet\n");
|
|
dev_err(wcnss->dev, "failed to send smd packet\n");
|
|
goto release_fw;
|
|
goto release_fw;
|
|
@@ -274,11 +276,16 @@ free_req:
|
|
* @name: SMD channel name
|
|
* @name: SMD channel name
|
|
* @cb: callback to handle incoming data on the channel
|
|
* @cb: callback to handle incoming data on the channel
|
|
*/
|
|
*/
|
|
-struct qcom_smd_channel *qcom_wcnss_open_channel(void *wcnss, const char *name, qcom_smd_cb_t cb)
|
|
|
|
|
|
+struct rpmsg_endpoint *qcom_wcnss_open_channel(void *wcnss, const char *name, rpmsg_rx_cb_t cb, void *priv)
|
|
{
|
|
{
|
|
|
|
+ struct rpmsg_channel_info chinfo;
|
|
struct wcnss_ctrl *_wcnss = wcnss;
|
|
struct wcnss_ctrl *_wcnss = wcnss;
|
|
|
|
|
|
- return qcom_smd_open_channel(_wcnss->channel, name, cb);
|
|
|
|
|
|
+ strncpy(chinfo.name, name, sizeof(chinfo.name));
|
|
|
|
+ chinfo.src = RPMSG_ADDR_ANY;
|
|
|
|
+ chinfo.dst = RPMSG_ADDR_ANY;
|
|
|
|
+
|
|
|
|
+ return rpmsg_create_ept(_wcnss->channel->rpdev, cb, priv, chinfo);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(qcom_wcnss_open_channel);
|
|
EXPORT_SYMBOL(qcom_wcnss_open_channel);
|
|
|
|
|
|
@@ -306,35 +313,34 @@ static void wcnss_async_probe(struct work_struct *work)
|
|
of_platform_populate(wcnss->dev->of_node, NULL, NULL, wcnss->dev);
|
|
of_platform_populate(wcnss->dev->of_node, NULL, NULL, wcnss->dev);
|
|
}
|
|
}
|
|
|
|
|
|
-static int wcnss_ctrl_probe(struct qcom_smd_device *sdev)
|
|
|
|
|
|
+static int wcnss_ctrl_probe(struct rpmsg_device *rpdev)
|
|
{
|
|
{
|
|
struct wcnss_ctrl *wcnss;
|
|
struct wcnss_ctrl *wcnss;
|
|
|
|
|
|
- wcnss = devm_kzalloc(&sdev->dev, sizeof(*wcnss), GFP_KERNEL);
|
|
|
|
|
|
+ wcnss = devm_kzalloc(&rpdev->dev, sizeof(*wcnss), GFP_KERNEL);
|
|
if (!wcnss)
|
|
if (!wcnss)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
- wcnss->dev = &sdev->dev;
|
|
|
|
- wcnss->channel = sdev->channel;
|
|
|
|
|
|
+ wcnss->dev = &rpdev->dev;
|
|
|
|
+ wcnss->channel = rpdev->ept;
|
|
|
|
|
|
init_completion(&wcnss->ack);
|
|
init_completion(&wcnss->ack);
|
|
init_completion(&wcnss->cbc);
|
|
init_completion(&wcnss->cbc);
|
|
INIT_WORK(&wcnss->probe_work, wcnss_async_probe);
|
|
INIT_WORK(&wcnss->probe_work, wcnss_async_probe);
|
|
|
|
|
|
- qcom_smd_set_drvdata(sdev->channel, wcnss);
|
|
|
|
- dev_set_drvdata(&sdev->dev, wcnss);
|
|
|
|
|
|
+ dev_set_drvdata(&rpdev->dev, wcnss);
|
|
|
|
|
|
schedule_work(&wcnss->probe_work);
|
|
schedule_work(&wcnss->probe_work);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static void wcnss_ctrl_remove(struct qcom_smd_device *sdev)
|
|
|
|
|
|
+static void wcnss_ctrl_remove(struct rpmsg_device *rpdev)
|
|
{
|
|
{
|
|
- struct wcnss_ctrl *wcnss = qcom_smd_get_drvdata(sdev->channel);
|
|
|
|
|
|
+ struct wcnss_ctrl *wcnss = dev_get_drvdata(&rpdev->dev);
|
|
|
|
|
|
cancel_work_sync(&wcnss->probe_work);
|
|
cancel_work_sync(&wcnss->probe_work);
|
|
- of_platform_depopulate(&sdev->dev);
|
|
|
|
|
|
+ of_platform_depopulate(&rpdev->dev);
|
|
}
|
|
}
|
|
|
|
|
|
static const struct of_device_id wcnss_ctrl_of_match[] = {
|
|
static const struct of_device_id wcnss_ctrl_of_match[] = {
|
|
@@ -342,18 +348,18 @@ static const struct of_device_id wcnss_ctrl_of_match[] = {
|
|
{}
|
|
{}
|
|
};
|
|
};
|
|
|
|
|
|
-static struct qcom_smd_driver wcnss_ctrl_driver = {
|
|
|
|
|
|
+static struct rpmsg_driver wcnss_ctrl_driver = {
|
|
.probe = wcnss_ctrl_probe,
|
|
.probe = wcnss_ctrl_probe,
|
|
.remove = wcnss_ctrl_remove,
|
|
.remove = wcnss_ctrl_remove,
|
|
.callback = wcnss_ctrl_smd_callback,
|
|
.callback = wcnss_ctrl_smd_callback,
|
|
- .driver = {
|
|
|
|
|
|
+ .drv = {
|
|
.name = "qcom_wcnss_ctrl",
|
|
.name = "qcom_wcnss_ctrl",
|
|
.owner = THIS_MODULE,
|
|
.owner = THIS_MODULE,
|
|
.of_match_table = wcnss_ctrl_of_match,
|
|
.of_match_table = wcnss_ctrl_of_match,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
-module_qcom_smd_driver(wcnss_ctrl_driver);
|
|
|
|
|
|
+module_rpmsg_driver(wcnss_ctrl_driver);
|
|
|
|
|
|
MODULE_DESCRIPTION("Qualcomm WCNSS control driver");
|
|
MODULE_DESCRIPTION("Qualcomm WCNSS control driver");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_LICENSE("GPL v2");
|