xref: /rk3399_rockchip-uboot/board/htkw/mcx/mcx.c (revision 8f1fae26a7fb4c0c2897f2f086fe8a3e1da58a9a)
14ab779cbSIlya Yanok /*
24ab779cbSIlya Yanok  * Copyright (C) 2011 Ilya Yanok, Emcraft Systems
34ab779cbSIlya Yanok  *
44ab779cbSIlya Yanok  * Based on ti/evm/evm.c
54ab779cbSIlya Yanok  *
64ab779cbSIlya Yanok  * This program is free software; you can redistribute it and/or modify
74ab779cbSIlya Yanok  * it under the terms of the GNU General Public License as published by
84ab779cbSIlya Yanok  * the Free Software Foundation; either version 2 of the License, or
94ab779cbSIlya Yanok  * (at your option) any later version.
104ab779cbSIlya Yanok  *
114ab779cbSIlya Yanok  * This program is distributed in the hope that it will be useful,
124ab779cbSIlya Yanok  * but WITHOUT ANY WARRANTY; without even the implied warranty of
134ab779cbSIlya Yanok  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
144ab779cbSIlya Yanok  * GNU General Public License for more details.
154ab779cbSIlya Yanok  *
164ab779cbSIlya Yanok  * You should have received a copy of the GNU General Public License
174ab779cbSIlya Yanok  * along with this program; if not, write to the Free Software
184ab779cbSIlya Yanok  * Foundation, Inc.
194ab779cbSIlya Yanok  */
204ab779cbSIlya Yanok 
214ab779cbSIlya Yanok #include <common.h>
224ab779cbSIlya Yanok #include <asm/io.h>
234ab779cbSIlya Yanok #include <asm/arch/mem.h>
244ab779cbSIlya Yanok #include <asm/arch/mmc_host_def.h>
254ab779cbSIlya Yanok #include <asm/arch/mux.h>
264ab779cbSIlya Yanok #include <asm/arch/sys_proto.h>
274ab779cbSIlya Yanok #include <asm/mach-types.h>
284ab779cbSIlya Yanok #include <asm/gpio.h>
294ab779cbSIlya Yanok #include <asm/omap_gpio.h>
30*8f1fae26SStefano Babic #include <asm/arch/dss.h>
31*8f1fae26SStefano Babic #include <asm/arch/clocks.h>
324ab779cbSIlya Yanok #include "errno.h"
334ab779cbSIlya Yanok #include <i2c.h>
344ab779cbSIlya Yanok #ifdef CONFIG_USB_EHCI
354ab779cbSIlya Yanok #include <usb.h>
364ab779cbSIlya Yanok #include <asm/ehci-omap.h>
374ab779cbSIlya Yanok #endif
384ab779cbSIlya Yanok #include "mcx.h"
394ab779cbSIlya Yanok 
404ab779cbSIlya Yanok DECLARE_GLOBAL_DATA_PTR;
414ab779cbSIlya Yanok 
428c735b99SStefano Babic #define HOT_WATER_BUTTON	42
43*8f1fae26SStefano Babic #define LCD_OUTPUT		55
44*8f1fae26SStefano Babic 
45*8f1fae26SStefano Babic /* Address of the framebuffer in RAM. */
46*8f1fae26SStefano Babic #define FB_START_ADDRESS 0x88000000
473ae6abb6SStefano Babic 
484ab779cbSIlya Yanok #ifdef CONFIG_USB_EHCI
494ab779cbSIlya Yanok static struct omap_usbhs_board_data usbhs_bdata = {
504ab779cbSIlya Yanok 	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
518c735b99SStefano Babic 	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
524ab779cbSIlya Yanok 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
534ab779cbSIlya Yanok };
544ab779cbSIlya Yanok 
55676ae068SLucas Stach int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
564ab779cbSIlya Yanok {
57676ae068SLucas Stach 	return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
584ab779cbSIlya Yanok }
594ab779cbSIlya Yanok 
60676ae068SLucas Stach int ehci_hcd_stop(int index)
614ab779cbSIlya Yanok {
624ab779cbSIlya Yanok 	return omap_ehci_hcd_stop();
634ab779cbSIlya Yanok }
644ab779cbSIlya Yanok #endif
654ab779cbSIlya Yanok 
664ab779cbSIlya Yanok /*
674ab779cbSIlya Yanok  * Routine: board_init
684ab779cbSIlya Yanok  * Description: Early hardware init.
694ab779cbSIlya Yanok  */
704ab779cbSIlya Yanok int board_init(void)
714ab779cbSIlya Yanok {
724ab779cbSIlya Yanok 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
734ab779cbSIlya Yanok 	/* boot param addr */
744ab779cbSIlya Yanok 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
754ab779cbSIlya Yanok 
76*8f1fae26SStefano Babic 	gpio_direction_output(LCD_OUTPUT, 0);
77*8f1fae26SStefano Babic 
784ab779cbSIlya Yanok 	return 0;
794ab779cbSIlya Yanok }
804ab779cbSIlya Yanok 
813ae6abb6SStefano Babic #ifdef CONFIG_BOARD_LATE_INIT
823ae6abb6SStefano Babic int board_late_init(void)
833ae6abb6SStefano Babic {
843ae6abb6SStefano Babic 	if (gpio_request(HOT_WATER_BUTTON, "hot-water-button") < 0) {
853ae6abb6SStefano Babic 		puts("Failed to get hot-water-button pin\n");
863ae6abb6SStefano Babic 		return -ENODEV;
873ae6abb6SStefano Babic 	}
883ae6abb6SStefano Babic 	gpio_direction_input(HOT_WATER_BUTTON);
893ae6abb6SStefano Babic 
903ae6abb6SStefano Babic 	/*
913ae6abb6SStefano Babic 	 * if hot-water-button is pressed
923ae6abb6SStefano Babic 	 * change bootcmd
933ae6abb6SStefano Babic 	 */
943ae6abb6SStefano Babic 	if (gpio_get_value(HOT_WATER_BUTTON))
953ae6abb6SStefano Babic 		return 0;
963ae6abb6SStefano Babic 
973ae6abb6SStefano Babic 	setenv("bootcmd", "run swupdate");
988c735b99SStefano Babic 
993ae6abb6SStefano Babic 	return 0;
1003ae6abb6SStefano Babic }
1013ae6abb6SStefano Babic #endif
1023ae6abb6SStefano Babic 
1034ab779cbSIlya Yanok /*
1044ab779cbSIlya Yanok  * Routine: set_muxconf_regs
1054ab779cbSIlya Yanok  * Description: Setting up the configuration Mux registers specific to the
1064ab779cbSIlya Yanok  *		hardware. Many pins need to be moved from protect to primary
1074ab779cbSIlya Yanok  *		mode.
1084ab779cbSIlya Yanok  */
1094ab779cbSIlya Yanok void set_muxconf_regs(void)
1104ab779cbSIlya Yanok {
1114ab779cbSIlya Yanok 	MUX_MCX();
1124ab779cbSIlya Yanok }
1134ab779cbSIlya Yanok 
1144ab779cbSIlya Yanok #if defined(CONFIG_OMAP_HSMMC) && !defined(CONFIG_SPL_BUILD)
1154ab779cbSIlya Yanok int board_mmc_init(bd_t *bis)
1164ab779cbSIlya Yanok {
117bbbc1ae9SJonathan Solnit 	return omap_mmc_init(0, 0, 0);
1184ab779cbSIlya Yanok }
1194ab779cbSIlya Yanok #endif
120*8f1fae26SStefano Babic 
121*8f1fae26SStefano Babic #if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD)
122*8f1fae26SStefano Babic 
123*8f1fae26SStefano Babic static struct panel_config lcd_cfg = {
124*8f1fae26SStefano Babic 	.timing_h       = PANEL_TIMING_H(40, 40, 48),
125*8f1fae26SStefano Babic 	.timing_v       = PANEL_TIMING_V(29, 13, 3),
126*8f1fae26SStefano Babic 	.pol_freq       = 0x00003000, /* Pol Freq */
127*8f1fae26SStefano Babic 	.divisor        = 0x0001000E,
128*8f1fae26SStefano Babic 	.panel_type     = 0x01, /* TFT */
129*8f1fae26SStefano Babic 	.data_lines     = 0x03, /* 24 Bit RGB */
130*8f1fae26SStefano Babic 	.load_mode      = 0x02, /* Frame Mode */
131*8f1fae26SStefano Babic 	.panel_color	= 0,
132*8f1fae26SStefano Babic 	.lcd_size	= PANEL_LCD_SIZE(800, 480),
133*8f1fae26SStefano Babic };
134*8f1fae26SStefano Babic 
135*8f1fae26SStefano Babic int board_video_init(void)
136*8f1fae26SStefano Babic {
137*8f1fae26SStefano Babic 	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
138*8f1fae26SStefano Babic 	void *fb;
139*8f1fae26SStefano Babic 
140*8f1fae26SStefano Babic 	fb = (void *)FB_START_ADDRESS;
141*8f1fae26SStefano Babic 
142*8f1fae26SStefano Babic 	lcd_cfg.frame_buffer = fb;
143*8f1fae26SStefano Babic 
144*8f1fae26SStefano Babic 	setbits_le32(&prcm_base->fclken_dss, FCK_DSS_ON);
145*8f1fae26SStefano Babic 	setbits_le32(&prcm_base->iclken_dss, ICK_DSS_ON);
146*8f1fae26SStefano Babic 
147*8f1fae26SStefano Babic 	omap3_dss_panel_config(&lcd_cfg);
148*8f1fae26SStefano Babic 	omap3_dss_enable();
149*8f1fae26SStefano Babic 
150*8f1fae26SStefano Babic 	return 0;
151*8f1fae26SStefano Babic }
152*8f1fae26SStefano Babic #endif
153