From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wasim Khan Date: Sat, 17 Apr 2021 20:03:32 +0200 Subject: [PATCH] armv8: lx2160ardb: Add thermal node fixup for revc board Message-ID: <20210417180332.1164345-1-wasim.khan@oss.nxp.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de From: Wasim Khan lx2160ardb Rev-C board has i2c node for thermal monitors connected to different chip offset. Add device tree fixup to use lx2160ardb dts and apply thernal node fixups for lx2160ardb Rev-C board. Signed-off-by: Wasim Khan --- board/freescale/lx2160a/lx2160a.c | 119 +++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/board/freescale/lx2160a/lx2160a.c b/board/freescale/lx2160a/lx2160a.c index 47a7024f33..8f75b48f95 100644 --- a/board/freescale/lx2160a/lx2160a.c +++ b/board/freescale/lx2160a/lx2160a.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * Copyright 2018-2020 NXP + * Copyright 2018-2021 NXP */ #include @@ -726,6 +726,116 @@ void board_quiesce_devices(void) } #endif +#if CONFIG_IS_ENABLED(TARGET_LX2160ARDB) +int fdt_fixup_add_thermal(void *blob, int mux_node, int channel, int reg) +{ + int err; + int noff; + int offset; + char channel_node_name[50]; + char thermal_node_name[50]; + u32 phandle; + + snprintf(channel_node_name, sizeof(channel_node_name), + "i2c@%x", channel); + debug("channel_node_name = %s\n", channel_node_name); + + snprintf(thermal_node_name, sizeof(thermal_node_name), + "temperature-sensor@%x", reg); + debug("thermal_node_name = %s\n", thermal_node_name); + + err = fdt_increase_size(blob, 200); + if (err) { + printf("fdt_increase_size: err=%s\n", fdt_strerror(err)); + return err; + } + + noff = fdt_subnode_offset(blob, mux_node, (const char *) + channel_node_name); + if (noff < 0) { + /* channel node not found - create it */ + noff = fdt_add_subnode(blob, mux_node, channel_node_name); + if (noff < 0) { + printf("fdt_add_subnode: err=%s\n", fdt_strerror(err)); + return err; + } + fdt_setprop_u32 (blob, noff, "#address-cells", 1); + fdt_setprop_u32 (blob, noff, "#size-cells", 0); + fdt_setprop_u32 (blob, noff, "reg", channel); + } + + /* Create thermal node*/ + offset = fdt_add_subnode(blob, noff, thermal_node_name); + fdt_setprop(blob, offset, "compatible", "nxp,sa56004", + strlen("nxp,sa56004") + 1); + fdt_setprop_u32 (blob, offset, "reg", reg); + + /* fixup phandle*/ + noff = fdt_node_offset_by_compatible(blob, -1, "regulator-fixed"); + if (noff < 0) { + printf("%s : failed to get phandle\n", __func__); + return noff; + } + phandle = fdt_get_phandle(blob, noff); + fdt_setprop_u32 (blob, offset, "vcc-supply", phandle); + + return 0; +} + +void fdt_fixup_delete_thermal(void *blob, int mux_node, int channel, int reg) +{ + int node; + int value; + int err; + int subnode; + + fdt_for_each_subnode(subnode, blob, mux_node) { + value = fdtdec_get_uint(blob, subnode, "reg", -1); + if (value == channel) { + /* delete thermal node */ + fdt_for_each_subnode(node, blob, subnode) { + value = fdtdec_get_uint(blob, node, "reg", -1); + err = fdt_node_check_compatible(blob, node, + "nxp,sa56004"); + if (!err && value == reg) { + fdt_del_node(blob, node); + break; + } + } + } + } +} + +void fdt_fixup_i2c_thermal_node(void *blob) +{ + int i2coffset; + int mux_node; + int reg; + int err; + + i2coffset = fdt_node_offset_by_compat_reg(blob, "fsl,vf610-i2c", + 0x2000000); + if (i2coffset != -FDT_ERR_NOTFOUND) { + fdt_for_each_subnode(mux_node, blob, i2coffset) { + reg = fdtdec_get_uint(blob, mux_node, "reg", -1); + err = fdt_node_check_compatible(blob, mux_node, + "nxp,pca9547"); + if (!err && reg == 0x77) { + fdt_fixup_delete_thermal(blob, mux_node, + 0x3, 0x4d); + err = fdt_fixup_add_thermal(blob, mux_node, + 0x3, 0x48); + if (err) + printf("%s: Add thermal node failed\n", + __func__); + } + } + } else { + printf("%s: i2c node not found\n", __func__); + } +} +#endif + #ifdef CONFIG_OF_BOARD_SETUP int ft_board_setup(void *blob, struct bd_info *bd) { @@ -737,6 +847,7 @@ int ft_board_setup(void *blob, struct bd_info *bd) u64 mc_memory_base = 0; u64 mc_memory_size = 0; u16 total_memory_banks; + u8 board_rev; ft_cpu_setup(blob, bd); @@ -791,6 +902,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) #endif fdt_fixup_icid(blob); +if (IS_ENABLED(CONFIG_TARGET_LX2160ARDB)) { + board_rev = (QIXIS_READ(arch) & 0xf) - 1 + 'A'; + if (board_rev == 'C') + fdt_fixup_i2c_thermal_node(blob); + } + return 0; } #endif -- 2.25.1