xref: /rk3399_rockchip-uboot/board/samsung/universal_c210/universal.c (revision a4bb9b3636fe6dfd1cadaf34c42f4fb3b1ebe46c)
19e40808cSMinkyu Kang /*
29e40808cSMinkyu Kang  *  Copyright (C) 2010 Samsung Electronics
39e40808cSMinkyu Kang  *  Minkyu Kang <mk7.kang@samsung.com>
49e40808cSMinkyu Kang  *  Kyungmin Park <kyungmin.park@samsung.com>
59e40808cSMinkyu Kang  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
79e40808cSMinkyu Kang  */
89e40808cSMinkyu Kang 
99e40808cSMinkyu Kang #include <common.h>
10ff0fedd5SPiotr Wilczek #include <spi.h>
11d984b9f8SPiotr Wilczek #include <lcd.h>
129e40808cSMinkyu Kang #include <asm/io.h>
13ff0fedd5SPiotr Wilczek #include <asm/gpio.h>
149e40808cSMinkyu Kang #include <asm/arch/adc.h>
15ea7991b8SPiotr Wilczek #include <asm/arch/pinmux.h>
1611a44798SPiotr Wilczek #include <asm/arch/watchdog.h>
17d984b9f8SPiotr Wilczek #include <ld9040.h>
18c7336815SŁukasz Majewski #include <power/pmic.h>
193f41ffe4SPiotr Wilczek #include <usb.h>
20ddc7e541SLukasz Majewski #include <usb/s3c_udc.h>
21ddc7e541SLukasz Majewski #include <asm/arch/cpu.h>
22c7336815SŁukasz Majewski #include <power/max8998_pmic.h>
233f41ffe4SPiotr Wilczek #include <libtizen.h>
2482b0a055SPrzemyslaw Marczak #include <samsung/misc.h>
253f41ffe4SPiotr Wilczek #include <usb_mass_storage.h>
269e40808cSMinkyu Kang 
279e40808cSMinkyu Kang DECLARE_GLOBAL_DATA_PTR;
289e40808cSMinkyu Kang 
299e40808cSMinkyu Kang unsigned int board_rev;
309e40808cSMinkyu Kang 
319e40808cSMinkyu Kang u32 get_board_rev(void)
329e40808cSMinkyu Kang {
339e40808cSMinkyu Kang 	return board_rev;
349e40808cSMinkyu Kang }
359e40808cSMinkyu Kang 
369e40808cSMinkyu Kang static int get_hwrev(void)
379e40808cSMinkyu Kang {
389e40808cSMinkyu Kang 	return board_rev & 0xFF;
399e40808cSMinkyu Kang }
409e40808cSMinkyu Kang 
4148e91caeSMinkyu Kang static void init_pmic_lcd(void);
4248e91caeSMinkyu Kang 
433f41ffe4SPiotr Wilczek int exynos_power_init(void)
44f5a7004cSŁukasz Majewski {
45f5a7004cSŁukasz Majewski 	int ret;
46f5a7004cSŁukasz Majewski 
472936df1fSŁukasz Majewski 	/*
482936df1fSŁukasz Majewski 	 * For PMIC the I2C bus is named as I2C5, but it is connected
492936df1fSŁukasz Majewski 	 * to logical I2C adapter 0
502936df1fSŁukasz Majewski 	 */
51c47817beSPiotr Wilczek 	ret = pmic_init(I2C_0);
52f5a7004cSŁukasz Majewski 	if (ret)
53f5a7004cSŁukasz Majewski 		return ret;
54f5a7004cSŁukasz Majewski 
5548e91caeSMinkyu Kang 	init_pmic_lcd();
5648e91caeSMinkyu Kang 
57f5a7004cSŁukasz Majewski 	return 0;
58f5a7004cSŁukasz Majewski }
599e40808cSMinkyu Kang 
609e40808cSMinkyu Kang static unsigned short get_adc_value(int channel)
619e40808cSMinkyu Kang {
629e40808cSMinkyu Kang 	struct s5p_adc *adc = (struct s5p_adc *)samsung_get_base_adc();
639e40808cSMinkyu Kang 	unsigned short ret = 0;
649e40808cSMinkyu Kang 	unsigned int reg;
659e40808cSMinkyu Kang 	unsigned int loop = 0;
669e40808cSMinkyu Kang 
679e40808cSMinkyu Kang 	writel(channel & 0xF, &adc->adcmux);
689e40808cSMinkyu Kang 	writel((1 << 14) | (49 << 6), &adc->adccon);
699e40808cSMinkyu Kang 	writel(1000 & 0xffff, &adc->adcdly);
709e40808cSMinkyu Kang 	writel(readl(&adc->adccon) | (1 << 16), &adc->adccon); /* 12 bit */
719e40808cSMinkyu Kang 	udelay(10);
729e40808cSMinkyu Kang 	writel(readl(&adc->adccon) | (1 << 0), &adc->adccon); /* Enable */
739e40808cSMinkyu Kang 	udelay(10);
749e40808cSMinkyu Kang 
759e40808cSMinkyu Kang 	do {
769e40808cSMinkyu Kang 		udelay(1);
779e40808cSMinkyu Kang 		reg = readl(&adc->adccon);
789e40808cSMinkyu Kang 	} while (!(reg & (1 << 15)) && (loop++ < 1000));
799e40808cSMinkyu Kang 
809e40808cSMinkyu Kang 	ret = readl(&adc->adcdat0) & 0xFFF;
819e40808cSMinkyu Kang 
829e40808cSMinkyu Kang 	return ret;
839e40808cSMinkyu Kang }
849e40808cSMinkyu Kang 
854d86bf08SŁukasz Majewski static int adc_power_control(int on)
864d86bf08SŁukasz Majewski {
874d86bf08SŁukasz Majewski 	int ret;
88c7336815SŁukasz Majewski 	struct pmic *p = pmic_get("MAX8998_PMIC");
89c7336815SŁukasz Majewski 	if (!p)
90c7336815SŁukasz Majewski 		return -ENODEV;
914d86bf08SŁukasz Majewski 
924d86bf08SŁukasz Majewski 	if (pmic_probe(p))
934d86bf08SŁukasz Majewski 		return -1;
944d86bf08SŁukasz Majewski 
954d86bf08SŁukasz Majewski 	ret = pmic_set_output(p,
964d86bf08SŁukasz Majewski 			      MAX8998_REG_ONOFF1,
974d86bf08SŁukasz Majewski 			      MAX8998_LDO4, !!on);
984d86bf08SŁukasz Majewski 
994d86bf08SŁukasz Majewski 	return ret;
1004d86bf08SŁukasz Majewski }
1014d86bf08SŁukasz Majewski 
1029e40808cSMinkyu Kang static unsigned int get_hw_revision(void)
1039e40808cSMinkyu Kang {
1049e40808cSMinkyu Kang 	int hwrev, mode0, mode1;
1059e40808cSMinkyu Kang 
1064d86bf08SŁukasz Majewski 	adc_power_control(1);
1074d86bf08SŁukasz Majewski 
1089e40808cSMinkyu Kang 	mode0 = get_adc_value(1);		/* HWREV_MODE0 */
1099e40808cSMinkyu Kang 	mode1 = get_adc_value(2);		/* HWREV_MODE1 */
1109e40808cSMinkyu Kang 
1119e40808cSMinkyu Kang 	/*
1129e40808cSMinkyu Kang 	 * XXX Always set the default hwrev as the latest board
1139e40808cSMinkyu Kang 	 * ADC = (voltage) / 3.3 * 4096
1149e40808cSMinkyu Kang 	 */
1159e40808cSMinkyu Kang 	hwrev = 3;
1169e40808cSMinkyu Kang 
1179e40808cSMinkyu Kang #define IS_RANGE(x, min, max)	((x) > (min) && (x) < (max))
1189e40808cSMinkyu Kang 	if (IS_RANGE(mode0, 80, 200) && IS_RANGE(mode1, 80, 200))
1199e40808cSMinkyu Kang 		hwrev = 0x0;		/* 0.01V	0.01V */
1209e40808cSMinkyu Kang 	if (IS_RANGE(mode0, 750, 1000) && IS_RANGE(mode1, 80, 200))
1219e40808cSMinkyu Kang 		hwrev = 0x1;		/* 610mV	0.01V */
1229e40808cSMinkyu Kang 	if (IS_RANGE(mode0, 1300, 1700) && IS_RANGE(mode1, 80, 200))
1239e40808cSMinkyu Kang 		hwrev = 0x2;		/* 1.16V	0.01V */
1249e40808cSMinkyu Kang 	if (IS_RANGE(mode0, 2000, 2400) && IS_RANGE(mode1, 80, 200))
1259e40808cSMinkyu Kang 		hwrev = 0x3;		/* 1.79V	0.01V */
1269e40808cSMinkyu Kang #undef IS_RANGE
1279e40808cSMinkyu Kang 
1289e40808cSMinkyu Kang 	debug("mode0: %d, mode1: %d, hwrev 0x%x\n", mode0, mode1, hwrev);
1299e40808cSMinkyu Kang 
1304d86bf08SŁukasz Majewski 	adc_power_control(0);
1314d86bf08SŁukasz Majewski 
1329e40808cSMinkyu Kang 	return hwrev;
1339e40808cSMinkyu Kang }
1349e40808cSMinkyu Kang 
1359e40808cSMinkyu Kang static void check_hw_revision(void)
1369e40808cSMinkyu Kang {
1379e40808cSMinkyu Kang 	int hwrev;
1389e40808cSMinkyu Kang 
1399e40808cSMinkyu Kang 	hwrev = get_hw_revision();
1409e40808cSMinkyu Kang 
1419e40808cSMinkyu Kang 	board_rev |= hwrev;
1429e40808cSMinkyu Kang }
1439e40808cSMinkyu Kang 
144ddc7e541SLukasz Majewski #ifdef CONFIG_USB_GADGET
145ddc7e541SLukasz Majewski static int s5pc210_phy_control(int on)
146ddc7e541SLukasz Majewski {
147e03492c8SAnatolij Gustschin 	int ret = 0;
148c7336815SŁukasz Majewski 	struct pmic *p = pmic_get("MAX8998_PMIC");
149c7336815SŁukasz Majewski 	if (!p)
150c7336815SŁukasz Majewski 		return -ENODEV;
151ddc7e541SLukasz Majewski 
152ddc7e541SLukasz Majewski 	if (pmic_probe(p))
153ddc7e541SLukasz Majewski 		return -1;
154ddc7e541SLukasz Majewski 
155ddc7e541SLukasz Majewski 	if (on) {
156ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p,
157ddc7e541SLukasz Majewski 				       MAX8998_REG_BUCK_ACTIVE_DISCHARGE3,
158ddc7e541SLukasz Majewski 				       MAX8998_SAFEOUT1, LDO_ON);
159ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p, MAX8998_REG_ONOFF1,
160ddc7e541SLukasz Majewski 				      MAX8998_LDO3, LDO_ON);
161ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p, MAX8998_REG_ONOFF2,
162ddc7e541SLukasz Majewski 				      MAX8998_LDO8, LDO_ON);
163ddc7e541SLukasz Majewski 
164ddc7e541SLukasz Majewski 	} else {
165ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p, MAX8998_REG_ONOFF2,
166ddc7e541SLukasz Majewski 				      MAX8998_LDO8, LDO_OFF);
167ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p, MAX8998_REG_ONOFF1,
168ddc7e541SLukasz Majewski 				      MAX8998_LDO3, LDO_OFF);
169ddc7e541SLukasz Majewski 		ret |= pmic_set_output(p,
170ddc7e541SLukasz Majewski 				       MAX8998_REG_BUCK_ACTIVE_DISCHARGE3,
171ddc7e541SLukasz Majewski 				       MAX8998_SAFEOUT1, LDO_OFF);
172ddc7e541SLukasz Majewski 	}
173ddc7e541SLukasz Majewski 
174ddc7e541SLukasz Majewski 	if (ret) {
175ddc7e541SLukasz Majewski 		puts("MAX8998 LDO setting error!\n");
176ddc7e541SLukasz Majewski 		return -1;
177ddc7e541SLukasz Majewski 	}
178ddc7e541SLukasz Majewski 
179ddc7e541SLukasz Majewski 	return 0;
180ddc7e541SLukasz Majewski }
181ddc7e541SLukasz Majewski 
182c0982871SMarek Vasut struct dwc2_plat_otg_data s5pc210_otg_data = {
183ddc7e541SLukasz Majewski 	.phy_control = s5pc210_phy_control,
184ddc7e541SLukasz Majewski 	.regs_phy = EXYNOS4_USBPHY_BASE,
185ddc7e541SLukasz Majewski 	.regs_otg = EXYNOS4_USBOTG_BASE,
186ddc7e541SLukasz Majewski 	.usb_phy_ctrl = EXYNOS4_USBPHY_CONTROL,
187ddc7e541SLukasz Majewski 	.usb_flags = PHY0_SLEEP,
188ddc7e541SLukasz Majewski };
189ddc7e541SLukasz Majewski #endif
19011a44798SPiotr Wilczek 
1913f41ffe4SPiotr Wilczek int board_usb_init(int index, enum usb_init_type init)
1923f41ffe4SPiotr Wilczek {
1933f41ffe4SPiotr Wilczek 	debug("USB_udc_probe\n");
194*a4bb9b36SMarek Vasut 	return dwc2_udc_probe(&s5pc210_otg_data);
1953f41ffe4SPiotr Wilczek }
1963f41ffe4SPiotr Wilczek 
1973f41ffe4SPiotr Wilczek int exynos_early_init_f(void)
19811a44798SPiotr Wilczek {
19911a44798SPiotr Wilczek 	wdt_stop();
20011a44798SPiotr Wilczek 
20111a44798SPiotr Wilczek 	return 0;
20211a44798SPiotr Wilczek }
203ff0fedd5SPiotr Wilczek 
204d984b9f8SPiotr Wilczek static void init_pmic_lcd(void)
205d984b9f8SPiotr Wilczek {
206d984b9f8SPiotr Wilczek 	unsigned char val;
207d984b9f8SPiotr Wilczek 	int ret = 0;
208d984b9f8SPiotr Wilczek 
20948e91caeSMinkyu Kang 	struct pmic *p = pmic_get("MAX8998_PMIC");
210d984b9f8SPiotr Wilczek 
211fbef8e6eSMinkyu Kang 	if (!p)
212fbef8e6eSMinkyu Kang 		return;
213fbef8e6eSMinkyu Kang 
214d984b9f8SPiotr Wilczek 	if (pmic_probe(p))
215d984b9f8SPiotr Wilczek 		return;
216d984b9f8SPiotr Wilczek 
217d984b9f8SPiotr Wilczek 	/* LDO7 1.8V */
218d984b9f8SPiotr Wilczek 	val = 0x02; /* (1800 - 1600) / 100; */
219d984b9f8SPiotr Wilczek 	ret |= pmic_reg_write(p,  MAX8998_REG_LDO7, val);
220d984b9f8SPiotr Wilczek 
221d984b9f8SPiotr Wilczek 	/* LDO17 3.0V */
222d984b9f8SPiotr Wilczek 	val = 0xe; /* (3000 - 1600) / 100; */
223d984b9f8SPiotr Wilczek 	ret |= pmic_reg_write(p,  MAX8998_REG_LDO17, val);
224d984b9f8SPiotr Wilczek 
225d984b9f8SPiotr Wilczek 	/* Disable unneeded regulators */
226d984b9f8SPiotr Wilczek 	/*
227d984b9f8SPiotr Wilczek 	 * ONOFF1
228d984b9f8SPiotr Wilczek 	 * Buck1 ON, Buck2 OFF, Buck3 ON, Buck4 ON
229d984b9f8SPiotr Wilczek 	 * LDO2 ON, LDO3 OFF, LDO4 OFF, LDO5 ON
230d984b9f8SPiotr Wilczek 	 */
231d984b9f8SPiotr Wilczek 	val = 0xB9;
232d984b9f8SPiotr Wilczek 	ret |= pmic_reg_write(p,  MAX8998_REG_ONOFF1, val);
233d984b9f8SPiotr Wilczek 
234d984b9f8SPiotr Wilczek 	/* ONOFF2
235d984b9f8SPiotr Wilczek 	 * LDO6 OFF, LDO7 ON, LDO8 OFF, LDO9 ON,
236d984b9f8SPiotr Wilczek 	 * LDO10 OFF, LDO11 OFF, LDO12 OFF, LDO13 OFF
237d984b9f8SPiotr Wilczek 	 */
238d984b9f8SPiotr Wilczek 	val = 0x50;
239d984b9f8SPiotr Wilczek 	ret |= pmic_reg_write(p,  MAX8998_REG_ONOFF2, val);
240d984b9f8SPiotr Wilczek 
241d984b9f8SPiotr Wilczek 	/* ONOFF3
242d984b9f8SPiotr Wilczek 	 * LDO14 OFF, LDO15 OFF, LGO16 OFF, LDO17 OFF
243d984b9f8SPiotr Wilczek 	 * EPWRHOLD OFF, EBATTMON OFF, ELBCNFG2 OFF, ELBCNFG1 OFF
244d984b9f8SPiotr Wilczek 	 */
245d984b9f8SPiotr Wilczek 	val = 0x00;
246d984b9f8SPiotr Wilczek 	ret |= pmic_reg_write(p,  MAX8998_REG_ONOFF3, val);
247d984b9f8SPiotr Wilczek 
248d984b9f8SPiotr Wilczek 	if (ret)
249d984b9f8SPiotr Wilczek 		puts("LCD pmic initialisation error!\n");
250d984b9f8SPiotr Wilczek }
251d984b9f8SPiotr Wilczek 
25229fd5704SAjay Kumar void exynos_cfg_lcd_gpio(void)
253d984b9f8SPiotr Wilczek {
254d984b9f8SPiotr Wilczek 	unsigned int i, f3_end = 4;
255d984b9f8SPiotr Wilczek 
256d984b9f8SPiotr Wilczek 	for (i = 0; i < 8; i++) {
257d984b9f8SPiotr Wilczek 		/* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
258f6ae1ca0SAkshay Saraswat 		gpio_cfg_pin(EXYNOS4_GPIO_F00 + i, S5P_GPIO_FUNC(2));
259f6ae1ca0SAkshay Saraswat 		gpio_cfg_pin(EXYNOS4_GPIO_F10 + i, S5P_GPIO_FUNC(2));
260f6ae1ca0SAkshay Saraswat 		gpio_cfg_pin(EXYNOS4_GPIO_F20 + i, S5P_GPIO_FUNC(2));
261d984b9f8SPiotr Wilczek 		/* pull-up/down disable */
262f6ae1ca0SAkshay Saraswat 		gpio_set_pull(EXYNOS4_GPIO_F00 + i, S5P_GPIO_PULL_NONE);
263f6ae1ca0SAkshay Saraswat 		gpio_set_pull(EXYNOS4_GPIO_F10 + i, S5P_GPIO_PULL_NONE);
264f6ae1ca0SAkshay Saraswat 		gpio_set_pull(EXYNOS4_GPIO_F20 + i, S5P_GPIO_PULL_NONE);
265d984b9f8SPiotr Wilczek 
266d984b9f8SPiotr Wilczek 		/* drive strength to max (24bit) */
267f6ae1ca0SAkshay Saraswat 		gpio_set_drv(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_4X);
268f6ae1ca0SAkshay Saraswat 		gpio_set_rate(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_SLOW);
269f6ae1ca0SAkshay Saraswat 		gpio_set_drv(EXYNOS4_GPIO_F10 + i, S5P_GPIO_DRV_4X);
270f6ae1ca0SAkshay Saraswat 		gpio_set_rate(EXYNOS4_GPIO_F10 + i, S5P_GPIO_DRV_SLOW);
271f6ae1ca0SAkshay Saraswat 		gpio_set_drv(EXYNOS4_GPIO_F20 + i, S5P_GPIO_DRV_4X);
272f6ae1ca0SAkshay Saraswat 		gpio_set_rate(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_SLOW);
273d984b9f8SPiotr Wilczek 	}
274d984b9f8SPiotr Wilczek 
275f6ae1ca0SAkshay Saraswat 	for (i = EXYNOS4_GPIO_F30; i < (EXYNOS4_GPIO_F30 + f3_end); i++) {
276d984b9f8SPiotr Wilczek 		/* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
277f6ae1ca0SAkshay Saraswat 		gpio_cfg_pin(i, S5P_GPIO_FUNC(2));
278d984b9f8SPiotr Wilczek 		/* pull-up/down disable */
279f6ae1ca0SAkshay Saraswat 		gpio_set_pull(i, S5P_GPIO_PULL_NONE);
280d984b9f8SPiotr Wilczek 		/* drive strength to max (24bit) */
281f6ae1ca0SAkshay Saraswat 		gpio_set_drv(i, S5P_GPIO_DRV_4X);
282f6ae1ca0SAkshay Saraswat 		gpio_set_rate(i, S5P_GPIO_DRV_SLOW);
283d984b9f8SPiotr Wilczek 	}
284d984b9f8SPiotr Wilczek 
285d984b9f8SPiotr Wilczek 	/* gpio pad configuration for LCD reset. */
2867f196101SSimon Glass 	gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset");
287f6ae1ca0SAkshay Saraswat 	gpio_cfg_pin(EXYNOS4_GPIO_Y45, S5P_GPIO_OUTPUT);
288d984b9f8SPiotr Wilczek }
289d984b9f8SPiotr Wilczek 
2903f41ffe4SPiotr Wilczek int mipi_power(void)
2913f41ffe4SPiotr Wilczek {
2923f41ffe4SPiotr Wilczek 	return 0;
2933f41ffe4SPiotr Wilczek }
2943f41ffe4SPiotr Wilczek 
29529fd5704SAjay Kumar void exynos_reset_lcd(void)
296d984b9f8SPiotr Wilczek {
297f6ae1ca0SAkshay Saraswat 	gpio_set_value(EXYNOS4_GPIO_Y45, 1);
298d984b9f8SPiotr Wilczek 	udelay(10000);
299f6ae1ca0SAkshay Saraswat 	gpio_set_value(EXYNOS4_GPIO_Y45, 0);
300d984b9f8SPiotr Wilczek 	udelay(10000);
301f6ae1ca0SAkshay Saraswat 	gpio_set_value(EXYNOS4_GPIO_Y45, 1);
302d984b9f8SPiotr Wilczek 	udelay(100);
303d984b9f8SPiotr Wilczek }
304d984b9f8SPiotr Wilczek 
30529fd5704SAjay Kumar void exynos_lcd_power_on(void)
306d984b9f8SPiotr Wilczek {
30748e91caeSMinkyu Kang 	struct pmic *p = pmic_get("MAX8998_PMIC");
308d984b9f8SPiotr Wilczek 
309fbef8e6eSMinkyu Kang 	if (!p)
310fbef8e6eSMinkyu Kang 		return;
311fbef8e6eSMinkyu Kang 
312d984b9f8SPiotr Wilczek 	if (pmic_probe(p))
313d984b9f8SPiotr Wilczek 		return;
314d984b9f8SPiotr Wilczek 
315d984b9f8SPiotr Wilczek 	pmic_set_output(p, MAX8998_REG_ONOFF3, MAX8998_LDO17, LDO_ON);
316d984b9f8SPiotr Wilczek 	pmic_set_output(p, MAX8998_REG_ONOFF2, MAX8998_LDO7, LDO_ON);
317d984b9f8SPiotr Wilczek }
318d984b9f8SPiotr Wilczek 
31929fd5704SAjay Kumar void exynos_cfg_ldo(void)
32029fd5704SAjay Kumar {
32129fd5704SAjay Kumar 	ld9040_cfg_ldo();
32229fd5704SAjay Kumar }
32329fd5704SAjay Kumar 
32429fd5704SAjay Kumar void exynos_enable_ldo(unsigned int onoff)
32529fd5704SAjay Kumar {
32629fd5704SAjay Kumar 	ld9040_enable_ldo(onoff);
32729fd5704SAjay Kumar }
32829fd5704SAjay Kumar 
3293f41ffe4SPiotr Wilczek int exynos_init(void)
330ff0fedd5SPiotr Wilczek {
3314381aad9SPrzemyslaw Marczak 	char buf[16];
3324381aad9SPrzemyslaw Marczak 
333ff0fedd5SPiotr Wilczek 	gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;
3343f41ffe4SPiotr Wilczek 
3353f41ffe4SPiotr Wilczek 	switch (get_hwrev()) {
3363f41ffe4SPiotr Wilczek 	case 0:
3373f41ffe4SPiotr Wilczek 		/*
3383f41ffe4SPiotr Wilczek 		 * Set the low to enable LDO_EN
3393f41ffe4SPiotr Wilczek 		 * But when you use the test board for eMMC booting
3403f41ffe4SPiotr Wilczek 		 * you should set it HIGH since it removes the inverter
3413f41ffe4SPiotr Wilczek 		 */
3423f41ffe4SPiotr Wilczek 		/* MASSMEMORY_EN: XMDMDATA_6: GPE3[6] */
3437f196101SSimon Glass 		gpio_request(EXYNOS4_GPIO_E36, "ldo_en");
344f6ae1ca0SAkshay Saraswat 		gpio_direction_output(EXYNOS4_GPIO_E36, 0);
3453f41ffe4SPiotr Wilczek 		break;
3463f41ffe4SPiotr Wilczek 	default:
3473f41ffe4SPiotr Wilczek 		/*
3483f41ffe4SPiotr Wilczek 		 * Default reset state is High and there's no inverter
3493f41ffe4SPiotr Wilczek 		 * But set it as HIGH to ensure
3503f41ffe4SPiotr Wilczek 		 */
3513f41ffe4SPiotr Wilczek 		/* MASSMEMORY_EN: XMDMADDR_3: GPE1[3] */
3527f196101SSimon Glass 		gpio_request(EXYNOS4_GPIO_E13, "massmemory_en");
353f6ae1ca0SAkshay Saraswat 		gpio_direction_output(EXYNOS4_GPIO_E13, 1);
3543f41ffe4SPiotr Wilczek 		break;
3553f41ffe4SPiotr Wilczek 	}
356ff0fedd5SPiotr Wilczek 
3574381aad9SPrzemyslaw Marczak 	/* Request soft I2C gpios */
3584381aad9SPrzemyslaw Marczak 	sprintf(buf, "soft_i2c_scl");
3594381aad9SPrzemyslaw Marczak 	gpio_request(CONFIG_SOFT_I2C_GPIO_SCL, buf);
3604381aad9SPrzemyslaw Marczak 
3614381aad9SPrzemyslaw Marczak 	sprintf(buf, "soft_i2c_sda");
3624381aad9SPrzemyslaw Marczak 	gpio_request(CONFIG_SOFT_I2C_GPIO_SDA, buf);
3634381aad9SPrzemyslaw Marczak 
364ff0fedd5SPiotr Wilczek 	check_hw_revision();
365ff0fedd5SPiotr Wilczek 	printf("HW Revision:\t0x%x\n", board_rev);
366ff0fedd5SPiotr Wilczek 
367ff0fedd5SPiotr Wilczek 	return 0;
368ff0fedd5SPiotr Wilczek }
369679549d1SPrzemyslaw Marczak 
3703f41ffe4SPiotr Wilczek void exynos_lcd_misc_init(vidinfo_t *vid)
371679549d1SPrzemyslaw Marczak {
3723f41ffe4SPiotr Wilczek #ifdef CONFIG_TIZEN
3733f41ffe4SPiotr Wilczek 	get_tizen_logo_info(vid);
374815a6072SPiotr Wilczek #endif
3753f41ffe4SPiotr Wilczek 
3763f41ffe4SPiotr Wilczek 	/* for LD9040. */
3773f41ffe4SPiotr Wilczek 	vid->pclk_name = 1;	/* MPLL */
3783f41ffe4SPiotr Wilczek 	vid->sclk_div = 1;
3793f41ffe4SPiotr Wilczek 
3803f41ffe4SPiotr Wilczek 	setenv("lcdinfo", "lcd=ld9040");
381679549d1SPrzemyslaw Marczak }
382