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:
parent
dc81996449
commit
fd56696248
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user