Index: board/chromeos_st15/board.c |
diff --git a/board/chromeos_st15/board.c b/board/chromeos_st15/board.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..78fcf38c25fe9d550e534fc24cd0fad23c3c5387 |
--- /dev/null |
+++ b/board/chromeos_st15/board.c |
@@ -0,0 +1,294 @@ |
+/* |
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved. |
+ * |
+ * (C) Copyright 2002 |
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com> |
+ * Marius Groeger <mgroeger@sysgo.de> |
+ * |
+ * (C) Copyright 2002 |
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch> |
+ * |
+ * (C) Copyright 2003 |
+ * Texas Instruments, <www.ti.com> |
+ * Kshitij Gupta <Kshitij@ti.com> |
+ * |
+ * (C) Copyright 2004 |
+ * ARM Ltd. |
+ * Philippe Robin, <philippe.robin@arm.com> |
+ * |
+ * See file CREDITS for list of people who contributed to this |
+ * project. |
+ * |
+ * This program is free software; you can redistribute it and/or |
+ * modify it under the terms of the GNU General Public License as |
+ * published by the Free Software Foundation; either version 2 of |
+ * the License, or (at your option) any later version. |
+ * |
+ * This program is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ * GNU General Public License for more details. |
+ * |
+ * You should have received a copy of the GNU General Public License |
+ * along with this program; if not, write to the Free Software |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
+ * MA 02111-1307 USA |
+ */ |
+ |
+#include <common.h> |
+#include <linux/mtd/nand.h> |
+#ifdef CONFIG_CMD_USB |
+#include <usb.h> |
+#endif |
+#ifdef USE_PROC_COMM |
+#include <asm/arch/proc_comm.h> |
+#endif |
+#include <asm/arch/memtypes.h> |
+ |
+#ifdef CONFIG_GENERIC_MMC |
+#include <mmc.h> |
+#endif |
+ |
+#ifdef CONFIG_QSD_SDCC |
+#include <qsd_sdcc.h> |
+#include <asm/arch/adm.h> |
+ |
+static struct mmc mmc_1; |
+static struct mmc mmc_2; |
+static sdcc_params_t sdcc_1; |
+static sdcc_params_t sdcc_3; |
+ |
+#define SDCC_1_VOLTAGE_SUPPORTED 0x00FF8000; |
+#define SDCC_3_VOLTAGE_SUPPORTED 0x00FF8080; |
+#endif |
+ |
+extern int timer_init(void); |
+extern void scorpion_pll_init (void); |
+extern void SDCn_deinit(uint32_t instance); |
+ |
+/* |
+ * Optional boot progress function. |
+ */ |
+#ifdef CONFIG_SHOW_BOOT_PROGRESS |
+void show_boot_progress(int progress) |
+{ |
+ printf("Boot reached stage %d\n", progress); |
+} |
+#endif |
+ |
+/* |
+ * Miscellaneous platform dependent initialisations |
+ */ |
+ |
+int board_init (void) |
+{ |
+ DECLARE_GLOBAL_DATA_PTR; |
+ |
+ /* arch number of Qualcomm MSM */ |
+ gd->bd->bi_arch_number = LINUX_MACH_TYPE; |
+ |
+ /* address of boot parameters */ |
+ gd->bd->bi_boot_params = CFG_QC_BOOT_PARAM_ADDR; |
+ |
+ gd->flags = 0; |
+ |
+ /* Initialize GPT timer support */ |
+ timer_init(); |
+ |
+ /* When released from reset, Scorpion gets its clock from the AXI bus clock. |
+ * Start up the Scorpion PLL and start using it instead. |
+ */ |
+ scorpion_pll_init(); |
+ |
+#ifdef CONFIG_SILENT_CONSOLE |
+ gd->flags |= GD_FLG_SILENT; |
+#endif |
+ |
+ /* |
+ * Before proceeding, wait until ARM9 has finished booting. |
+ */ |
+#ifdef USE_PROC_COMM |
+ proc_comm_init(); |
+ proc_comm_wait_for_modem_ready(); |
+#else |
+ |
+ udelay(5000000); |
+#endif |
+ |
+#ifdef CONFIG_QSD8X50_LCDC |
+ gd->fb_base = LCDC_FB_ADDR; |
+#endif |
+ |
+ return 0; |
+} |
+ |
+#ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE |
+int overwrite_console(void) |
+{ |
+#ifdef CONFIG_USB_KEYBOARD |
+ static int usb_init_called = 0; |
+#endif |
+ |
+#ifdef CONFIG_STDERR |
+ setenv("stderr", CONFIG_STDERR); |
+#endif |
+ |
+#ifdef CONFIG_STDOUT |
+ setenv("stdout", CONFIG_STDOUT); |
+#endif |
+ |
+#ifdef CONFIG_STDIN |
+ setenv("stdin", CONFIG_STDIN); |
+#endif |
+ |
+#if defined(CONFIG_USB_KEYBOARD) && defined(CONFIG_CMD_USB) |
+ if (strcmp(CONFIG_STDIN, "usbkbd") == 0) |
+ { |
+ if (usb_init_called == 0) |
+ { |
+ usb_init_called = 1; |
+ usb_stop(); |
+ usb_init(); |
+ } |
+ } |
+#endif /* CONFIG_USB_KEYBOARD */ |
+ |
+ return 0; |
+} |
+#endif /* CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE */ |
+ |
+int misc_init_r (void) |
+{ |
+ //dont checksum loaded image |
+ setenv("verify", "n"); |
+ //dont tftp images automatically for dhcp,bootp,rarp commands |
+ setenv("autoload", "no"); |
+ return (0); |
+} |
+ |
+/****************************** |
+ Routine: cleanup_platform_before_linux |
+ Description: Calls various functions to deinitialize that were initialized. |
+******************************/ |
+int cleanup_platform_before_linux(void) |
+{ |
+ /* Defined in start.S, global to track warm booting */ |
+ extern ulong _warmboot; |
+#ifdef CONFIG_MMC |
+#ifndef CONFIG_GENERIC_MMC |
+ // Cleanup SD resources if they were used |
+ SDCn_deinit(SDC_INSTANCE); |
+#endif |
+#endif |
+ |
+ /* Just about to boot the kernel, next power collapse should warm boot |
+ * on wakeup. |
+ */ |
+ _warmboot = CONFIG_WARMBOOT_TRUE; |
+ |
+ return(0); |
+} |
+ |
+void board_lcd_enable(void) |
+{ |
+ const uint GPIO_BANK1 = 0xa9100c00; |
+ const uint GPIO_BANK7 = 0xa9000818; |
+ |
+ uint value = IO_READ32(GPIO_BANK1); |
+ |
+ value |= (1 << 4) | (1 << 16); |
+ |
+ IO_WRITE32(GPIO_BANK1, value); |
+ |
+ value = IO_READ32(GPIO_BANK7); |
+ |
+ value |= (1 << 2); |
+ |
+ IO_WRITE32(GPIO_BANK7, value); |
+} |
+ |
+void board_lcd_disble(void) |
+{ |
+} |
+ |
+#ifdef CONFIG_QSD_SDCC |
+int board_mmc_init(bd_t *bis) |
+{ |
+ /* populate sdcc_1 struct with base addresses and other info */ |
+ sdcc_1.instance = 1; |
+ sdcc_1.base = SDC1_BASE; |
+ sdcc_1.ns_addr = SDC1_NS_REG; |
+ sdcc_1.md_addr = SDC1_MD_REG; |
+ sdcc_1.row_reset_mask = ROW_RESET__SDC1___M; |
+ sdcc_1.glbl_clk_ena_mask = GLBL_CLK_ENA__SDC1_H_CLK_ENA___M; |
+ sdcc_1.adm_crci_num = ADM_CRCI_SDC1; |
+ |
+ /* GPIO config */ |
+ proc_comm_sdcard_gpio_config(1); |
+ |
+ mmc_1.priv = &sdcc_1; |
+ mmc_1.send_cmd = sdcc_send_cmd; |
+ mmc_1.set_ios = sdcc_set_ios; |
+ mmc_1.init = sdcc_init; |
+ mmc_1.voltages = SDCC_1_VOLTAGE_SUPPORTED ; |
+ mmc_1.host_caps = MMC_MODE_4BIT | MMC_MODE_HS | MMC_MODE_HS_52MHz; |
+ mmc_1.f_min = 400000; |
+ mmc_1.f_max = MCLK_48MHz; |
+ sprintf(mmc_1.name, "External_Card"); |
+ |
+ |
+ /* populate sdcc_3 struct with base addresses and other info */ |
+ sdcc_3.instance = 3; |
+ sdcc_3.base = SDC3_BASE; |
+ sdcc_3.ns_addr = SDC3_NS_REG; |
+ sdcc_3.md_addr = SDC3_MD_REG; |
+ sdcc_3.row_reset_mask = ROW_RESET__SDC3___M; |
+ sdcc_3.glbl_clk_ena_mask = GLBL_CLK_ENA__SDC3_H_CLK_ENA___M; |
+ sdcc_3.adm_crci_num = ADM_CRCI_SDC3; |
+ |
+ /* GPIO config */ |
+ proc_comm_sdcard_gpio_config(3); |
+ |
+ mmc_2.priv = &sdcc_3; |
+ mmc_2.send_cmd = sdcc_send_cmd; |
+ mmc_2.set_ios = sdcc_set_ios; |
+ mmc_2.init = sdcc_init; |
+ mmc_2.voltages = SDCC_3_VOLTAGE_SUPPORTED; |
+ mmc_2.host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT | MMC_MODE_HS | MMC_MODE_HS_52MHz; |
+ mmc_2.f_min = 400000; |
+ mmc_2.f_max = MCLK_48MHz; |
+ sprintf(mmc_2.name, "Embedded_MMC"); |
+ |
+ |
+ /* register our available mmc interfaces with mmc framework */ |
+ mmc_register(&mmc_1); |
+ mmc_register(&mmc_2); |
+ |
+ return 0; |
+} |
+ |
+int board_sdcc_init(sdcc_params_t *sd) |
+{ |
+ if(sd->instance == 1) |
+ { |
+ /* Power cycle the card. */ |
+ proc_comm_vreg_control(PM_VREG_WLAN_ID, 2850, 0); |
+ udelay(1000); |
+ proc_comm_vreg_control(PM_VREG_WLAN_ID, 2850, 1); |
+ } |
+ else if(sd->instance == 3) |
+ { |
+ /* Power cycle the card. */ |
+ proc_comm_vreg_control(PM_VREG_WLAN_ID, 2850, 0); |
+ udelay(1000); |
+ proc_comm_vreg_control(PM_VREG_WLAN_ID, 2850, 1); |
+ } |
+ else |
+ { |
+ /* this board does not have an sd/mmc card on this interface. */ |
+ return -1; |
+ } |
+ |
+ return 0; |
+} |
+#endif |