2008-08-19 11:08:43 +03:00
/*
2010-01-26 20:13:13 -07:00
* OMAP3 powerdomain definitions
2008-08-19 11:08:43 +03:00
*
2011-09-14 11:34:21 -06:00
* Copyright ( C ) 2007 - 2008 , 2011 Texas Instruments , Inc .
2011-03-07 19:28:15 -07:00
* Copyright ( C ) 2007 - 2011 Nokia Corporation
2008-08-19 11:08:43 +03:00
*
2010-12-21 20:01:20 -07:00
* Paul Walmsley , Jouni Högander
2008-08-19 11:08:43 +03:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2010-12-21 20:01:20 -07:00
# include <linux/kernel.h>
# include <linux/init.h>
2012-03-07 17:28:01 -08:00
# include <linux/bug.h>
2008-08-19 11:08:43 +03:00
2012-08-31 10:59:07 -07:00
# include "soc.h"
2010-12-21 21:05:16 -07:00
# include "powerdomain.h"
2010-12-21 20:01:20 -07:00
# include "powerdomains2xxx_3xxx_data.h"
2008-08-19 11:08:43 +03:00
# include "prcm-common.h"
2010-12-21 15:30:55 -07:00
# include "prm2xxx_3xxx.h"
2008-08-19 11:08:43 +03:00
# include "prm-regbits-34xx.h"
2010-12-21 15:30:55 -07:00
# include "cm2xxx_3xxx.h"
2008-08-19 11:08:43 +03:00
# include "cm-regbits-34xx.h"
/*
* 34 XX - specific powerdomains , dependencies
*/
/*
* Powerdomains
*/
static struct powerdomain iva2_pwrdm = {
. name = " iva2_pwrdm " ,
. prcm_offs = OMAP3430_IVA2_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
. pwrsts_logic_ret = PWRSTS_OFF_RET ,
. banks = 4 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_OFF_RET ,
[ 1 ] = PWRSTS_OFF_RET ,
[ 2 ] = PWRSTS_OFF_RET ,
[ 3 ] = PWRSTS_OFF_RET ,
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON ,
[ 1 ] = PWRSTS_ON ,
2008-08-19 11:08:43 +03:00
[ 2 ] = PWRSTS_OFF_ON ,
2011-03-07 19:28:15 -07:00
[ 3 ] = PWRSTS_ON ,
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2008-08-19 11:08:43 +03:00
} ;
2010-01-26 20:13:13 -07:00
static struct powerdomain mpu_3xxx_pwrdm = {
2008-08-19 11:08:43 +03:00
. name = " mpu_pwrdm " ,
. prcm_offs = MPU_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
. pwrsts_logic_ret = PWRSTS_OFF_RET ,
2009-12-08 16:33:15 -07:00
. flags = PWRDM_HAS_MPU_QUIRK ,
2008-08-19 11:08:43 +03:00
. banks = 1 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_OFF_RET ,
} ,
. pwrsts_mem_on = {
[ 0 ] = PWRSTS_OFF_ON ,
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
static struct powerdomain mpu_am35x_pwrdm = {
. name = " mpu_pwrdm " ,
. prcm_offs = MPU_MOD ,
. pwrsts = PWRSTS_ON ,
. pwrsts_logic_ret = PWRSTS_ON ,
. flags = PWRDM_HAS_MPU_QUIRK ,
. banks = 1 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_ON ,
} ,
. pwrsts_mem_on = {
[ 0 ] = PWRSTS_ON ,
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2012-06-27 18:43:59 -06:00
} ;
2010-07-14 13:38:49 +00:00
/*
* The USBTLL Save - and - Restore mechanism is broken on
2011-03-30 22:57:33 -03:00
* 3430 s up to ES3 .0 and 3630 ES1 .0 . Hence this feature
2010-07-14 13:38:49 +00:00
* needs to be disabled on these chips .
* Refer : 3430 errata ID i459 and 3630 errata ID i579
2010-11-17 17:52:11 +00:00
*
* Note : setting the SAR flag could help for errata ID i478
* which applies to 3430 < = ES3 .1 , but since the SAR feature
* is broken , do not use it .
2010-07-14 13:38:49 +00:00
*/
2010-01-26 20:13:13 -07:00
static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
2008-08-19 11:08:43 +03:00
. name = " core_pwrdm " ,
. prcm_offs = CORE_MOD ,
2009-02-05 20:45:28 -07:00
. pwrsts = PWRSTS_OFF_RET_ON ,
2010-02-24 12:05:50 -07:00
. pwrsts_logic_ret = PWRSTS_OFF_RET ,
2009-02-05 20:45:28 -07:00
. banks = 2 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_OFF_RET , /* MEM1RETSTATE */
[ 1 ] = PWRSTS_OFF_RET , /* MEM2RETSTATE */
} ,
. pwrsts_mem_on = {
[ 0 ] = PWRSTS_OFF_RET_ON , /* MEM1ONSTATE */
[ 1 ] = PWRSTS_OFF_RET_ON , /* MEM2ONSTATE */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2009-02-05 20:45:28 -07:00
} ;
2010-01-26 20:13:13 -07:00
static struct powerdomain core_3xxx_es3_1_pwrdm = {
2009-02-05 20:45:28 -07:00
. name = " core_pwrdm " ,
. prcm_offs = CORE_MOD ,
2008-08-19 11:08:43 +03:00
. pwrsts = PWRSTS_OFF_RET_ON ,
2010-02-24 12:05:50 -07:00
. pwrsts_logic_ret = PWRSTS_OFF_RET ,
2010-11-17 17:52:11 +00:00
/*
* Setting the SAR flag for errata ID i478 which applies
* to 3430 < = ES3 .1
*/
2009-02-05 20:45:28 -07:00
. flags = PWRDM_HAS_HDWR_SAR , /* for USBTLL only */
2008-08-19 11:08:43 +03:00
. banks = 2 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_OFF_RET , /* MEM1RETSTATE */
[ 1 ] = PWRSTS_OFF_RET , /* MEM2RETSTATE */
} ,
. pwrsts_mem_on = {
[ 0 ] = PWRSTS_OFF_RET_ON , /* MEM1ONSTATE */
[ 1 ] = PWRSTS_OFF_RET_ON , /* MEM2ONSTATE */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
static struct powerdomain core_am35x_pwrdm = {
. name = " core_pwrdm " ,
. prcm_offs = CORE_MOD ,
. pwrsts = PWRSTS_ON ,
. pwrsts_logic_ret = PWRSTS_ON ,
. banks = 2 ,
. pwrsts_mem_ret = {
[ 0 ] = PWRSTS_ON , /* MEM1RETSTATE */
[ 1 ] = PWRSTS_ON , /* MEM2RETSTATE */
} ,
. pwrsts_mem_on = {
[ 0 ] = PWRSTS_ON , /* MEM1ONSTATE */
[ 1 ] = PWRSTS_ON , /* MEM2ONSTATE */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2012-06-27 18:43:59 -06:00
} ;
2008-08-19 11:08:43 +03:00
static struct powerdomain dss_pwrdm = {
. name = " dss_pwrdm " ,
. prcm_offs = OMAP3430_DSS_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
2011-03-07 19:28:15 -07:00
. pwrsts_logic_ret = PWRSTS_RET ,
2008-08-19 11:08:43 +03:00
. banks = 1 ,
. pwrsts_mem_ret = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_RET , /* MEMRETSTATE */
2008-08-19 11:08:43 +03:00
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON , /* MEMONSTATE */
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
static struct powerdomain dss_am35x_pwrdm = {
. name = " dss_pwrdm " ,
. prcm_offs = OMAP3430_DSS_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 */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2012-06-27 18:43:59 -06:00
} ;
2009-01-27 19:44:28 -07:00
/*
* Although the 34 XX TRM Rev K Table 4 - 371 notes that retention is a
* possible SGX powerstate , the SGX device itself does not support
* retention .
*/
2008-08-19 11:08:43 +03:00
static struct powerdomain sgx_pwrdm = {
. name = " sgx_pwrdm " ,
. prcm_offs = OMAP3430ES2_SGX_MOD ,
/* XXX This is accurate for 3430 SGX, but what about GFX? */
2009-01-27 19:44:28 -07:00
. pwrsts = PWRSTS_OFF_ON ,
2011-03-07 19:28:15 -07:00
. pwrsts_logic_ret = PWRSTS_RET ,
2008-08-19 11:08:43 +03:00
. banks = 1 ,
. pwrsts_mem_ret = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_RET , /* MEMRETSTATE */
2008-08-19 11:08:43 +03:00
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON , /* MEMONSTATE */
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
static struct powerdomain sgx_am35x_pwrdm = {
. name = " sgx_pwrdm " ,
. prcm_offs = OMAP3430ES2_SGX_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 */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2012-06-27 18:43:59 -06:00
} ;
2008-08-19 11:08:43 +03:00
static struct powerdomain cam_pwrdm = {
. name = " cam_pwrdm " ,
. prcm_offs = OMAP3430_CAM_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
2011-03-07 19:28:15 -07:00
. pwrsts_logic_ret = PWRSTS_RET ,
2008-08-19 11:08:43 +03:00
. banks = 1 ,
. pwrsts_mem_ret = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_RET , /* MEMRETSTATE */
2008-08-19 11:08:43 +03:00
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON , /* MEMONSTATE */
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
static struct powerdomain per_pwrdm = {
. name = " per_pwrdm " ,
. prcm_offs = OMAP3430_PER_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
. pwrsts_logic_ret = PWRSTS_OFF_RET ,
. banks = 1 ,
. pwrsts_mem_ret = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_RET , /* MEMRETSTATE */
2008-08-19 11:08:43 +03:00
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON , /* MEMONSTATE */
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
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 */
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2012-06-27 18:43:59 -06:00
} ;
2008-08-19 11:08:43 +03:00
static struct powerdomain emu_pwrdm = {
. name = " emu_pwrdm " ,
. prcm_offs = OMAP3430_EMU_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
static struct powerdomain neon_pwrdm = {
. name = " neon_pwrdm " ,
. prcm_offs = OMAP3430_NEON_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
2011-03-07 19:28:15 -07:00
. pwrsts_logic_ret = PWRSTS_RET ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2008-08-19 11:08:43 +03:00
} ;
2012-06-27 18:43:59 -06:00
static struct powerdomain neon_am35x_pwrdm = {
. name = " neon_pwrdm " ,
. prcm_offs = OMAP3430_NEON_MOD ,
. pwrsts = PWRSTS_ON ,
. pwrsts_logic_ret = PWRSTS_ON ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2012-06-27 18:43:59 -06:00
} ;
2008-08-19 11:08:43 +03:00
static struct powerdomain usbhost_pwrdm = {
. name = " usbhost_pwrdm " ,
. prcm_offs = OMAP3430ES2_USBHOST_MOD ,
. pwrsts = PWRSTS_OFF_RET_ON ,
2011-03-07 19:28:15 -07:00
. pwrsts_logic_ret = PWRSTS_RET ,
2009-04-23 13:58:51 +03:00
/*
* 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 */
2008-08-19 11:08:43 +03:00
. banks = 1 ,
. pwrsts_mem_ret = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_RET , /* MEMRETSTATE */
2008-08-19 11:08:43 +03:00
} ,
. pwrsts_mem_on = {
2011-03-07 19:28:15 -07:00
[ 0 ] = PWRSTS_ON , /* MEMONSTATE */
2008-08-19 11:08:43 +03:00
} ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2008-08-19 11:08:43 +03:00
} ;
2009-01-27 19:44:18 -07:00
static struct powerdomain dpll1_pwrdm = {
. name = " dpll1_pwrdm " ,
. prcm_offs = MPU_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2009-01-27 19:44:18 -07:00
} ;
static struct powerdomain dpll2_pwrdm = {
. name = " dpll2_pwrdm " ,
. prcm_offs = OMAP3430_IVA2_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " mpu_iva " } ,
2009-01-27 19:44:18 -07:00
} ;
static struct powerdomain dpll3_pwrdm = {
. name = " dpll3_pwrdm " ,
. prcm_offs = PLL_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2009-01-27 19:44:18 -07:00
} ;
static struct powerdomain dpll4_pwrdm = {
. name = " dpll4_pwrdm " ,
. prcm_offs = PLL_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2009-01-27 19:44:18 -07:00
} ;
static struct powerdomain dpll5_pwrdm = {
. name = " dpll5_pwrdm " ,
. prcm_offs = PLL_MOD ,
2013-01-26 00:58:17 -07:00
. voltdm = { . name = " core " } ,
2009-01-27 19:44:18 -07:00
} ;
2010-12-21 20:01:20 -07:00
/* As powerdomains are added or removed above, this list must also be changed */
2011-09-14 11:34:21 -06:00
static struct powerdomain * powerdomains_omap3430_common [ ] __initdata = {
2010-12-21 20:01:20 -07:00
& 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 ,
2011-09-14 11:34:21 -06:00
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 ,
2010-12-21 20:01:20 -07:00
& dpll5_pwrdm ,
NULL
} ;
2008-08-19 11:08:43 +03:00
2011-09-14 11:34:21 -06:00
/* also includes 3630ES1.1+ */
static struct powerdomain * powerdomains_omap3430es3_1plus [ ] __initdata = {
& core_3xxx_es3_1_pwrdm ,
& sgx_pwrdm ,
& usbhost_pwrdm ,
& dpll5_pwrdm ,
NULL
} ;
2008-08-19 11:08:43 +03:00
2012-06-27 18:43:59 -06:00
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
} ;
2010-12-21 20:01:20 -07:00
void __init omap3xxx_powerdomains_init ( void )
{
2011-09-14 11:34:21 -06:00
unsigned int rev ;
if ( ! cpu_is_omap34xx ( ) )
return ;
2011-09-14 16:01:21 -06:00
pwrdm_register_platform_funcs ( & omap3_pwrdm_operations ) ;
2011-09-14 11:34:21 -06:00
rev = omap_rev ( ) ;
2012-06-27 18:43:59 -06:00
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 " ) ;
}
}
2011-09-14 11:34:21 -06:00
2011-09-14 16:01:21 -06:00
pwrdm_complete_init ( ) ;
2010-12-21 20:01:20 -07:00
}