]>
Commit | Line | Data |
---|---|---|
6494d708 SG |
1 | /* |
2 | * Copyright (c) 2013 Google, Inc | |
3 | * | |
4 | * (C) Copyright 2012 | |
5 | * Pavel Herrmann <morpheus.ibis@gmail.com> | |
6 | * | |
7 | * SPDX-License-Identifier: GPL-2.0+ | |
8 | */ | |
9 | ||
10 | #ifndef _DM_UCLASS_INTERNAL_H | |
11 | #define _DM_UCLASS_INTERNAL_H | |
12 | ||
40bb637d SG |
13 | #include <dm/ofnode.h> |
14 | ||
794d5219 PM |
15 | /** |
16 | * uclass_get_device_tail() - handle the end of a get_device call | |
17 | * | |
18 | * This handles returning an error or probing a device as needed. | |
19 | * | |
20 | * @dev: Device that needs to be probed | |
21 | * @ret: Error to return. If non-zero then the device is not probed | |
22 | * @devp: Returns the value of 'dev' if there is no error | |
23 | * @return ret, if non-zero, else the result of the device_probe() call | |
24 | */ | |
25 | int uclass_get_device_tail(struct udevice *dev, int ret, struct udevice **devp); | |
26 | ||
6494d708 SG |
27 | /** |
28 | * uclass_find_device() - Return n-th child of uclass | |
29 | * @id: Id number of the uclass | |
30 | * @index: Position of the child in uclass's list | |
31 | * #devp: Returns pointer to device, or NULL on error | |
32 | * | |
794d5219 PM |
33 | * The device is not prepared for use - this is an internal function. |
34 | * The function uclass_get_device_tail() can be used to probe the device. | |
6494d708 SG |
35 | * |
36 | * @return the uclass pointer of a child at the given index or | |
37 | * return NULL on error. | |
38 | */ | |
54c5d08a | 39 | int uclass_find_device(enum uclass_id id, int index, struct udevice **devp); |
6494d708 | 40 | |
c1d6f919 PM |
41 | /** |
42 | * uclass_find_first_device() - Return the first device in a uclass | |
43 | * @id: Id number of the uclass | |
44 | * #devp: Returns pointer to device, or NULL on error | |
45 | * | |
794d5219 PM |
46 | * The device is not prepared for use - this is an internal function. |
47 | * The function uclass_get_device_tail() can be used to probe the device. | |
c1d6f919 PM |
48 | * |
49 | * @return 0 if OK (found or not found), -1 on error | |
50 | */ | |
51 | int uclass_find_first_device(enum uclass_id id, struct udevice **devp); | |
52 | ||
53 | /** | |
54 | * uclass_find_next_device() - Return the next device in a uclass | |
55 | * @devp: On entry, pointer to device to lookup. On exit, returns pointer | |
56 | * to the next device in the same uclass, or NULL if none | |
57 | * | |
794d5219 PM |
58 | * The device is not prepared for use - this is an internal function. |
59 | * The function uclass_get_device_tail() can be used to probe the device. | |
c1d6f919 PM |
60 | * |
61 | * @return 0 if OK (found or not found), -1 on error | |
62 | */ | |
63 | int uclass_find_next_device(struct udevice **devp); | |
64 | ||
e0735a4c PM |
65 | /** |
66 | * uclass_find_device_by_name() - Find uclass device based on ID and name | |
67 | * | |
a7b82502 | 68 | * This searches for a device with the exactly given name. |
e0735a4c PM |
69 | * |
70 | * The device is NOT probed, it is merely returned. | |
71 | * | |
72 | * @id: ID to look up | |
73 | * @name: name of a device to find | |
74 | * @devp: Returns pointer to device (the first one with the name) | |
75 | * @return 0 if OK, -ve on error | |
76 | */ | |
77 | int uclass_find_device_by_name(enum uclass_id id, const char *name, | |
78 | struct udevice **devp); | |
79 | ||
80 | /** | |
81 | * uclass_find_device_by_seq() - Find uclass device based on ID and sequence | |
82 | * | |
83 | * This searches for a device with the given seq or req_seq. | |
84 | * | |
85 | * For seq, if an active device has this sequence it will be returned. | |
86 | * If there is no such device then this will return -ENODEV. | |
87 | * | |
88 | * For req_seq, if a device (whether activated or not) has this req_seq | |
89 | * value, that device will be returned. This is a strong indication that | |
90 | * the device will receive that sequence when activated. | |
91 | * | |
92 | * The device is NOT probed, it is merely returned. | |
93 | * | |
94 | * @id: ID to look up | |
95 | * @seq_or_req_seq: Sequence number to find (0=first) | |
96 | * @find_req_seq: true to find req_seq, false to find seq | |
97 | * @devp: Returns pointer to device (there is only one per for each seq) | |
98 | * @return 0 if OK, -ve on error | |
99 | */ | |
100 | int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq, | |
101 | bool find_req_seq, struct udevice **devp); | |
102 | ||
1b30d61d SG |
103 | /** |
104 | * uclass_find_device_by_of_offset() - Find a uclass device by device tree node | |
105 | * | |
106 | * This searches the devices in the uclass for one attached to the given | |
107 | * device tree node. | |
108 | * | |
109 | * The device is NOT probed, it is merely returned. | |
110 | * | |
111 | * @id: ID to look up | |
112 | * @node: Device tree offset to search for (if -ve then -ENODEV is returned) | |
113 | * @devp: Returns pointer to device (there is only one for each node) | |
114 | * @return 0 if OK, -ve on error | |
115 | */ | |
116 | int uclass_find_device_by_of_offset(enum uclass_id id, int node, | |
117 | struct udevice **devp); | |
118 | ||
40bb637d SG |
119 | /** |
120 | * uclass_find_device_by_of_node() - Find a uclass device by device tree node | |
121 | * | |
122 | * This searches the devices in the uclass for one attached to the given | |
123 | * device tree node. | |
124 | * | |
125 | * The device is NOT probed, it is merely returned. | |
126 | * | |
127 | * @id: ID to look up | |
128 | * @node: Device tree offset to search for (if NULL then -ENODEV is returned) | |
129 | * @devp: Returns pointer to device (there is only one for each node) | |
130 | * @return 0 if OK, -ve on error | |
131 | */ | |
132 | int uclass_find_device_by_ofnode(enum uclass_id id, ofnode node, | |
133 | struct udevice **devp); | |
134 | ||
6494d708 SG |
135 | /** |
136 | * uclass_bind_device() - Associate device with a uclass | |
137 | * | |
138 | * Connect the device into uclass's list of devices. | |
139 | * | |
140 | * @dev: Pointer to the device | |
141 | * #return 0 on success, -ve on error | |
142 | */ | |
54c5d08a | 143 | int uclass_bind_device(struct udevice *dev); |
6494d708 SG |
144 | |
145 | /** | |
146 | * uclass_unbind_device() - Deassociate device with a uclass | |
147 | * | |
148 | * Disconnect the device from uclass's list of devices. | |
149 | * | |
150 | * @dev: Pointer to the device | |
151 | * #return 0 on success, -ve on error | |
152 | */ | |
0a5804b5 | 153 | #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE) |
54c5d08a | 154 | int uclass_unbind_device(struct udevice *dev); |
7f9875e7 SG |
155 | #else |
156 | static inline int uclass_unbind_device(struct udevice *dev) { return 0; } | |
157 | #endif | |
6494d708 | 158 | |
83c7e434 | 159 | /** |
02c07b37 | 160 | * uclass_pre_probe_device() - Deal with a device that is about to be probed |
83c7e434 SG |
161 | * |
162 | * Perform any pre-processing that is needed by the uclass before it can be | |
02c07b37 SG |
163 | * probed. This includes the uclass' pre-probe() method and the parent |
164 | * uclass' child_pre_probe() method. | |
83c7e434 SG |
165 | * |
166 | * @dev: Pointer to the device | |
167 | * #return 0 on success, -ve on error | |
168 | */ | |
02c07b37 | 169 | int uclass_pre_probe_device(struct udevice *dev); |
83c7e434 | 170 | |
6494d708 SG |
171 | /** |
172 | * uclass_post_probe_device() - Deal with a device that has just been probed | |
173 | * | |
174 | * Perform any post-processing of a probed device that is needed by the | |
175 | * uclass. | |
176 | * | |
177 | * @dev: Pointer to the device | |
178 | * #return 0 on success, -ve on error | |
179 | */ | |
54c5d08a | 180 | int uclass_post_probe_device(struct udevice *dev); |
6494d708 SG |
181 | |
182 | /** | |
183 | * uclass_pre_remove_device() - Handle a device which is about to be removed | |
184 | * | |
185 | * Perform any pre-processing of a device that is about to be removed. | |
186 | * | |
187 | * @dev: Pointer to the device | |
188 | * #return 0 on success, -ve on error | |
189 | */ | |
0a5804b5 | 190 | #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE) |
54c5d08a | 191 | int uclass_pre_remove_device(struct udevice *dev); |
7f9875e7 SG |
192 | #else |
193 | static inline int uclass_pre_remove_device(struct udevice *dev) { return 0; } | |
194 | #endif | |
6494d708 SG |
195 | |
196 | /** | |
197 | * uclass_find() - Find uclass by its id | |
198 | * | |
199 | * @id: Id to serach for | |
200 | * @return pointer to uclass, or NULL if not found | |
201 | */ | |
202 | struct uclass *uclass_find(enum uclass_id key); | |
203 | ||
204 | /** | |
205 | * uclass_destroy() - Destroy a uclass | |
206 | * | |
207 | * Destroy a uclass and all its devices | |
208 | * | |
209 | * @uc: uclass to destroy | |
210 | * @return 0 on success, -ve on error | |
211 | */ | |
212 | int uclass_destroy(struct uclass *uc); | |
213 | ||
214 | #endif |