diff options
Diffstat (limited to 'arch/arm/mach-exynos/asv-4x12.c')
-rw-r--r-- | arch/arm/mach-exynos/asv-4x12.c | 158 |
1 files changed, 142 insertions, 16 deletions
diff --git a/arch/arm/mach-exynos/asv-4x12.c b/arch/arm/mach-exynos/asv-4x12.c index 4953af7..db5f83b 100644 --- a/arch/arm/mach-exynos/asv-4x12.c +++ b/arch/arm/mach-exynos/asv-4x12.c @@ -61,6 +61,41 @@ struct asv_judge_table exynos4x12_limit[] = { {999, 999}, /* Reserved Group */ }; +struct asv_judge_table exynos4x12_limit_rev2[] = { +#if 0 + /* 0705 dvfs table */ + /* HPM, IDS */ + { 0, 0}, /* Reserved Group */ + { 15, 8}, /* ASV1 Group */ + { 16, 11}, + { 18, 14}, + { 19, 18}, + { 20, 22}, + { 21, 26}, + { 22, 29}, + { 23, 36}, + { 24, 44}, + { 25, 56}, + {999, 999}, /* ASV11 Group */ +#else + /* 0725 dvfs table */ + /* HPM, IDS */ + { 0, 0}, /* Reserved Group */ + { 15, 8}, /* ASV1 Group */ + { 16, 11}, + { 18, 14}, + { 19, 18}, + { 20, 22}, + { 21, 26}, + { 22, 29}, + { 23, 36}, + { 24, 40}, + { 25, 45}, + { 26, 50}, + {999, 999}, /* ASV11 Group */ +#endif +}; + struct asv_judge_table exynos4212_limit[] = { /* HPM, IDS */ { 0, 0}, /* Reserved Group */ @@ -93,17 +128,63 @@ static int exynos4x12_get_ids(struct samsung_asv *asv_info) static void exynos4x12_pre_set_abb(void) { - switch (exynos_result_of_asv) { - case 0: - case 1: - case 2: - case 3: - exynos4x12_set_abb(ABB_MODE_100V); - break; - - default: - exynos4x12_set_abb(ABB_MODE_130V); - break; + if (samsung_rev() >= EXYNOS4412_REV_2_0) { + switch (exynos_result_of_asv) { + case 0: + case 1: + exynos4x12_set_abb_member(ABB_ARM, ABB_MODE_075V); + exynos4x12_set_abb_member(ABB_INT, ABB_MODE_100V); + exynos4x12_set_abb_member(ABB_MIF, ABB_MODE_100V); + exynos4x12_set_abb_member(ABB_G3D, ABB_MODE_100V); + break; + case 2: + exynos4x12_set_abb_member(ABB_ARM, ABB_MODE_100V); + exynos4x12_set_abb_member(ABB_INT, ABB_MODE_100V); + exynos4x12_set_abb_member(ABB_MIF, ABB_MODE_140V); + exynos4x12_set_abb_member(ABB_G3D, ABB_MODE_100V); + break; + case 3: + case 4: + case 5: + case 6: + case 7: + exynos4x12_set_abb_member(ABB_ARM, ABB_MODE_130V); + exynos4x12_set_abb_member(ABB_INT, ABB_MODE_130V); + exynos4x12_set_abb_member(ABB_MIF, ABB_MODE_140V); + exynos4x12_set_abb_member(ABB_G3D, ABB_MODE_100V); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + exynos4x12_set_abb_member(ABB_ARM, ABB_MODE_130V); + exynos4x12_set_abb_member(ABB_INT, ABB_MODE_130V); + exynos4x12_set_abb_member(ABB_MIF, ABB_MODE_140V); + exynos4x12_set_abb_member(ABB_G3D, ABB_MODE_130V); + break; + default: + exynos4x12_set_abb(ABB_MODE_130V); + break; + } + } else { + switch (exynos_result_of_asv) { + case 0: + case 1: + case 2: + case 3: + exynos4x12_set_abb(ABB_MODE_100V); + break; + case 4: + case 5: + case 6: + case 7: + exynos4x12_set_abb(ABB_MODE_130V); + break; + default: + exynos4x12_set_abb(ABB_MODE_130V); + break; + } } } @@ -112,11 +193,21 @@ static int exynos4x12_asv_store_result(struct samsung_asv *asv_info) unsigned int i; if (soc_is_exynos4412()) { - for (i = 0; i < ARRAY_SIZE(exynos4x12_limit); i++) { - if ((asv_info->ids_result <= exynos4x12_limit[i].ids_limit) || - (asv_info->hpm_result <= exynos4x12_limit[i].hpm_limit)) { - exynos_result_of_asv = i; - break; + if (samsung_rev() >= EXYNOS4412_REV_2_0) { + for (i = 0; i < ARRAY_SIZE(exynos4x12_limit_rev2); i++) { + if ((asv_info->ids_result <= exynos4x12_limit_rev2[i].ids_limit) || + (asv_info->hpm_result <= exynos4x12_limit_rev2[i].hpm_limit)) { + exynos_result_of_asv = i; + break; + } + } + } else { + for (i = 0; i < ARRAY_SIZE(exynos4x12_limit); i++) { + if ((asv_info->ids_result <= exynos4x12_limit[i].ids_limit) || + (asv_info->hpm_result <= exynos4x12_limit[i].hpm_limit)) { + exynos_result_of_asv = i; + break; + } } } } else { @@ -137,8 +228,10 @@ static int exynos4x12_asv_store_result(struct samsung_asv *asv_info) if (exynos_result_of_asv < DEFAULT_ASV_GROUP) exynos_result_of_asv = DEFAULT_ASV_GROUP; +#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP pr_info("EXYNOS4X12(NO SG): IDS : %d HPM : %d RESULT : %d\n", asv_info->ids_result, asv_info->hpm_result, exynos_result_of_asv); +#endif exynos4x12_pre_set_abb(); @@ -153,6 +246,8 @@ int exynos4x12_asv_init(struct samsung_asv *asv_info) int exynos_cal_asv; exynos_result_of_asv = 0; + exynos_special_flag = 0; + exynos_dynamic_ema = false; pr_info("EXYNOS4X12: Adaptive Support Voltage init\n"); @@ -161,6 +256,31 @@ int exynos4x12_asv_init(struct samsung_asv *asv_info) /* Store PKG_ID */ asv_info->pkg_id = tmp; +#ifdef CONFIG_EXYNOS4X12_1000MHZ_SUPPORT + exynos_armclk_max = 1000000; +#else + /* If maximum armclock is fused, set its value */ + if (samsung_rev() < EXYNOS4412_REV_2_0) { + switch (tmp & MOD_SG_MASK) { + case 0: + case 3: + exynos_armclk_max = 1400000; + break; + case 2: + exynos_armclk_max = 1000000; + break; + default: + exynos_armclk_max = 1400000; + break; + } + } +#endif + + if ((tmp >> EMA_OFFSET) & EMA_MASK) + exynos_dynamic_ema = true; + else + exynos_dynamic_ema = false; + /* If Speed group is fused, get speed group from */ if ((tmp >> FUSED_SG_OFFSET) & 0x1) { exynos_orig_sp = (tmp >> ORIG_SG_OFFSET) & ORIG_SG_MASK; @@ -185,11 +305,17 @@ int exynos4x12_asv_init(struct samsung_asv *asv_info) pr_info("EXYNOS4X12(SG): ORIG : %d MOD : %d RESULT : %d\n", exynos_orig_sp, exynos_mod_sp, exynos_result_of_asv); + /* set Special flag into exynos_special_flag */ + exynos_special_flag = (tmp >> LOCKING_OFFSET) & LOCKING_MASK; + exynos4x12_pre_set_abb(); return -EEXIST; } + /* set Special flag into exynos_special_flag */ + exynos_special_flag = (tmp >> LOCKING_OFFSET) & LOCKING_MASK; + asv_info->get_ids = exynos4x12_get_ids; asv_info->get_hpm = exynos4x12_get_hpm; asv_info->store_result = exynos4x12_asv_store_result; |