#define dev_fmt(fmt) "tegra241_cmdqv: " fmt
-#include <linux/acpi.h>
#include <linux/debugfs.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/iommu.h>
#include <linux/iommufd.h>
#include <linux/iopoll.h>
+#include <linux/platform_device.h>
#include <uapi/linux/iommufd.h>
-#include <acpi/acpixf.h>
-
#include "arm-smmu-v3.h"
/* CMDQV register page base and size defines */
/* Probe Functions */
-static int tegra241_cmdqv_acpi_is_memory(struct acpi_resource *res, void *data)
-{
- struct resource_win win;
-
- return !acpi_dev_resource_address_space(res, &win);
-}
-
-static int tegra241_cmdqv_acpi_get_irqs(struct acpi_resource *ares, void *data)
-{
- struct resource r;
- int *irq = data;
-
- if (*irq <= 0 && acpi_dev_resource_interrupt(ares, 0, &r))
- *irq = r.start;
- return 1; /* No need to add resource to the list */
-}
-
-static struct resource *
-tegra241_cmdqv_find_acpi_resource(struct device *dev, int *irq)
-{
- struct acpi_device *adev = to_acpi_device(dev);
- struct list_head resource_list;
- struct resource_entry *rentry;
- struct resource *res = NULL;
- int ret;
-
- INIT_LIST_HEAD(&resource_list);
- ret = acpi_dev_get_resources(adev, &resource_list,
- tegra241_cmdqv_acpi_is_memory, NULL);
- if (ret < 0) {
- dev_err(dev, "failed to get memory resource: %d\n", ret);
- return NULL;
- }
-
- rentry = list_first_entry_or_null(&resource_list,
- struct resource_entry, node);
- if (!rentry) {
- dev_err(dev, "failed to get memory resource entry\n");
- goto free_list;
- }
-
- /* Caller must free the res */
- res = kzalloc(sizeof(*res), GFP_KERNEL);
- if (!res)
- goto free_list;
-
- *res = *rentry->res;
-
- acpi_dev_free_resource_list(&resource_list);
-
- INIT_LIST_HEAD(&resource_list);
-
- if (irq)
- ret = acpi_dev_get_resources(adev, &resource_list,
- tegra241_cmdqv_acpi_get_irqs, irq);
- if (ret < 0 || !irq || *irq <= 0)
- dev_warn(dev, "no interrupt. errors will not be reported\n");
-
-free_list:
- acpi_dev_free_resource_list(&resource_list);
- return res;
-}
-
static int tegra241_cmdqv_init_structures(struct arm_smmu_device *smmu)
{
struct tegra241_cmdqv *cmdqv =
struct arm_smmu_device *tegra241_cmdqv_probe(struct arm_smmu_device *smmu)
{
+ struct platform_device *pdev = to_platform_device(smmu->impl_dev);
struct arm_smmu_device *new_smmu;
- struct resource *res = NULL;
+ struct resource *res;
int irq;
- if (!smmu->dev->of_node)
- res = tegra241_cmdqv_find_acpi_resource(smmu->impl_dev, &irq);
- if (!res)
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "no memory resource found for CMDQV\n");
goto out_fallback;
+ }
- new_smmu = __tegra241_cmdqv_probe(smmu, res, irq);
- kfree(res);
+ irq = platform_get_irq_optional(pdev, 0);
+ if (irq <= 0)
+ dev_warn(&pdev->dev,
+ "no interrupt. errors will not be reported\n");
+ new_smmu = __tegra241_cmdqv_probe(smmu, res, irq);
if (new_smmu)
return new_smmu;