Commit 941a802d authored by Will Deacon's avatar Will Deacon

iommu/arm-smmu: Use drvdata instead of maintaining smmu_devices list

Rather than keep a private list of struct arm_smmu_device and searching
this whenever we need to look up the correct SMMU instance, instead use
the drvdata field in the struct device to take care of the mapping for
us.
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 25cb62b7
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -568,7 +569,6 @@ struct arm_smmu_device { ...@@ -568,7 +569,6 @@ struct arm_smmu_device {
unsigned int sid_bits; unsigned int sid_bits;
struct arm_smmu_strtab_cfg strtab_cfg; struct arm_smmu_strtab_cfg strtab_cfg;
struct list_head list;
}; };
/* SMMU private data for an IOMMU group */ /* SMMU private data for an IOMMU group */
...@@ -603,10 +603,6 @@ struct arm_smmu_domain { ...@@ -603,10 +603,6 @@ struct arm_smmu_domain {
struct iommu_domain domain; struct iommu_domain domain;
}; };
/* Our list of SMMU instances */
static DEFINE_SPINLOCK(arm_smmu_devices_lock);
static LIST_HEAD(arm_smmu_devices);
struct arm_smmu_option_prop { struct arm_smmu_option_prop {
u32 opt; u32 opt;
const char *prop; const char *prop;
...@@ -1722,7 +1718,8 @@ static void __arm_smmu_release_pci_iommudata(void *data) ...@@ -1722,7 +1718,8 @@ static void __arm_smmu_release_pci_iommudata(void *data)
static struct arm_smmu_device *arm_smmu_get_for_pci_dev(struct pci_dev *pdev) static struct arm_smmu_device *arm_smmu_get_for_pci_dev(struct pci_dev *pdev)
{ {
struct device_node *of_node; struct device_node *of_node;
struct arm_smmu_device *curr, *smmu = NULL; struct platform_device *smmu_pdev;
struct arm_smmu_device *smmu = NULL;
struct pci_bus *bus = pdev->bus; struct pci_bus *bus = pdev->bus;
/* Walk up to the root bus */ /* Walk up to the root bus */
...@@ -1735,14 +1732,10 @@ static struct arm_smmu_device *arm_smmu_get_for_pci_dev(struct pci_dev *pdev) ...@@ -1735,14 +1732,10 @@ static struct arm_smmu_device *arm_smmu_get_for_pci_dev(struct pci_dev *pdev)
return NULL; return NULL;
/* See if we can find an SMMU corresponding to the phandle */ /* See if we can find an SMMU corresponding to the phandle */
spin_lock(&arm_smmu_devices_lock); smmu_pdev = of_find_device_by_node(of_node);
list_for_each_entry(curr, &arm_smmu_devices, list) { if (smmu_pdev)
if (curr->dev->of_node == of_node) { smmu = platform_get_drvdata(smmu_pdev);
smmu = curr;
break;
}
}
spin_unlock(&arm_smmu_devices_lock);
of_node_put(of_node); of_node_put(of_node);
return smmu; return smmu;
} }
...@@ -2609,10 +2602,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) ...@@ -2609,10 +2602,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
goto out_free_structures; goto out_free_structures;
/* Record our private device structure */ /* Record our private device structure */
INIT_LIST_HEAD(&smmu->list); platform_set_drvdata(pdev, smmu);
spin_lock(&arm_smmu_devices_lock);
list_add(&smmu->list, &arm_smmu_devices);
spin_unlock(&arm_smmu_devices_lock);
return 0; return 0;
out_free_structures: out_free_structures:
...@@ -2622,21 +2612,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) ...@@ -2622,21 +2612,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
static int arm_smmu_device_remove(struct platform_device *pdev) static int arm_smmu_device_remove(struct platform_device *pdev)
{ {
struct arm_smmu_device *curr, *smmu = NULL; struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
struct device *dev = &pdev->dev;
spin_lock(&arm_smmu_devices_lock);
list_for_each_entry(curr, &arm_smmu_devices, list) {
if (curr->dev == dev) {
smmu = curr;
list_del(&smmu->list);
break;
}
}
spin_unlock(&arm_smmu_devices_lock);
if (!smmu)
return -ENODEV;
arm_smmu_device_disable(smmu); arm_smmu_device_disable(smmu);
arm_smmu_free_structures(smmu); arm_smmu_free_structures(smmu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment