Код с вопросом
#define MBX_REG_SYS_PHYS_BASE 0xC0000000
#define MBX_REG_RANGE 0x00004000
static struct resource mxc_reg_resources[] = {
{
.start = MBX_REG_SYS_PHYS_BASE,
.end = MBX_REG_SYS_PHYS_BASE + MBX_REG_RANGE - 1,
.flags = IORESOURCE_MEM }
};
mbx_reg = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mbx_reg)
return -EINVAL;
reg_base = ioremap(mbx_reg->start, resource_size(mbx_reg));
if (!reg_base) {
ret = -ENOMEM;
goto eremap;
}
printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
mbx_reg->start, reg_base);
regread = mx3reg_read_reg(mx3reg, MBX1_GLOBREG_REVISION);
printk(KERN_CRIT "MBX1_GLOBREG_REVISION: 0x%.8X\n", regread);
Этот код работает на iMX31 из LogicPD с использованием 2.6.19.2 с исправлением вне дерева из freescale.
при портировании на 2.6.38-rc2 он больше не работает.
Вот некоторые результаты данных:
Результаты работы:
Адрес: 0xC7860000
MBX1_GLOBREG_REVISION: 0x01010200
Неудачные результаты:
Адрес: 0xC48A0000
MBX1_GLOBREG_REVISION: 0x00000000
Адрес: 0xC48A8000
MBX1_GLOBREG_REVISION: 0x00000000
Адрес: 0xC48B8000
MBX1_GLOBREG_REVISION: 0x00000000
Адрес: 0xC48C0000
MBX1_GLOBREG_REVISION: 0x00000000
может быть интересно, на 2.6.19.2 он всегда получает один и тот же адрес
все же в 2.6.38-RC2 это не так.