三、【GPIO驱动框架》向omap_hwmod中添加GPIO资源】
***将GPIO硬件信息添加到注册到omap_hwmod_list列表中
Arch/arm/plat-omap/include/plat/ti81xx.h中
#define TI814X_GPIO3_BASE 0x481AE000
Arch/arm/plat-omap/gpio.c中
输入输出控制寄存器偏移地址
#define OMAP4_GPIO_OE 0x0134
Arch/arm/mach-omap2/Omap_hwmod_81xx_data.c中
/* L4 SLOW -> GPIO4 */
static struct omap_hwmod_addr_space ti814x_gpio4_addrs[] = {
{
.pa_start =TI814X_GPIO3_BASE,
.pa_end = TI814X_GPIO3_BASE + SZ_4K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
};
static struct omap_hwmod_ocp_if ti814x_l4_slow__gpio4 = {
.master =&ti816x_l4_slow_hwmod,
.slave =&ti814x_gpio4_hwmod,
.addr = ti814x_gpio4_addrs,
.addr_cnt = ARRAY_SIZE(ti814x_gpio4_addrs),
.user =OCP_USER_MPU | OCP_USER_SDMA,
};
/* gpio4 slave ports */
static struct omap_hwmod_ocp_if *ti814x_gpio4_slaves[] = {
&ti814x_l4_slow__gpio4,
};
static struct omap_hwmod ti814x_gpio4_hwmod = {
.name ="gpio4",
.class =&ti81xx_gpio_hwmod_class,
.mpu_irqs = ti814x_gpio4_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(ti814x_gpio4_irqs),
.main_clk = "gpio4_ick",
.prcm= {
.omap4 = {
.clkctrl_reg= TI81XX_CM_ALWON_GPIO_1_CLKCTRL,
},
},
.opt_clks = gpio4_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks),
.dev_attr = &gpio_dev_attr,
.slaves =ti814x_gpio4_slaves,
.slaves_cnt = ARRAY_SIZE(ti814x_gpio4_slaves),
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_TI814X |CHIP_IS_DM385 |
CHIP_IS_TI811X),
#if defined(CONFIG_MACH_DM385IPNC) ||defined(CONFIG_MACH_TI8148IPNC)
.flags =HWMOD_INIT_NO_RESET,
#endif
};
static __initdata struct omap_hwmod *ti81xx_hwmods[] = {
。。。。。。
&ti81xx_gpio1_hwmod,
&ti81xx_gpio2_hwmod,
&ti814x_gpio3_hwmod,
&ti814x_gpio4_hwmod,
&ti814x_gpio5_hwmod,
&ti814x_gpio6_hwmod,
&ti81xx_usbss_hwmod,
&ti81xx_elm_hwmod,
NULL,
};
int __init ti81xx_hwmod_init(void)
{
returnomap_hwmod_init(ti81xx_hwmods);//注册到omap_hwmod_list列表中
}
Arch/arm/mach-omap2/io.c
void __init omap2_init_common_infrastructure(void)
{
。。。。。。
}else if (cpu_is_ti81xx()) {
ti81xx_powerdomains_init();
omap2_clockdomains_init();
ti81xx_hwmod_init();
}
。。。。。。
Arch/arm/mach-omap2/board-ti8148ipnc.c
static void __init ti8148_ipnc_init_irq(void)
{
omap2_init_common_infrastructure();
omap2_init_common_devices(NULL,NULL);
omap_init_irq();
gpmc_init();
}
Arch/arm/mach-omap2/board-ti8148ipnc.c
MACHINE_START(TI8148IPNC,"ti8148ipnc")
/*Maintainer: Texas Instruments */
.boot_params = 0x80000100,
.map_io =ti8148_ipnc_map_io,
.reserve = ti81xx_reserve,
.init_irq = ti8148_ipnc_init_irq,
.init_machine = ti8148_ipnc_init,
.timer =&omap_timer,
MACHINE_END