static int am33xx_push_sram_idle(void) { struct am33xx_pm_ro_sram_data ro_sram_data; int ret; u32 table_addr, ro_data_addr; void *copy_addr; ro_sram_data.amx3_pm_sram_data_virt = ocmcram_location_data; ro_sram_data.amx3_pm_sram_data_phys = gen_pool_virt_to_phys(sram_pool_data, ocmcram_location_data); /* Save physical address to calculate resume offset during pm init */ am33xx_do_wfi_sram_phys = gen_pool_virt_to_phys(sram_pool, ocmcram_location); am33xx_do_wfi_sram = sram_exec_copy(sram_pool, (void *)ocmcram_location, pm_sram->do_wfi, *pm_sram->do_wfi_sz); if (!am33xx_do_wfi_sram) { dev_err(pm33xx_dev, "PM: %s: am33xx_do_wfi copy to sram failed\n", __func__); return -ENODEV; } table_addr = sram_suspend_address((unsigned long)pm_sram->emif_sram_table); ret = ti_emif_copy_pm_function_table(sram_pool, (void *)table_addr); if (ret) { dev_dbg(pm33xx_dev, "PM: %s: EMIF function copy failed\n", __func__); return -EPROBE_DEFER; } ro_data_addr = sram_suspend_address((unsigned long)pm_sram->ro_sram_data); copy_addr = sram_exec_copy(sram_pool, (void *)ro_data_addr, &ro_sram_data, sizeof(ro_sram_data)); if (!copy_addr) { dev_err(pm33xx_dev, "PM: %s: ro_sram_data copy to sram failed\n", __func__); return -ENODEV; } return 0; }
static int am33xx_prepare_push_sram_idle(void) { struct device_node *np; int ret; ret = ti_emif_copy_pm_function_table(pm_sram->emif_sram_table); if (ret) { pr_err("PM: %s: EMIF function copy failed\n", __func__); return -EPROBE_DEFER; } np = of_find_compatible_node(NULL, NULL, "ti,omap3-mpu"); if (!np) { np = of_find_compatible_node(NULL, NULL, "ti,omap4-mpu"); if (!np) { pr_warn("PM: %s: Unable to find device node for mpu\n", __func__); return -ENODEV; } } sram_pool = of_get_named_gen_pool(np, "sram", 0); if (!sram_pool) { pr_warn("PM: %s: Unable to get sram pool for ocmcram\n", __func__); return -ENODEV; } ocmcram_location = gen_pool_alloc(sram_pool, *pm_sram->do_wfi_sz); if (!ocmcram_location) { pr_warn("PM: %s: Unable to allocate memory from ocmcram\n", __func__); return -EINVAL; } /* Save physical address to calculate resume offset during pm init */ am33xx_do_wfi_sram_phys = gen_pool_virt_to_phys(sram_pool, ocmcram_location); return 0; }