|
@@ -250,3 +250,185 @@ static struct powerdomain per_pwrdm = {
|
|
|
static struct powerdomain per_am35x_pwrdm = {
|
|
|
.name = "per_pwrdm",
|
|
|
.prcm_offs = OMAP3430_PER_MOD,
|
|
|
+ .pwrsts = PWRSTS_ON,
|
|
|
+ .pwrsts_logic_ret = PWRSTS_ON,
|
|
|
+ .banks = 1,
|
|
|
+ .pwrsts_mem_ret = {
|
|
|
+ [0] = PWRSTS_ON, /* MEMRETSTATE */
|
|
|
+ },
|
|
|
+ .pwrsts_mem_on = {
|
|
|
+ [0] = PWRSTS_ON, /* MEMONSTATE */
|
|
|
+ },
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain emu_pwrdm = {
|
|
|
+ .name = "emu_pwrdm",
|
|
|
+ .prcm_offs = OMAP3430_EMU_MOD,
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain neon_pwrdm = {
|
|
|
+ .name = "neon_pwrdm",
|
|
|
+ .prcm_offs = OMAP3430_NEON_MOD,
|
|
|
+ .pwrsts = PWRSTS_OFF_RET_ON,
|
|
|
+ .pwrsts_logic_ret = PWRSTS_RET,
|
|
|
+ .voltdm = { .name = "mpu_iva" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain neon_am35x_pwrdm = {
|
|
|
+ .name = "neon_pwrdm",
|
|
|
+ .prcm_offs = OMAP3430_NEON_MOD,
|
|
|
+ .pwrsts = PWRSTS_ON,
|
|
|
+ .pwrsts_logic_ret = PWRSTS_ON,
|
|
|
+ .voltdm = { .name = "mpu_iva" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain usbhost_pwrdm = {
|
|
|
+ .name = "usbhost_pwrdm",
|
|
|
+ .prcm_offs = OMAP3430ES2_USBHOST_MOD,
|
|
|
+ .pwrsts = PWRSTS_OFF_RET_ON,
|
|
|
+ .pwrsts_logic_ret = PWRSTS_RET,
|
|
|
+ /*
|
|
|
+ * REVISIT: Enabling usb host save and restore mechanism seems to
|
|
|
+ * leave the usb host domain permanently in ACTIVE mode after
|
|
|
+ * changing the usb host power domain state from OFF to active once.
|
|
|
+ * Disabling for now.
|
|
|
+ */
|
|
|
+ /*.flags = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */
|
|
|
+ .banks = 1,
|
|
|
+ .pwrsts_mem_ret = {
|
|
|
+ [0] = PWRSTS_RET, /* MEMRETSTATE */
|
|
|
+ },
|
|
|
+ .pwrsts_mem_on = {
|
|
|
+ [0] = PWRSTS_ON, /* MEMONSTATE */
|
|
|
+ },
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain dpll1_pwrdm = {
|
|
|
+ .name = "dpll1_pwrdm",
|
|
|
+ .prcm_offs = MPU_MOD,
|
|
|
+ .voltdm = { .name = "mpu_iva" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain dpll2_pwrdm = {
|
|
|
+ .name = "dpll2_pwrdm",
|
|
|
+ .prcm_offs = OMAP3430_IVA2_MOD,
|
|
|
+ .voltdm = { .name = "mpu_iva" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain dpll3_pwrdm = {
|
|
|
+ .name = "dpll3_pwrdm",
|
|
|
+ .prcm_offs = PLL_MOD,
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain dpll4_pwrdm = {
|
|
|
+ .name = "dpll4_pwrdm",
|
|
|
+ .prcm_offs = PLL_MOD,
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain dpll5_pwrdm = {
|
|
|
+ .name = "dpll5_pwrdm",
|
|
|
+ .prcm_offs = PLL_MOD,
|
|
|
+ .voltdm = { .name = "core" },
|
|
|
+};
|
|
|
+
|
|
|
+/* As powerdomains are added or removed above, this list must also be changed */
|
|
|
+static struct powerdomain *powerdomains_omap3430_common[] __initdata = {
|
|
|
+ &wkup_omap2_pwrdm,
|
|
|
+ &iva2_pwrdm,
|
|
|
+ &mpu_3xxx_pwrdm,
|
|
|
+ &neon_pwrdm,
|
|
|
+ &cam_pwrdm,
|
|
|
+ &dss_pwrdm,
|
|
|
+ &per_pwrdm,
|
|
|
+ &emu_pwrdm,
|
|
|
+ &dpll1_pwrdm,
|
|
|
+ &dpll2_pwrdm,
|
|
|
+ &dpll3_pwrdm,
|
|
|
+ &dpll4_pwrdm,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain *powerdomains_omap3430es1[] __initdata = {
|
|
|
+ &gfx_omap2_pwrdm,
|
|
|
+ &core_3xxx_pre_es3_1_pwrdm,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+/* also includes 3630ES1.0 */
|
|
|
+static struct powerdomain *powerdomains_omap3430es2_es3_0[] __initdata = {
|
|
|
+ &core_3xxx_pre_es3_1_pwrdm,
|
|
|
+ &sgx_pwrdm,
|
|
|
+ &usbhost_pwrdm,
|
|
|
+ &dpll5_pwrdm,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+/* also includes 3630ES1.1+ */
|
|
|
+static struct powerdomain *powerdomains_omap3430es3_1plus[] __initdata = {
|
|
|
+ &core_3xxx_es3_1_pwrdm,
|
|
|
+ &sgx_pwrdm,
|
|
|
+ &usbhost_pwrdm,
|
|
|
+ &dpll5_pwrdm,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct powerdomain *powerdomains_am35x[] __initdata = {
|
|
|
+ &wkup_omap2_pwrdm,
|
|
|
+ &mpu_am35x_pwrdm,
|
|
|
+ &neon_am35x_pwrdm,
|
|
|
+ &core_am35x_pwrdm,
|
|
|
+ &sgx_am35x_pwrdm,
|
|
|
+ &dss_am35x_pwrdm,
|
|
|
+ &per_am35x_pwrdm,
|
|
|
+ &emu_pwrdm,
|
|
|
+ &dpll1_pwrdm,
|
|
|
+ &dpll3_pwrdm,
|
|
|
+ &dpll4_pwrdm,
|
|
|
+ &dpll5_pwrdm,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+void __init omap3xxx_powerdomains_init(void)
|
|
|
+{
|
|
|
+ unsigned int rev;
|
|
|
+
|
|
|
+ if (!cpu_is_omap34xx())
|
|
|
+ return;
|
|
|
+
|
|
|
+ pwrdm_register_platform_funcs(&omap3_pwrdm_operations);
|
|
|
+
|
|
|
+ rev = omap_rev();
|
|
|
+
|
|
|
+ if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
|
|
|
+ pwrdm_register_pwrdms(powerdomains_am35x);
|
|
|
+ } else {
|
|
|
+ pwrdm_register_pwrdms(powerdomains_omap3430_common);
|
|
|
+
|
|
|
+ switch (rev) {
|
|
|
+ case OMAP3430_REV_ES1_0:
|
|
|
+ pwrdm_register_pwrdms(powerdomains_omap3430es1);
|
|
|
+ break;
|
|
|
+ case OMAP3430_REV_ES2_0:
|
|
|
+ case OMAP3430_REV_ES2_1:
|
|
|
+ case OMAP3430_REV_ES3_0:
|
|
|
+ case OMAP3630_REV_ES1_0:
|
|
|
+ pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0);
|
|
|
+ break;
|
|
|
+ case OMAP3430_REV_ES3_1:
|
|
|
+ case OMAP3430_REV_ES3_1_2:
|
|
|
+ case OMAP3630_REV_ES1_1:
|
|
|
+ case OMAP3630_REV_ES1_2:
|
|
|
+ pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ WARN(1, "OMAP3 powerdomain init: unknown chip type\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pwrdm_complete_init();
|
|
|
+}
|