Hi Priyanka, These changes have been tested and validated . If no comments, please merge them . Ethernet changes for RevC boards has dependency on this patch.
Regards, Wasim > -----Original Message----- > From: Wasim Khan <[email protected]> > Sent: Saturday, April 17, 2021 11:34 PM > To: Priyanka Jain <[email protected]>; Varun Sethi <[email protected]> > Cc: [email protected]; Wasim Khan <[email protected]> > Subject: [PATCH] armv8: lx2160ardb: Add thermal node fixup for revc board > > From: Wasim Khan <[email protected]> > > 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 <[email protected]> > --- > 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 <common.h> > @@ -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

