Linux 3.8.1 电源管理之OMAP Power Domain分析

前面分析了Voltage Domain的管理,现在开始做Power Domain 分析。首先来看Power Domain的定义【来自OMAP35XX PRCM TRM 】:

接下来从am33xx_powerdomains_init()函数开始,分析Linux 中对OMAP 的Power Domain的实现。该函数实现在linux-3.8.1/arch/arm/mach-omap2/powerdomains33xx_data.c中。

首先是pwrdm_register_platform_funcs()函数,位于linux-3.8.1/arch/arm/mach-omap2/powerdomain.c中:

这里就只是初始化一个全局结构体变量static struct pwrdm_ops *arch_pwrdm;而所注册的struct pwrdm_ops am33xx_pwrdm_operations位于linux-3.8.1/arch/arm/mach-omap2/prm33xx.c中:

而这个struct pwrdm_ops位于linux-3.8.1/arch/arm/mach-omap2/powerdomain.h:

在am33xx_powerdomains_init()中接着是pwrdm_register_pwrdms(powerdomains_am33xx)。其中注册的powerdomains_am33xx[]是一个AM335X支持的Power Domain的数组。

这对应于下表中的所有Power Domain,实际上pwrdm_register_pwrdms()就是调用_pwrdm_register()将这所有的Power Domain都注册给系统。

 

struct powerdomain定义在linux-3.8.1/arch/arm/mach-omap2/powerdomain.h:

其中每个字段的介绍如下:

其实_pwrdm_register()的核心代码如下,通过struct powerdomain中的Voltage Domain的名字,找到对应的Voltage Domain,然后将其保存起来;之后再将这个Power Domain加入到这个Voltage Domain中,并将这个Power Domain加入全局的pwrdm_list中。

实际上,struct powerdomain中定义的是PRCM中各个Power Domain对应的寄存器相关的东西,例如偏移量,控制掩码等。例如struct powerdomain mpu_33xx_pwrdm定义的值如下:

 

我们看am33xx_pwrdm_set_mem_onst()的实现如下:

 

这个am33xx_pwrdm_set_mem_onst()函数实际是想修改PM_MPU_PWRSTCTRL寄存器的MPU_RAM_ONState字段为指定的值(MPU_L1_ONState和MPU_L2_ONState字段都为只读,因此不可修改)。因此,这里的参数bank只能是2,且m = pwrdm->mem_on_mask[bank]得到的值m为AM33XX_MPU_RAM_ONSTATE_MASK (0x3 << 16);即该MPU_RAM_ONState字段的掩码。并且(pwrst << __ffs(m))中的__ffs()得到这个m的第一个被设置的bit位置,自然为16,pwrst <<16即为要设置的该MPU_RAM_ONState字段的值。

这里实现的这些am33xx_pwrdm_operations函数,说明了Power Domain不仅仅是控制该Domain的Power On和Power Off,还可能包括对该Power Domain的各个模块在各种电源状态下所处的状态进行设置。例如这里就可以设置在该Power Domain处于ON状态时,其中的RAM模块是处于OFF,RET还是ON状态。也就是说,还可以进一步细化对该模块内部的各个模块的电源状态控制。因此,如果我们要抽象一个Generic 的Power Domain实现,除了要对该Power Domain提供一个pwrDomainControl()接口,还应该提供一个更细化的pwrDomainModuleControl()接口。

am33xx_powerdomains_init()的最后一步是调用pwrdm_complete_init()。这是将所有的Power Domain都设置为PWRDM_POWER_ON状态(其他状态包括PWRDM_POWER_OFF,PWRDM_POWER_RET以及PWRDM_POWER_INACTIVE)。

原文地址:https://www.cnblogs.com/coryxie/p/2951746.html