From 48be4a4c7fcddaad8e4da0445c44b7f2c57b4eea Mon Sep 17 00:00:00 2001 From: Apurva Nandan Date: Sat, 7 Oct 2023 04:31:26 +0530 Subject: [PATCH] board: ti: j784s4: Enable OSPI NAND SPL fixup On J784S4, SW3.1 (WKUP_GPIO0_6) is used for selecting between OSPI NOR and OSPI NAND flash. Read the GPIO state, to perform flash enable operation on the fdt, for the valid flash and delete the unconnected flash node. Signed-off-by: Apurva Nandan --- board/ti/j784s4/evm.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/board/ti/j784s4/evm.c b/board/ti/j784s4/evm.c index a59adaf051..f17b88248f 100644 --- a/board/ti/j784s4/evm.c +++ b/board/ti/j784s4/evm.c @@ -72,6 +72,44 @@ int dram_init_banksize(void) return 0; } +/* Enables the spi-nand dts node, if onboard mux is set to spinand */ +static void __maybe_unused detect_enable_spinand(void *blob) +{ + if (IS_ENABLED(CONFIG_DM_GPIO) && IS_ENABLED(CONFIG_OF_LIBFDT)) { + struct gpio_desc desc = {0}; + char *ospi_mux_sel_gpio = "6"; + int nand_offset, nor_offset; + + if (dm_gpio_lookup_name(ospi_mux_sel_gpio, &desc)) + return; + + if (dm_gpio_request(&desc, ospi_mux_sel_gpio)) + return; + + if (dm_gpio_set_dir_flags(&desc, GPIOD_IS_IN)) + return; + + nand_offset = fdt_node_offset_by_compatible(blob, -1, "spi-nand"); + nor_offset = fdt_node_offset_by_compatible(blob, + fdt_parent_offset(blob, nand_offset), + "jedec,spi-nor"); + + if (dm_gpio_get_value(&desc)) { + fdt_status_okay(blob, nand_offset); + fdt_del_node(blob, nor_offset); + } else { + fdt_del_node(blob, nand_offset); + } + } +} + +#if defined(CONFIG_SPL_BUILD) +void spl_perform_fixups(struct spl_image_info *spl_image) +{ + detect_enable_spinand(spl_image->fdt_addr); +} +#endif + #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) int ft_board_setup(void *blob, struct bd_info *bd) { @@ -84,6 +122,8 @@ int ft_board_setup(void *blob, struct bd_info *bd) if (ret) printf("%s: fixing up msmc ram failed %d\n", __func__, ret); + detect_enable_spinand(blob); + return ret; } #endif