firmware: zynqmp: Add zynqmp-power support
[oweals/u-boot.git] / drivers / firmware / firmware-zynqmp.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Xilinx Zynq MPSoC Firmware driver
4  *
5  * Copyright (C) 2018-2019 Xilinx, Inc.
6  */
7
8 #include <common.h>
9 #include <dm.h>
10
11 #if defined(CONFIG_ZYNQMP_IPI)
12 #include <mailbox.h>
13 #include <asm/arch/sys_proto.h>
14
15 struct zynqmp_power {
16         struct mbox_chan tx_chan;
17         struct mbox_chan rx_chan;
18 } zynqmp_power;
19
20 static int zynqmp_power_probe(struct udevice *dev)
21 {
22         int ret = 0;
23
24         debug("%s, (dev=%p)\n", __func__, dev);
25
26         ret = mbox_get_by_name(dev, "tx", &zynqmp_power.tx_chan);
27         if (ret) {
28                 debug("%s, cannot tx mailbox\n", __func__);
29                 return ret;
30         }
31
32         ret = mbox_get_by_name(dev, "rx", &zynqmp_power.rx_chan);
33         if (ret)
34                 debug("%s, cannot rx mailbox\n", __func__);
35
36         return ret;
37 };
38
39 static const struct udevice_id zynqmp_power_ids[] = {
40         { .compatible = "xlnx,zynqmp-power" },
41         { }
42 };
43
44 U_BOOT_DRIVER(zynqmp_power) = {
45         .name = "zynqmp_power",
46         .id = UCLASS_FIRMWARE,
47         .of_match = zynqmp_power_ids,
48         .probe = zynqmp_power_probe,
49 };
50 #endif
51
52 static const struct udevice_id zynqmp_firmware_ids[] = {
53         { .compatible = "xlnx,zynqmp-firmware" },
54         { .compatible = "xlnx,versal-firmware"},
55         { }
56 };
57
58 U_BOOT_DRIVER(zynqmp_firmware) = {
59         .id = UCLASS_FIRMWARE,
60         .name = "zynqmp-firmware",
61         .probe = dm_scan_fdt_dev,
62         .of_match = zynqmp_firmware_ids,
63 };