diff options
Diffstat (limited to 'src/soc/broadcom/cygnus/hw_init.c')
-rw-r--r-- | src/soc/broadcom/cygnus/hw_init.c | 759 |
1 files changed, 0 insertions, 759 deletions
diff --git a/src/soc/broadcom/cygnus/hw_init.c b/src/soc/broadcom/cygnus/hw_init.c deleted file mode 100644 index ce5592fb40..0000000000 --- a/src/soc/broadcom/cygnus/hw_init.c +++ /dev/null @@ -1,759 +0,0 @@ -/* - * Copyright (C) 2015 Broadcom Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <arch/io.h> -#include <delay.h> -#include <console/console.h> -#include <soc/tz.h> -#include <soc/hw_init.h> - -/***************************************************************************** - * TrustZone - *****************************************************************************/ -#define IHOST_SCU_SECURE_ACCESS 0x19020054 - -#define SMAU_NIC_IDM_TZ_BASE 0x180150a0 -#define SMAU_DDR_TZ_BASE 0x18015200 -#define SMAU_FLASH0_TZ_BASE 0x18015300 -#define SMAU_FLASH1_TZ_BASE 0x18015308 -#define SMAU_FLASH2_TZ_BASE 0x18015310 -#define SMAU_FLASH3_TZ_BASE 0x18015318 -#define SMAU_TZ_BASE_ENABLE 0x00000001 - -#define CRMU_IPROC_ADDR_RANGE0_LOW 0x03024c30 -#define CRMU_IPROC_ADDR_RANGE0_HIGH 0x03024c34 -#define CRMU_ADDR_MASK 0xffffff00 -#define CRMU_ADDR_VALID 0x00000001 -#define CRMU_ADDR_START 0x03010000 -#define CRMU_ADDR_END 0x03100000 - -static void scu_ns_config(void) -{ - /* - * Enable NS SCU access to ARM global timer, private timer, and - * components - */ - write32((void *)IHOST_SCU_SECURE_ACCESS, 0xFFF); -} - -static void smau_ns_config(void) -{ - unsigned int val; - - /* Disable SMAU NIC IDM TZ */ - val = read32((void *)SMAU_NIC_IDM_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_NIC_IDM_TZ_BASE, val); - - /* - * Disable DDR TZ base - * - * This means the entire DDR is marked as NONSECURE (NS) - * - * NOTE: In the future, multiple regions of DDR may need to be marked - * as SECURE for secure OS and other TZ usages - */ - val = read32((void *)SMAU_DDR_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_DDR_TZ_BASE, val); - - - /* - * Disable flash TZ support - * - * The entire flash is currently marked as NS - * - * NOTE: In the future, multiple regions of flash may need to be marked - * as SECURE for secure OS and other TZ firmware/data storage - */ - - /* Flash 0: ROM */ - val = read32((void *)SMAU_FLASH0_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_FLASH0_TZ_BASE, val); - - /* Flash 1: QSPI */ - val = read32((void *)SMAU_FLASH1_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_FLASH1_TZ_BASE, val); - - /* Flash 2: NAND */ - val = read32((void *)SMAU_FLASH2_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_FLASH2_TZ_BASE, val); - - /* Flash 3: PNOR */ - val = read32((void *)SMAU_FLASH3_TZ_BASE); - val &= ~SMAU_TZ_BASE_ENABLE; - write32((void *)SMAU_FLASH3_TZ_BASE, val); -} - -static void crmu_ns_config(void) -{ - - /* - * Currently opens up the entire CRMU to allow iPROC NS access - * - * NOTE: In the future, we might want to protect particular CRMU - * sub-blocks to allow SECURE access only. That can be done by - * programming the CRMU IPROC address range registers. Up to 4 access - * windows can be created - */ - write32((void *)CRMU_IPROC_ADDR_RANGE0_LOW, - (CRMU_ADDR_START & CRMU_ADDR_MASK) | CRMU_ADDR_VALID); - write32((void *)CRMU_IPROC_ADDR_RANGE0_HIGH, - (CRMU_ADDR_END & CRMU_ADDR_MASK) | CRMU_ADDR_VALID); -} - -static void tz_init(void) -{ - /* Configure the Cygnus for non-secure access */ - /* ARM Cortex A9 SCU NS access configuration */ - scu_ns_config(); - - /* SMAU NS related configurations */ - smau_ns_config(); - - /* CRMU NS related configurations */ - crmu_ns_config(); - - /* - * Configure multiple masters and slaves to run in NS - */ - tz_set_non_virtual_slaves_security(0xFFFFFFFF, TZ_STATE_NON_SECURE); - tz_set_periph_security(0xFFFFFFFF, TZ_STATE_NON_SECURE); - tz_set_masters_security(0xFFFFFFFF, TZ_STATE_NON_SECURE); - tz_set_wrapper_security(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - TZ_STATE_NON_SECURE); - tz_set_cfg_slaves_security(0xFFFFFFFF, TZ_STATE_NON_SECURE); - - tz_set_ext_slaves_security(0xFFFFFFFF, TZ_STATE_NON_SECURE); - - /* configure sec peripherals to be accessed from non-secure world */ - tz_set_sec_periphs_security(0xFFFFFFFF & - ~(CYGNUS_sec_periph_APBz_sotp | - CYGNUS_sec_periph_APBz_tzpc), - TZ_STATE_NON_SECURE); - - /* default sram to non-secure */ - tz_set_sram_sec_region(0); -} - -/***************************************************************************** - * DMAC - *****************************************************************************/ -#define DMAC_M0_IDM_RESET_CONTROL 0x1810f800 -#define DMAC_RESET_MASK 0x00000001 -#define DMAC_RESET_TIMEOUT 1000 - -static void dmac_init(void) -{ - unsigned int val, timeout; - - /* bring the DMAC block out of reset */ - val = read32((void *)DMAC_M0_IDM_RESET_CONTROL); - val |= DMAC_RESET_MASK; - write32((void *)DMAC_M0_IDM_RESET_CONTROL, val); - udelay(10); - val &= ~DMAC_RESET_MASK; - write32((void *)DMAC_M0_IDM_RESET_CONTROL, val); - - timeout = 0; - while (read32((void *)DMAC_M0_IDM_RESET_CONTROL) & DMAC_RESET_MASK) { - udelay(1); - if (timeout++ > DMAC_RESET_TIMEOUT) - die("Failed to bring PL330 DMAC out of reset\n"); - } -} - -/***************************************************************************** - * Neon - *****************************************************************************/ -#define CRU_CONTROL 0x1800e000 -#define CRU_CONTROL_NEON_RESET_N 0x00000040 - -#define CRU_IHOST_PWRDWN_EN 0x1800e004 -#define CRU_IHOST_PWRDWN_EN_CLAMPON_NEON 0x00100000 -#define CRU_IHOST_PWRDWN_EN_PWRON_NEON 0x00200000 -#define CRU_IHOST_PWRDWN_EN_PWROK_NEON 0x00400000 - -#define CRU_IHOST_PWRDWN_STATUS 0x1800e008 -#define CRU_IHOST_PWRDWN_STATUS_PWRON_NEON 0x00200000 -#define CRU_IHOST_PWRDWN_STATUS_PWROK_NEON 0x00400000 - -#define CRU_STATUS_DELAY_US 1 -#define CRU_MAX_RETRY_COUNT 10 -#define CRU_RETRY_INTVL_US 1 - -static void neon_init(void) -{ - unsigned int i, val; - - /* put Neon into reset */ - val = read32((void *)CRU_CONTROL); - val &= ~CRU_CONTROL_NEON_RESET_N; - write32((void *)CRU_CONTROL, val); - - /* assert the power on register bit */ - val = read32((void *)CRU_IHOST_PWRDWN_EN); - val |= CRU_IHOST_PWRDWN_EN_PWRON_NEON; - write32((void *)CRU_IHOST_PWRDWN_EN, val); - - /* wait for power on */ - i = 0; - while (!(read32((void *)CRU_IHOST_PWRDWN_STATUS) & - CRU_IHOST_PWRDWN_STATUS_PWRON_NEON)) { - udelay(CRU_RETRY_INTVL_US); - if (i++ >= CRU_MAX_RETRY_COUNT) - die("Failed to ack NEON power on\n"); - } - - udelay(CRU_STATUS_DELAY_US); - - /* assert the power ok register bit */ - val = read32((void *)CRU_IHOST_PWRDWN_EN); - val |= CRU_IHOST_PWRDWN_EN_PWROK_NEON; - write32((void *)CRU_IHOST_PWRDWN_EN, val); - - /* wait for power ok */ - i = 0; - while (!(read32((void *)CRU_IHOST_PWRDWN_STATUS) & - CRU_IHOST_PWRDWN_STATUS_PWROK_NEON)) { - udelay(CRU_RETRY_INTVL_US); - if (i++ >= CRU_MAX_RETRY_COUNT) - die("Failed to ack NEON power ok\n"); - } - - udelay(CRU_STATUS_DELAY_US); - - /* clamp off for the NEON block */ - val = read32((void *)CRU_IHOST_PWRDWN_EN); - val &= ~CRU_IHOST_PWRDWN_EN_CLAMPON_NEON; - write32((void *)CRU_IHOST_PWRDWN_EN, val); - - udelay(CRU_STATUS_DELAY_US); - - /* bring NEON out of reset */ - val = read32((void *)CRU_CONTROL); - val |= CRU_CONTROL_NEON_RESET_N; - write32((void *)CRU_CONTROL, val); -} - -/***************************************************************************** - * PCIe - *****************************************************************************/ -#define CRMU_PCIE_CFG 0x0301d0a0 -#define PCIE0_LNK_PHY_IDDQ 0x00000004 -#define PCIE1_LNK_PHY_IDDQ 0x00000400 - -static void pcie_init(void) -{ - unsigned int val; - - /* - * Force all AFEs of both PCIe0 and PCIe1 to be powered down, including - * pad biasing - * - * This brings down the PCIe interfaces to the lowest possible power - * mode - */ - val = read32((void *)CRMU_PCIE_CFG); - val |= PCIE1_LNK_PHY_IDDQ | PCIE0_LNK_PHY_IDDQ; - write32((void *)CRMU_PCIE_CFG, val); -} - -/***************************************************************************** - * M0 - *****************************************************************************/ -#define CRMU_MCU_ACCESS_CONTROL 0x03024c00 -#define CRMU_MCU_ACCESS_MODE_SECURE 0x2 - -static void M0_init(void) -{ - /* Set M0 as a secure master */ - write32((void *)CRMU_MCU_ACCESS_CONTROL, CRMU_MCU_ACCESS_MODE_SECURE); -} - -/***************************************************************************** - * CCU - *****************************************************************************/ -#define IHOST_PROC_CLK_WR_ACCESS 0x19000000 -#define IHOST_PROC_CLK_POLICY_FREQ 0x19000008 -#define IHOST_PROC_CLK_POLICY_CTL 0x1900000c -#define IHOST_PROC_CLK_POLICY0_MASK 0x19000010 -#define IHOST_PROC_CLK_POLICY1_MASK 0x19000014 -#define IHOST_PROC_CLK_POLICY2_MASK 0x19000018 -#define IHOST_PROC_CLK_POLICY3_MASK 0x1900001c -#define IHOST_PROC_CLK_INTEN 0x19000020 -#define IHOST_PROC_CLK_INTSTAT 0x19000024 -#define IHOST_PROC_CLK_LVM_EN 0x19000034 -#define IHOST_PROC_CLK_LVM0_3 0x19000038 -#define IHOST_PROC_CLK_LVM4_7 0x1900003c -#define IHOST_PROC_CLK_VLT0_3 0x19000040 -#define IHOST_PROC_CLK_VLT4_7 0x19000044 -#define IHOST_PROC_CLK_BUS_QUIESC 0x19000100 -#define IHOST_PROC_CLK_CORE0_CLKGATE 0x19000200 -#define IHOST_PROC_CLK_CORE1_CLKGATE 0x19000204 -#define IHOST_PROC_CLK_ARM_SWITCH_CLKGATE 0x19000210 -#define IHOST_PROC_CLK_ARM_PERIPH_CLKGATE 0x19000300 -#define IHOST_PROC_CLK_APB0_CLKGATE 0x19000400 -#define IHOST_PROC_CLK_PL310_DIV 0x19000a00 -#define IHOST_PROC_CLK_PL310_TRIGGER 0x19000a04 -#define IHOST_PROC_CLK_ARM_SWITCH_DIV 0x19000a08 -#define IHOST_PROC_CLK_ARM_SWITCH_TRIGGER 0x19000a0c -#define IHOST_PROC_CLK_APB_DIV 0x19000a10 -#define IHOST_PROC_CLK_APB_DIV_TRIGGER 0x19000a14 -#define IHOST_PROC_CLK_PLLARMA 0x19000c00 -#define IHOST_PROC_CLK_PLLARMB 0x19000c04 -#define IHOST_PROC_CLK_PLLARMC 0x19000c08 -#define IHOST_PROC_CLK_PLLARMCTRL0 0x19000c0c -#define IHOST_PROC_CLK_PLLARMCTRL1 0x19000c10 -#define IHOST_PROC_CLK_PLLARMCTRL2 0x19000c14 -#define IHOST_PROC_CLK_PLLARMCTRL3 0x19000c18 -#define IHOST_PROC_CLK_PLLARMCTRL4 0x19000c1c -#define IHOST_PROC_CLK_PLLARMCTRL5 0x19000c20 -#define IHOST_PROC_CLK_PLLARM_OFFSET 0x19000c24 -#define IHOST_PROC_CLK_ARM_DIV 0x19000e00 -#define IHOST_PROC_CLK_ARM_SEG_TRG 0x19000e04 -#define IHOST_PROC_CLK_ARM_SEG_TRG_OVERRIDE 0x19000e08 -#define IHOST_PROC_CLK_PLL_DEBUG 0x19000e10 -#define IHOST_PROC_CLK_ACTIVITY_MON1 0x19000e20 -#define IHOST_PROC_CLK_ACTIVITY_MON2 0x19000e24 -#define IHOST_PROC_CLK_CLKGATE_DBG 0x19000e40 -#define IHOST_PROC_CLK_APB_CLKGATE_DBG1 0x19000e48 -#define IHOST_PROC_CLK_CLKMON 0x19000e64 -#define IHOST_PROC_CLK_POLICY_DBG 0x19000ec0 -#define IHOST_PROC_CLK_TGTMASK_DBG1 0x19000ec4 -#define IHOST_PROC_RST_WR_ACCESS 0x19000f00 -#define IHOST_PROC_RST_SOFT_RSTN 0x19000f04 -#define IHOST_PROC_RST_A9_CORE_SOFT_RSTN 0x19000f08 - -#define WR_ACCESS_PRIVATE_ACCESS_MODE 0x80000000 - -static uint32_t ccu_reg[] = { - IHOST_PROC_CLK_WR_ACCESS, - IHOST_PROC_CLK_POLICY_FREQ, - IHOST_PROC_CLK_POLICY_CTL, - IHOST_PROC_CLK_POLICY0_MASK, - IHOST_PROC_CLK_POLICY1_MASK, - IHOST_PROC_CLK_POLICY2_MASK, - IHOST_PROC_CLK_POLICY3_MASK, - IHOST_PROC_CLK_INTEN, - IHOST_PROC_CLK_INTSTAT, - IHOST_PROC_CLK_LVM_EN, - IHOST_PROC_CLK_LVM0_3, - IHOST_PROC_CLK_LVM4_7, - IHOST_PROC_CLK_VLT0_3, - IHOST_PROC_CLK_VLT4_7, - IHOST_PROC_CLK_BUS_QUIESC, - IHOST_PROC_CLK_CORE0_CLKGATE, - IHOST_PROC_CLK_CORE1_CLKGATE, - IHOST_PROC_CLK_ARM_SWITCH_CLKGATE, - IHOST_PROC_CLK_ARM_PERIPH_CLKGATE, - IHOST_PROC_CLK_APB0_CLKGATE, - IHOST_PROC_CLK_PL310_DIV, - IHOST_PROC_CLK_PL310_TRIGGER, - IHOST_PROC_CLK_ARM_SWITCH_DIV, - IHOST_PROC_CLK_ARM_SWITCH_TRIGGER, - IHOST_PROC_CLK_APB_DIV, - IHOST_PROC_CLK_APB_DIV_TRIGGER, - IHOST_PROC_CLK_PLLARMA, - IHOST_PROC_CLK_PLLARMB, - IHOST_PROC_CLK_PLLARMC, - IHOST_PROC_CLK_PLLARMCTRL0, - IHOST_PROC_CLK_PLLARMCTRL1, - IHOST_PROC_CLK_PLLARMCTRL2, - IHOST_PROC_CLK_PLLARMCTRL3, - IHOST_PROC_CLK_PLLARMCTRL4, - IHOST_PROC_CLK_PLLARMCTRL5, - IHOST_PROC_CLK_PLLARM_OFFSET, - IHOST_PROC_CLK_ARM_DIV, - IHOST_PROC_CLK_ARM_SEG_TRG, - IHOST_PROC_CLK_ARM_SEG_TRG_OVERRIDE, - IHOST_PROC_CLK_PLL_DEBUG, - IHOST_PROC_CLK_ACTIVITY_MON1, - IHOST_PROC_CLK_ACTIVITY_MON2, - IHOST_PROC_CLK_CLKGATE_DBG, - IHOST_PROC_CLK_APB_CLKGATE_DBG1, - IHOST_PROC_CLK_CLKMON, - IHOST_PROC_CLK_POLICY_DBG, - IHOST_PROC_CLK_TGTMASK_DBG1, - IHOST_PROC_RST_WR_ACCESS, - IHOST_PROC_RST_SOFT_RSTN, - IHOST_PROC_RST_A9_CORE_SOFT_RSTN -}; - -#define CCU_REG_TABLE_SIZE (sizeof(ccu_reg)/sizeof(ccu_reg[0])) - -/* Set priv_access_mode field to unrestricted (0) */ -static void ccu_init(void) -{ - uint32_t val; - uint32_t i; - for (i = 0; i < CCU_REG_TABLE_SIZE; i++) { - val = read32((void *)(ccu_reg[i])); - val &= ~WR_ACCESS_PRIVATE_ACCESS_MODE; - write32((void *)(ccu_reg[i]), val); - } -} - -/***************************************************************************** - * LCD - *****************************************************************************/ -#define ASIU_TOP_CLK_GATING_CTRL 0x180aa024 -#define ASIU_TOP_CLK_GATING_CTRL_LCD_CLK_GATE_EN 0x00000010 -#define ASIU_TOP_CLK_GATING_CTRL_MIPI_DSI_CLK_GATE_EN 0x00000008 -#define ASIU_TOP_CLK_GATING_CTRL_GFX_CLK_GATE_EN 0x00000001 -#define ASIU_TOP_CLK_GATING_CTRL_AUD_CLK_GATE_EN 0x00000002 - -static void lcd_init(void) -{ - unsigned int val; - - /* make sure the LCD clock is ungated */ - val = read32((void *)ASIU_TOP_CLK_GATING_CTRL); - val |= ASIU_TOP_CLK_GATING_CTRL_LCD_CLK_GATE_EN; - write32((void *)ASIU_TOP_CLK_GATING_CTRL, val); -} - -/******************************************************************* - * Default priority settings in Cygnus - * - * Master Name Default Priority - * ==================== ================= - * ihost_m0 12 - * mhost0_m0 12 - * mhost1_m0 ` 12 - * pcie0_m0 9 - * pcie0_m1 9 - * cmicd_m0 7 - * amac_m0 7 - * amac_m1 7 - * ext_m0 (LCD) 5 - * ext_m1 (V3D) 5 - * sdio_m0 3 - * sdio_m1 3 - * usb2h_m0 3 - * usb2d_m0 3 - * dmu_m0 3 - * a9jtag_m0 0 - * - *****************************************************************************/ - -#define AXIIC_EXT_M0_READ_QOS 0x1a057100 -#define AXIIC_EXT_M0_READ_MASK 0x0000000f -#define AXIIC_EXT_M0_WRITE_QOS 0x1a057104 -#define AXIIC_EXT_M0_WRITE_MASK 0x0000000f - -static void lcd_qos_init(unsigned int qos) -{ - unsigned int val; - - val = read32((void *)AXIIC_EXT_M0_READ_QOS); - val &= ~AXIIC_EXT_M0_READ_MASK; - val |= (qos & AXIIC_EXT_M0_READ_MASK); - write32((void *)AXIIC_EXT_M0_READ_QOS, val); - - val = read32((void *)AXIIC_EXT_M0_WRITE_QOS); - val &= ~AXIIC_EXT_M0_WRITE_MASK; - val |= (qos & AXIIC_EXT_M0_WRITE_MASK); - write32((void *)AXIIC_EXT_M0_WRITE_QOS, val); -} - -/***************************************************************************** - * V3D - *****************************************************************************/ -static void v3d_init(void) -{ - unsigned int val; - - /* make sure the V3D clock is ungated */ - val = read32((void *)ASIU_TOP_CLK_GATING_CTRL); - val |= ASIU_TOP_CLK_GATING_CTRL_MIPI_DSI_CLK_GATE_EN | - ASIU_TOP_CLK_GATING_CTRL_GFX_CLK_GATE_EN; - write32((void *)ASIU_TOP_CLK_GATING_CTRL, val); -} - -/***************************************************************************** - * Audio - *****************************************************************************/ -#define CRMU_PLL_AON_CTRL 0x0301c020 -#define CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_PLL 0x00000800 -#define CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_BG 0x00000400 -#define CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_LDO 0x00000200 -#define CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_ISO_IN 0x00000100 - -static void audio_init(void) -{ - unsigned int val; - - /* Ungate (enable) audio clock. */ - val = read32((void *)ASIU_TOP_CLK_GATING_CTRL); - val |= ASIU_TOP_CLK_GATING_CTRL_AUD_CLK_GATE_EN; - write32((void *)ASIU_TOP_CLK_GATING_CTRL, val); - - /* Power on audio GEN PLL, LDO, and BG. Input isolation = normal. */ - val = read32((void *)CRMU_PLL_AON_CTRL); - val |= CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_BG; - val |= CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_LDO; - val |= CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_PWRON_PLL; - val &= ~CRMU_PLL_AON_CTRL_ASIU_AUDIO_GENPLL_ISO_IN; - write32((void *)CRMU_PLL_AON_CTRL, val); -} - -/***************************************************************************** - * SDIO - *****************************************************************************/ -#define CRMU_SDIO_1P8_FAIL_CONTROL 0x0301c0a0 -#define UHS1_18V_VREG_FAIL 0x00000001 - -#define SDIO_IDM0_IO_CONTROL_DIRECT 0x18116408 -#define SDIO_IDM1_IO_CONTROL_DIRECT 0x18117408 -#define SDIO_CMD_COMFLICT_DISABLE 0x00400000 -#define SDIO_FEEDBACK_CLK_EN 0x00200000 -#define SDIO_CLK_ENABLE 0x00000001 - -#define CDRU_SDIO0_IO_CONTROL 0x0301d144 -#define CDRU_SDIO1_IO_CONTROL 0x0301d140 -#define INPUT_DISABLE 0x00000080 -#define SLEW_RATE_ENABLE 0x00000040 -#define PULL_UP_ENABLE 0x00000020 -#define PULL_DOWN_ENABLE 0x00000010 -#define HYSTERESIS_ENABLE 0x00000008 -#define SDIO_DEFAULT_DRIVE_STRENGTH 0x4 /* 8 mA */ - -#define SDIO_IDM0_IDM_RESET_CONTROL 0x18116800 -#define SDIO_IDM1_IDM_RESET_CONTROL 0x18117800 -#define SDIO_RESET_MASK 0x00000001 -#define SDIO_RESET_TIMEOUT 1000 - -#define CRMU_SDIO_CONTROL0 0x0301d088 -#define CRMU_SDIO_CONTROL1 0x0301d08c -#define CRMU_SDIO_CONTROL2 0x0301d090 -#define CRMU_SDIO_CONTROL3 0x0301d094 -#define CRMU_SDIO_CONTROL4 0x0301d098 -#define CRMU_SDIO_CONTROL5 0x0301d09c - -/* - * SDIO_CAPS_L - * - * Field Bit(s) - * =========================== - * DDR50 31 - * SDR104 30 - * SDR50 29 - * SLOTTYPE 28:27 - * ASYNCHIRQ 26 - * SYSBUS64 25 - * V18 24 - * V3 23 - * V33 22 - * SUPRSM 21 - * SDMA 20 - * HSPEED 19 - * ADMA2 18 - * EXTBUSMED 17 - * MAXBLK 16:15 - * BCLK 14:7 - * TOUT 6 - * TOUTFREQ 5:0 - */ -#define SDIO_CAPS_L 0xA17C0000 - -/* - * SDIO_CAPS_H - * - * Field Bit(s) - * =========================== - * reserved 31:20 - * SPIBLOCKMODE 19 - * SPIMODE_CAP 18 - * CLOCKMULT 17:10 - * RETUNE_MODE 9:8 - * USETUNE_SDR50 7 - * TMRCNT_RETUNE 6:3 - * DRVR_TYPED 2 - * DRVR_TYPEC 1 - * DRVR_TYPEA 0 - */ -#define SDIO_CAPS_H 0x000C0087 - -/* - * Preset value - * - * Field Bit(s) - * =========================== - * Driver Strength 12:11 - * Clock Generator 10 - * SDCLK Frequeency 9:0 - */ - -/* - * SDIO_PRESETVAL1 - * - * Field Bit(s) Description - * ============================================================ - * DDR50_PRESET 25:13 Preset Value for DDR50 - * DEFAULT_PRESET 12:0 Preset Value for Default Speed - */ -#define SDIO_PRESETVAL1 0x01004004 - -/* - * SDIO_PRESETVAL2 - * - * Field Bit(s) Description - * ============================================================ - * HIGH_SPEED_PRESET 25:13 Preset Value for High Speed - * INIT_PRESET 12:0 Preset Value for Initialization - */ -#define SDIO_PRESETVAL2 0x01004100 - -/* - * SDIO_PRESETVAL3 - * - * Field Bit(s) Description - * ============================================================ - * SDR104_PRESET 25:13 Preset Value for SDR104 - * SDR12_PRESET 12:0 Preset Value for SDR12 - */ -#define SDIO_PRESETVAL3 0x00000004 - -/* - * SDIO_PRESETVAL4 - * - * Field Bit(s) Description - * ============================================================ - * SDR25_PRESET 25:13 Preset Value for SDR25 - * SDR50_PRESET 12:0 Preset Value for SDR50 - */ -#define SDIO_PRESETVAL4 0x01005001 - -static void sdio_ctrl_init(unsigned int idx) -{ - unsigned int sdio_idm_io_control_direct_reg; - unsigned int cdru_sdio_io_control_reg; - unsigned int sdio_idm_reset_control_reg; - unsigned int val, timeout; - - switch (idx) { - case 0: - sdio_idm_io_control_direct_reg = SDIO_IDM0_IO_CONTROL_DIRECT; - cdru_sdio_io_control_reg = CDRU_SDIO0_IO_CONTROL; - sdio_idm_reset_control_reg = SDIO_IDM0_IDM_RESET_CONTROL; - break; - case 1: - sdio_idm_io_control_direct_reg = SDIO_IDM1_IO_CONTROL_DIRECT; - cdru_sdio_io_control_reg = CDRU_SDIO1_IO_CONTROL; - sdio_idm_reset_control_reg = SDIO_IDM1_IDM_RESET_CONTROL; - break; - default: - return; - } - - /* - * Disable the cmd conflict error interrupt and enable feedback clock - */ - val = read32((void *)sdio_idm_io_control_direct_reg); - val |= SDIO_CMD_COMFLICT_DISABLE | SDIO_FEEDBACK_CLK_EN | - SDIO_CLK_ENABLE; - write32((void *)sdio_idm_io_control_direct_reg, val); - - /* - * Set drive strength, enable hysteresis and slew rate control - */ - val = SDIO_DEFAULT_DRIVE_STRENGTH | - HYSTERESIS_ENABLE | SLEW_RATE_ENABLE; - write32((void *)cdru_sdio_io_control_reg, val); - - /* Reset SDIO controller */ - val = read32((void *)sdio_idm_reset_control_reg); - val |= SDIO_RESET_MASK; - write32((void *)sdio_idm_reset_control_reg, SDIO_RESET_MASK); - udelay(10); - val &= ~SDIO_RESET_MASK; - write32((void *)sdio_idm_reset_control_reg, val); - - timeout = 0; - while (read32((void *)sdio_idm_reset_control_reg) & SDIO_RESET_MASK) { - udelay(1); - if (timeout++ > SDIO_RESET_TIMEOUT) - die("Failed to bring SDIO out of reset\n"); - } -} - -static void sdio_init(void) -{ - unsigned int val; - - /* - * Configure SDIO host controller capabilities - * (common setting for all SDIO controllers) - */ - write32((void *)CRMU_SDIO_CONTROL0, SDIO_CAPS_H); - write32((void *)CRMU_SDIO_CONTROL1, SDIO_CAPS_L); - /* - * Configure SDIO host controller preset values - * (common setting for all SDIO controllers) - */ - write32((void *)CRMU_SDIO_CONTROL2, SDIO_PRESETVAL1); - write32((void *)CRMU_SDIO_CONTROL3, SDIO_PRESETVAL2); - write32((void *)CRMU_SDIO_CONTROL4, SDIO_PRESETVAL3); - write32((void *)CRMU_SDIO_CONTROL5, SDIO_PRESETVAL4); - - /* - * The sdhci driver attempts to change the SDIO IO voltage for UHS-I - * cards by setting the EN1P8V in control2 register then checks the - * outcome by reading it back. - * Cygnus does not have an internal regulator for the SDIO IO voltage - * but can be configured to indicate success (leave EN1P8V set) - * or failure (clear EN1P8V). - * - * Clear CRMU_SDIO_UHS1_18V_VREG_FAIL in CRMU_SDIO_1P8_FAIL_CONTROL - * register to indicate success. - * (common setting for all SDIO controllers) - */ - val = read32((void *)CRMU_SDIO_1P8_FAIL_CONTROL); - val &= ~UHS1_18V_VREG_FAIL; - write32((void *)CRMU_SDIO_1P8_FAIL_CONTROL, val); - - /* - * Initialize each SDIO controller - */ - sdio_ctrl_init(0); - sdio_ctrl_init(1); -} - -void hw_init(void) -{ - tz_init(); - printk(BIOS_INFO, "trustzone initialized\n"); - dmac_init(); - printk(BIOS_INFO, "PL330 DMAC initialized\n"); - lcd_init(); - lcd_qos_init(15); - printk(BIOS_INFO, "LCD initialized\n"); - v3d_init(); - printk(BIOS_INFO, "V3D initialized\n"); - audio_init(); - printk(BIOS_INFO, "audio initialized\n"); - neon_init(); - printk(BIOS_INFO, "neon initialized\n"); - pcie_init(); - printk(BIOS_INFO, "PCIe initialized\n"); - M0_init(); - printk(BIOS_INFO, "M0 initialized\n"); - ccu_init(); - printk(BIOS_INFO, "CCU initialized\n"); - sdio_init(); - printk(BIOS_INFO, "SDIO initialized\n"); -} |