xref: /openbmc/u-boot/include/dm/device-internal.h (revision 0a21fdd6)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2013 Google, Inc
4  *
5  * (C) Copyright 2012
6  * Pavel Herrmann <morpheus.ibis@gmail.com>
7  * Marek Vasut <marex@denx.de>
8  */
9 
10 #ifndef _DM_DEVICE_INTERNAL_H
11 #define _DM_DEVICE_INTERNAL_H
12 
13 #include <dm/ofnode.h>
14 
15 struct device_node;
16 struct udevice;
17 
18 /**
19  * device_bind() - Create a device and bind it to a driver
20  *
21  * Called to set up a new device attached to a driver. The device will either
22  * have platdata, or a device tree node which can be used to create the
23  * platdata.
24  *
25  * Once bound a device exists but is not yet active until device_probe() is
26  * called.
27  *
28  * @parent: Pointer to device's parent, under which this driver will exist
29  * @drv: Device's driver
30  * @name: Name of device (e.g. device tree node name)
31  * @platdata: Pointer to data for this device - the structure is device-
32  * specific but may include the device's I/O address, etc.. This is NULL for
33  * devices which use device tree.
34  * @of_offset: Offset of device tree node for this device. This is -1 for
35  * devices which don't use device tree.
36  * @devp: if non-NULL, returns a pointer to the bound device
37  * @return 0 if OK, -ve on error
38  */
39 int device_bind(struct udevice *parent, const struct driver *drv,
40 		const char *name, void *platdata, int of_offset,
41 		struct udevice **devp);
42 
43 int device_bind_ofnode(struct udevice *parent, const struct driver *drv,
44 		       const char *name, void *platdata, ofnode node,
45 		       struct udevice **devp);
46 
47 /**
48  * device_bind_with_driver_data() - Create a device and bind it to a driver
49  *
50  * Called to set up a new device attached to a driver, in the case where the
51  * driver was matched to the device by means of a match table that provides
52  * driver_data.
53  *
54  * Once bound a device exists but is not yet active until device_probe() is
55  * called.
56  *
57  * @parent: Pointer to device's parent, under which this driver will exist
58  * @drv: Device's driver
59  * @name: Name of device (e.g. device tree node name)
60  * @driver_data: The driver_data field from the driver's match table.
61  * @node: Device tree node for this device. This is invalid for devices which
62  * don't use device tree.
63  * @devp: if non-NULL, returns a pointer to the bound device
64  * @return 0 if OK, -ve on error
65  */
66 int device_bind_with_driver_data(struct udevice *parent,
67 				 const struct driver *drv, const char *name,
68 				 ulong driver_data, ofnode node,
69 				 struct udevice **devp);
70 /**
71  * device_bind_by_name: Create a device and bind it to a driver
72  *
73  * This is a helper function used to bind devices which do not use device
74  * tree.
75  *
76  * @parent: Pointer to device's parent
77  * @pre_reloc_only: If true, bind the driver only if its DM_INIT_F flag is set.
78  * If false bind the driver always.
79  * @info: Name and platdata for this device
80  * @devp: if non-NULL, returns a pointer to the bound device
81  * @return 0 if OK, -ve on error
82  */
83 int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
84 			const struct driver_info *info, struct udevice **devp);
85 
86 /**
87  * device_probe() - Probe a device, activating it
88  *
89  * Activate a device so that it is ready for use. All its parents are probed
90  * first.
91  *
92  * @dev: Pointer to device to probe
93  * @return 0 if OK, -ve on error
94  */
95 int device_probe(struct udevice *dev);
96 
97 /**
98  * device_remove() - Remove a device, de-activating it
99  *
100  * De-activate a device so that it is no longer ready for use. All its
101  * children are deactivated first.
102  *
103  * @dev: Pointer to device to remove
104  * @flags: Flags for selective device removal (DM_REMOVE_...)
105  * @return 0 if OK, -ve on error (an error here is normally a very bad thing)
106  */
107 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
108 int device_remove(struct udevice *dev, uint flags);
109 #else
110 static inline int device_remove(struct udevice *dev, uint flags) { return 0; }
111 #endif
112 
113 /**
114  * device_unbind() - Unbind a device, destroying it
115  *
116  * Unbind a device and remove all memory used by it
117  *
118  * @dev: Pointer to device to unbind
119  * @return 0 if OK, -ve on error
120  */
121 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
122 int device_unbind(struct udevice *dev);
123 #else
124 static inline int device_unbind(struct udevice *dev) { return 0; }
125 #endif
126 
127 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
128 void device_free(struct udevice *dev);
129 #else
130 static inline void device_free(struct udevice *dev) {}
131 #endif
132 
133 /**
134  * simple_bus_translate() - translate a bus address to a system address
135  *
136  * This handles the 'ranges' property in a simple bus. It translates the
137  * device address @addr to a system address using this property.
138  *
139  * @dev:	Simple bus device (parent of target device)
140  * @addr:	Address to translate
141  * @return new address
142  */
143 fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr);
144 
145 /* Cast away any volatile pointer */
146 #define DM_ROOT_NON_CONST		(((gd_t *)gd)->dm_root)
147 #define DM_UCLASS_ROOT_NON_CONST	(((gd_t *)gd)->uclass_root)
148 
149 /* device resource management */
150 #ifdef CONFIG_DEVRES
151 
152 /**
153  * devres_release_probe - Release managed resources allocated after probing
154  * @dev: Device to release resources for
155  *
156  * Release all resources allocated for @dev when it was probed or later.
157  * This function is called on driver removal.
158  */
159 void devres_release_probe(struct udevice *dev);
160 
161 /**
162  * devres_release_all - Release all managed resources
163  * @dev: Device to release resources for
164  *
165  * Release all resources associated with @dev.  This function is
166  * called on driver unbinding.
167  */
168 void devres_release_all(struct udevice *dev);
169 
170 #else /* ! CONFIG_DEVRES */
171 
172 static inline void devres_release_probe(struct udevice *dev)
173 {
174 }
175 
176 static inline void devres_release_all(struct udevice *dev)
177 {
178 }
179 
180 #endif /* ! CONFIG_DEVRES */
181 #endif
182