Merge branch 'master' of https://gitlab.denx.de/u-boot/custodians/u-boot-spi
[platform/kernel/u-boot.git] / include / dm / device-internal.h
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_FLAG_PRE_RELOC flag
78  * is set. 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                         struct driver_info *info, struct udevice **devp);
85
86 /**
87  * device_ofdata_to_platdata() - Read platform data for a device
88  *
89  * Read platform data for a device (typically from the device tree) so that
90  * the information needed to probe the device is present.
91  *
92  * This may cause some others devices to be probed if this one depends on them,
93  * e.g. a GPIO line will cause a GPIO device to be probed.
94  *
95  * All private data associated with the device is allocated.
96  *
97  * @dev: Pointer to device to process
98  * @return 0 if OK, -ve on error
99  */
100 int device_ofdata_to_platdata(struct udevice *dev);
101
102 /**
103  * device_probe() - Probe a device, activating it
104  *
105  * Activate a device so that it is ready for use. All its parents are probed
106  * first.
107  *
108  * @dev: Pointer to device to probe
109  * @return 0 if OK, -ve on error
110  */
111 int device_probe(struct udevice *dev);
112
113 /**
114  * device_remove() - Remove a device, de-activating it
115  *
116  * De-activate a device so that it is no longer ready for use. All its
117  * children are deactivated first.
118  *
119  * @dev: Pointer to device to remove
120  * @flags: Flags for selective device removal (DM_REMOVE_...)
121  * @return 0 if OK, -ve on error (an error here is normally a very bad thing)
122  */
123 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
124 int device_remove(struct udevice *dev, uint flags);
125 #else
126 static inline int device_remove(struct udevice *dev, uint flags) { return 0; }
127 #endif
128
129 /**
130  * device_unbind() - Unbind a device, destroying it
131  *
132  * Unbind a device and remove all memory used by it
133  *
134  * @dev: Pointer to device to unbind
135  * @return 0 if OK, -ve on error
136  */
137 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
138 int device_unbind(struct udevice *dev);
139 #else
140 static inline int device_unbind(struct udevice *dev) { return 0; }
141 #endif
142
143 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
144 void device_free(struct udevice *dev);
145 #else
146 static inline void device_free(struct udevice *dev) {}
147 #endif
148
149 /**
150  * device_chld_unbind() - Unbind all device's children from the device if bound
151  *                        to drv
152  *
153  * On error, the function continues to unbind all children, and reports the
154  * first error.
155  *
156  * @dev:        The device that is to be stripped of its children
157  * @drv:        The targeted driver
158  * @return 0 on success, -ve on error
159  */
160 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
161 int device_chld_unbind(struct udevice *dev, struct driver *drv);
162 #else
163 static inline int device_chld_unbind(struct udevice *dev, struct driver *drv)
164 {
165         return 0;
166 }
167 #endif
168
169 /**
170  * device_chld_remove() - Stop all device's children
171  * @dev:        The device whose children are to be removed
172  * @drv:        The targeted driver
173  * @flags:      Flag, if this functions is called in the pre-OS stage
174  * @return 0 on success, -ve on error
175  */
176 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
177 int device_chld_remove(struct udevice *dev, struct driver *drv,
178                        uint flags);
179 #else
180 static inline int device_chld_remove(struct udevice *dev, struct driver *drv,
181                                      uint flags)
182 {
183         return 0;
184 }
185 #endif
186
187 /**
188  * simple_bus_translate() - translate a bus address to a system address
189  *
190  * This handles the 'ranges' property in a simple bus. It translates the
191  * device address @addr to a system address using this property.
192  *
193  * @dev:        Simple bus device (parent of target device)
194  * @addr:       Address to translate
195  * @return new address
196  */
197 fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr);
198
199 /* Cast away any volatile pointer */
200 #define DM_ROOT_NON_CONST               (((gd_t *)gd)->dm_root)
201 #define DM_UCLASS_ROOT_NON_CONST        (((gd_t *)gd)->uclass_root)
202
203 /* device resource management */
204 #ifdef CONFIG_DEVRES
205
206 /**
207  * devres_release_probe - Release managed resources allocated after probing
208  * @dev: Device to release resources for
209  *
210  * Release all resources allocated for @dev when it was probed or later.
211  * This function is called on driver removal.
212  */
213 void devres_release_probe(struct udevice *dev);
214
215 /**
216  * devres_release_all - Release all managed resources
217  * @dev: Device to release resources for
218  *
219  * Release all resources associated with @dev.  This function is
220  * called on driver unbinding.
221  */
222 void devres_release_all(struct udevice *dev);
223
224 #else /* ! CONFIG_DEVRES */
225
226 static inline void devres_release_probe(struct udevice *dev)
227 {
228 }
229
230 static inline void devres_release_all(struct udevice *dev)
231 {
232 }
233
234 #endif /* ! CONFIG_DEVRES */
235 #endif