dmaengine: qcom: Drop hidma DT support
The DT support in hidma has been broken since commit 37fa4905d2
("dmaengine: qcom_hidma: simplify DT resource parsing") in 2018. The
issue is the of_address_to_resource() calls bail out on success rather
than failure. This driver is for a defunct QCom server platform where
DT use was limited to start with. As it seems no one has noticed the
breakage, just remove the DT support altogether.
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://lore.kernel.org/r/20240423161413.481670-1-robh@kernel.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
98f2233a5c
commit
d100ffe504
@ -50,7 +50,6 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/of_dma.h>
|
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
@ -947,22 +946,12 @@ static const struct acpi_device_id hidma_acpi_ids[] = {
|
|||||||
MODULE_DEVICE_TABLE(acpi, hidma_acpi_ids);
|
MODULE_DEVICE_TABLE(acpi, hidma_acpi_ids);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct of_device_id hidma_match[] = {
|
|
||||||
{.compatible = "qcom,hidma-1.0",},
|
|
||||||
{.compatible = "qcom,hidma-1.1", .data = (void *)(HIDMA_MSI_CAP),},
|
|
||||||
{.compatible = "qcom,hidma-1.2",
|
|
||||||
.data = (void *)(HIDMA_MSI_CAP | HIDMA_IDENTITY_CAP),},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
MODULE_DEVICE_TABLE(of, hidma_match);
|
|
||||||
|
|
||||||
static struct platform_driver hidma_driver = {
|
static struct platform_driver hidma_driver = {
|
||||||
.probe = hidma_probe,
|
.probe = hidma_probe,
|
||||||
.remove_new = hidma_remove,
|
.remove_new = hidma_remove,
|
||||||
.shutdown = hidma_shutdown,
|
.shutdown = hidma_shutdown,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "hidma",
|
.name = "hidma",
|
||||||
.of_match_table = hidma_match,
|
|
||||||
.acpi_match_table = ACPI_PTR(hidma_acpi_ids),
|
.acpi_match_table = ACPI_PTR(hidma_acpi_ids),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -7,12 +7,7 @@
|
|||||||
|
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/of.h>
|
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/of_irq.h>
|
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
@ -327,115 +322,13 @@ static const struct acpi_device_id hidma_mgmt_acpi_ids[] = {
|
|||||||
MODULE_DEVICE_TABLE(acpi, hidma_mgmt_acpi_ids);
|
MODULE_DEVICE_TABLE(acpi, hidma_mgmt_acpi_ids);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct of_device_id hidma_mgmt_match[] = {
|
|
||||||
{.compatible = "qcom,hidma-mgmt-1.0",},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
MODULE_DEVICE_TABLE(of, hidma_mgmt_match);
|
|
||||||
|
|
||||||
static struct platform_driver hidma_mgmt_driver = {
|
static struct platform_driver hidma_mgmt_driver = {
|
||||||
.probe = hidma_mgmt_probe,
|
.probe = hidma_mgmt_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "hidma-mgmt",
|
.name = "hidma-mgmt",
|
||||||
.of_match_table = hidma_mgmt_match,
|
|
||||||
.acpi_match_table = ACPI_PTR(hidma_mgmt_acpi_ids),
|
.acpi_match_table = ACPI_PTR(hidma_mgmt_acpi_ids),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ)
|
module_platform_driver(hidma_mgmt_driver);
|
||||||
static int object_counter;
|
|
||||||
|
|
||||||
static int __init hidma_mgmt_of_populate_channels(struct device_node *np)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev_parent = of_find_device_by_node(np);
|
|
||||||
struct platform_device_info pdevinfo;
|
|
||||||
struct device_node *child;
|
|
||||||
struct resource *res;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
/* allocate a resource array */
|
|
||||||
res = kcalloc(3, sizeof(*res), GFP_KERNEL);
|
|
||||||
if (!res)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
for_each_available_child_of_node(np, child) {
|
|
||||||
struct platform_device *new_pdev;
|
|
||||||
|
|
||||||
ret = of_address_to_resource(child, 0, &res[0]);
|
|
||||||
if (!ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = of_address_to_resource(child, 1, &res[1]);
|
|
||||||
if (!ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = of_irq_to_resource(child, 0, &res[2]);
|
|
||||||
if (ret <= 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
memset(&pdevinfo, 0, sizeof(pdevinfo));
|
|
||||||
pdevinfo.fwnode = &child->fwnode;
|
|
||||||
pdevinfo.parent = pdev_parent ? &pdev_parent->dev : NULL;
|
|
||||||
pdevinfo.name = child->name;
|
|
||||||
pdevinfo.id = object_counter++;
|
|
||||||
pdevinfo.res = res;
|
|
||||||
pdevinfo.num_res = 3;
|
|
||||||
pdevinfo.data = NULL;
|
|
||||||
pdevinfo.size_data = 0;
|
|
||||||
pdevinfo.dma_mask = DMA_BIT_MASK(64);
|
|
||||||
new_pdev = platform_device_register_full(&pdevinfo);
|
|
||||||
if (IS_ERR(new_pdev)) {
|
|
||||||
ret = PTR_ERR(new_pdev);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
new_pdev->dev.of_node = child;
|
|
||||||
of_dma_configure(&new_pdev->dev, child, true);
|
|
||||||
/*
|
|
||||||
* It is assumed that calling of_msi_configure is safe on
|
|
||||||
* platforms with or without MSI support.
|
|
||||||
*/
|
|
||||||
of_msi_configure(&new_pdev->dev, child);
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(res);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
out:
|
|
||||||
of_node_put(child);
|
|
||||||
kfree(res);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int __init hidma_mgmt_init(void)
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ)
|
|
||||||
struct device_node *child;
|
|
||||||
|
|
||||||
for_each_matching_node(child, hidma_mgmt_match) {
|
|
||||||
/* device tree based firmware here */
|
|
||||||
hidma_mgmt_of_populate_channels(child);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* We do not check for return value here, as it is assumed that
|
|
||||||
* platform_driver_register must not fail. The reason for this is that
|
|
||||||
* the (potential) hidma_mgmt_of_populate_channels calls above are not
|
|
||||||
* cleaned up if it does fail, and to do this work is quite
|
|
||||||
* complicated. In particular, various calls of of_address_to_resource,
|
|
||||||
* of_irq_to_resource, platform_device_register_full, of_dma_configure,
|
|
||||||
* and of_msi_configure which then call other functions and so on, must
|
|
||||||
* be cleaned up - this is not a trivial exercise.
|
|
||||||
*
|
|
||||||
* Currently, this module is not intended to be unloaded, and there is
|
|
||||||
* no module_exit function defined which does the needed cleanup. For
|
|
||||||
* this reason, we have to assume success here.
|
|
||||||
*/
|
|
||||||
platform_driver_register(&hidma_mgmt_driver);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
module_init(hidma_mgmt_init);
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
Loading…
Reference in New Issue
Block a user