diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-20 17:51:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-20 17:51:34 -0400 |
commit | e7f44b65b532040ac90b73b60ea0b629742ced33 (patch) | |
tree | 1dec69d411543c5c8ee1b61311db4470070745f0 /drivers/iommu/arm-smmu.c | |
parent | 76b584d3125a1f7d8b64e9c522a4555bc2844bde (diff) | |
parent | f2c27767af0a91cbdc3d832231f953110473e853 (diff) |
Merge tag 'devicetree-for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull devicetree updates from Rob Herring:
- Rewrite of the unflattening code to avoid recursion and lessen the
stack usage.
- Rewrite of the phandle args parsing code to get rid of the fixed args
size. This is needed for IOMMU code.
- Sync to latest dtc which adds more dts style checking. These
warnings are enabled with "W=1" compiles.
- Tegra documentation updates related to the above warnings.
- A bunch of spelling and other doc fixes.
- Various vendor prefix additions.
* tag 'devicetree-for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (52 commits)
devicetree: Add Creative Technology vendor id
gpio: dt-bindings: add ibm,ppc4xx-gpio binding
of/unittest: Remove unnecessary module.h header inclusion
drivers/of: Fix build warning in populate_node()
drivers/of: Fix depth when unflattening devicetree
of: dynamic: changeset prop-update revert fix
drivers/of: Export of_detach_node()
drivers/of: Return allocated memory from of_fdt_unflatten_tree()
drivers/of: Specify parent node in of_fdt_unflatten_tree()
drivers/of: Rename unflatten_dt_node()
drivers/of: Avoid recursively calling unflatten_dt_node()
drivers/of: Split unflatten_dt_node()
of: include errno.h in of_graph.h
of: document refcount incrementation of of_get_cpu_node()
Documentation: dt: soc: fix spelling mistakes
Documentation: dt: power: fix spelling mistake
Documentation: dt: pinctrl: fix spelling mistake
Documentation: dt: opp: fix spelling mistake
Documentation: dt: net: fix spelling mistakes
Documentation: dt: mtd: fix spelling mistake
...
Diffstat (limited to 'drivers/iommu/arm-smmu.c')
-rw-r--r-- | drivers/iommu/arm-smmu.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 0360919a5737..e206ce7a4e4b 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -50,7 +50,7 @@ | |||
50 | #include "io-pgtable.h" | 50 | #include "io-pgtable.h" |
51 | 51 | ||
52 | /* Maximum number of stream IDs assigned to a single device */ | 52 | /* Maximum number of stream IDs assigned to a single device */ |
53 | #define MAX_MASTER_STREAMIDS MAX_PHANDLE_ARGS | 53 | #define MAX_MASTER_STREAMIDS 128 |
54 | 54 | ||
55 | /* Maximum number of context banks per SMMU */ | 55 | /* Maximum number of context banks per SMMU */ |
56 | #define ARM_SMMU_MAX_CBS 128 | 56 | #define ARM_SMMU_MAX_CBS 128 |
@@ -397,6 +397,12 @@ struct arm_smmu_domain { | |||
397 | struct iommu_domain domain; | 397 | struct iommu_domain domain; |
398 | }; | 398 | }; |
399 | 399 | ||
400 | struct arm_smmu_phandle_args { | ||
401 | struct device_node *np; | ||
402 | int args_count; | ||
403 | uint32_t args[MAX_MASTER_STREAMIDS]; | ||
404 | }; | ||
405 | |||
400 | static DEFINE_SPINLOCK(arm_smmu_devices_lock); | 406 | static DEFINE_SPINLOCK(arm_smmu_devices_lock); |
401 | static LIST_HEAD(arm_smmu_devices); | 407 | static LIST_HEAD(arm_smmu_devices); |
402 | 408 | ||
@@ -506,7 +512,7 @@ static int insert_smmu_master(struct arm_smmu_device *smmu, | |||
506 | 512 | ||
507 | static int register_smmu_master(struct arm_smmu_device *smmu, | 513 | static int register_smmu_master(struct arm_smmu_device *smmu, |
508 | struct device *dev, | 514 | struct device *dev, |
509 | struct of_phandle_args *masterspec) | 515 | struct arm_smmu_phandle_args *masterspec) |
510 | { | 516 | { |
511 | int i; | 517 | int i; |
512 | struct arm_smmu_master *master; | 518 | struct arm_smmu_master *master; |
@@ -1875,7 +1881,8 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) | |||
1875 | struct arm_smmu_device *smmu; | 1881 | struct arm_smmu_device *smmu; |
1876 | struct device *dev = &pdev->dev; | 1882 | struct device *dev = &pdev->dev; |
1877 | struct rb_node *node; | 1883 | struct rb_node *node; |
1878 | struct of_phandle_args masterspec; | 1884 | struct of_phandle_iterator it; |
1885 | struct arm_smmu_phandle_args *masterspec; | ||
1879 | int num_irqs, i, err; | 1886 | int num_irqs, i, err; |
1880 | 1887 | ||
1881 | smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL); | 1888 | smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL); |
@@ -1938,20 +1945,35 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) | |||
1938 | 1945 | ||
1939 | i = 0; | 1946 | i = 0; |
1940 | smmu->masters = RB_ROOT; | 1947 | smmu->masters = RB_ROOT; |
1941 | while (!of_parse_phandle_with_args(dev->of_node, "mmu-masters", | 1948 | |
1942 | "#stream-id-cells", i, | 1949 | err = -ENOMEM; |
1943 | &masterspec)) { | 1950 | /* No need to zero the memory for masterspec */ |
1944 | err = register_smmu_master(smmu, dev, &masterspec); | 1951 | masterspec = kmalloc(sizeof(*masterspec), GFP_KERNEL); |
1952 | if (!masterspec) | ||
1953 | goto out_put_masters; | ||
1954 | |||
1955 | of_for_each_phandle(&it, err, dev->of_node, | ||
1956 | "mmu-masters", "#stream-id-cells", 0) { | ||
1957 | int count = of_phandle_iterator_args(&it, masterspec->args, | ||
1958 | MAX_MASTER_STREAMIDS); | ||
1959 | masterspec->np = of_node_get(it.node); | ||
1960 | masterspec->args_count = count; | ||
1961 | |||
1962 | err = register_smmu_master(smmu, dev, masterspec); | ||
1945 | if (err) { | 1963 | if (err) { |
1946 | dev_err(dev, "failed to add master %s\n", | 1964 | dev_err(dev, "failed to add master %s\n", |
1947 | masterspec.np->name); | 1965 | masterspec->np->name); |
1966 | kfree(masterspec); | ||
1948 | goto out_put_masters; | 1967 | goto out_put_masters; |
1949 | } | 1968 | } |
1950 | 1969 | ||
1951 | i++; | 1970 | i++; |
1952 | } | 1971 | } |
1972 | |||
1953 | dev_notice(dev, "registered %d master devices\n", i); | 1973 | dev_notice(dev, "registered %d master devices\n", i); |
1954 | 1974 | ||
1975 | kfree(masterspec); | ||
1976 | |||
1955 | parse_driver_options(smmu); | 1977 | parse_driver_options(smmu); |
1956 | 1978 | ||
1957 | if (smmu->version == ARM_SMMU_V2 && | 1979 | if (smmu->version == ARM_SMMU_V2 && |