rpmsg: glink: Split glink probe

Split rmp probe function and add glink_rpm_unregister to
reuse the code from glink native driver.

Change-Id: I9f60d0854f66b2e474a6bedcb7ec3c1e7cc20994
Signed-off-by: Pranav Mahesh Phansalkar <quic_pphansal@quicinc.com>
This commit is contained in:
Pranav Mahesh Phansalkar 2023-08-21 19:51:12 +05:30
parent dc81996449
commit fd56696248

View File

@ -254,7 +254,13 @@ static int glink_rpm_parse_toc(struct device *dev,
return -EINVAL;
}
static int glink_rpm_probe(struct platform_device *pdev)
static void glink_rpm_release(struct device *dev)
{
kfree(dev);
}
struct qcom_glink *glink_rpm_register(struct device *parent,
struct device_node *node)
{
struct qcom_glink *glink;
struct glink_rpm_pipe *rx_pipe;
@ -262,30 +268,50 @@ static int glink_rpm_probe(struct platform_device *pdev)
struct device_node *np;
void __iomem *msg_ram;
size_t msg_ram_size;
struct device *dev = &pdev->dev;
struct device *dev;
struct resource r;
int ret;
rx_pipe = devm_kzalloc(&pdev->dev, sizeof(*rx_pipe), GFP_KERNEL);
tx_pipe = devm_kzalloc(&pdev->dev, sizeof(*tx_pipe), GFP_KERNEL);
if (!rx_pipe || !tx_pipe)
return -ENOMEM;
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return ERR_PTR(-ENOMEM);
dev->parent = parent;
dev->of_node = node;
dev->release = glink_rpm_release;
dev_set_name(dev, "%s:%pKOFn", dev_name(parent->parent), node);
ret = device_register(dev);
if (ret) {
pr_err("failed to register glink edge\n");
put_device(dev);
return ERR_PTR(ret);
}
rx_pipe = devm_kzalloc(dev, sizeof(*rx_pipe), GFP_KERNEL);
tx_pipe = devm_kzalloc(dev, sizeof(*tx_pipe), GFP_KERNEL);
if (!rx_pipe || !tx_pipe) {
ret = -ENOMEM;
goto err_put_dev;
}
np = of_parse_phandle(dev->of_node, "qcom,rpm-msg-ram", 0);
ret = of_address_to_resource(np, 0, &r);
of_node_put(np);
if (ret)
return ret;
goto err_put_dev;
msg_ram = devm_ioremap(dev, r.start, resource_size(&r));
msg_ram_size = resource_size(&r);
if (!msg_ram)
return -ENOMEM;
if (!msg_ram) {
ret = -ENOMEM;
goto err_put_dev;
}
ret = glink_rpm_parse_toc(dev, msg_ram, msg_ram_size,
rx_pipe, tx_pipe);
if (ret)
return ret;
goto err_put_dev;
/* Pipe specific accessors */
rx_pipe->native.avail = glink_rpm_rx_avail;
@ -297,26 +323,57 @@ static int glink_rpm_probe(struct platform_device *pdev)
writel(0, tx_pipe->head);
writel(0, rx_pipe->tail);
glink = qcom_glink_native_probe(&pdev->dev,
glink = qcom_glink_native_probe(dev,
0,
&rx_pipe->native,
&tx_pipe->native,
true);
if (IS_ERR(glink))
return PTR_ERR(glink);
if (IS_ERR(glink)) {
ret = PTR_ERR(glink);
goto err_put_dev;
}
return glink;
err_put_dev:
device_unregister(dev);
return ERR_PTR(ret);
}
static int glink_rpm_probe(struct platform_device *pdev)
{
struct qcom_glink *glink;
int ret;
glink = glink_rpm_register(&pdev->dev, pdev->dev.of_node);
if (IS_ERR(glink)) {
ret = PTR_ERR(glink);
return ret;
}
ret = qcom_glink_native_start(glink);
if (ret)
pr_err("Failed to register glink as chrdev\n");
platform_set_drvdata(pdev, glink);
ret = qcom_glink_native_start(glink);
return 0;
}
return ret;
static int glink_rpm_unregister(struct device *dev)
{
struct qcom_glink *glink = dev_get_drvdata(dev);
qcom_glink_native_remove(glink);
qcom_glink_native_unregister(glink);
return 0;
}
static int glink_rpm_remove(struct platform_device *pdev)
{
struct qcom_glink *glink = platform_get_drvdata(pdev);
qcom_glink_native_remove(glink);
glink_rpm_unregister(&pdev->dev);
return 0;
}