diff options
author | Benoit Goby <benoit@android.com> | 2012-04-13 13:57:57 -0700 |
---|---|---|
committer | Benoit Goby <benoit@android.com> | 2012-04-13 13:57:57 -0700 |
commit | c44db2cb45281396db072108769463eb3a392814 (patch) | |
tree | 0df3cc835ed8f561c469e39f44b0eebd73e2d977 | |
parent | 5f713c662104a1a49025616bc397c1363b7970b6 (diff) | |
parent | afadff82e7b2041498c95f266b76b21dda04e703 (diff) | |
download | kernel_samsung_tuna-c44db2cb45281396db072108769463eb3a392814.zip kernel_samsung_tuna-c44db2cb45281396db072108769463eb3a392814.tar.gz kernel_samsung_tuna-c44db2cb45281396db072108769463eb3a392814.tar.bz2 |
Merge branch 'linux-omap-3.0' into android-omap-3.0
-rw-r--r-- | arch/arm/mach-omap2/omap_opp_data.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/opp3xxx_data.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-omap2/opp4xxx_data.c | 52 | ||||
-rw-r--r-- | arch/arm/mach-omap2/smartreflex-class1p5.c | 58 | ||||
-rw-r--r-- | arch/arm/mach-omap2/smartreflex.h | 5 | ||||
-rw-r--r-- | arch/arm/mach-omap2/voltage.c | 25 | ||||
-rw-r--r-- | arch/arm/mach-omap2/voltage.h | 3 | ||||
-rw-r--r-- | arch/arm/plat-omap/clock.c | 5 |
8 files changed, 94 insertions, 93 deletions
diff --git a/arch/arm/mach-omap2/omap_opp_data.h b/arch/arm/mach-omap2/omap_opp_data.h index 1fa9d1c..37d16e1 100644 --- a/arch/arm/mach-omap2/omap_opp_data.h +++ b/arch/arm/mach-omap2/omap_opp_data.h @@ -75,9 +75,10 @@ struct omap_opp_def { * Initialization wrapper used to define SmartReflex process data * XXX Is this needed? Just use C99 initializers in data files? */ -#define VOLT_DATA_DEFINE(_v_nom, _efuse_offs, _errminlimit, _errgain, _abb_type) \ +#define VOLT_DATA_DEFINE(_v_nom, _v_margin, _efuse_offs, _errminlimit, _errgain, _abb_type) \ { \ .volt_nominal = _v_nom, \ + .volt_margin = _v_margin, \ .sr_efuse_offs = _efuse_offs, \ .sr_errminlimit = _errminlimit, \ .vp_errgain = _errgain, \ diff --git a/arch/arm/mach-omap2/opp3xxx_data.c b/arch/arm/mach-omap2/opp3xxx_data.c index bcb98be..41619ea 100644 --- a/arch/arm/mach-omap2/opp3xxx_data.c +++ b/arch/arm/mach-omap2/opp3xxx_data.c @@ -36,12 +36,12 @@ #define OMAP3430_VDD_MPU_OPP5_UV 1350000 struct omap_volt_data omap34xx_vddmpu_volt_data[] = { - VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, 0, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, 0, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, 0, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, 0, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, 0, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* VDD2 */ @@ -51,10 +51,10 @@ struct omap_volt_data omap34xx_vddmpu_volt_data[] = { #define OMAP3430_VDD_CORE_OPP3_UV 1150000 struct omap_volt_data omap34xx_vddcore_volt_data[] = { - VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, 0, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, 0, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, 0, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* OMAP 3430 MPU Core VDD dependency table */ @@ -85,11 +85,11 @@ struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[] = { #define OMAP3630_VDD_MPU_OPP1G_UV 1375000 struct omap_volt_data omap36xx_vddmpu_volt_data[] = { - VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27, OMAP_ABB_FAST_OPP), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, 0, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, 0, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, 0, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, 0, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27, OMAP_ABB_FAST_OPP), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* VDD2 */ @@ -98,9 +98,9 @@ struct omap_volt_data omap36xx_vddmpu_volt_data[] = { #define OMAP3630_VDD_CORE_OPP100_UV 1200000 struct omap_volt_data omap36xx_vddcore_volt_data[] = { - VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, 0, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, 0, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* OPP data */ diff --git a/arch/arm/mach-omap2/opp4xxx_data.c b/arch/arm/mach-omap2/opp4xxx_data.c index 255f132..e36ca46 100644 --- a/arch/arm/mach-omap2/opp4xxx_data.c +++ b/arch/arm/mach-omap2/opp4xxx_data.c @@ -39,11 +39,11 @@ #define OMAP4430_VDD_MPU_OPPNITRO_UV 1388000 struct omap_volt_data omap443x_vdd_mpu_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27, OMAP_ABB_FAST_OPP), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27, OMAP_ABB_FAST_OPP), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; #define OMAP4430_VDD_IVA_OPP50_UV 950000 @@ -51,19 +51,19 @@ struct omap_volt_data omap443x_vdd_mpu_volt_data[] = { #define OMAP4430_VDD_IVA_OPPTURBO_UV 1291000 struct omap_volt_data omap443x_vdd_iva_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; #define OMAP4430_VDD_CORE_OPP50_UV 962000 #define OMAP4430_VDD_CORE_OPP100_UV 1127000 struct omap_volt_data omap443x_vdd_core_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, 0, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, 0, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* Dependency of domains are as follows for OMAP4430 (OPP based): @@ -159,11 +159,11 @@ static struct omap_opp_def __initdata omap443x_opp_def_list[] = { #define OMAP4460_VDD_MPU_OPPNITRO_UV 1380000 struct omap_volt_data omap446x_vdd_mpu_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27, OMAP_ABB_FAST_OPP), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPP50_UV, 10000, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPP100_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPPTURBO_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_MPU_OPPNITRO_UV, 0, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27, OMAP_ABB_FAST_OPP), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; #define OMAP4460_VDD_IVA_OPP50_UV 950000 @@ -172,11 +172,11 @@ struct omap_volt_data omap446x_vdd_mpu_volt_data[] = { #define OMAP4460_VDD_IVA_OPPNITRO_UV 1375000 struct omap_volt_data omap446x_vdd_iva_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), - VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPNITRO, 0xfa, 0x23, OMAP_ABB_FAST_OPP), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPP50_UV, 13000, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPP100_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPPTURBO_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23, OMAP_ABB_NOMINAL_OPP), + VOLT_DATA_DEFINE(OMAP4460_VDD_IVA_OPPNITRO_UV, 0, OMAP44XX_CONTROL_FUSE_IVA_OPPNITRO, 0xfa, 0x23, OMAP_ABB_FAST_OPP), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; #define OMAP4460_VDD_CORE_OPP50_UV 962000 @@ -184,10 +184,10 @@ struct omap_volt_data omap446x_vdd_iva_volt_data[] = { #define OMAP4460_VDD_CORE_OPP100_OV_UV 1250000 struct omap_volt_data omap446x_vdd_core_volt_data[] = { - VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP100_OV_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100OV, 0xf9, 0x16, OMAP_ABB_NONE), - VOLT_DATA_DEFINE(0, 0, 0, 0, 0), + VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP50_UV, 38000, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP100_UV, 13000, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(OMAP4460_VDD_CORE_OPP100_OV_UV, 13000, OMAP44XX_CONTROL_FUSE_CORE_OPP100OV, 0xf9, 0x16, OMAP_ABB_NONE), + VOLT_DATA_DEFINE(0, 0, 0, 0, 0, 0), }; /* OMAP 4460 MPU Core VDD dependency table */ diff --git a/arch/arm/mach-omap2/smartreflex-class1p5.c b/arch/arm/mach-omap2/smartreflex-class1p5.c index 7d66eb5..2090884 100644 --- a/arch/arm/mach-omap2/smartreflex-class1p5.c +++ b/arch/arm/mach-omap2/smartreflex-class1p5.c @@ -69,8 +69,6 @@ struct sr_class1p5_work_data { static struct delayed_work recal_work; #endif -static unsigned long class1p5_margin; - /** * sr_class1p5_notify() - isr notifier for status events * @voltdm: voltage domain for which we were triggered @@ -140,7 +138,7 @@ static void sr_class1p5_calib_work(struct work_struct *work) { struct sr_class1p5_work_data *work_data = container_of(work, struct sr_class1p5_work_data, work.work); - unsigned long u_volt_safe = 0, u_volt_current = 0, u_volt_margin; + unsigned long u_volt_safe = 0, u_volt_current = 0, u_volt_margin = 0; struct omap_volt_data *volt_data; struct voltagedomain *voltdm; int idx = 0; @@ -262,10 +260,6 @@ stop_sampling: if (work_data->u_volt_samples[idx] > u_volt_safe) u_volt_safe = work_data->u_volt_samples[idx]; } - /* Use the nominal voltage as the safe voltage to recover bad osc */ - if (u_volt_safe > volt_data->volt_nominal) - u_volt_safe = volt_data->volt_nominal; - /* Fall through to close up common stuff */ done_calib: @@ -274,7 +268,7 @@ done_calib: sr_disable(voltdm); /* Add margin if needed */ - if (class1p5_margin) { + if (volt_data->volt_margin) { struct omap_voltdm_pmic *pmic = voltdm->pmic; /* Convert to rounded to PMIC step level if available */ if (pmic && pmic->vsel_to_uv && pmic->uv_to_vsel) { @@ -284,23 +278,23 @@ done_calib: * then convert it with pmic routine to vsel and back * to voltage, and finally remove the base voltage */ - u_volt_margin = u_volt_current + class1p5_margin; + u_volt_margin = u_volt_current + volt_data->volt_margin; u_volt_margin = pmic->uv_to_vsel(u_volt_margin); u_volt_margin = pmic->vsel_to_uv(u_volt_margin); u_volt_margin -= u_volt_current; } else { - u_volt_margin = class1p5_margin; - } - /* Add margin IF we are lower than nominal */ - if ((u_volt_safe + u_volt_margin) < volt_data->volt_nominal) { - u_volt_safe += u_volt_margin; - } else { - pr_err("%s: %s could not add %ld[%ld] margin" - "to vnom %d curr_v=%ld\n", - __func__, voltdm->name, u_volt_margin, - class1p5_margin, volt_data->volt_nominal, - u_volt_current); + u_volt_margin = volt_data->volt_margin; } + + u_volt_safe += u_volt_margin; + } + + if (u_volt_safe > volt_data->volt_nominal) { + pr_warning("%s: %s Vsafe %ld > Vnom %d. %ld[%d] margin on" + "vnom %d curr_v=%ld\n", __func__, voltdm->name, + u_volt_safe, volt_data->volt_nominal, u_volt_margin, + volt_data->volt_margin, volt_data->volt_nominal, + u_volt_current); } volt_data->volt_calibrated = u_volt_safe; @@ -317,9 +311,10 @@ done_calib: voltdm_scale(voltdm, volt_data); } - pr_info("%s: %s: Calibration complete: Voltage Nominal=%d Calib=%d\n", + pr_info("%s: %s: Calibration complete: Voltage:Nominal=%d," + "Calib=%d,margin=%d\n", __func__, voltdm->name, volt_data->volt_nominal, - volt_data->volt_calibrated); + volt_data->volt_calibrated, volt_data->volt_margin); /* * TODO: Setup my wakeup voltage to allow immediate going to OFF and * on - Pending twl and voltage layer cleanups. @@ -650,18 +645,6 @@ static struct omap_sr_class_data class1p5_data = { }; /** - * sr_class1p5_margin_set() - add a margin on top of calibrated voltage - * @margin: add margin in uVolts - * - * Some platforms may need a margin, so provide an api which board files - * need to call and update internal data structure. - */ -void __init sr_class1p5_margin_set(unsigned int margin) -{ - class1p5_margin = margin; -} - -/** * sr_class1p5_driver_init() - register class 1p5 as default * * board files call this function to use class 1p5, we register with the @@ -675,13 +658,6 @@ static int __init sr_class1p5_driver_init(void) if (!(cpu_is_omap3630() || cpu_is_omap44xx())) return -EINVAL; - /* Add 10mV margin as 4460 has Class3 ntarget values */ - if (!class1p5_margin && cpu_is_omap446x()) { - pr_info("%s: OMAP4460: add 10mV margin for class 1.5\n", - __func__); - class1p5_margin = 10000; - } - r = sr_register_class(&class1p5_data); if (r) { pr_err("SmartReflex class 1.5 driver: " diff --git a/arch/arm/mach-omap2/smartreflex.h b/arch/arm/mach-omap2/smartreflex.h index 1fecc1b..f17c2ec 100644 --- a/arch/arm/mach-omap2/smartreflex.h +++ b/arch/arm/mach-omap2/smartreflex.h @@ -286,9 +286,4 @@ static inline bool is_sr_enabled(struct voltagedomain *voltdm) } #endif -#ifdef CONFIG_OMAP_SMARTREFLEX_CLASS1P5 -extern void sr_class1p5_margin_set(unsigned int margin); -#else -static inline void sr_class1p5_margin_set(unsigned int margin) { } -#endif #endif diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index da436e3..bcc7593 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c @@ -385,6 +385,28 @@ static int calib_volt_debug_get(void *data, u64 *val) } DEFINE_SIMPLE_ATTRIBUTE(calib_volt_debug_fops, calib_volt_debug_get, NULL, "%llu\n"); +static int margin_volt_debug_get(void *data, u64 *val) +{ + struct voltagedomain *voltdm = (struct voltagedomain *) data; + struct omap_volt_data *vdata; + + if (!voltdm) { + pr_warning("%s: Wrong parameter passed\n", __func__); + return -EINVAL; + } + + vdata = omap_voltage_get_curr_vdata(voltdm); + if (IS_ERR_OR_NULL(vdata)) { + pr_warning("%s: unable to get volt for vdd_%s\n", + __func__, voltdm->name); + return -ENODEV; + } + *val = vdata->volt_margin; + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(margin_volt_debug_fops, margin_volt_debug_get, NULL, + "%llu\n"); static int nom_volt_debug_get(void *data, u64 *val) { @@ -441,6 +463,9 @@ static void __init voltdm_debugfs_init(struct dentry *voltage_dir, (void) debugfs_create_file("curr_calibrated_volt", S_IRUGO, voltdm->debug_dir, (void *) voltdm, &calib_volt_debug_fops); + (void) debugfs_create_file("curr_margin_volt", S_IRUGO, + voltdm->debug_dir, (void *) voltdm, + &margin_volt_debug_fops); } /** diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h index 642febd..34202dc 100644 --- a/arch/arm/mach-omap2/voltage.h +++ b/arch/arm/mach-omap2/voltage.h @@ -134,6 +134,8 @@ struct omap_voltage_notifier { * @voltage_dynamic_nominal: The run time optimized nominal voltage for * the device. Dynamic nominal is the nominal voltage * specialized for that OPP on the device in uV. + * @volt_margin: Additional sofware margin in uV to add to OPP calibrated + * voltage * @sr_efuse_offs: The offset of the efuse register(from system * control module base address) from where to read * the n-target value for the smartreflex module. @@ -151,6 +153,7 @@ struct omap_volt_data { u32 volt_nominal; u32 volt_calibrated; u32 volt_dynamic_nominal; + u32 volt_margin; u32 sr_efuse_offs; u8 sr_errminlimit; u8 vp_errgain; diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index c7dd1b6..b327956 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c @@ -441,6 +441,8 @@ static int __init clk_disable_unused(void) return 0; pr_info("clock: disabling unused clocks to save power\n"); + + spin_lock_irqsave(&clockfw_lock, flags); list_for_each_entry(ck, &clocks, node) { if (ck->ops == &clkops_null) continue; @@ -448,10 +450,9 @@ static int __init clk_disable_unused(void) if (ck->usecount > 0 || !ck->enable_reg) continue; - spin_lock_irqsave(&clockfw_lock, flags); arch_clock->clk_disable_unused(ck); - spin_unlock_irqrestore(&clockfw_lock, flags); } + spin_unlock_irqrestore(&clockfw_lock, flags); return 0; } |