From patchwork Fri Sep 14 15:40:15 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [U-Boot, 16/16] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Date: Fri, 14 Sep 2012 05:40:15 -0000 From: =?utf-8?q?=C5=81ukasz_Majewski?= X-Patchwork-Id: 183961 Message-Id: <1347637215-4830-17-git-send-email-l.majewski@samsung.com> To: u-boot@lists.denx.de Cc: Lukasz Majewski , Kyungmin Park , Tom Rini When charging battery is necessary, the development board needs to be turned into low power mode for better efficiency. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Minkyu Kang --- board/samsung/trats/trats.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c index 21050c8..f213d72 100644 --- a/board/samsung/trats/trats.c +++ b/board/samsung/trats/trats.c @@ -89,6 +89,48 @@ void i2c_init_board(void) s5p_gpio_direction_output(&gpio2->y4, 1, 1); } +static void trats_low_power_mode(void) +{ + struct exynos4_clock *clk = + (struct exynos4_clock *)samsung_get_base_clock(); + struct exynos4_power *pwr = + (struct exynos4_power *)samsung_get_base_power(); + + /* Power down CORE1 */ + writel(0x0, &pwr->arm_core1_configuration); + + /* Change the APLL frequency */ + writel(0xa0c80604, &clk->apll_con0); + /* Change CPU0 clock divider */ + writel(0x00000100, &clk->div_cpu0); + /* CLK_DIV_STAT_CPU0 - wait until clock gets stable */ + while (readl(&clk->div_stat_cpu0) & 0x1111111) + ; + + /* Change clock divider ratio for DMC */ + writel(0x13113117, &clk->div_dmc0); + while (readl(&clk->div_stat_dmc0) & 0x11111111) + ; + + /* Turn off unnecessary power domains */ + writel(0x0, &pwr->xxti_configuration); /* XXTI */ + writel(0x0, &pwr->cam_configuration); /* CAM */ + writel(0x0, &pwr->tv_configuration); /* TV */ + writel(0x0, &pwr->mfc_configuration); /* MFC */ + writel(0x0, &pwr->g3d_configuration); /* G3D */ + writel(0x0, &pwr->gps_configuration); /* GPS */ + writel(0x0, &pwr->gps_alive_configuration); /* GPS_ALIVE */ + + /* Turn off unnecessary clocks */ + writel(0x0, &clk->gate_ip_cam); /* CAM */ + writel(0x0, &clk->gate_ip_tv); /* TV */ + writel(0x0, &clk->gate_ip_mfc); /* MFC */ + writel(0x0, &clk->gate_ip_g3d); /* G3D */ + writel(0x0, &clk->gate_ip_image); /* IMAGE */ + writel(0x0, &clk->gate_ip_gps); /* GPS */ +} + + static int pmic_init_max8997(void) { struct pmic *p = pmic_get("MAX8997_PMIC"); @@ -262,6 +304,7 @@ int power_board_init(void) power_check_battery(&bat); if (bat.state == CHARGE && chrg == CHARGER_USB) { + trats_low_power_mode(); puts("CHARGER ENABLE\n"); if (pmic_charger_state(CHARGER_ENABLE, 450)) return -1;