diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-09 19:44:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-09 19:44:07 -0500 |
commit | eef121f407f727a8c34d8284f9b954828d2cb5ce (patch) | |
tree | 9dd339eab08f77c7419c0646e98a74c99521c728 | |
parent | abb7e2b3f0714b9710b1865d2ba53525a935a7db (diff) | |
parent | eaddb5725357e9f05ffe5d271630f8197d089da4 (diff) |
Merge tag 'devicetree-fixes-for-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull DT fixes from Rob Herring:
"I think this should be all for 4.4:
- Fix incorrect warning about overlapping memory regions
- Export of_irq_find_parent again which was made static in 4.4, but
has users pending for 4.5.
- Fix of_msi_map_rid declaration location
- Fix re-entrancy for of_fdt_unflatten_tree
- Clean-up of phys_addr_t printks"
* tag 'devicetree-fixes-for-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux:
of/irq: move of_msi_map_rid declaration to the correct ifdef section
of/irq: Export of_irq_find_parent again
of/fdt: Add mutex protection for calls to __unflatten_device_tree()
of/address: fix typo in comment block of of_translate_one()
of: do not use 0x in front of %pa
of: Fix comparison of reserved memory regions
-rw-r--r-- | drivers/of/address.c | 5 | ||||
-rw-r--r-- | drivers/of/fdt.c | 7 | ||||
-rw-r--r-- | drivers/of/irq.c | 3 | ||||
-rw-r--r-- | drivers/of/of_reserved_mem.c | 8 | ||||
-rw-r--r-- | include/linux/of_irq.h | 19 |
5 files changed, 30 insertions, 12 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c index cd53fe4a0c86..9582c5703b3c 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c | |||
@@ -485,9 +485,10 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, | |||
485 | int rone; | 485 | int rone; |
486 | u64 offset = OF_BAD_ADDR; | 486 | u64 offset = OF_BAD_ADDR; |
487 | 487 | ||
488 | /* Normally, an absence of a "ranges" property means we are | 488 | /* |
489 | * Normally, an absence of a "ranges" property means we are | ||
489 | * crossing a non-translatable boundary, and thus the addresses | 490 | * crossing a non-translatable boundary, and thus the addresses |
490 | * below the current not cannot be converted to CPU physical ones. | 491 | * below the current cannot be converted to CPU physical ones. |
491 | * Unfortunately, while this is very clear in the spec, it's not | 492 | * Unfortunately, while this is very clear in the spec, it's not |
492 | * what Apple understood, and they do have things like /uni-n or | 493 | * what Apple understood, and they do have things like /uni-n or |
493 | * /ht nodes with no "ranges" property and a lot of perfectly | 494 | * /ht nodes with no "ranges" property and a lot of perfectly |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index d2430298a309..655f79db7899 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/initrd.h> | 14 | #include <linux/initrd.h> |
15 | #include <linux/memblock.h> | 15 | #include <linux/memblock.h> |
16 | #include <linux/mutex.h> | ||
16 | #include <linux/of.h> | 17 | #include <linux/of.h> |
17 | #include <linux/of_fdt.h> | 18 | #include <linux/of_fdt.h> |
18 | #include <linux/of_reserved_mem.h> | 19 | #include <linux/of_reserved_mem.h> |
@@ -436,6 +437,8 @@ static void *kernel_tree_alloc(u64 size, u64 align) | |||
436 | return kzalloc(size, GFP_KERNEL); | 437 | return kzalloc(size, GFP_KERNEL); |
437 | } | 438 | } |
438 | 439 | ||
440 | static DEFINE_MUTEX(of_fdt_unflatten_mutex); | ||
441 | |||
439 | /** | 442 | /** |
440 | * of_fdt_unflatten_tree - create tree of device_nodes from flat blob | 443 | * of_fdt_unflatten_tree - create tree of device_nodes from flat blob |
441 | * | 444 | * |
@@ -447,7 +450,9 @@ static void *kernel_tree_alloc(u64 size, u64 align) | |||
447 | void of_fdt_unflatten_tree(const unsigned long *blob, | 450 | void of_fdt_unflatten_tree(const unsigned long *blob, |
448 | struct device_node **mynodes) | 451 | struct device_node **mynodes) |
449 | { | 452 | { |
453 | mutex_lock(&of_fdt_unflatten_mutex); | ||
450 | __unflatten_device_tree(blob, mynodes, &kernel_tree_alloc); | 454 | __unflatten_device_tree(blob, mynodes, &kernel_tree_alloc); |
455 | mutex_unlock(&of_fdt_unflatten_mutex); | ||
451 | } | 456 | } |
452 | EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); | 457 | EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); |
453 | 458 | ||
@@ -1041,7 +1046,7 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) | |||
1041 | int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, | 1046 | int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, |
1042 | phys_addr_t size, bool nomap) | 1047 | phys_addr_t size, bool nomap) |
1043 | { | 1048 | { |
1044 | pr_err("Reserved memory not supported, ignoring range 0x%pa - 0x%pa%s\n", | 1049 | pr_err("Reserved memory not supported, ignoring range %pa - %pa%s\n", |
1045 | &base, &size, nomap ? " (nomap)" : ""); | 1050 | &base, &size, nomap ? " (nomap)" : ""); |
1046 | return -ENOSYS; | 1051 | return -ENOSYS; |
1047 | } | 1052 | } |
diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 902b89be7217..4fa916dffc91 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c | |||
@@ -53,7 +53,7 @@ EXPORT_SYMBOL_GPL(irq_of_parse_and_map); | |||
53 | * Returns a pointer to the interrupt parent node, or NULL if the interrupt | 53 | * Returns a pointer to the interrupt parent node, or NULL if the interrupt |
54 | * parent could not be determined. | 54 | * parent could not be determined. |
55 | */ | 55 | */ |
56 | static struct device_node *of_irq_find_parent(struct device_node *child) | 56 | struct device_node *of_irq_find_parent(struct device_node *child) |
57 | { | 57 | { |
58 | struct device_node *p; | 58 | struct device_node *p; |
59 | const __be32 *parp; | 59 | const __be32 *parp; |
@@ -77,6 +77,7 @@ static struct device_node *of_irq_find_parent(struct device_node *child) | |||
77 | 77 | ||
78 | return p; | 78 | return p; |
79 | } | 79 | } |
80 | EXPORT_SYMBOL_GPL(of_irq_find_parent); | ||
80 | 81 | ||
81 | /** | 82 | /** |
82 | * of_irq_parse_raw - Low level interrupt tree parsing | 83 | * of_irq_parse_raw - Low level interrupt tree parsing |
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index be77e75c587d..1a3556a9e9ea 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c | |||
@@ -206,7 +206,13 @@ static int __init __rmem_cmp(const void *a, const void *b) | |||
206 | { | 206 | { |
207 | const struct reserved_mem *ra = a, *rb = b; | 207 | const struct reserved_mem *ra = a, *rb = b; |
208 | 208 | ||
209 | return ra->base - rb->base; | 209 | if (ra->base < rb->base) |
210 | return -1; | ||
211 | |||
212 | if (ra->base > rb->base) | ||
213 | return 1; | ||
214 | |||
215 | return 0; | ||
210 | } | 216 | } |
211 | 217 | ||
212 | static void __init __rmem_check_for_overlap(void) | 218 | static void __init __rmem_check_for_overlap(void) |
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index 039f2eec49ce..1e0deb8e8494 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h | |||
@@ -46,12 +46,14 @@ extern int of_irq_get(struct device_node *dev, int index); | |||
46 | extern int of_irq_get_byname(struct device_node *dev, const char *name); | 46 | extern int of_irq_get_byname(struct device_node *dev, const char *name); |
47 | extern int of_irq_to_resource_table(struct device_node *dev, | 47 | extern int of_irq_to_resource_table(struct device_node *dev, |
48 | struct resource *res, int nr_irqs); | 48 | struct resource *res, int nr_irqs); |
49 | extern struct device_node *of_irq_find_parent(struct device_node *child); | ||
49 | extern struct irq_domain *of_msi_get_domain(struct device *dev, | 50 | extern struct irq_domain *of_msi_get_domain(struct device *dev, |
50 | struct device_node *np, | 51 | struct device_node *np, |
51 | enum irq_domain_bus_token token); | 52 | enum irq_domain_bus_token token); |
52 | extern struct irq_domain *of_msi_map_get_device_domain(struct device *dev, | 53 | extern struct irq_domain *of_msi_map_get_device_domain(struct device *dev, |
53 | u32 rid); | 54 | u32 rid); |
54 | extern void of_msi_configure(struct device *dev, struct device_node *np); | 55 | extern void of_msi_configure(struct device *dev, struct device_node *np); |
56 | u32 of_msi_map_rid(struct device *dev, struct device_node *msi_np, u32 rid_in); | ||
55 | #else | 57 | #else |
56 | static inline int of_irq_count(struct device_node *dev) | 58 | static inline int of_irq_count(struct device_node *dev) |
57 | { | 59 | { |
@@ -70,6 +72,11 @@ static inline int of_irq_to_resource_table(struct device_node *dev, | |||
70 | { | 72 | { |
71 | return 0; | 73 | return 0; |
72 | } | 74 | } |
75 | static inline void *of_irq_find_parent(struct device_node *child) | ||
76 | { | ||
77 | return NULL; | ||
78 | } | ||
79 | |||
73 | static inline struct irq_domain *of_msi_get_domain(struct device *dev, | 80 | static inline struct irq_domain *of_msi_get_domain(struct device *dev, |
74 | struct device_node *np, | 81 | struct device_node *np, |
75 | enum irq_domain_bus_token token) | 82 | enum irq_domain_bus_token token) |
@@ -84,6 +91,11 @@ static inline struct irq_domain *of_msi_map_get_device_domain(struct device *dev | |||
84 | static inline void of_msi_configure(struct device *dev, struct device_node *np) | 91 | static inline void of_msi_configure(struct device *dev, struct device_node *np) |
85 | { | 92 | { |
86 | } | 93 | } |
94 | static inline u32 of_msi_map_rid(struct device *dev, | ||
95 | struct device_node *msi_np, u32 rid_in) | ||
96 | { | ||
97 | return rid_in; | ||
98 | } | ||
87 | #endif | 99 | #endif |
88 | 100 | ||
89 | #if defined(CONFIG_OF_IRQ) || defined(CONFIG_SPARC) | 101 | #if defined(CONFIG_OF_IRQ) || defined(CONFIG_SPARC) |
@@ -93,7 +105,6 @@ static inline void of_msi_configure(struct device *dev, struct device_node *np) | |||
93 | * so declare it here regardless of the CONFIG_OF_IRQ setting. | 105 | * so declare it here regardless of the CONFIG_OF_IRQ setting. |
94 | */ | 106 | */ |
95 | extern unsigned int irq_of_parse_and_map(struct device_node *node, int index); | 107 | extern unsigned int irq_of_parse_and_map(struct device_node *node, int index); |
96 | u32 of_msi_map_rid(struct device *dev, struct device_node *msi_np, u32 rid_in); | ||
97 | 108 | ||
98 | #else /* !CONFIG_OF && !CONFIG_SPARC */ | 109 | #else /* !CONFIG_OF && !CONFIG_SPARC */ |
99 | static inline unsigned int irq_of_parse_and_map(struct device_node *dev, | 110 | static inline unsigned int irq_of_parse_and_map(struct device_node *dev, |
@@ -101,12 +112,6 @@ static inline unsigned int irq_of_parse_and_map(struct device_node *dev, | |||
101 | { | 112 | { |
102 | return 0; | 113 | return 0; |
103 | } | 114 | } |
104 | |||
105 | static inline u32 of_msi_map_rid(struct device *dev, | ||
106 | struct device_node *msi_np, u32 rid_in) | ||
107 | { | ||
108 | return rid_in; | ||
109 | } | ||
110 | #endif /* !CONFIG_OF */ | 115 | #endif /* !CONFIG_OF */ |
111 | 116 | ||
112 | #endif /* __OF_IRQ_H */ | 117 | #endif /* __OF_IRQ_H */ |