xref: /openbmc/u-boot/drivers/core/device.c (revision 84351792)
1 /*
2  * Device manager
3  *
4  * Copyright (c) 2013 Google, Inc
5  *
6  * (C) Copyright 2012
7  * Pavel Herrmann <morpheus.ibis@gmail.com>
8  *
9  * SPDX-License-Identifier:	GPL-2.0+
10  */
11 
12 #include <common.h>
13 #include <asm/io.h>
14 #include <fdtdec.h>
15 #include <fdt_support.h>
16 #include <malloc.h>
17 #include <dm/device.h>
18 #include <dm/device-internal.h>
19 #include <dm/lists.h>
20 #include <dm/pinctrl.h>
21 #include <dm/platdata.h>
22 #include <dm/uclass.h>
23 #include <dm/uclass-internal.h>
24 #include <dm/util.h>
25 #include <linux/err.h>
26 #include <linux/list.h>
27 
28 DECLARE_GLOBAL_DATA_PTR;
29 
30 static int device_bind_common(struct udevice *parent, const struct driver *drv,
31 			      const char *name, void *platdata,
32 			      ulong driver_data, int of_offset,
33 			      uint of_platdata_size, struct udevice **devp)
34 {
35 	struct udevice *dev;
36 	struct uclass *uc;
37 	int size, ret = 0;
38 
39 	if (devp)
40 		*devp = NULL;
41 	if (!name)
42 		return -EINVAL;
43 
44 	ret = uclass_get(drv->id, &uc);
45 	if (ret) {
46 		debug("Missing uclass for driver %s\n", drv->name);
47 		return ret;
48 	}
49 
50 	dev = calloc(1, sizeof(struct udevice));
51 	if (!dev)
52 		return -ENOMEM;
53 
54 	INIT_LIST_HEAD(&dev->sibling_node);
55 	INIT_LIST_HEAD(&dev->child_head);
56 	INIT_LIST_HEAD(&dev->uclass_node);
57 #ifdef CONFIG_DEVRES
58 	INIT_LIST_HEAD(&dev->devres_head);
59 #endif
60 	dev->platdata = platdata;
61 	dev->driver_data = driver_data;
62 	dev->name = name;
63 	dev->of_offset = of_offset;
64 	dev->parent = parent;
65 	dev->driver = drv;
66 	dev->uclass = uc;
67 
68 	dev->seq = -1;
69 	dev->req_seq = -1;
70 	if (CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DM_SEQ_ALIAS)) {
71 		/*
72 		 * Some devices, such as a SPI bus, I2C bus and serial ports
73 		 * are numbered using aliases.
74 		 *
75 		 * This is just a 'requested' sequence, and will be
76 		 * resolved (and ->seq updated) when the device is probed.
77 		 */
78 		if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
79 			if (uc->uc_drv->name && of_offset != -1) {
80 				fdtdec_get_alias_seq(gd->fdt_blob,
81 						uc->uc_drv->name, of_offset,
82 						&dev->req_seq);
83 			}
84 		}
85 	}
86 
87 	if (drv->platdata_auto_alloc_size) {
88 		bool alloc = !platdata;
89 
90 		if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
91 			if (of_platdata_size) {
92 				dev->flags |= DM_FLAG_OF_PLATDATA;
93 				if (of_platdata_size <
94 						drv->platdata_auto_alloc_size)
95 					alloc = true;
96 			}
97 		}
98 		if (alloc) {
99 			dev->flags |= DM_FLAG_ALLOC_PDATA;
100 			dev->platdata = calloc(1,
101 					       drv->platdata_auto_alloc_size);
102 			if (!dev->platdata) {
103 				ret = -ENOMEM;
104 				goto fail_alloc1;
105 			}
106 			if (CONFIG_IS_ENABLED(OF_PLATDATA) && platdata) {
107 				memcpy(dev->platdata, platdata,
108 				       of_platdata_size);
109 			}
110 		}
111 	}
112 
113 	size = uc->uc_drv->per_device_platdata_auto_alloc_size;
114 	if (size) {
115 		dev->flags |= DM_FLAG_ALLOC_UCLASS_PDATA;
116 		dev->uclass_platdata = calloc(1, size);
117 		if (!dev->uclass_platdata) {
118 			ret = -ENOMEM;
119 			goto fail_alloc2;
120 		}
121 	}
122 
123 	if (parent) {
124 		size = parent->driver->per_child_platdata_auto_alloc_size;
125 		if (!size) {
126 			size = parent->uclass->uc_drv->
127 					per_child_platdata_auto_alloc_size;
128 		}
129 		if (size) {
130 			dev->flags |= DM_FLAG_ALLOC_PARENT_PDATA;
131 			dev->parent_platdata = calloc(1, size);
132 			if (!dev->parent_platdata) {
133 				ret = -ENOMEM;
134 				goto fail_alloc3;
135 			}
136 		}
137 	}
138 
139 	/* put dev into parent's successor list */
140 	if (parent)
141 		list_add_tail(&dev->sibling_node, &parent->child_head);
142 
143 	ret = uclass_bind_device(dev);
144 	if (ret)
145 		goto fail_uclass_bind;
146 
147 	/* if we fail to bind we remove device from successors and free it */
148 	if (drv->bind) {
149 		ret = drv->bind(dev);
150 		if (ret)
151 			goto fail_bind;
152 	}
153 	if (parent && parent->driver->child_post_bind) {
154 		ret = parent->driver->child_post_bind(dev);
155 		if (ret)
156 			goto fail_child_post_bind;
157 	}
158 	if (uc->uc_drv->post_bind) {
159 		ret = uc->uc_drv->post_bind(dev);
160 		if (ret)
161 			goto fail_uclass_post_bind;
162 	}
163 
164 	if (parent)
165 		dm_dbg("Bound device %s to %s\n", dev->name, parent->name);
166 	if (devp)
167 		*devp = dev;
168 
169 	dev->flags |= DM_FLAG_BOUND;
170 
171 	return 0;
172 
173 fail_uclass_post_bind:
174 	/* There is no child unbind() method, so no clean-up required */
175 fail_child_post_bind:
176 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
177 		if (drv->unbind && drv->unbind(dev)) {
178 			dm_warn("unbind() method failed on dev '%s' on error path\n",
179 				dev->name);
180 		}
181 	}
182 
183 fail_bind:
184 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
185 		if (uclass_unbind_device(dev)) {
186 			dm_warn("Failed to unbind dev '%s' on error path\n",
187 				dev->name);
188 		}
189 	}
190 fail_uclass_bind:
191 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
192 		list_del(&dev->sibling_node);
193 		if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
194 			free(dev->parent_platdata);
195 			dev->parent_platdata = NULL;
196 		}
197 	}
198 fail_alloc3:
199 	if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) {
200 		free(dev->uclass_platdata);
201 		dev->uclass_platdata = NULL;
202 	}
203 fail_alloc2:
204 	if (dev->flags & DM_FLAG_ALLOC_PDATA) {
205 		free(dev->platdata);
206 		dev->platdata = NULL;
207 	}
208 fail_alloc1:
209 	devres_release_all(dev);
210 
211 	free(dev);
212 
213 	return ret;
214 }
215 
216 int device_bind_with_driver_data(struct udevice *parent,
217 				 const struct driver *drv, const char *name,
218 				 ulong driver_data, int of_offset,
219 				 struct udevice **devp)
220 {
221 	return device_bind_common(parent, drv, name, NULL, driver_data,
222 				  of_offset, 0, devp);
223 }
224 
225 int device_bind(struct udevice *parent, const struct driver *drv,
226 		const char *name, void *platdata, int of_offset,
227 		struct udevice **devp)
228 {
229 	return device_bind_common(parent, drv, name, platdata, 0, of_offset, 0,
230 				  devp);
231 }
232 
233 int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
234 			const struct driver_info *info, struct udevice **devp)
235 {
236 	struct driver *drv;
237 	uint platdata_size = 0;
238 
239 	drv = lists_driver_lookup_name(info->name);
240 	if (!drv)
241 		return -ENOENT;
242 	if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
243 		return -EPERM;
244 
245 #if CONFIG_IS_ENABLED(OF_PLATDATA)
246 	platdata_size = info->platdata_size;
247 #endif
248 	return device_bind_common(parent, drv, info->name,
249 			(void *)info->platdata, 0, -1, platdata_size, devp);
250 }
251 
252 static void *alloc_priv(int size, uint flags)
253 {
254 	void *priv;
255 
256 	if (flags & DM_FLAG_ALLOC_PRIV_DMA) {
257 		priv = memalign(ARCH_DMA_MINALIGN, size);
258 		if (priv)
259 			memset(priv, '\0', size);
260 	} else {
261 		priv = calloc(1, size);
262 	}
263 
264 	return priv;
265 }
266 
267 int device_probe(struct udevice *dev)
268 {
269 	const struct driver *drv;
270 	int size = 0;
271 	int ret;
272 	int seq;
273 
274 	if (!dev)
275 		return -EINVAL;
276 
277 	if (dev->flags & DM_FLAG_ACTIVATED)
278 		return 0;
279 
280 	drv = dev->driver;
281 	assert(drv);
282 
283 	/* Allocate private data if requested and not reentered */
284 	if (drv->priv_auto_alloc_size && !dev->priv) {
285 		dev->priv = alloc_priv(drv->priv_auto_alloc_size, drv->flags);
286 		if (!dev->priv) {
287 			ret = -ENOMEM;
288 			goto fail;
289 		}
290 	}
291 	/* Allocate private data if requested and not reentered */
292 	size = dev->uclass->uc_drv->per_device_auto_alloc_size;
293 	if (size && !dev->uclass_priv) {
294 		dev->uclass_priv = calloc(1, size);
295 		if (!dev->uclass_priv) {
296 			ret = -ENOMEM;
297 			goto fail;
298 		}
299 	}
300 
301 	/* Ensure all parents are probed */
302 	if (dev->parent) {
303 		size = dev->parent->driver->per_child_auto_alloc_size;
304 		if (!size) {
305 			size = dev->parent->uclass->uc_drv->
306 					per_child_auto_alloc_size;
307 		}
308 		if (size && !dev->parent_priv) {
309 			dev->parent_priv = alloc_priv(size, drv->flags);
310 			if (!dev->parent_priv) {
311 				ret = -ENOMEM;
312 				goto fail;
313 			}
314 		}
315 
316 		ret = device_probe(dev->parent);
317 		if (ret)
318 			goto fail;
319 
320 		/*
321 		 * The device might have already been probed during
322 		 * the call to device_probe() on its parent device
323 		 * (e.g. PCI bridge devices). Test the flags again
324 		 * so that we don't mess up the device.
325 		 */
326 		if (dev->flags & DM_FLAG_ACTIVATED)
327 			return 0;
328 	}
329 
330 	seq = uclass_resolve_seq(dev);
331 	if (seq < 0) {
332 		ret = seq;
333 		goto fail;
334 	}
335 	dev->seq = seq;
336 
337 	dev->flags |= DM_FLAG_ACTIVATED;
338 
339 	/*
340 	 * Process pinctrl for everything except the root device, and
341 	 * continue regardless of the result of pinctrl. Don't process pinctrl
342 	 * settings for pinctrl devices since the device may not yet be
343 	 * probed.
344 	 */
345 	if (dev->parent && device_get_uclass_id(dev) != UCLASS_PINCTRL)
346 		pinctrl_select_state(dev, "default");
347 
348 	ret = uclass_pre_probe_device(dev);
349 	if (ret)
350 		goto fail;
351 
352 	if (dev->parent && dev->parent->driver->child_pre_probe) {
353 		ret = dev->parent->driver->child_pre_probe(dev);
354 		if (ret)
355 			goto fail;
356 	}
357 
358 	if (drv->ofdata_to_platdata && dev->of_offset >= 0) {
359 		ret = drv->ofdata_to_platdata(dev);
360 		if (ret)
361 			goto fail;
362 	}
363 
364 	if (drv->probe) {
365 		ret = drv->probe(dev);
366 		if (ret) {
367 			dev->flags &= ~DM_FLAG_ACTIVATED;
368 			goto fail;
369 		}
370 	}
371 
372 	ret = uclass_post_probe_device(dev);
373 	if (ret)
374 		goto fail_uclass;
375 
376 	if (dev->parent && device_get_uclass_id(dev) == UCLASS_PINCTRL)
377 		pinctrl_select_state(dev, "default");
378 
379 	return 0;
380 fail_uclass:
381 	if (device_remove(dev)) {
382 		dm_warn("%s: Device '%s' failed to remove on error path\n",
383 			__func__, dev->name);
384 	}
385 fail:
386 	dev->flags &= ~DM_FLAG_ACTIVATED;
387 
388 	dev->seq = -1;
389 	device_free(dev);
390 
391 	return ret;
392 }
393 
394 void *dev_get_platdata(struct udevice *dev)
395 {
396 	if (!dev) {
397 		dm_warn("%s: null device\n", __func__);
398 		return NULL;
399 	}
400 
401 	return dev->platdata;
402 }
403 
404 void *dev_get_parent_platdata(struct udevice *dev)
405 {
406 	if (!dev) {
407 		dm_warn("%s: null device\n", __func__);
408 		return NULL;
409 	}
410 
411 	return dev->parent_platdata;
412 }
413 
414 void *dev_get_uclass_platdata(struct udevice *dev)
415 {
416 	if (!dev) {
417 		dm_warn("%s: null device\n", __func__);
418 		return NULL;
419 	}
420 
421 	return dev->uclass_platdata;
422 }
423 
424 void *dev_get_priv(struct udevice *dev)
425 {
426 	if (!dev) {
427 		dm_warn("%s: null device\n", __func__);
428 		return NULL;
429 	}
430 
431 	return dev->priv;
432 }
433 
434 void *dev_get_uclass_priv(struct udevice *dev)
435 {
436 	if (!dev) {
437 		dm_warn("%s: null device\n", __func__);
438 		return NULL;
439 	}
440 
441 	return dev->uclass_priv;
442 }
443 
444 void *dev_get_parent_priv(struct udevice *dev)
445 {
446 	if (!dev) {
447 		dm_warn("%s: null device\n", __func__);
448 		return NULL;
449 	}
450 
451 	return dev->parent_priv;
452 }
453 
454 static int device_get_device_tail(struct udevice *dev, int ret,
455 				  struct udevice **devp)
456 {
457 	if (ret)
458 		return ret;
459 
460 	ret = device_probe(dev);
461 	if (ret)
462 		return ret;
463 
464 	*devp = dev;
465 
466 	return 0;
467 }
468 
469 int device_get_child(struct udevice *parent, int index, struct udevice **devp)
470 {
471 	struct udevice *dev;
472 
473 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
474 		if (!index--)
475 			return device_get_device_tail(dev, 0, devp);
476 	}
477 
478 	return -ENODEV;
479 }
480 
481 int device_find_child_by_seq(struct udevice *parent, int seq_or_req_seq,
482 			     bool find_req_seq, struct udevice **devp)
483 {
484 	struct udevice *dev;
485 
486 	*devp = NULL;
487 	if (seq_or_req_seq == -1)
488 		return -ENODEV;
489 
490 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
491 		if ((find_req_seq ? dev->req_seq : dev->seq) ==
492 				seq_or_req_seq) {
493 			*devp = dev;
494 			return 0;
495 		}
496 	}
497 
498 	return -ENODEV;
499 }
500 
501 int device_get_child_by_seq(struct udevice *parent, int seq,
502 			    struct udevice **devp)
503 {
504 	struct udevice *dev;
505 	int ret;
506 
507 	*devp = NULL;
508 	ret = device_find_child_by_seq(parent, seq, false, &dev);
509 	if (ret == -ENODEV) {
510 		/*
511 		 * We didn't find it in probed devices. See if there is one
512 		 * that will request this seq if probed.
513 		 */
514 		ret = device_find_child_by_seq(parent, seq, true, &dev);
515 	}
516 	return device_get_device_tail(dev, ret, devp);
517 }
518 
519 int device_find_child_by_of_offset(struct udevice *parent, int of_offset,
520 				   struct udevice **devp)
521 {
522 	struct udevice *dev;
523 
524 	*devp = NULL;
525 
526 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
527 		if (dev->of_offset == of_offset) {
528 			*devp = dev;
529 			return 0;
530 		}
531 	}
532 
533 	return -ENODEV;
534 }
535 
536 int device_get_child_by_of_offset(struct udevice *parent, int node,
537 				  struct udevice **devp)
538 {
539 	struct udevice *dev;
540 	int ret;
541 
542 	*devp = NULL;
543 	ret = device_find_child_by_of_offset(parent, node, &dev);
544 	return device_get_device_tail(dev, ret, devp);
545 }
546 
547 static struct udevice *_device_find_global_by_of_offset(struct udevice *parent,
548 							int of_offset)
549 {
550 	struct udevice *dev, *found;
551 
552 	if (parent->of_offset == of_offset)
553 		return parent;
554 
555 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
556 		found = _device_find_global_by_of_offset(dev, of_offset);
557 		if (found)
558 			return found;
559 	}
560 
561 	return NULL;
562 }
563 
564 int device_get_global_by_of_offset(int of_offset, struct udevice **devp)
565 {
566 	struct udevice *dev;
567 
568 	dev = _device_find_global_by_of_offset(gd->dm_root, of_offset);
569 	return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
570 }
571 
572 int device_find_first_child(struct udevice *parent, struct udevice **devp)
573 {
574 	if (list_empty(&parent->child_head)) {
575 		*devp = NULL;
576 	} else {
577 		*devp = list_first_entry(&parent->child_head, struct udevice,
578 					 sibling_node);
579 	}
580 
581 	return 0;
582 }
583 
584 int device_find_next_child(struct udevice **devp)
585 {
586 	struct udevice *dev = *devp;
587 	struct udevice *parent = dev->parent;
588 
589 	if (list_is_last(&dev->sibling_node, &parent->child_head)) {
590 		*devp = NULL;
591 	} else {
592 		*devp = list_entry(dev->sibling_node.next, struct udevice,
593 				   sibling_node);
594 	}
595 
596 	return 0;
597 }
598 
599 struct udevice *dev_get_parent(struct udevice *child)
600 {
601 	return child->parent;
602 }
603 
604 ulong dev_get_driver_data(struct udevice *dev)
605 {
606 	return dev->driver_data;
607 }
608 
609 const void *dev_get_driver_ops(struct udevice *dev)
610 {
611 	if (!dev || !dev->driver->ops)
612 		return NULL;
613 
614 	return dev->driver->ops;
615 }
616 
617 enum uclass_id device_get_uclass_id(struct udevice *dev)
618 {
619 	return dev->uclass->uc_drv->id;
620 }
621 
622 const char *dev_get_uclass_name(struct udevice *dev)
623 {
624 	if (!dev)
625 		return NULL;
626 
627 	return dev->uclass->uc_drv->name;
628 }
629 
630 fdt_addr_t dev_get_addr_index(struct udevice *dev, int index)
631 {
632 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
633 	fdt_addr_t addr;
634 
635 	if (CONFIG_IS_ENABLED(OF_TRANSLATE)) {
636 		const fdt32_t *reg;
637 		int len = 0;
638 		int na, ns;
639 
640 		na = fdt_address_cells(gd->fdt_blob, dev->parent->of_offset);
641 		if (na < 1) {
642 			debug("bad #address-cells\n");
643 			return FDT_ADDR_T_NONE;
644 		}
645 
646 		ns = fdt_size_cells(gd->fdt_blob, dev->parent->of_offset);
647 		if (ns < 0) {
648 			debug("bad #size-cells\n");
649 			return FDT_ADDR_T_NONE;
650 		}
651 
652 		reg = fdt_getprop(gd->fdt_blob, dev->of_offset, "reg", &len);
653 		if (!reg || (len <= (index * sizeof(fdt32_t) * (na + ns)))) {
654 			debug("Req index out of range\n");
655 			return FDT_ADDR_T_NONE;
656 		}
657 
658 		reg += index * (na + ns);
659 
660 		/*
661 		 * Use the full-fledged translate function for complex
662 		 * bus setups.
663 		 */
664 		addr = fdt_translate_address((void *)gd->fdt_blob,
665 					     dev->of_offset, reg);
666 	} else {
667 		/*
668 		 * Use the "simple" translate function for less complex
669 		 * bus setups.
670 		 */
671 		addr = fdtdec_get_addr_size_auto_parent(gd->fdt_blob,
672 							dev->parent->of_offset,
673 							dev->of_offset, "reg",
674 							index, NULL, false);
675 		if (CONFIG_IS_ENABLED(SIMPLE_BUS) && addr != FDT_ADDR_T_NONE) {
676 			if (device_get_uclass_id(dev->parent) ==
677 			    UCLASS_SIMPLE_BUS)
678 				addr = simple_bus_translate(dev->parent, addr);
679 		}
680 	}
681 
682 	/*
683 	 * Some platforms need a special address translation. Those
684 	 * platforms (e.g. mvebu in SPL) can configure a translation
685 	 * offset in the DM by calling dm_set_translation_offset() that
686 	 * will get added to all addresses returned by dev_get_addr().
687 	 */
688 	addr += dm_get_translation_offset();
689 
690 	return addr;
691 #else
692 	return FDT_ADDR_T_NONE;
693 #endif
694 }
695 
696 fdt_addr_t dev_get_addr_name(struct udevice *dev, const char *name)
697 {
698 #if CONFIG_IS_ENABLED(OF_CONTROL)
699 	int index;
700 
701 	index = fdt_find_string(gd->fdt_blob, dev->of_offset, "reg-names",
702 				name);
703 	if (index < 0)
704 		return index;
705 
706 	return dev_get_addr_index(dev, index);
707 #else
708 	return FDT_ADDR_T_NONE;
709 #endif
710 }
711 
712 fdt_addr_t dev_get_addr(struct udevice *dev)
713 {
714 	return dev_get_addr_index(dev, 0);
715 }
716 
717 void *dev_get_addr_ptr(struct udevice *dev)
718 {
719 	return (void *)(uintptr_t)dev_get_addr_index(dev, 0);
720 }
721 
722 void *dev_map_physmem(struct udevice *dev, unsigned long size)
723 {
724 	fdt_addr_t addr = dev_get_addr(dev);
725 
726 	if (addr == FDT_ADDR_T_NONE)
727 		return NULL;
728 
729 	return map_physmem(addr, size, MAP_NOCACHE);
730 }
731 
732 bool device_has_children(struct udevice *dev)
733 {
734 	return !list_empty(&dev->child_head);
735 }
736 
737 bool device_has_active_children(struct udevice *dev)
738 {
739 	struct udevice *child;
740 
741 	for (device_find_first_child(dev, &child);
742 	     child;
743 	     device_find_next_child(&child)) {
744 		if (device_active(child))
745 			return true;
746 	}
747 
748 	return false;
749 }
750 
751 bool device_is_last_sibling(struct udevice *dev)
752 {
753 	struct udevice *parent = dev->parent;
754 
755 	if (!parent)
756 		return false;
757 	return list_is_last(&dev->sibling_node, &parent->child_head);
758 }
759 
760 void device_set_name_alloced(struct udevice *dev)
761 {
762 	dev->flags |= DM_FLAG_NAME_ALLOCED;
763 }
764 
765 int device_set_name(struct udevice *dev, const char *name)
766 {
767 	name = strdup(name);
768 	if (!name)
769 		return -ENOMEM;
770 	dev->name = name;
771 	device_set_name_alloced(dev);
772 
773 	return 0;
774 }
775 
776 bool of_device_is_compatible(struct udevice *dev, const char *compat)
777 {
778 	const void *fdt = gd->fdt_blob;
779 
780 	return !fdt_node_check_compatible(fdt, dev->of_offset, compat);
781 }
782 
783 bool of_machine_is_compatible(const char *compat)
784 {
785 	const void *fdt = gd->fdt_blob;
786 
787 	return !fdt_node_check_compatible(fdt, 0, compat);
788 }
789