169018ce2SKumar Gala /*
269018ce2SKumar Gala * Copyright 2008 Freescale Semiconductor, Inc.
369018ce2SKumar Gala *
469018ce2SKumar Gala * (C) Copyright 2000
569018ce2SKumar Gala * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
669018ce2SKumar Gala *
71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
869018ce2SKumar Gala */
969018ce2SKumar Gala
1069018ce2SKumar Gala #include <common.h>
11*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
1269018ce2SKumar Gala #include <fdt_support.h>
132459afb1SQianyu Gong #include <fsl_qe.h>
1469018ce2SKumar Gala
1593d33204SZhao Qiang #ifdef CONFIG_QE
1669018ce2SKumar Gala DECLARE_GLOBAL_DATA_PTR;
1769018ce2SKumar Gala
1869018ce2SKumar Gala /*
1969018ce2SKumar Gala * If a QE firmware has been uploaded, then add the 'firmware' node under
2069018ce2SKumar Gala * the 'qe' node.
2169018ce2SKumar Gala */
fdt_fixup_qe_firmware(void * blob)2269018ce2SKumar Gala void fdt_fixup_qe_firmware(void *blob)
2369018ce2SKumar Gala {
2469018ce2SKumar Gala struct qe_firmware_info *qe_fw_info;
2569018ce2SKumar Gala int node, ret;
2669018ce2SKumar Gala
2769018ce2SKumar Gala qe_fw_info = qe_get_firmware_info();
2869018ce2SKumar Gala if (!qe_fw_info)
2969018ce2SKumar Gala return;
3069018ce2SKumar Gala
3169018ce2SKumar Gala node = fdt_path_offset(blob, "/qe");
3269018ce2SKumar Gala if (node < 0)
3369018ce2SKumar Gala return;
3469018ce2SKumar Gala
3569018ce2SKumar Gala /* We assume the node doesn't exist yet */
3669018ce2SKumar Gala node = fdt_add_subnode(blob, node, "firmware");
3769018ce2SKumar Gala if (node < 0)
3869018ce2SKumar Gala return;
3969018ce2SKumar Gala
4069018ce2SKumar Gala ret = fdt_setprop(blob, node, "extended-modes",
4169018ce2SKumar Gala &qe_fw_info->extended_modes, sizeof(u64));
4269018ce2SKumar Gala if (ret < 0)
4369018ce2SKumar Gala goto error;
4469018ce2SKumar Gala
4569018ce2SKumar Gala ret = fdt_setprop_string(blob, node, "id", qe_fw_info->id);
4669018ce2SKumar Gala if (ret < 0)
4769018ce2SKumar Gala goto error;
4869018ce2SKumar Gala
4969018ce2SKumar Gala ret = fdt_setprop(blob, node, "virtual-traps", qe_fw_info->vtraps,
5069018ce2SKumar Gala sizeof(qe_fw_info->vtraps));
5169018ce2SKumar Gala if (ret < 0)
5269018ce2SKumar Gala goto error;
5369018ce2SKumar Gala
5469018ce2SKumar Gala return;
5569018ce2SKumar Gala
5669018ce2SKumar Gala error:
5769018ce2SKumar Gala fdt_del_node(blob, node);
5869018ce2SKumar Gala }
5969018ce2SKumar Gala
ft_qe_setup(void * blob)6069018ce2SKumar Gala void ft_qe_setup(void *blob)
6169018ce2SKumar Gala {
6269018ce2SKumar Gala do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
6345bae2e3SSimon Glass "bus-frequency", gd->arch.qe_clk, 1);
6469018ce2SKumar Gala do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
651206c184SSimon Glass "brg-frequency", gd->arch.brg_clk, 1);
6669018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe",
6745bae2e3SSimon Glass "clock-frequency", gd->arch.qe_clk, 1);
6869018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe",
6945bae2e3SSimon Glass "bus-frequency", gd->arch.qe_clk, 1);
7069018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe",
711206c184SSimon Glass "brg-frequency", gd->arch.brg_clk, 1);
723fca8037SAnton Vorontsov do_fixup_by_compat_u32(blob, "fsl,qe-gtm",
7345bae2e3SSimon Glass "clock-frequency", gd->arch.qe_clk / 2, 1);
7469018ce2SKumar Gala fdt_fixup_qe_firmware(blob);
7569018ce2SKumar Gala }
7693d33204SZhao Qiang #endif
77