trats.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. /*
  2. * Copyright (C) 2011 Samsung Electronics
  3. * Heungjun Kim <riverful.kim@samsung.com>
  4. * Kyungmin Park <kyungmin.park@samsung.com>
  5. * Donghwa Lee <dh09.lee@samsung.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <lcd.h>
  11. #include <asm/io.h>
  12. #include <asm/gpio.h>
  13. #include <asm/arch/cpu.h>
  14. #include <asm/arch/pinmux.h>
  15. #include <asm/arch/clock.h>
  16. #include <asm/arch/mipi_dsim.h>
  17. #include <asm/arch/watchdog.h>
  18. #include <asm/arch/power.h>
  19. #include <power/pmic.h>
  20. #include <usb/dwc2_udc.h>
  21. #include <power/max8997_pmic.h>
  22. #include <power/max8997_muic.h>
  23. #include <power/battery.h>
  24. #include <power/max17042_fg.h>
  25. #include <libtizen.h>
  26. #include <usb.h>
  27. #include <usb_mass_storage.h>
  28. #include "setup.h"
  29. DECLARE_GLOBAL_DATA_PTR;
  30. unsigned int board_rev;
  31. #ifdef CONFIG_REVISION_TAG
  32. u32 get_board_rev(void)
  33. {
  34. return board_rev;
  35. }
  36. #endif
  37. static void check_hw_revision(void);
  38. struct dwc2_plat_otg_data s5pc210_otg_data;
  39. int exynos_init(void)
  40. {
  41. check_hw_revision();
  42. printf("HW Revision:\t0x%x\n", board_rev);
  43. return 0;
  44. }
  45. void i2c_init_board(void)
  46. {
  47. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  48. int err;
  49. /* I2C_5 -> PMIC */
  50. err = exynos_pinmux_config(PERIPH_ID_I2C5, PINMUX_FLAG_NONE);
  51. if (err) {
  52. debug("I2C%d not configured\n", (I2C_5));
  53. return;
  54. }
  55. /* I2C_8 -> FG */
  56. gpio_request(EXYNOS4_GPIO_Y40, "i2c_clk");
  57. gpio_request(EXYNOS4_GPIO_Y41, "i2c_data");
  58. gpio_direction_output(EXYNOS4_GPIO_Y40, 1);
  59. gpio_direction_output(EXYNOS4_GPIO_Y41, 1);
  60. #endif
  61. }
  62. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  63. static void trats_low_power_mode(void)
  64. {
  65. struct exynos4_clock *clk =
  66. (struct exynos4_clock *)samsung_get_base_clock();
  67. struct exynos4_power *pwr =
  68. (struct exynos4_power *)samsung_get_base_power();
  69. /* Power down CORE1 */
  70. /* LOCAL_PWR_CFG [1:0] 0x3 EN, 0x0 DIS */
  71. writel(0x0, &pwr->arm_core1_configuration);
  72. /* Change the APLL frequency */
  73. /* ENABLE (1 enable) | LOCKED (1 locked) */
  74. /* [31] | [29] */
  75. /* FSEL | MDIV | PDIV | SDIV */
  76. /* [27] | [25:16] | [13:8] | [2:0] */
  77. writel(0xa0c80604, &clk->apll_con0);
  78. /* Change CPU0 clock divider */
  79. /* CORE2_RATIO | APLL_RATIO | PCLK_DBG_RATIO | ATB_RATIO */
  80. /* [30:28] | [26:24] | [22:20] | [18:16] */
  81. /* PERIPH_RATIO | COREM1_RATIO | COREM0_RATIO | CORE_RATIO */
  82. /* [14:12] | [10:8] | [6:4] | [2:0] */
  83. writel(0x00000100, &clk->div_cpu0);
  84. /* CLK_DIV_STAT_CPU0 - wait until clock gets stable (0 = stable) */
  85. while (readl(&clk->div_stat_cpu0) & 0x1111111)
  86. continue;
  87. /* Change clock divider ratio for DMC */
  88. /* DMCP_RATIO | DMCD_RATIO */
  89. /* [22:20] | [18:16] */
  90. /* DMC_RATIO | DPHY_RATIO | ACP_PCLK_RATIO | ACP_RATIO */
  91. /* [14:12] | [10:8] | [6:4] | [2:0] */
  92. writel(0x13113117, &clk->div_dmc0);
  93. /* CLK_DIV_STAT_DMC0 - wait until clock gets stable (0 = stable) */
  94. while (readl(&clk->div_stat_dmc0) & 0x11111111)
  95. continue;
  96. /* Turn off unnecessary power domains */
  97. writel(0x0, &pwr->xxti_configuration); /* XXTI */
  98. writel(0x0, &pwr->cam_configuration); /* CAM */
  99. writel(0x0, &pwr->tv_configuration); /* TV */
  100. writel(0x0, &pwr->mfc_configuration); /* MFC */
  101. writel(0x0, &pwr->g3d_configuration); /* G3D */
  102. writel(0x0, &pwr->gps_configuration); /* GPS */
  103. writel(0x0, &pwr->gps_alive_configuration); /* GPS_ALIVE */
  104. /* Turn off unnecessary clocks */
  105. writel(0x0, &clk->gate_ip_cam); /* CAM */
  106. writel(0x0, &clk->gate_ip_tv); /* TV */
  107. writel(0x0, &clk->gate_ip_mfc); /* MFC */
  108. writel(0x0, &clk->gate_ip_g3d); /* G3D */
  109. writel(0x0, &clk->gate_ip_image); /* IMAGE */
  110. writel(0x0, &clk->gate_ip_gps); /* GPS */
  111. }
  112. static int pmic_init_max8997(void)
  113. {
  114. struct pmic *p = pmic_get("MAX8997_PMIC");
  115. int i = 0, ret = 0;
  116. u32 val;
  117. if (pmic_probe(p))
  118. return -1;
  119. /* BUCK1 VARM: 1.2V */
  120. val = (1200000 - 650000) / 25000;
  121. ret |= pmic_reg_write(p, MAX8997_REG_BUCK1DVS1, val);
  122. val = ENBUCK | ACTIVE_DISCHARGE; /* DVS OFF */
  123. ret |= pmic_reg_write(p, MAX8997_REG_BUCK1CTRL, val);
  124. /* BUCK2 VINT: 1.1V */
  125. val = (1100000 - 650000) / 25000;
  126. ret |= pmic_reg_write(p, MAX8997_REG_BUCK2DVS1, val);
  127. val = ENBUCK | ACTIVE_DISCHARGE; /* DVS OFF */
  128. ret |= pmic_reg_write(p, MAX8997_REG_BUCK2CTRL, val);
  129. /* BUCK3 G3D: 1.1V - OFF */
  130. ret |= pmic_reg_read(p, MAX8997_REG_BUCK3CTRL, &val);
  131. val &= ~ENBUCK;
  132. ret |= pmic_reg_write(p, MAX8997_REG_BUCK3CTRL, val);
  133. val = (1100000 - 750000) / 50000;
  134. ret |= pmic_reg_write(p, MAX8997_REG_BUCK3DVS, val);
  135. /* BUCK4 CAMISP: 1.2V - OFF */
  136. ret |= pmic_reg_read(p, MAX8997_REG_BUCK4CTRL, &val);
  137. val &= ~ENBUCK;
  138. ret |= pmic_reg_write(p, MAX8997_REG_BUCK4CTRL, val);
  139. val = (1200000 - 650000) / 25000;
  140. ret |= pmic_reg_write(p, MAX8997_REG_BUCK4DVS, val);
  141. /* BUCK5 VMEM: 1.2V */
  142. val = (1200000 - 650000) / 25000;
  143. for (i = 0; i < 8; i++)
  144. ret |= pmic_reg_write(p, MAX8997_REG_BUCK5DVS1 + i, val);
  145. val = ENBUCK | ACTIVE_DISCHARGE; /* DVS OFF */
  146. ret |= pmic_reg_write(p, MAX8997_REG_BUCK5CTRL, val);
  147. /* BUCK6 CAM AF: 2.8V */
  148. /* No Voltage Setting Register */
  149. /* GNSLCT 3.0X */
  150. val = GNSLCT;
  151. ret |= pmic_reg_write(p, MAX8997_REG_BUCK6CTRL, val);
  152. /* BUCK7 VCC_SUB: 2.0V */
  153. val = (2000000 - 750000) / 50000;
  154. ret |= pmic_reg_write(p, MAX8997_REG_BUCK7DVS, val);
  155. /* LDO1 VADC: 3.3V */
  156. val = max8997_reg_ldo(3300000) | DIS_LDO; /* OFF */
  157. ret |= pmic_reg_write(p, MAX8997_REG_LDO1CTRL, val);
  158. /* LDO1 Disable active discharging */
  159. ret |= pmic_reg_read(p, MAX8997_REG_LDO1CONFIG, &val);
  160. val &= ~LDO_ADE;
  161. ret |= pmic_reg_write(p, MAX8997_REG_LDO1CONFIG, val);
  162. /* LDO2 VALIVE: 1.1V */
  163. val = max8997_reg_ldo(1100000) | EN_LDO;
  164. ret |= pmic_reg_write(p, MAX8997_REG_LDO2CTRL, val);
  165. /* LDO3 VUSB/MIPI: 1.1V */
  166. val = max8997_reg_ldo(1100000) | DIS_LDO; /* OFF */
  167. ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, val);
  168. /* LDO4 VMIPI: 1.8V */
  169. val = max8997_reg_ldo(1800000) | DIS_LDO; /* OFF */
  170. ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, val);
  171. /* LDO5 VHSIC: 1.2V */
  172. val = max8997_reg_ldo(1200000) | DIS_LDO; /* OFF */
  173. ret |= pmic_reg_write(p, MAX8997_REG_LDO5CTRL, val);
  174. /* LDO6 VCC_1.8V_PDA: 1.8V */
  175. val = max8997_reg_ldo(1800000) | EN_LDO;
  176. ret |= pmic_reg_write(p, MAX8997_REG_LDO6CTRL, val);
  177. /* LDO7 CAM_ISP: 1.8V */
  178. val = max8997_reg_ldo(1800000) | DIS_LDO; /* OFF */
  179. ret |= pmic_reg_write(p, MAX8997_REG_LDO7CTRL, val);
  180. /* LDO8 VDAC/VUSB: 3.3V */
  181. val = max8997_reg_ldo(3300000) | DIS_LDO; /* OFF */
  182. ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, val);
  183. /* LDO9 VCC_2.8V_PDA: 2.8V */
  184. val = max8997_reg_ldo(2800000) | EN_LDO;
  185. ret |= pmic_reg_write(p, MAX8997_REG_LDO9CTRL, val);
  186. /* LDO10 VPLL: 1.1V */
  187. val = max8997_reg_ldo(1100000) | EN_LDO;
  188. ret |= pmic_reg_write(p, MAX8997_REG_LDO10CTRL, val);
  189. /* LDO11 TOUCH: 2.8V */
  190. val = max8997_reg_ldo(2800000) | DIS_LDO; /* OFF */
  191. ret |= pmic_reg_write(p, MAX8997_REG_LDO11CTRL, val);
  192. /* LDO12 VTCAM: 1.8V */
  193. val = max8997_reg_ldo(1800000) | DIS_LDO; /* OFF */
  194. ret |= pmic_reg_write(p, MAX8997_REG_LDO12CTRL, val);
  195. /* LDO13 VCC_3.0_LCD: 3.0V */
  196. val = max8997_reg_ldo(3000000) | DIS_LDO; /* OFF */
  197. ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, val);
  198. /* LDO14 MOTOR: 3.0V */
  199. val = max8997_reg_ldo(3000000) | DIS_LDO; /* OFF */
  200. ret |= pmic_reg_write(p, MAX8997_REG_LDO14CTRL, val);
  201. /* LDO15 LED_A: 2.8V */
  202. val = max8997_reg_ldo(2800000) | DIS_LDO; /* OFF */
  203. ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, val);
  204. /* LDO16 CAM_SENSOR: 1.8V */
  205. val = max8997_reg_ldo(1800000) | DIS_LDO; /* OFF */
  206. ret |= pmic_reg_write(p, MAX8997_REG_LDO16CTRL, val);
  207. /* LDO17 VTF: 2.8V */
  208. val = max8997_reg_ldo(2800000) | DIS_LDO; /* OFF */
  209. ret |= pmic_reg_write(p, MAX8997_REG_LDO17CTRL, val);
  210. /* LDO18 TOUCH_LED 3.3V */
  211. val = max8997_reg_ldo(3300000) | DIS_LDO; /* OFF */
  212. ret |= pmic_reg_write(p, MAX8997_REG_LDO18CTRL, val);
  213. /* LDO21 VDDQ: 1.2V */
  214. val = max8997_reg_ldo(1200000) | EN_LDO;
  215. ret |= pmic_reg_write(p, MAX8997_REG_LDO21CTRL, val);
  216. /* SAFEOUT for both 1 and 2: 4.9V, Active discharge, Enable */
  217. val = (SAFEOUT_4_90V << 0) | (SAFEOUT_4_90V << 2) |
  218. ACTDISSAFEO1 | ACTDISSAFEO2 | ENSAFEOUT1 | ENSAFEOUT2;
  219. ret |= pmic_reg_write(p, MAX8997_REG_SAFEOUTCTRL, val);
  220. if (ret) {
  221. puts("MAX8997 PMIC setting error!\n");
  222. return -1;
  223. }
  224. return 0;
  225. }
  226. #endif
  227. int exynos_power_init(void)
  228. {
  229. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  230. int chrg, ret;
  231. struct power_battery *pb;
  232. struct pmic *p_fg, *p_chrg, *p_muic, *p_bat;
  233. /*
  234. * For PMIC/MUIC the I2C bus is named as I2C5, but it is connected
  235. * to logical I2C adapter 0
  236. *
  237. * The FUEL_GAUGE is marked as I2C9 on the schematic, but connected
  238. * to logical I2C adapter 1
  239. */
  240. ret = pmic_init(I2C_5);
  241. ret |= pmic_init_max8997();
  242. ret |= power_fg_init(I2C_9);
  243. ret |= power_muic_init(I2C_5);
  244. ret |= power_bat_init(0);
  245. if (ret)
  246. return ret;
  247. p_fg = pmic_get("MAX17042_FG");
  248. if (!p_fg) {
  249. puts("MAX17042_FG: Not found\n");
  250. return -ENODEV;
  251. }
  252. p_chrg = pmic_get("MAX8997_PMIC");
  253. if (!p_chrg) {
  254. puts("MAX8997_PMIC: Not found\n");
  255. return -ENODEV;
  256. }
  257. p_muic = pmic_get("MAX8997_MUIC");
  258. if (!p_muic) {
  259. puts("MAX8997_MUIC: Not found\n");
  260. return -ENODEV;
  261. }
  262. p_bat = pmic_get("BAT_TRATS");
  263. if (!p_bat) {
  264. puts("BAT_TRATS: Not found\n");
  265. return -ENODEV;
  266. }
  267. p_fg->parent = p_bat;
  268. p_chrg->parent = p_bat;
  269. p_muic->parent = p_bat;
  270. p_bat->low_power_mode = trats_low_power_mode;
  271. p_bat->pbat->battery_init(p_bat, p_fg, p_chrg, p_muic);
  272. pb = p_bat->pbat;
  273. chrg = p_muic->chrg->chrg_type(p_muic);
  274. debug("CHARGER TYPE: %d\n", chrg);
  275. if (!p_chrg->chrg->chrg_bat_present(p_chrg)) {
  276. puts("No battery detected\n");
  277. return 0;
  278. }
  279. p_fg->fg->fg_battery_check(p_fg, p_bat);
  280. if (pb->bat->state == CHARGE && chrg == CHARGER_USB)
  281. puts("CHARGE Battery !\n");
  282. #endif
  283. return 0;
  284. }
  285. static unsigned int get_hw_revision(void)
  286. {
  287. int hwrev = 0;
  288. char str[10];
  289. int i;
  290. /* hw_rev[3:0] == GPE1[3:0] */
  291. for (i = 0; i < 4; i++) {
  292. int pin = i + EXYNOS4_GPIO_E10;
  293. sprintf(str, "hw_rev%d", i);
  294. gpio_request(pin, str);
  295. gpio_cfg_pin(pin, S5P_GPIO_INPUT);
  296. gpio_set_pull(pin, S5P_GPIO_PULL_NONE);
  297. }
  298. udelay(1);
  299. for (i = 0; i < 4; i++)
  300. hwrev |= (gpio_get_value(EXYNOS4_GPIO_E10 + i) << i);
  301. debug("hwrev 0x%x\n", hwrev);
  302. return hwrev;
  303. }
  304. static void check_hw_revision(void)
  305. {
  306. int hwrev;
  307. hwrev = get_hw_revision();
  308. board_rev |= hwrev;
  309. }
  310. #ifdef CONFIG_USB_GADGET
  311. static int s5pc210_phy_control(int on)
  312. {
  313. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  314. int ret = 0;
  315. u32 val = 0;
  316. struct pmic *p = pmic_get("MAX8997_PMIC");
  317. if (!p)
  318. return -ENODEV;
  319. if (pmic_probe(p))
  320. return -1;
  321. if (on) {
  322. ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
  323. ENSAFEOUT1, LDO_ON);
  324. ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val);
  325. ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, EN_LDO | val);
  326. ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val);
  327. ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, EN_LDO | val);
  328. } else {
  329. ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val);
  330. ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, DIS_LDO | val);
  331. ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val);
  332. ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, DIS_LDO | val);
  333. ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
  334. ENSAFEOUT1, LDO_OFF);
  335. }
  336. if (ret) {
  337. puts("MAX8997 LDO setting error!\n");
  338. return -1;
  339. }
  340. #endif
  341. return 0;
  342. }
  343. struct dwc2_plat_otg_data s5pc210_otg_data = {
  344. .phy_control = s5pc210_phy_control,
  345. .regs_phy = EXYNOS4_USBPHY_BASE,
  346. .regs_otg = EXYNOS4_USBOTG_BASE,
  347. .usb_phy_ctrl = EXYNOS4_USBPHY_CONTROL,
  348. .usb_flags = PHY0_SLEEP,
  349. };
  350. int board_usb_init(int index, enum usb_init_type init)
  351. {
  352. debug("USB_udc_probe\n");
  353. return dwc2_udc_probe(&s5pc210_otg_data);
  354. }
  355. int g_dnl_board_usb_cable_connected(void)
  356. {
  357. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  358. struct pmic *muic = pmic_get("MAX8997_MUIC");
  359. if (!muic)
  360. return 0;
  361. return !!muic->chrg->chrg_type(muic);
  362. #else
  363. return false;
  364. #endif
  365. }
  366. #endif
  367. static void pmic_reset(void)
  368. {
  369. gpio_direction_output(EXYNOS4_GPIO_X07, 1);
  370. gpio_set_pull(EXYNOS4_GPIO_X27, S5P_GPIO_PULL_NONE);
  371. }
  372. static void board_clock_init(void)
  373. {
  374. struct exynos4_clock *clk =
  375. (struct exynos4_clock *)samsung_get_base_clock();
  376. writel(CLK_SRC_CPU_VAL, (unsigned int)&clk->src_cpu);
  377. writel(CLK_SRC_TOP0_VAL, (unsigned int)&clk->src_top0);
  378. writel(CLK_SRC_FSYS_VAL, (unsigned int)&clk->src_fsys);
  379. writel(CLK_SRC_PERIL0_VAL, (unsigned int)&clk->src_peril0);
  380. writel(CLK_DIV_CPU0_VAL, (unsigned int)&clk->div_cpu0);
  381. writel(CLK_DIV_CPU1_VAL, (unsigned int)&clk->div_cpu1);
  382. writel(CLK_DIV_DMC0_VAL, (unsigned int)&clk->div_dmc0);
  383. writel(CLK_DIV_DMC1_VAL, (unsigned int)&clk->div_dmc1);
  384. writel(CLK_DIV_LEFTBUS_VAL, (unsigned int)&clk->div_leftbus);
  385. writel(CLK_DIV_RIGHTBUS_VAL, (unsigned int)&clk->div_rightbus);
  386. writel(CLK_DIV_TOP_VAL, (unsigned int)&clk->div_top);
  387. writel(CLK_DIV_FSYS1_VAL, (unsigned int)&clk->div_fsys1);
  388. writel(CLK_DIV_FSYS2_VAL, (unsigned int)&clk->div_fsys2);
  389. writel(CLK_DIV_FSYS3_VAL, (unsigned int)&clk->div_fsys3);
  390. writel(CLK_DIV_PERIL0_VAL, (unsigned int)&clk->div_peril0);
  391. writel(CLK_DIV_PERIL3_VAL, (unsigned int)&clk->div_peril3);
  392. writel(PLL_LOCKTIME, (unsigned int)&clk->apll_lock);
  393. writel(PLL_LOCKTIME, (unsigned int)&clk->mpll_lock);
  394. writel(PLL_LOCKTIME, (unsigned int)&clk->epll_lock);
  395. writel(PLL_LOCKTIME, (unsigned int)&clk->vpll_lock);
  396. writel(APLL_CON1_VAL, (unsigned int)&clk->apll_con1);
  397. writel(APLL_CON0_VAL, (unsigned int)&clk->apll_con0);
  398. writel(MPLL_CON1_VAL, (unsigned int)&clk->mpll_con1);
  399. writel(MPLL_CON0_VAL, (unsigned int)&clk->mpll_con0);
  400. writel(EPLL_CON1_VAL, (unsigned int)&clk->epll_con1);
  401. writel(EPLL_CON0_VAL, (unsigned int)&clk->epll_con0);
  402. writel(VPLL_CON1_VAL, (unsigned int)&clk->vpll_con1);
  403. writel(VPLL_CON0_VAL, (unsigned int)&clk->vpll_con0);
  404. writel(CLK_GATE_IP_CAM_VAL, (unsigned int)&clk->gate_ip_cam);
  405. writel(CLK_GATE_IP_VP_VAL, (unsigned int)&clk->gate_ip_tv);
  406. writel(CLK_GATE_IP_MFC_VAL, (unsigned int)&clk->gate_ip_mfc);
  407. writel(CLK_GATE_IP_G3D_VAL, (unsigned int)&clk->gate_ip_g3d);
  408. writel(CLK_GATE_IP_IMAGE_VAL, (unsigned int)&clk->gate_ip_image);
  409. writel(CLK_GATE_IP_LCD0_VAL, (unsigned int)&clk->gate_ip_lcd0);
  410. writel(CLK_GATE_IP_LCD1_VAL, (unsigned int)&clk->gate_ip_lcd1);
  411. writel(CLK_GATE_IP_FSYS_VAL, (unsigned int)&clk->gate_ip_fsys);
  412. writel(CLK_GATE_IP_GPS_VAL, (unsigned int)&clk->gate_ip_gps);
  413. writel(CLK_GATE_IP_PERIL_VAL, (unsigned int)&clk->gate_ip_peril);
  414. writel(CLK_GATE_IP_PERIR_VAL, (unsigned int)&clk->gate_ip_perir);
  415. writel(CLK_GATE_BLOCK_VAL, (unsigned int)&clk->gate_block);
  416. }
  417. static void board_power_init(void)
  418. {
  419. struct exynos4_power *pwr =
  420. (struct exynos4_power *)samsung_get_base_power();
  421. /* PS HOLD */
  422. writel(EXYNOS4_PS_HOLD_CON_VAL, (unsigned int)&pwr->ps_hold_control);
  423. /* Set power down */
  424. writel(0, (unsigned int)&pwr->cam_configuration);
  425. writel(0, (unsigned int)&pwr->tv_configuration);
  426. writel(0, (unsigned int)&pwr->mfc_configuration);
  427. writel(0, (unsigned int)&pwr->g3d_configuration);
  428. writel(0, (unsigned int)&pwr->lcd1_configuration);
  429. writel(0, (unsigned int)&pwr->gps_configuration);
  430. writel(0, (unsigned int)&pwr->gps_alive_configuration);
  431. /* It is necessary to power down core 1 */
  432. /* to successfully boot CPU1 in kernel */
  433. writel(0, (unsigned int)&pwr->arm_core1_configuration);
  434. }
  435. static void exynos_uart_init(void)
  436. {
  437. /* UART_SEL GPY4[7] (part2) at EXYNOS4 */
  438. gpio_request(EXYNOS4_GPIO_Y47, "uart_sel");
  439. gpio_set_pull(EXYNOS4_GPIO_Y47, S5P_GPIO_PULL_UP);
  440. gpio_direction_output(EXYNOS4_GPIO_Y47, 1);
  441. }
  442. int exynos_early_init_f(void)
  443. {
  444. wdt_stop();
  445. pmic_reset();
  446. board_clock_init();
  447. exynos_uart_init();
  448. board_power_init();
  449. return 0;
  450. }
  451. void exynos_reset_lcd(void)
  452. {
  453. gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset");
  454. gpio_direction_output(EXYNOS4_GPIO_Y45, 1);
  455. udelay(10000);
  456. gpio_direction_output(EXYNOS4_GPIO_Y45, 0);
  457. udelay(10000);
  458. gpio_direction_output(EXYNOS4_GPIO_Y45, 1);
  459. }
  460. int lcd_power(void)
  461. {
  462. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  463. int ret = 0;
  464. struct pmic *p = pmic_get("MAX8997_PMIC");
  465. if (!p)
  466. return -ENODEV;
  467. if (pmic_probe(p))
  468. return 0;
  469. /* LDO15 voltage: 2.2v */
  470. ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, 0x1c | EN_LDO);
  471. /* LDO13 voltage: 3.0v */
  472. ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, 0x2c | EN_LDO);
  473. if (ret) {
  474. puts("MAX8997 LDO setting error!\n");
  475. return -1;
  476. }
  477. #endif
  478. return 0;
  479. }
  480. int mipi_power(void)
  481. {
  482. #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */
  483. int ret = 0;
  484. struct pmic *p = pmic_get("MAX8997_PMIC");
  485. if (!p)
  486. return -ENODEV;
  487. if (pmic_probe(p))
  488. return 0;
  489. /* LDO3 voltage: 1.1v */
  490. ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, 0x6 | EN_LDO);
  491. /* LDO4 voltage: 1.8v */
  492. ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, 0x14 | EN_LDO);
  493. if (ret) {
  494. puts("MAX8997 LDO setting error!\n");
  495. return -1;
  496. }
  497. #endif
  498. return 0;
  499. }
  500. #ifdef CONFIG_LCD
  501. void exynos_lcd_misc_init(vidinfo_t *vid)
  502. {
  503. #ifdef CONFIG_TIZEN
  504. get_tizen_logo_info(vid);
  505. #endif
  506. #ifdef CONFIG_S6E8AX0
  507. s6e8ax0_init();
  508. setenv("lcdinfo", "lcd=s6e8ax0");
  509. #endif
  510. }
  511. #endif