Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 28 additions & 67 deletions drivers/rpmsg/adi_rpmsg.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Analog Device RPMSG driver for SC5XX processors
Expand Down Expand Up @@ -251,13 +251,13 @@
}

static struct virtio_config_ops adi_rpmsg_config_ops = {
.get_features = adi_rpmsg_get_features,
.get_features = adi_rpmsg_get_features,
.finalize_features = adi_rpmsg_finalize_features,
.find_vqs = adi_rpmsg_virtio_find_vqs,
.del_vqs = adi_rproc_virtio_del_vqs,
.reset = adi_virtio_reset,
.set_status = adi_virtio_set_status,
.get_status = adi_virtio_get_status,
.find_vqs = adi_rpmsg_virtio_find_vqs,
.del_vqs = adi_rproc_virtio_del_vqs,
.reset = adi_virtio_reset,
.set_status = adi_virtio_set_status,
.get_status = adi_virtio_get_status,
};

static int adi_rpmsg_parse_resource_table(struct adi_rpmsg_channel *rpchan)
Expand All @@ -267,14 +267,11 @@
struct fw_rsc_hdr *hdr;
int i, offset;

if (strcmp(adi_rsc_table->adi_table_hdr.tag, ADI_RESOURCE_TABLE_TAG)) {
dev_err(dev, "Corrupted resource table\n");
return -ENODEV;
}
if (adi_rsc_table->adi_table_hdr.version != ADI_RESOURCE_TABLE_VERSION) {
dev_err(dev, "Invalid resource table version\n");
return -ENODEV;
}
if (strcmp(adi_rsc_table->adi_table_hdr.tag, ADI_RESOURCE_TABLE_TAG))
return dev_err_probe(dev, -ENODEV, "Corrupted resource table\n");

if (adi_rsc_table->adi_table_hdr.version != ADI_RESOURCE_TABLE_VERSION)
return dev_err_probe(dev, -ENODEV, "Invalid resource table version\n");

/* Look for a VDEV entry */
for (i = 0; i < adi_rsc_table->rsc_table.num; i++) {
Expand Down Expand Up @@ -321,8 +318,6 @@
void *va;
int ret, size, num;

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

rpchan = devm_kzalloc(dev, sizeof(struct adi_rpmsg_channel), GFP_KERNEL);
if (!rpchan)
return -ENOMEM;
Expand All @@ -331,16 +326,12 @@
if (IS_ERR(adi_tru))
return PTR_ERR(adi_tru);

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

adi_rcu = get_adi_rcu_from_node(dev);
if (IS_ERR(adi_rcu)) {
ret = PTR_ERR(adi_rcu);
goto free_adi_tru;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

platform_set_drvdata(pdev, rpchan);
rpchan->pdev = pdev;
rpchan->dev = dev;
Expand All @@ -349,82 +340,60 @@
rpchan->rcu = adi_rcu;
rpchan->rpmsg_state = ADI_RP_RPMSG_WAITING;

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

ret = of_property_read_u32(dev_node, "core-id", &rpchan->core_id);
if (ret) {
dev_err(dev, "Unable to get core-id property\n");
dev_err_probe(dev, ret, "Unable to get core-id property\n");
goto free_adi_rcu;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

rpchan->icc_irq = platform_get_irq(pdev, 0);
if (rpchan->icc_irq <= 0) {
dev_err(dev, "No ICC IRQ specified\n");
ret = -ENOENT;
ret = rpchan->icc_irq;
goto free_adi_rcu;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

//res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

rpchan->icc_irq_flags = IRQF_PERCPU | IRQF_SHARED | IRQF_ONESHOT;

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

ret = devm_request_threaded_irq(rpchan->dev, rpchan->icc_irq, NULL,
adi_rpmsg_virtio_irq_threaded_handler, rpchan->icc_irq_flags,
"ICC virtio IRQ", rpchan);
if (ret) {
dev_err(rpchan->dev, "Fail to request ICC IRQ\n");
ret = -ENOENT;
ret = dev_err_probe(rpchan->dev, -ENOENT, "Fail to request ICC IRQ\n");
goto free_adi_rcu;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

if (of_property_read_bool(dev_node, "adi,check-idle")) {
ret = adi_rcu_is_core_idle(rpchan->rcu, rpchan->core_id);
if (ret < 0) {
dev_err(dev, "Invalid core-id\n");
dev_err_probe(dev, ret, "Invalid core-id\n");
goto free_adi_rcu;
} else if (ret > 0) {
dev_err(dev, "Error: Core%d idle\n", rpchan->core_id);
ret = -ENODEV;
ret = dev_err_probe(dev, -ENODEV, "Error: Core%d idle\n", rpchan->core_id);
goto free_adi_rcu;
}
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

/* Get ADI resource table address */
node = of_parse_phandle(dev_node, "adi,rsc-table", 0);
if (!node) {
dev_err(&pdev->dev, "Can't find adi,rsc-table\n");
ret = -EINVAL;
ret = dev_err_probe(&pdev->dev, -EINVAL, "Can't find adi,rsc-table\n");
goto free_adi_rcu;
}
rmem = of_reserved_mem_lookup(node);
of_node_put(node);
if (!rmem) {
dev_err(&pdev->dev, "Translating adi,rsc-table failed\n");
ret = -ENOMEM;
ret = dev_err_probe(&pdev->dev, -ENOENT, "Translating adi,rsc-table failed\n");
goto free_adi_rcu;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

rpchan->adi_rsc_table = devm_ioremap_wc(dev, rmem->base, rmem->size);
if (IS_ERR(rpchan->adi_rsc_table)) {
dev_err(dev, "Can't map adi,rsc-table\n");
ret = PTR_ERR(rpchan->adi_rsc_table);
ret = dev_err_probe(dev, PTR_ERR(rpchan->adi_rsc_table), "Can't map adi,rsc-table\n");

Check warning on line 393 in drivers/rpmsg/adi_rpmsg.c

View workflow job for this annotation

GitHub Actions / checks / checks

checkpatch: line length of 102 exceeds 100 columns + ret = dev_err_probe(dev, PTR_ERR(rpchan->adi_rsc_table), "Can't map adi,rsc-table\n");
goto free_adi_rcu;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

ret = adi_rpmsg_parse_resource_table(rpchan);
if (ret)
goto free_adi_rcu;
Expand All @@ -436,14 +405,12 @@
rmem = of_reserved_mem_lookup(node);
of_node_put(node);
if (!rmem) {
dev_err(dev, "Failed to acquire vdev-vring\n");
ret = -EINVAL;
ret = dev_err_probe(dev, -EINVAL, "Failed to acquire vdev-vring\n");
goto free_adi_rcu;
}

if (rmem->size < 0x4000) {
dev_err(dev, "Insufficient space in vdev-vring, min space req is 16kB\n");
ret = -EINVAL;
ret = dev_err_probe(dev, -EINVAL, "Insufficient space in vdev-vring, min space req is 16kB\n");

Check warning on line 413 in drivers/rpmsg/adi_rpmsg.c

View workflow job for this annotation

GitHub Actions / checks / checks

checkpatch: line length of 119 exceeds 100 columns + ret = dev_err_probe(dev, -EINVAL, "Insufficient space in vdev-vring, min space req is 16kB\n");
goto free_adi_rcu;
}

Expand All @@ -463,13 +430,10 @@

va = devm_ioremap_wc(dev, rmem->base, rmem->size);
if (!(va)) {
dev_err(dev, "Unable to map vdev-vring\n");
ret = -ENOMEM;
ret = dev_err_probe(dev, -ENOMEM, "Unable to map vdev-vring\n");
goto free_adi_rcu;
}

dev_info(dev, "vrings in vdev-vring reserved-memory.\n");

rpchan->vring[0].num = num;
rpchan->vring[1].num = num;

Expand Down Expand Up @@ -503,8 +467,7 @@
va = dma_alloc_coherent(dev, rpchan->vring[0].size + rpchan->vring[1].size,
&dma, GFP_KERNEL);
if (!(va)) {
dev_err(dev, "Unable to map vdev-vring\n");
ret = -ENOMEM;
ret = dev_err_probe(dev, -ENOMEM, "Unable to map vdev-vring\n");
goto free_adi_rcu;
}

Expand All @@ -514,8 +477,6 @@
rpchan->vring[1].va = rpchan->vring[0].va + rpchan->vring[0].size;
}

printk(KERN_ERR"adi rpmsg probe %d \n", __LINE__);

/* Update resource table */
rpchan->rsc_vring[0]->da = rpchan->vring[0].da;
rpchan->rsc_vring[0]->align = rpchan->vring[0].align;
Expand Down Expand Up @@ -544,7 +505,7 @@

ret = register_virtio_device(&rpchan->vdev);
if (ret) {
dev_err(dev, "failed to register vdev\n");
dev_err_probe(dev, ret, "failed to register vdev\n");
goto free_adi_rcu;
}

Expand Down Expand Up @@ -583,10 +544,10 @@

static struct platform_driver adi_rpmsg_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "adi-rpmsg",
.of_match_table = adi_rpmsg_dt_ids,
},
.owner = THIS_MODULE,
.name = "adi-rpmsg",
.of_match_table = adi_rpmsg_dt_ids,
},
.probe = adi_rpmsg_probe,
.remove = adi_rpmsg_remove,
};
Expand Down
Loading