xref: /rk3399_ARM-atf/plat/intel/soc/common/drivers/combophy/combophy.c (revision c6b2bb999944b065c3225a2ea61350598ee1a6a0)
1ddaf02d1SJit Loon Lim /*
2ddaf02d1SJit Loon Lim  * Copyright (c) 2022-2023, Intel Corporation. All rights reserved.
3*6f7f8b18SGirisha Dengi  * Copyright (c) 2025, Altera Corporation. All rights reserved.
4ddaf02d1SJit Loon Lim  *
5ddaf02d1SJit Loon Lim  * SPDX-License-Identifier: BSD-3-Clause
6ddaf02d1SJit Loon Lim  */
7ddaf02d1SJit Loon Lim 
8ddaf02d1SJit Loon Lim #include <assert.h>
9ddaf02d1SJit Loon Lim #include <errno.h>
10ddaf02d1SJit Loon Lim #include <stdbool.h>
11ddaf02d1SJit Loon Lim #include <string.h>
12ddaf02d1SJit Loon Lim 
13ddaf02d1SJit Loon Lim #include <arch_helpers.h>
14ddaf02d1SJit Loon Lim #include <common/debug.h>
15ddaf02d1SJit Loon Lim #include <drivers/cadence/cdns_sdmmc.h>
16ddaf02d1SJit Loon Lim #include <drivers/delay_timer.h>
17ddaf02d1SJit Loon Lim #include <lib/mmio.h>
18ddaf02d1SJit Loon Lim #include <lib/utils.h>
19ddaf02d1SJit Loon Lim 
20ddaf02d1SJit Loon Lim #include "combophy.h"
21ddaf02d1SJit Loon Lim #include "sdmmc/sdmmc.h"
22ddaf02d1SJit Loon Lim 
23ddaf02d1SJit Loon Lim /* DFI configuration */
dfi_select(handoff * hoff_ptr)24ddaf02d1SJit Loon Lim int dfi_select(handoff *hoff_ptr)
25ddaf02d1SJit Loon Lim {
266993598fSGirisha Dengi 	uint32_t reg = 0;
276993598fSGirisha Dengi 	uint32_t active_dfi_intf = DFI_CTRL_SEL_HPNFC;
28ddaf02d1SJit Loon Lim 
296993598fSGirisha Dengi 	INFO("Power gate enable hand-off: 0x%08x\n", hoff_ptr->peripheral_pwr_gate_array);
30ddaf02d1SJit Loon Lim 
31*6f7f8b18SGirisha Dengi 	if (hoff_ptr->peripheral_pwr_gate_array & POWER_GATE_EN_SDEMMC) {
326993598fSGirisha Dengi 		INFO("SDEMMC power gate enabled, DFI selected to NAND\n");
336993598fSGirisha Dengi 		/*
346993598fSGirisha Dengi 		 * SDEMMC power gate enabled.
356993598fSGirisha Dengi 		 * This means SDEMMC controller is disabled and active DFI
366993598fSGirisha Dengi 		 * interface is selected to NAND via System manager.
376993598fSGirisha Dengi 		 */
386993598fSGirisha Dengi 		active_dfi_intf = DFI_CTRL_SEL_HPNFC;
39*6f7f8b18SGirisha Dengi 	} else if (hoff_ptr->peripheral_pwr_gate_array & POWER_GATE_EN_NAND) {
406993598fSGirisha Dengi 		INFO("NAND power gate enabled, DFI selected to SDEMMC\n");
416993598fSGirisha Dengi 		/*
426993598fSGirisha Dengi 		 * NAND power gate enabled.
436993598fSGirisha Dengi 		 * This means NAND controller is disabled and active DFI
446993598fSGirisha Dengi 		 * interface is selected to SDEMMC via System manager.
456993598fSGirisha Dengi 		 */
466993598fSGirisha Dengi 		active_dfi_intf = DFI_CTRL_SEL_SDEMMC;
476993598fSGirisha Dengi 	} else {
486993598fSGirisha Dengi 		WARN("Neither SDEMMC nor NAND power gate enabled, by def DFI sel to NAND\n");
49ddaf02d1SJit Loon Lim 	}
50ddaf02d1SJit Loon Lim 
516993598fSGirisha Dengi 	/* Configure the DFI interface select via System manager. */
526993598fSGirisha Dengi 	mmio_setbits_32(SOCFPGA_SYSMGR(DFI_INTF), active_dfi_intf);
536993598fSGirisha Dengi 
546993598fSGirisha Dengi 	/* Read back and confirm the same.*/
556993598fSGirisha Dengi 	reg = mmio_read_32(SOCFPGA_SYSMGR(DFI_INTF));
566993598fSGirisha Dengi 	if ((reg & DFI_INTF_MASK) != active_dfi_intf) {
576993598fSGirisha Dengi 		ERROR("DFI interface select failed, expected: 0x%08x, got: 0x%08x\n",
586993598fSGirisha Dengi 			active_dfi_intf, (reg & DFI_INTF_MASK));
59ddaf02d1SJit Loon Lim 		return -ENXIO;
606993598fSGirisha Dengi 	} else {
616993598fSGirisha Dengi 		NOTICE("DFI interface selected successfully to %s\n",
626993598fSGirisha Dengi 			(reg & DFI_INTF_MASK) == DFI_CTRL_SEL_HPNFC ?
636993598fSGirisha Dengi 			"NAND" : "SDEMMC");
64ddaf02d1SJit Loon Lim 	}
65ddaf02d1SJit Loon Lim 
66ddaf02d1SJit Loon Lim 	return 0;
67ddaf02d1SJit Loon Lim }
68ddaf02d1SJit Loon Lim 
combo_phy_init(handoff * hoff_ptr)69ddaf02d1SJit Loon Lim int combo_phy_init(handoff *hoff_ptr)
70ddaf02d1SJit Loon Lim {
71ddaf02d1SJit Loon Lim 	/* SDMMC/NAND DFI selection based on system manager DFI register */
72ddaf02d1SJit Loon Lim 	int ret = dfi_select(hoff_ptr);
73ddaf02d1SJit Loon Lim 
74ddaf02d1SJit Loon Lim 	if (ret != 0U) {
75ddaf02d1SJit Loon Lim 		ERROR("DFI configuration failed\n");
76ddaf02d1SJit Loon Lim 		return ret;
77ddaf02d1SJit Loon Lim 	}
78ddaf02d1SJit Loon Lim 
79ddaf02d1SJit Loon Lim 	return 0;
80ddaf02d1SJit Loon Lim }