int stm32_sdmmc2_mmc_init(struct stm32_sdmmc2_params *params) { int ret; assert((params != NULL) && ((params->reg_base & MMC_BLOCK_MASK) == 0U) && ((params->bus_width == MMC_BUS_WIDTH_1) || (params->bus_width == MMC_BUS_WIDTH_4) || (params->bus_width == MMC_BUS_WIDTH_8))); memcpy(&sdmmc2_params, params, sizeof(struct stm32_sdmmc2_params)); if (stm32_sdmmc2_dt_get_config() != 0) { ERROR("%s: DT error\n", __func__); return -ENOMEM; } ret = stm32mp1_clk_enable(sdmmc2_params.clock_id); if (ret != 0) { ERROR("%s: clock %d failed\n", __func__, sdmmc2_params.clock_id); return ret; } stm32mp1_reset_assert(sdmmc2_params.reset_id); udelay(2); stm32mp1_reset_deassert(sdmmc2_params.reset_id); mdelay(1); sdmmc2_params.clk_rate = stm32mp1_clk_get_rate(sdmmc2_params.clock_id); return mmc_init(&stm32_sdmmc2_ops, sdmmc2_params.clk_rate, sdmmc2_params.bus_width, sdmmc2_params.flags, sdmmc2_params.device_info); }
/******************************************************************************* * STM32MP1 handler called when a power domain is about to be turned on. The * mpidr determines the CPU to be turned on. * call by core 0 to activate core 1 ******************************************************************************/ static int stm32_pwr_domain_on(u_register_t mpidr) { unsigned long current_cpu_mpidr = read_mpidr_el1(); uint32_t tamp_clk_off = 0; uint32_t bkpr_core1_addr = tamp_bkpr(BOOT_API_CORE1_BRANCH_ADDRESS_TAMP_BCK_REG_IDX); uint32_t bkpr_core1_magic = tamp_bkpr(BOOT_API_CORE1_MAGIC_NUMBER_TAMP_BCK_REG_IDX); if (mpidr == current_cpu_mpidr) { return PSCI_E_INVALID_PARAMS; } if ((stm32_sec_entrypoint < STM32MP1_SRAM_BASE) || (stm32_sec_entrypoint > (STM32MP1_SRAM_BASE + (STM32MP1_SRAM_SIZE - 1)))) { return PSCI_E_INVALID_ADDRESS; } if (!stm32mp1_clk_is_enabled(RTCAPB)) { tamp_clk_off = 1; if (stm32mp1_clk_enable(RTCAPB) != 0) { panic(); } } cntfrq_core0 = read_cntfrq_el0(); /* Write entrypoint in backup RAM register */ mmio_write_32(bkpr_core1_addr, stm32_sec_entrypoint); /* Write magic number in backup register */ mmio_write_32(bkpr_core1_magic, BOOT_API_A7_CORE1_MAGIC_NUMBER); if (tamp_clk_off != 0U) { if (stm32mp1_clk_disable(RTCAPB) != 0) { panic(); } } /* Generate an IT to core 1 */ mmio_write_32(STM32MP1_GICD_BASE + GICD_SGIR, SEND_SECURE_IT_TO_CORE_1 | ARM_IRQ_SEC_SGI_0); return PSCI_E_SUCCESS; }