xref: /linux/drivers/of/of_private.h (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
1af6074fcSRob Herring /* SPDX-License-Identifier: GPL-2.0+ */
2ced4eec9SStepan Moskovchenko #ifndef _LINUX_OF_PRIVATE_H
3ced4eec9SStepan Moskovchenko #define _LINUX_OF_PRIVATE_H
4ced4eec9SStepan Moskovchenko /*
5ced4eec9SStepan Moskovchenko  * Private symbols used by OF support code
6ced4eec9SStepan Moskovchenko  *
7ced4eec9SStepan Moskovchenko  * Paul Mackerras	August 1996.
8ced4eec9SStepan Moskovchenko  * Copyright (C) 1996-2005 Paul Mackerras.
9ced4eec9SStepan Moskovchenko  */
10ced4eec9SStepan Moskovchenko 
1148d499bdSFrank Rowand #define FDT_ALIGN_SIZE 8
1248d499bdSFrank Rowand 
13ced4eec9SStepan Moskovchenko /**
14ced4eec9SStepan Moskovchenko  * struct alias_prop - Alias property in 'aliases' node
15ced4eec9SStepan Moskovchenko  * @link:	List node to link the structure in aliases_lookup list
16ced4eec9SStepan Moskovchenko  * @alias:	Alias property name
17ced4eec9SStepan Moskovchenko  * @np:		Pointer to device_node that the alias stands for
18ced4eec9SStepan Moskovchenko  * @id:		Index value from end of alias name
19ced4eec9SStepan Moskovchenko  * @stem:	Alias string without the index
20ced4eec9SStepan Moskovchenko  *
21ced4eec9SStepan Moskovchenko  * The structure represents one alias property of 'aliases' node as
22ced4eec9SStepan Moskovchenko  * an entry in aliases_lookup list.
23ced4eec9SStepan Moskovchenko  */
24ced4eec9SStepan Moskovchenko struct alias_prop {
25ced4eec9SStepan Moskovchenko 	struct list_head link;
26ced4eec9SStepan Moskovchenko 	const char *alias;
27ced4eec9SStepan Moskovchenko 	struct device_node *np;
28ced4eec9SStepan Moskovchenko 	int id;
29f4377562SGustavo A. R. Silva 	char stem[];
30ced4eec9SStepan Moskovchenko };
31ced4eec9SStepan Moskovchenko 
3200b7d1cfSRob Herring #if defined(CONFIG_SPARC)
3300b7d1cfSRob Herring #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 2
3400b7d1cfSRob Herring #else
3500b7d1cfSRob Herring #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
3600b7d1cfSRob Herring #endif
3700b7d1cfSRob Herring 
3800b7d1cfSRob Herring #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
3900b7d1cfSRob Herring 
40c05aba2bSPantelis Antoniou extern struct mutex of_mutex;
411dd5474eSRob Herring extern raw_spinlock_t devtree_lock;
42ced4eec9SStepan Moskovchenko extern struct list_head aliases_lookup;
438a2b22a2SGrant Likely extern struct kset *of_kset;
448a2b22a2SGrant Likely 
456afc0dc3SGrant Likely #if defined(CONFIG_OF_DYNAMIC)
466afc0dc3SGrant Likely extern int of_property_notify(int action, struct device_node *np,
47259092a3SGrant Likely 			      struct property *prop, struct property *old_prop);
486afc0dc3SGrant Likely extern void of_node_release(struct kobject *kobj);
4924789c5cSFrank Rowand extern int __of_changeset_apply_entries(struct of_changeset *ocs,
5024789c5cSFrank Rowand 					int *ret_revert);
5124789c5cSFrank Rowand extern int __of_changeset_apply_notify(struct of_changeset *ocs);
5224789c5cSFrank Rowand extern int __of_changeset_revert_entries(struct of_changeset *ocs,
5324789c5cSFrank Rowand 					 int *ret_apply);
5424789c5cSFrank Rowand extern int __of_changeset_revert_notify(struct of_changeset *ocs);
556afc0dc3SGrant Likely #else /* CONFIG_OF_DYNAMIC */
566afc0dc3SGrant Likely static inline int of_property_notify(int action, struct device_node *np,
57259092a3SGrant Likely 				     struct property *prop, struct property *old_prop)
586afc0dc3SGrant Likely {
596afc0dc3SGrant Likely 	return 0;
606afc0dc3SGrant Likely }
616afc0dc3SGrant Likely #endif /* CONFIG_OF_DYNAMIC */
626afc0dc3SGrant Likely 
6373aca58bSRob Herring #if defined(CONFIG_OF_DYNAMIC) && defined(CONFIG_OF_ADDRESS)
6473aca58bSRob Herring void of_platform_register_reconfig_notifier(void);
6573aca58bSRob Herring #else
6673aca58bSRob Herring static inline void of_platform_register_reconfig_notifier(void) { }
6773aca58bSRob Herring #endif
6873aca58bSRob Herring 
69b56b5528SRob Herring #if defined(CONFIG_OF_KOBJ)
706effc885SNathan Lynch int of_node_is_attached(const struct device_node *node);
71b56b5528SRob Herring int __of_add_property_sysfs(struct device_node *np, struct property *pp);
72b56b5528SRob Herring void __of_remove_property_sysfs(struct device_node *np, struct property *prop);
73b56b5528SRob Herring void __of_update_property_sysfs(struct device_node *np, struct property *newprop,
74b56b5528SRob Herring 		struct property *oldprop);
75b56b5528SRob Herring int __of_attach_node_sysfs(struct device_node *np);
76b56b5528SRob Herring void __of_detach_node_sysfs(struct device_node *np);
77b56b5528SRob Herring #else
78b56b5528SRob Herring static inline int __of_add_property_sysfs(struct device_node *np, struct property *pp)
79b56b5528SRob Herring {
80b56b5528SRob Herring 	return 0;
81b56b5528SRob Herring }
82b56b5528SRob Herring static inline void __of_remove_property_sysfs(struct device_node *np, struct property *prop) {}
83b56b5528SRob Herring static inline void __of_update_property_sysfs(struct device_node *np,
84b56b5528SRob Herring 		struct property *newprop, struct property *oldprop) {}
85b56b5528SRob Herring static inline int __of_attach_node_sysfs(struct device_node *np)
86b56b5528SRob Herring {
87b56b5528SRob Herring 	return 0;
88b56b5528SRob Herring }
89b56b5528SRob Herring static inline void __of_detach_node_sysfs(struct device_node *np) {}
90b56b5528SRob Herring #endif
91b56b5528SRob Herring 
92f948d6d8SFrank Rowand #if defined(CONFIG_OF_RESOLVE)
93f948d6d8SFrank Rowand int of_resolve_phandles(struct device_node *tree);
94f948d6d8SFrank Rowand #endif
95f948d6d8SFrank Rowand 
9690dc0d1cSRob Herring void __of_phandle_cache_inv_entry(phandle handle);
975801169aSFrank Rowand 
98f948d6d8SFrank Rowand #if defined(CONFIG_OF_OVERLAY)
99f948d6d8SFrank Rowand void of_overlay_mutex_lock(void);
100f948d6d8SFrank Rowand void of_overlay_mutex_unlock(void);
101f948d6d8SFrank Rowand #else
102f948d6d8SFrank Rowand static inline void of_overlay_mutex_lock(void) {};
103f948d6d8SFrank Rowand static inline void of_overlay_mutex_unlock(void) {};
104f948d6d8SFrank Rowand #endif
105f948d6d8SFrank Rowand 
1065d4dd65bSArnd Bergmann #if defined(CONFIG_OF_UNITTEST) && defined(CONFIG_OF_OVERLAY)
10781d0848fSFrank Rowand extern void __init unittest_unflatten_overlay_base(void);
10881d0848fSFrank Rowand #else
10981d0848fSFrank Rowand static inline void unittest_unflatten_overlay_base(void) {};
11081d0848fSFrank Rowand #endif
11181d0848fSFrank Rowand 
11281d0848fSFrank Rowand extern void *__unflatten_device_tree(const void *blob,
11381d0848fSFrank Rowand 			      struct device_node *dad,
11481d0848fSFrank Rowand 			      struct device_node **mynodes,
11581d0848fSFrank Rowand 			      void *(*dt_alloc)(u64 size, u64 align),
11681d0848fSFrank Rowand 			      bool detached);
11781d0848fSFrank Rowand 
11869843396SPantelis Antoniou /**
11969843396SPantelis Antoniou  * General utilities for working with live trees.
12069843396SPantelis Antoniou  *
12169843396SPantelis Antoniou  * All functions with two leading underscores operate
12269843396SPantelis Antoniou  * without taking node references, so you either have to
12369843396SPantelis Antoniou  * own the devtree lock or work on detached trees only.
12469843396SPantelis Antoniou  */
12569843396SPantelis Antoniou struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
1261c5e3d9bSRob Herring void __of_prop_free(struct property *prop);
127b89dae18SFrank Rowand struct device_node *__of_node_dup(const struct device_node *np,
128b89dae18SFrank Rowand 				  const char *full_name);
12969843396SPantelis Antoniou 
130e0a58f3eSFrank Rowand struct device_node *__of_find_node_by_path(struct device_node *parent,
131e0a58f3eSFrank Rowand 						const char *path);
13227497e11SRob Herring struct device_node *__of_find_node_by_full_path(struct device_node *node,
13327497e11SRob Herring 						const char *path);
13427497e11SRob Herring 
135a25095d4SGrant Likely extern const void *__of_get_property(const struct device_node *np,
136a25095d4SGrant Likely 				     const char *name, int *lenp);
137d8c50088SPantelis Antoniou extern int __of_add_property(struct device_node *np, struct property *prop);
138d8c50088SPantelis Antoniou extern int __of_remove_property(struct device_node *np, struct property *prop);
139d8c50088SPantelis Antoniou extern int __of_update_property(struct device_node *np,
140d8c50088SPantelis Antoniou 		struct property *newprop, struct property **oldprop);
141d8c50088SPantelis Antoniou 
142d8c50088SPantelis Antoniou extern void __of_detach_node(struct device_node *np);
143d8c50088SPantelis Antoniou 
144d9fc8807SFrank Rowand extern void __of_sysfs_remove_bin_file(struct device_node *np,
145d9fc8807SFrank Rowand 				       struct property *prop);
146d9fc8807SFrank Rowand 
1470b3ce78eSFrank Rowand /* illegal phandle value (set when unresolved) */
1480b3ce78eSFrank Rowand #define OF_PHANDLE_ILLEGAL	0xdeadbeef
1490b3ce78eSFrank Rowand 
150201c910bSPantelis Antoniou /* iterators for transactions, used for overlays */
151201c910bSPantelis Antoniou /* forward iterator */
152201c910bSPantelis Antoniou #define for_each_transaction_entry(_oft, _te) \
153201c910bSPantelis Antoniou 	list_for_each_entry(_te, &(_oft)->te_list, node)
154201c910bSPantelis Antoniou 
155201c910bSPantelis Antoniou /* reverse iterator */
156201c910bSPantelis Antoniou #define for_each_transaction_entry_reverse(_oft, _te) \
157201c910bSPantelis Antoniou 	list_for_each_entry_reverse(_te, &(_oft)->te_list, node)
158201c910bSPantelis Antoniou 
159b68ac8dcSRobin Murphy extern int of_bus_n_addr_cells(struct device_node *np);
160b68ac8dcSRobin Murphy extern int of_bus_n_size_cells(struct device_node *np);
161b68ac8dcSRobin Murphy 
162*935df1bdSRob Herring (Arm) const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len,
163*935df1bdSRob Herring (Arm) 				       struct of_phandle_args *out_irq);
164*935df1bdSRob Herring (Arm) 
165e0d07278SJim Quinlan struct bus_dma_region;
166e0d07278SJim Quinlan #if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_HAS_DMA)
167e0d07278SJim Quinlan int of_dma_get_range(struct device_node *np,
168e0d07278SJim Quinlan 		const struct bus_dma_region **map);
169f1ad5338SRobin Murphy struct device_node *__of_get_dma_parent(const struct device_node *np);
1706e6faf63SRob Herring #else
171e0d07278SJim Quinlan static inline int of_dma_get_range(struct device_node *np,
172e0d07278SJim Quinlan 		const struct bus_dma_region **map)
1736e6faf63SRob Herring {
1746e6faf63SRob Herring 	return -ENODEV;
1756e6faf63SRob Herring }
176f1ad5338SRobin Murphy static inline struct device_node *__of_get_dma_parent(const struct device_node *np)
177f1ad5338SRobin Murphy {
178f1ad5338SRobin Murphy 	return of_get_parent(np);
179f1ad5338SRobin Murphy }
1806e6faf63SRob Herring #endif
1816e6faf63SRob Herring 
18254c180e7SRob Herring int fdt_scan_reserved_mem(void);
18312d55d3bSRob Herring void fdt_init_reserved_mem(void);
18454c180e7SRob Herring 
18554c180e7SRob Herring bool of_fdt_device_is_available(const void *blob, unsigned long node);
18612d55d3bSRob Herring 
187ced4eec9SStepan Moskovchenko #endif /* _LINUX_OF_PRIVATE_H */
188