1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2017 4 * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <dm/lists.h> 10 11 #include "gdsys_soc.h" 12 13 /** 14 * struct gdsys_soc_priv - Private data for gdsys soc bus 15 * @fpga: The gdsys IHS FPGA this bus is associated with 16 */ 17 struct gdsys_soc_priv { 18 struct udevice *fpga; 19 }; 20 21 static const struct udevice_id gdsys_soc_ids[] = { 22 { .compatible = "gdsys,soc" }, 23 { /* sentinel */ } 24 }; 25 26 int gdsys_soc_get_fpga(struct udevice *child, struct udevice **fpga) 27 { 28 struct gdsys_soc_priv *bus_priv; 29 30 if (!child->parent) { 31 debug("%s: Invalid parent\n", child->name); 32 return -EINVAL; 33 } 34 35 if (!device_is_compatible(child->parent, "gdsys,soc")) { 36 debug("%s: Not child of a gdsys soc\n", child->name); 37 return -EINVAL; 38 } 39 40 bus_priv = dev_get_priv(child->parent); 41 42 *fpga = bus_priv->fpga; 43 44 return 0; 45 } 46 47 static int gdsys_soc_probe(struct udevice *dev) 48 { 49 struct gdsys_soc_priv *priv = dev_get_priv(dev); 50 struct udevice *fpga; 51 int res = uclass_get_device_by_phandle(UCLASS_MISC, dev, "fpga", 52 &fpga); 53 if (res == -ENOENT) { 54 debug("%s: Could not find 'fpga' phandle\n", dev->name); 55 return -EINVAL; 56 } 57 58 if (res == -ENODEV) { 59 debug("%s: Could not get FPGA device\n", dev->name); 60 return -EINVAL; 61 } 62 63 priv->fpga = fpga; 64 65 return 0; 66 } 67 68 U_BOOT_DRIVER(gdsys_soc_bus) = { 69 .name = "gdsys_soc_bus", 70 .id = UCLASS_SIMPLE_BUS, 71 .of_match = gdsys_soc_ids, 72 .probe = gdsys_soc_probe, 73 .priv_auto_alloc_size = sizeof(struct gdsys_soc_priv), 74 }; 75