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

Reply via email to