189f95492SHeungJun, Kim /*
289f95492SHeungJun, Kim * Copyright (C) 2011 Samsung Electronics
389f95492SHeungJun, Kim * Heungjun Kim <riverful.kim@samsung.com>
489f95492SHeungJun, Kim * Kyungmin Park <kyungmin.park@samsung.com>
551b1cd6dSDonghwa Lee * Donghwa Lee <dh09.lee@samsung.com>
689f95492SHeungJun, Kim *
71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
889f95492SHeungJun, Kim */
989f95492SHeungJun, Kim
1089f95492SHeungJun, Kim #include <common.h>
1151b1cd6dSDonghwa Lee #include <lcd.h>
1289f95492SHeungJun, Kim #include <asm/io.h>
13903fd795SSimon Glass #include <asm/gpio.h>
1489f95492SHeungJun, Kim #include <asm/arch/cpu.h>
15d651e88aSPiotr Wilczek #include <asm/arch/pinmux.h>
1689f95492SHeungJun, Kim #include <asm/arch/clock.h>
1751b1cd6dSDonghwa Lee #include <asm/arch/mipi_dsim.h>
1889f95492SHeungJun, Kim #include <asm/arch/watchdog.h>
1989f95492SHeungJun, Kim #include <asm/arch/power.h>
20c7336815SŁukasz Majewski #include <power/pmic.h>
215d5716eeSMarek Vasut #include <usb/dwc2_udc.h>
22c7336815SŁukasz Majewski #include <power/max8997_pmic.h>
237dcda99dSŁukasz Majewski #include <power/max8997_muic.h>
2461365ffcSŁukasz Majewski #include <power/battery.h>
255a77358cSŁukasz Majewski #include <power/max17042_fg.h>
26883c19a7SJaehoon Chung #include <power/pmic.h>
27fe601647SPiotr Wilczek #include <libtizen.h>
2816297cfbSMateusz Zalega #include <usb.h>
2983301b4fSLukasz Majewski #include <usb_mass_storage.h>
3089f95492SHeungJun, Kim
3189f95492SHeungJun, Kim #include "setup.h"
3289f95492SHeungJun, Kim
3389f95492SHeungJun, Kim DECLARE_GLOBAL_DATA_PTR;
3489f95492SHeungJun, Kim
3589f95492SHeungJun, Kim unsigned int board_rev;
3689f95492SHeungJun, Kim
3789f95492SHeungJun, Kim #ifdef CONFIG_REVISION_TAG
get_board_rev(void)3889f95492SHeungJun, Kim u32 get_board_rev(void)
3989f95492SHeungJun, Kim {
4089f95492SHeungJun, Kim return board_rev;
4189f95492SHeungJun, Kim }
4289f95492SHeungJun, Kim #endif
4389f95492SHeungJun, Kim
4489f95492SHeungJun, Kim static void check_hw_revision(void);
45c0982871SMarek Vasut struct dwc2_plat_otg_data s5pc210_otg_data;
46a241d6efSLukasz Majewski
exynos_init(void)47fe601647SPiotr Wilczek int exynos_init(void)
4889f95492SHeungJun, Kim {
4989f95492SHeungJun, Kim check_hw_revision();
5089f95492SHeungJun, Kim printf("HW Revision:\t0x%x\n", board_rev);
5189f95492SHeungJun, Kim
5289f95492SHeungJun, Kim return 0;
5389f95492SHeungJun, Kim }
5489f95492SHeungJun, Kim
55fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
trats_low_power_mode(void)5669ad72a1SŁukasz Majewski static void trats_low_power_mode(void)
5769ad72a1SŁukasz Majewski {
5869ad72a1SŁukasz Majewski struct exynos4_clock *clk =
5969ad72a1SŁukasz Majewski (struct exynos4_clock *)samsung_get_base_clock();
6069ad72a1SŁukasz Majewski struct exynos4_power *pwr =
6169ad72a1SŁukasz Majewski (struct exynos4_power *)samsung_get_base_power();
6269ad72a1SŁukasz Majewski
6369ad72a1SŁukasz Majewski /* Power down CORE1 */
6469ad72a1SŁukasz Majewski /* LOCAL_PWR_CFG [1:0] 0x3 EN, 0x0 DIS */
6569ad72a1SŁukasz Majewski writel(0x0, &pwr->arm_core1_configuration);
6669ad72a1SŁukasz Majewski
6769ad72a1SŁukasz Majewski /* Change the APLL frequency */
6869ad72a1SŁukasz Majewski /* ENABLE (1 enable) | LOCKED (1 locked) */
6969ad72a1SŁukasz Majewski /* [31] | [29] */
7069ad72a1SŁukasz Majewski /* FSEL | MDIV | PDIV | SDIV */
7169ad72a1SŁukasz Majewski /* [27] | [25:16] | [13:8] | [2:0] */
7269ad72a1SŁukasz Majewski writel(0xa0c80604, &clk->apll_con0);
7369ad72a1SŁukasz Majewski
7469ad72a1SŁukasz Majewski /* Change CPU0 clock divider */
7569ad72a1SŁukasz Majewski /* CORE2_RATIO | APLL_RATIO | PCLK_DBG_RATIO | ATB_RATIO */
7669ad72a1SŁukasz Majewski /* [30:28] | [26:24] | [22:20] | [18:16] */
7769ad72a1SŁukasz Majewski /* PERIPH_RATIO | COREM1_RATIO | COREM0_RATIO | CORE_RATIO */
7869ad72a1SŁukasz Majewski /* [14:12] | [10:8] | [6:4] | [2:0] */
7969ad72a1SŁukasz Majewski writel(0x00000100, &clk->div_cpu0);
8069ad72a1SŁukasz Majewski
8169ad72a1SŁukasz Majewski /* CLK_DIV_STAT_CPU0 - wait until clock gets stable (0 = stable) */
8269ad72a1SŁukasz Majewski while (readl(&clk->div_stat_cpu0) & 0x1111111)
8369ad72a1SŁukasz Majewski continue;
8469ad72a1SŁukasz Majewski
8569ad72a1SŁukasz Majewski /* Change clock divider ratio for DMC */
8669ad72a1SŁukasz Majewski /* DMCP_RATIO | DMCD_RATIO */
8769ad72a1SŁukasz Majewski /* [22:20] | [18:16] */
8869ad72a1SŁukasz Majewski /* DMC_RATIO | DPHY_RATIO | ACP_PCLK_RATIO | ACP_RATIO */
8969ad72a1SŁukasz Majewski /* [14:12] | [10:8] | [6:4] | [2:0] */
9069ad72a1SŁukasz Majewski writel(0x13113117, &clk->div_dmc0);
9169ad72a1SŁukasz Majewski
9269ad72a1SŁukasz Majewski /* CLK_DIV_STAT_DMC0 - wait until clock gets stable (0 = stable) */
9369ad72a1SŁukasz Majewski while (readl(&clk->div_stat_dmc0) & 0x11111111)
9469ad72a1SŁukasz Majewski continue;
9569ad72a1SŁukasz Majewski
9669ad72a1SŁukasz Majewski /* Turn off unnecessary power domains */
9769ad72a1SŁukasz Majewski writel(0x0, &pwr->xxti_configuration); /* XXTI */
9869ad72a1SŁukasz Majewski writel(0x0, &pwr->cam_configuration); /* CAM */
9969ad72a1SŁukasz Majewski writel(0x0, &pwr->tv_configuration); /* TV */
10069ad72a1SŁukasz Majewski writel(0x0, &pwr->mfc_configuration); /* MFC */
10169ad72a1SŁukasz Majewski writel(0x0, &pwr->g3d_configuration); /* G3D */
10269ad72a1SŁukasz Majewski writel(0x0, &pwr->gps_configuration); /* GPS */
10369ad72a1SŁukasz Majewski writel(0x0, &pwr->gps_alive_configuration); /* GPS_ALIVE */
10469ad72a1SŁukasz Majewski
10569ad72a1SŁukasz Majewski /* Turn off unnecessary clocks */
10669ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_cam); /* CAM */
10769ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_tv); /* TV */
10869ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_mfc); /* MFC */
10969ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_g3d); /* G3D */
11069ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_image); /* IMAGE */
11169ad72a1SŁukasz Majewski writel(0x0, &clk->gate_ip_gps); /* GPS */
11269ad72a1SŁukasz Majewski }
113fc47cf9dSSimon Glass #endif
114a52a7b14SŁukasz Majewski
exynos_power_init(void)115fe601647SPiotr Wilczek int exynos_power_init(void)
116d47ab982SŁukasz Majewski {
117fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
118bdee9c85SŁukasz Majewski int chrg, ret;
119bdee9c85SŁukasz Majewski struct power_battery *pb;
120bdee9c85SŁukasz Majewski struct pmic *p_fg, *p_chrg, *p_muic, *p_bat;
121d47ab982SŁukasz Majewski
1222936df1fSŁukasz Majewski /*
1232936df1fSŁukasz Majewski * For PMIC/MUIC the I2C bus is named as I2C5, but it is connected
1242936df1fSŁukasz Majewski * to logical I2C adapter 0
1252936df1fSŁukasz Majewski *
1262936df1fSŁukasz Majewski * The FUEL_GAUGE is marked as I2C9 on the schematic, but connected
1272936df1fSŁukasz Majewski * to logical I2C adapter 1
1282936df1fSŁukasz Majewski */
1295dfbd7baSJaehoon Chung ret = power_fg_init(I2C_9);
1302d8f1e27SPiotr Wilczek ret |= power_muic_init(I2C_5);
13161365ffcSŁukasz Majewski ret |= power_bat_init(0);
132d47ab982SŁukasz Majewski if (ret)
133d47ab982SŁukasz Majewski return ret;
134d47ab982SŁukasz Majewski
135bdee9c85SŁukasz Majewski p_fg = pmic_get("MAX17042_FG");
136bdee9c85SŁukasz Majewski if (!p_fg) {
137bdee9c85SŁukasz Majewski puts("MAX17042_FG: Not found\n");
138bdee9c85SŁukasz Majewski return -ENODEV;
139bdee9c85SŁukasz Majewski }
140bdee9c85SŁukasz Majewski
141bdee9c85SŁukasz Majewski p_chrg = pmic_get("MAX8997_PMIC");
142bdee9c85SŁukasz Majewski if (!p_chrg) {
143bdee9c85SŁukasz Majewski puts("MAX8997_PMIC: Not found\n");
144bdee9c85SŁukasz Majewski return -ENODEV;
145bdee9c85SŁukasz Majewski }
146bdee9c85SŁukasz Majewski
147bdee9c85SŁukasz Majewski p_muic = pmic_get("MAX8997_MUIC");
148bdee9c85SŁukasz Majewski if (!p_muic) {
149bdee9c85SŁukasz Majewski puts("MAX8997_MUIC: Not found\n");
150bdee9c85SŁukasz Majewski return -ENODEV;
151bdee9c85SŁukasz Majewski }
152bdee9c85SŁukasz Majewski
153bdee9c85SŁukasz Majewski p_bat = pmic_get("BAT_TRATS");
154bdee9c85SŁukasz Majewski if (!p_bat) {
155bdee9c85SŁukasz Majewski puts("BAT_TRATS: Not found\n");
156bdee9c85SŁukasz Majewski return -ENODEV;
157bdee9c85SŁukasz Majewski }
158bdee9c85SŁukasz Majewski
159bdee9c85SŁukasz Majewski p_fg->parent = p_bat;
160bdee9c85SŁukasz Majewski p_chrg->parent = p_bat;
161bdee9c85SŁukasz Majewski p_muic->parent = p_bat;
162bdee9c85SŁukasz Majewski
163bdee9c85SŁukasz Majewski p_bat->low_power_mode = trats_low_power_mode;
164bdee9c85SŁukasz Majewski p_bat->pbat->battery_init(p_bat, p_fg, p_chrg, p_muic);
165bdee9c85SŁukasz Majewski
166bdee9c85SŁukasz Majewski pb = p_bat->pbat;
167bdee9c85SŁukasz Majewski chrg = p_muic->chrg->chrg_type(p_muic);
168bdee9c85SŁukasz Majewski debug("CHARGER TYPE: %d\n", chrg);
169bdee9c85SŁukasz Majewski
170bdee9c85SŁukasz Majewski if (!p_chrg->chrg->chrg_bat_present(p_chrg)) {
171bdee9c85SŁukasz Majewski puts("No battery detected\n");
1724a188365SPrzemyslaw Marczak return 0;
173bdee9c85SŁukasz Majewski }
174bdee9c85SŁukasz Majewski
175bdee9c85SŁukasz Majewski p_fg->fg->fg_battery_check(p_fg, p_bat);
176bdee9c85SŁukasz Majewski
177bdee9c85SŁukasz Majewski if (pb->bat->state == CHARGE && chrg == CHARGER_USB)
178bdee9c85SŁukasz Majewski puts("CHARGE Battery !\n");
179fc47cf9dSSimon Glass #endif
180bdee9c85SŁukasz Majewski
181d47ab982SŁukasz Majewski return 0;
182d47ab982SŁukasz Majewski }
183d47ab982SŁukasz Majewski
get_hw_revision(void)18489f95492SHeungJun, Kim static unsigned int get_hw_revision(void)
18589f95492SHeungJun, Kim {
18689f95492SHeungJun, Kim int hwrev = 0;
1877f196101SSimon Glass char str[10];
18889f95492SHeungJun, Kim int i;
18989f95492SHeungJun, Kim
19089f95492SHeungJun, Kim /* hw_rev[3:0] == GPE1[3:0] */
1917f196101SSimon Glass for (i = 0; i < 4; i++) {
1927f196101SSimon Glass int pin = i + EXYNOS4_GPIO_E10;
1937f196101SSimon Glass
1947f196101SSimon Glass sprintf(str, "hw_rev%d", i);
1957f196101SSimon Glass gpio_request(pin, str);
1967f196101SSimon Glass gpio_cfg_pin(pin, S5P_GPIO_INPUT);
1977f196101SSimon Glass gpio_set_pull(pin, S5P_GPIO_PULL_NONE);
19889f95492SHeungJun, Kim }
19989f95492SHeungJun, Kim
20089f95492SHeungJun, Kim udelay(1);
20189f95492SHeungJun, Kim
20289f95492SHeungJun, Kim for (i = 0; i < 4; i++)
203f6ae1ca0SAkshay Saraswat hwrev |= (gpio_get_value(EXYNOS4_GPIO_E10 + i) << i);
20489f95492SHeungJun, Kim
20589f95492SHeungJun, Kim debug("hwrev 0x%x\n", hwrev);
20689f95492SHeungJun, Kim
20789f95492SHeungJun, Kim return hwrev;
20889f95492SHeungJun, Kim }
20989f95492SHeungJun, Kim
check_hw_revision(void)21089f95492SHeungJun, Kim static void check_hw_revision(void)
21189f95492SHeungJun, Kim {
21289f95492SHeungJun, Kim int hwrev;
21389f95492SHeungJun, Kim
21489f95492SHeungJun, Kim hwrev = get_hw_revision();
21589f95492SHeungJun, Kim
21689f95492SHeungJun, Kim board_rev |= hwrev;
21789f95492SHeungJun, Kim }
21889f95492SHeungJun, Kim
21989f95492SHeungJun, Kim
22089f95492SHeungJun, Kim #ifdef CONFIG_USB_GADGET
s5pc210_phy_control(int on)22189f95492SHeungJun, Kim static int s5pc210_phy_control(int on)
22289f95492SHeungJun, Kim {
223883c19a7SJaehoon Chung struct udevice *dev;
224883c19a7SJaehoon Chung int reg, ret;
22589f95492SHeungJun, Kim
226883c19a7SJaehoon Chung ret = pmic_get("max8997-pmic", &dev);
227883c19a7SJaehoon Chung if (ret)
228883c19a7SJaehoon Chung return ret;
22989f95492SHeungJun, Kim
23089f95492SHeungJun, Kim if (on) {
231883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_SAFEOUTCTRL);
232883c19a7SJaehoon Chung reg |= ENSAFEOUT1;
233883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_SAFEOUTCTRL, reg);
23489f95492SHeungJun, Kim if (ret) {
235883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
236883c19a7SJaehoon Chung return ret;
23789f95492SHeungJun, Kim }
238883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_LDO3CTRL);
239883c19a7SJaehoon Chung reg |= EN_LDO;
240883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_LDO3CTRL, reg);
241883c19a7SJaehoon Chung if (ret) {
242883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
243883c19a7SJaehoon Chung return ret;
244883c19a7SJaehoon Chung }
245883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_LDO8CTRL);
246883c19a7SJaehoon Chung reg |= EN_LDO;
247883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_LDO8CTRL, reg);
248883c19a7SJaehoon Chung if (ret) {
249883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
250883c19a7SJaehoon Chung return ret;
251883c19a7SJaehoon Chung }
252883c19a7SJaehoon Chung } else {
253883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_LDO8CTRL);
254883c19a7SJaehoon Chung reg &= DIS_LDO;
255883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_LDO8CTRL, reg);
256883c19a7SJaehoon Chung if (ret) {
257883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
258883c19a7SJaehoon Chung return ret;
259883c19a7SJaehoon Chung }
260883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_LDO3CTRL);
261883c19a7SJaehoon Chung reg &= DIS_LDO;
262883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_LDO3CTRL, reg);
263883c19a7SJaehoon Chung if (ret) {
264883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
265883c19a7SJaehoon Chung return ret;
266883c19a7SJaehoon Chung }
267883c19a7SJaehoon Chung reg = pmic_reg_read(dev, MAX8997_REG_SAFEOUTCTRL);
268883c19a7SJaehoon Chung reg &= ~ENSAFEOUT1;
269883c19a7SJaehoon Chung ret = pmic_reg_write(dev, MAX8997_REG_SAFEOUTCTRL, reg);
270883c19a7SJaehoon Chung if (ret) {
271883c19a7SJaehoon Chung puts("MAX8997 setting error!\n");
272883c19a7SJaehoon Chung return ret;
273883c19a7SJaehoon Chung }
274883c19a7SJaehoon Chung
275883c19a7SJaehoon Chung }
27689f95492SHeungJun, Kim
27789f95492SHeungJun, Kim return 0;
27889f95492SHeungJun, Kim }
27989f95492SHeungJun, Kim
280c0982871SMarek Vasut struct dwc2_plat_otg_data s5pc210_otg_data = {
28189f95492SHeungJun, Kim .phy_control = s5pc210_phy_control,
28289f95492SHeungJun, Kim .regs_phy = EXYNOS4_USBPHY_BASE,
28389f95492SHeungJun, Kim .regs_otg = EXYNOS4_USBOTG_BASE,
28489f95492SHeungJun, Kim .usb_phy_ctrl = EXYNOS4_USBPHY_CONTROL,
28589f95492SHeungJun, Kim .usb_flags = PHY0_SLEEP,
28689f95492SHeungJun, Kim };
287a241d6efSLukasz Majewski
board_usb_init(int index,enum usb_init_type init)288bba67914STroy Kisky int board_usb_init(int index, enum usb_init_type init)
289a241d6efSLukasz Majewski {
290a241d6efSLukasz Majewski debug("USB_udc_probe\n");
291a4bb9b36SMarek Vasut return dwc2_udc_probe(&s5pc210_otg_data);
292a241d6efSLukasz Majewski }
2930938f5b2SPrzemyslaw Marczak
g_dnl_board_usb_cable_connected(void)29475504e95SMateusz Zalega int g_dnl_board_usb_cable_connected(void)
2950938f5b2SPrzemyslaw Marczak {
296fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
2970938f5b2SPrzemyslaw Marczak struct pmic *muic = pmic_get("MAX8997_MUIC");
2980938f5b2SPrzemyslaw Marczak if (!muic)
2990938f5b2SPrzemyslaw Marczak return 0;
3000938f5b2SPrzemyslaw Marczak
3010938f5b2SPrzemyslaw Marczak return !!muic->chrg->chrg_type(muic);
302fc47cf9dSSimon Glass #else
303fc47cf9dSSimon Glass return false;
304fc47cf9dSSimon Glass #endif
305fc47cf9dSSimon Glass
3060938f5b2SPrzemyslaw Marczak }
3070938f5b2SPrzemyslaw Marczak #endif
30889f95492SHeungJun, Kim
pmic_reset(void)30989f95492SHeungJun, Kim static void pmic_reset(void)
31089f95492SHeungJun, Kim {
311f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_X07, 1);
312f6ae1ca0SAkshay Saraswat gpio_set_pull(EXYNOS4_GPIO_X27, S5P_GPIO_PULL_NONE);
31389f95492SHeungJun, Kim }
31489f95492SHeungJun, Kim
board_clock_init(void)31589f95492SHeungJun, Kim static void board_clock_init(void)
31689f95492SHeungJun, Kim {
31789f95492SHeungJun, Kim struct exynos4_clock *clk =
31889f95492SHeungJun, Kim (struct exynos4_clock *)samsung_get_base_clock();
31989f95492SHeungJun, Kim
32089f95492SHeungJun, Kim writel(CLK_SRC_CPU_VAL, (unsigned int)&clk->src_cpu);
32189f95492SHeungJun, Kim writel(CLK_SRC_TOP0_VAL, (unsigned int)&clk->src_top0);
32289f95492SHeungJun, Kim writel(CLK_SRC_FSYS_VAL, (unsigned int)&clk->src_fsys);
32389f95492SHeungJun, Kim writel(CLK_SRC_PERIL0_VAL, (unsigned int)&clk->src_peril0);
32489f95492SHeungJun, Kim
32589f95492SHeungJun, Kim writel(CLK_DIV_CPU0_VAL, (unsigned int)&clk->div_cpu0);
32689f95492SHeungJun, Kim writel(CLK_DIV_CPU1_VAL, (unsigned int)&clk->div_cpu1);
32789f95492SHeungJun, Kim writel(CLK_DIV_DMC0_VAL, (unsigned int)&clk->div_dmc0);
32889f95492SHeungJun, Kim writel(CLK_DIV_DMC1_VAL, (unsigned int)&clk->div_dmc1);
32989f95492SHeungJun, Kim writel(CLK_DIV_LEFTBUS_VAL, (unsigned int)&clk->div_leftbus);
33089f95492SHeungJun, Kim writel(CLK_DIV_RIGHTBUS_VAL, (unsigned int)&clk->div_rightbus);
33189f95492SHeungJun, Kim writel(CLK_DIV_TOP_VAL, (unsigned int)&clk->div_top);
33289f95492SHeungJun, Kim writel(CLK_DIV_FSYS1_VAL, (unsigned int)&clk->div_fsys1);
33389f95492SHeungJun, Kim writel(CLK_DIV_FSYS2_VAL, (unsigned int)&clk->div_fsys2);
33489f95492SHeungJun, Kim writel(CLK_DIV_FSYS3_VAL, (unsigned int)&clk->div_fsys3);
33589f95492SHeungJun, Kim writel(CLK_DIV_PERIL0_VAL, (unsigned int)&clk->div_peril0);
33689f95492SHeungJun, Kim writel(CLK_DIV_PERIL3_VAL, (unsigned int)&clk->div_peril3);
33789f95492SHeungJun, Kim
33889f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->apll_lock);
33989f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->mpll_lock);
34089f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->epll_lock);
34189f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->vpll_lock);
34289f95492SHeungJun, Kim writel(APLL_CON1_VAL, (unsigned int)&clk->apll_con1);
34389f95492SHeungJun, Kim writel(APLL_CON0_VAL, (unsigned int)&clk->apll_con0);
34489f95492SHeungJun, Kim writel(MPLL_CON1_VAL, (unsigned int)&clk->mpll_con1);
34589f95492SHeungJun, Kim writel(MPLL_CON0_VAL, (unsigned int)&clk->mpll_con0);
34689f95492SHeungJun, Kim writel(EPLL_CON1_VAL, (unsigned int)&clk->epll_con1);
34789f95492SHeungJun, Kim writel(EPLL_CON0_VAL, (unsigned int)&clk->epll_con0);
34889f95492SHeungJun, Kim writel(VPLL_CON1_VAL, (unsigned int)&clk->vpll_con1);
34989f95492SHeungJun, Kim writel(VPLL_CON0_VAL, (unsigned int)&clk->vpll_con0);
35089f95492SHeungJun, Kim
35189f95492SHeungJun, Kim writel(CLK_GATE_IP_CAM_VAL, (unsigned int)&clk->gate_ip_cam);
35289f95492SHeungJun, Kim writel(CLK_GATE_IP_VP_VAL, (unsigned int)&clk->gate_ip_tv);
35389f95492SHeungJun, Kim writel(CLK_GATE_IP_MFC_VAL, (unsigned int)&clk->gate_ip_mfc);
35489f95492SHeungJun, Kim writel(CLK_GATE_IP_G3D_VAL, (unsigned int)&clk->gate_ip_g3d);
35589f95492SHeungJun, Kim writel(CLK_GATE_IP_IMAGE_VAL, (unsigned int)&clk->gate_ip_image);
35689f95492SHeungJun, Kim writel(CLK_GATE_IP_LCD0_VAL, (unsigned int)&clk->gate_ip_lcd0);
35789f95492SHeungJun, Kim writel(CLK_GATE_IP_LCD1_VAL, (unsigned int)&clk->gate_ip_lcd1);
35889f95492SHeungJun, Kim writel(CLK_GATE_IP_FSYS_VAL, (unsigned int)&clk->gate_ip_fsys);
35989f95492SHeungJun, Kim writel(CLK_GATE_IP_GPS_VAL, (unsigned int)&clk->gate_ip_gps);
36089f95492SHeungJun, Kim writel(CLK_GATE_IP_PERIL_VAL, (unsigned int)&clk->gate_ip_peril);
36189f95492SHeungJun, Kim writel(CLK_GATE_IP_PERIR_VAL, (unsigned int)&clk->gate_ip_perir);
36289f95492SHeungJun, Kim writel(CLK_GATE_BLOCK_VAL, (unsigned int)&clk->gate_block);
36389f95492SHeungJun, Kim }
36489f95492SHeungJun, Kim
board_power_init(void)36589f95492SHeungJun, Kim static void board_power_init(void)
36689f95492SHeungJun, Kim {
36789f95492SHeungJun, Kim struct exynos4_power *pwr =
36889f95492SHeungJun, Kim (struct exynos4_power *)samsung_get_base_power();
36989f95492SHeungJun, Kim
37089f95492SHeungJun, Kim /* PS HOLD */
37189f95492SHeungJun, Kim writel(EXYNOS4_PS_HOLD_CON_VAL, (unsigned int)&pwr->ps_hold_control);
37289f95492SHeungJun, Kim
37389f95492SHeungJun, Kim /* Set power down */
37489f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->cam_configuration);
37589f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->tv_configuration);
37689f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->mfc_configuration);
37789f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->g3d_configuration);
37889f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->lcd1_configuration);
37989f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->gps_configuration);
38089f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->gps_alive_configuration);
381ab23304dSPiotr Wilczek
382ab23304dSPiotr Wilczek /* It is necessary to power down core 1 */
383ab23304dSPiotr Wilczek /* to successfully boot CPU1 in kernel */
384ab23304dSPiotr Wilczek writel(0, (unsigned int)&pwr->arm_core1_configuration);
38589f95492SHeungJun, Kim }
38689f95492SHeungJun, Kim
exynos_uart_init(void)387fe601647SPiotr Wilczek static void exynos_uart_init(void)
38889f95492SHeungJun, Kim {
38989f95492SHeungJun, Kim /* UART_SEL GPY4[7] (part2) at EXYNOS4 */
3907f196101SSimon Glass gpio_request(EXYNOS4_GPIO_Y47, "uart_sel");
391f6ae1ca0SAkshay Saraswat gpio_set_pull(EXYNOS4_GPIO_Y47, S5P_GPIO_PULL_UP);
392f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_Y47, 1);
39389f95492SHeungJun, Kim }
39489f95492SHeungJun, Kim
exynos_early_init_f(void)395fe601647SPiotr Wilczek int exynos_early_init_f(void)
39689f95492SHeungJun, Kim {
39785948a8bSMinkyu Kang wdt_stop();
39889f95492SHeungJun, Kim pmic_reset();
39989f95492SHeungJun, Kim board_clock_init();
400fe601647SPiotr Wilczek exynos_uart_init();
40189f95492SHeungJun, Kim board_power_init();
40289f95492SHeungJun, Kim
40389f95492SHeungJun, Kim return 0;
40489f95492SHeungJun, Kim }
40551b1cd6dSDonghwa Lee
exynos_reset_lcd(void)40629fd5704SAjay Kumar void exynos_reset_lcd(void)
40751b1cd6dSDonghwa Lee {
4087f196101SSimon Glass gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset");
409f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_Y45, 1);
41051b1cd6dSDonghwa Lee udelay(10000);
411f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_Y45, 0);
41251b1cd6dSDonghwa Lee udelay(10000);
413f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_Y45, 1);
41451b1cd6dSDonghwa Lee }
41551b1cd6dSDonghwa Lee
lcd_power(void)416fe601647SPiotr Wilczek int lcd_power(void)
41751b1cd6dSDonghwa Lee {
418fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
41951b1cd6dSDonghwa Lee int ret = 0;
420c7336815SŁukasz Majewski struct pmic *p = pmic_get("MAX8997_PMIC");
421c7336815SŁukasz Majewski if (!p)
422c7336815SŁukasz Majewski return -ENODEV;
42351b1cd6dSDonghwa Lee
42451b1cd6dSDonghwa Lee if (pmic_probe(p))
42551b1cd6dSDonghwa Lee return 0;
42651b1cd6dSDonghwa Lee
42751b1cd6dSDonghwa Lee /* LDO15 voltage: 2.2v */
42851b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, 0x1c | EN_LDO);
42951b1cd6dSDonghwa Lee /* LDO13 voltage: 3.0v */
43051b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, 0x2c | EN_LDO);
43151b1cd6dSDonghwa Lee
43251b1cd6dSDonghwa Lee if (ret) {
43351b1cd6dSDonghwa Lee puts("MAX8997 LDO setting error!\n");
43451b1cd6dSDonghwa Lee return -1;
43551b1cd6dSDonghwa Lee }
436fc47cf9dSSimon Glass #endif
43751b1cd6dSDonghwa Lee return 0;
43851b1cd6dSDonghwa Lee }
43951b1cd6dSDonghwa Lee
mipi_power(void)440fe601647SPiotr Wilczek int mipi_power(void)
44151b1cd6dSDonghwa Lee {
442fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
44351b1cd6dSDonghwa Lee int ret = 0;
444c7336815SŁukasz Majewski struct pmic *p = pmic_get("MAX8997_PMIC");
445c7336815SŁukasz Majewski if (!p)
446c7336815SŁukasz Majewski return -ENODEV;
44751b1cd6dSDonghwa Lee
44851b1cd6dSDonghwa Lee if (pmic_probe(p))
44951b1cd6dSDonghwa Lee return 0;
45051b1cd6dSDonghwa Lee
45151b1cd6dSDonghwa Lee /* LDO3 voltage: 1.1v */
45251b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, 0x6 | EN_LDO);
45351b1cd6dSDonghwa Lee /* LDO4 voltage: 1.8v */
45451b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, 0x14 | EN_LDO);
45551b1cd6dSDonghwa Lee
45651b1cd6dSDonghwa Lee if (ret) {
45751b1cd6dSDonghwa Lee puts("MAX8997 LDO setting error!\n");
45851b1cd6dSDonghwa Lee return -1;
45951b1cd6dSDonghwa Lee }
460fc47cf9dSSimon Glass #endif
46151b1cd6dSDonghwa Lee return 0;
46251b1cd6dSDonghwa Lee }
46351b1cd6dSDonghwa Lee
464ea743e65SSimon Glass #ifdef CONFIG_LCD
exynos_lcd_misc_init(vidinfo_t * vid)465fe601647SPiotr Wilczek void exynos_lcd_misc_init(vidinfo_t *vid)
46651b1cd6dSDonghwa Lee {
46790464971SDonghwa Lee #ifdef CONFIG_TIZEN
46890464971SDonghwa Lee get_tizen_logo_info(vid);
46990464971SDonghwa Lee #endif
470fe601647SPiotr Wilczek #ifdef CONFIG_S6E8AX0
47151b1cd6dSDonghwa Lee s6e8ax0_init();
472*382bee57SSimon Glass env_set("lcdinfo", "lcd=s6e8ax0");
473fe601647SPiotr Wilczek #endif
47451b1cd6dSDonghwa Lee }
475ea743e65SSimon Glass #endif
476