static int emi_hibernation(int resuming) { int idx; int bank, data; static struct emi_pm *emi_saved_data; if (resuming) { if (emi_saved_data) { /* restore the previous common value */ for (idx = 0; idx < emi_num_common_cfg-4; ++idx) writel(emi_saved_data->common_cfg[idx], emi_control+EMI_COMMON_CFG(idx)); writel(emi_saved_data->common_cfg[12], emi_control + EMI_BANK_ENABLE); writel(emi_saved_data->common_cfg[13], emi_control + EMI_BANKNUMBER); writel(emi_saved_data->common_cfg[14], emiss_config + EMISS_CONFIG); writel(emi_saved_data->common_cfg[15], emiss_config + EMISS_ARBITER_CONFIG); /* restore the previous bank values */ for (bank = 0; bank < emi_num_bank; ++bank) { writel(emi_saved_data->bank[bank].base_address, emi_control + BANK_BASEADDRESS(bank)); for (data = 0; data < emi_num_bank_cfg; ++data) emi_bank_configure(bank, emi_saved_data->bank[bank].cfg); } kfree(emi_saved_data); emi_saved_data = NULL; } return 0; } emi_saved_data = kmalloc(sizeof(struct emi_pm), GFP_NOWAIT); if (!emi_saved_data) { printk(KERN_ERR "Unable to freeze the emi registers\n"); return -ENOMEM; } /* save the emi common values */ for (idx = 0; idx < emi_num_common_cfg-4; ++idx) emi_saved_data->common_cfg[idx] = readl(emi_control + EMI_COMMON_CFG(idx)); emi_saved_data->common_cfg[12] = readl(emi_control + EMI_BANK_ENABLE); emi_saved_data->common_cfg[13] = readl(emi_control + EMI_BANKNUMBER); emi_saved_data->common_cfg[14] = readl(emiss_config + EMISS_CONFIG); emi_saved_data->common_cfg[15] = readl(emiss_config + EMISS_ARBITER_CONFIG); /* save the emi bank value */ for (bank = 0; bank < emi_num_bank; ++bank) { emi_saved_data->bank[bank].base_address = readl(emi_control + BANK_BASEADDRESS(bank)); for (data = 0; data < emi_num_bank_cfg; ++data) emi_saved_data->bank[bank].cfg[data] = readl(emi_control + BANK_EMICONFIGDATA(bank, data)); } return 0; }
unsigned long emi_bank_base(int bank) { unsigned long reg; BUG_ON(bank < 0 || bank >= EMI_BANKS); BUG_ON(!emi_initialised); reg = readl(emi_control + BANK_BASEADDRESS(bank)); return emi_memory_base + (reg << 22); }