xref: /rk3399_rockchip-uboot/board/samsung/trats/trats.c (revision 382bee57f19b4454e2015bc19a010bc2d0ab9337)
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