xref: /openbmc/u-boot/drivers/qe/fdt.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
269018ce2SKumar Gala /*
369018ce2SKumar Gala  * Copyright 2008 Freescale Semiconductor, Inc.
469018ce2SKumar Gala  *
569018ce2SKumar Gala  * (C) Copyright 2000
669018ce2SKumar Gala  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
769018ce2SKumar Gala  */
869018ce2SKumar Gala 
969018ce2SKumar Gala #include <common.h>
10b08c8c48SMasahiro Yamada #include <linux/libfdt.h>
1169018ce2SKumar Gala #include <fdt_support.h>
122459afb1SQianyu Gong #include <fsl_qe.h>
1369018ce2SKumar Gala 
1493d33204SZhao Qiang #ifdef CONFIG_QE
1569018ce2SKumar Gala DECLARE_GLOBAL_DATA_PTR;
1669018ce2SKumar Gala 
1769018ce2SKumar Gala /*
1869018ce2SKumar Gala  * If a QE firmware has been uploaded, then add the 'firmware' node under
1969018ce2SKumar Gala  * the 'qe' node.
2069018ce2SKumar Gala  */
fdt_fixup_qe_firmware(void * blob)2169018ce2SKumar Gala void fdt_fixup_qe_firmware(void *blob)
2269018ce2SKumar Gala {
2369018ce2SKumar Gala 	struct qe_firmware_info *qe_fw_info;
2469018ce2SKumar Gala 	int node, ret;
2569018ce2SKumar Gala 
2669018ce2SKumar Gala 	qe_fw_info = qe_get_firmware_info();
2769018ce2SKumar Gala 	if (!qe_fw_info)
2869018ce2SKumar Gala 		return;
2969018ce2SKumar Gala 
3069018ce2SKumar Gala 	node = fdt_path_offset(blob, "/qe");
3169018ce2SKumar Gala 	if (node < 0)
3269018ce2SKumar Gala 		return;
3369018ce2SKumar Gala 
3469018ce2SKumar Gala 	/* We assume the node doesn't exist yet */
3569018ce2SKumar Gala 	node = fdt_add_subnode(blob, node, "firmware");
3669018ce2SKumar Gala 	if (node < 0)
3769018ce2SKumar Gala 		return;
3869018ce2SKumar Gala 
3969018ce2SKumar Gala 	ret = fdt_setprop(blob, node, "extended-modes",
4069018ce2SKumar Gala 		&qe_fw_info->extended_modes, sizeof(u64));
4169018ce2SKumar Gala 	if (ret < 0)
4269018ce2SKumar Gala 		goto error;
4369018ce2SKumar Gala 
4469018ce2SKumar Gala 	ret = fdt_setprop_string(blob, node, "id", qe_fw_info->id);
4569018ce2SKumar Gala 	if (ret < 0)
4669018ce2SKumar Gala 		goto error;
4769018ce2SKumar Gala 
4869018ce2SKumar Gala 	ret = fdt_setprop(blob, node, "virtual-traps", qe_fw_info->vtraps,
4969018ce2SKumar Gala 		sizeof(qe_fw_info->vtraps));
5069018ce2SKumar Gala 	if (ret < 0)
5169018ce2SKumar Gala 		goto error;
5269018ce2SKumar Gala 
5369018ce2SKumar Gala 	return;
5469018ce2SKumar Gala 
5569018ce2SKumar Gala error:
5669018ce2SKumar Gala 	fdt_del_node(blob, node);
5769018ce2SKumar Gala }
5869018ce2SKumar Gala 
ft_qe_setup(void * blob)5969018ce2SKumar Gala void ft_qe_setup(void *blob)
6069018ce2SKumar Gala {
6169018ce2SKumar Gala 	do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
6245bae2e3SSimon Glass 		"bus-frequency", gd->arch.qe_clk, 1);
6369018ce2SKumar Gala 	do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
641206c184SSimon Glass 		"brg-frequency", gd->arch.brg_clk, 1);
6569018ce2SKumar Gala 	do_fixup_by_compat_u32(blob, "fsl,qe",
6645bae2e3SSimon Glass 		"clock-frequency", gd->arch.qe_clk, 1);
6769018ce2SKumar Gala 	do_fixup_by_compat_u32(blob, "fsl,qe",
6845bae2e3SSimon Glass 		"bus-frequency", gd->arch.qe_clk, 1);
6969018ce2SKumar Gala 	do_fixup_by_compat_u32(blob, "fsl,qe",
701206c184SSimon Glass 		"brg-frequency", gd->arch.brg_clk, 1);
713fca8037SAnton Vorontsov 	do_fixup_by_compat_u32(blob, "fsl,qe-gtm",
7245bae2e3SSimon Glass 		"clock-frequency", gd->arch.qe_clk / 2, 1);
7369018ce2SKumar Gala 	fdt_fixup_qe_firmware(blob);
7469018ce2SKumar Gala }
7593d33204SZhao Qiang #endif
76