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