示例#1
0
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;
}
示例#2
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);
}