| #include <common.h> |
| #include <console.h> |
| #include <init.h> |
| #include <fs.h> |
| #include <driver.h> |
| #include <asm/io.h> |
| #include <ns16550.h> |
| #include <asm/armlinux.h> |
| #include <linux/stat.h> |
| #include <generated/mach-types.h> |
| #include <mach/silicon.h> |
| #include <mach/sdrc.h> |
| #include <mach/sys_info.h> |
| #include <mach/syslib.h> |
| #include <mach/control.h> |
| #include <usb/ehci.h> |
| #include <linux/err.h> |
| #include <sizes.h> |
| #include <asm/mmu.h> |
| #include <mach/gpio.h> |
| #include <environment.h> |
| #include <mach/xload.h> |
| |
| static int board_revision; |
| |
| #define GPIO_HUB_POWER 1 |
| #define GPIO_HUB_NRESET_39 39 |
| #define GPIO_HUB_NRESET_62 62 |
| #define GPIO_BOARD_ID0 182 |
| #define GPIO_BOARD_ID1 101 |
| #define GPIO_BOARD_ID2 171 |
| |
| static struct NS16550_plat serial_plat = { |
| .clock = 48000000, /* 48MHz (APLL96/2) */ |
| .f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR, |
| .reg_read = omap_uart_read, |
| .reg_write = omap_uart_write, |
| }; |
| |
| static struct device_d panda_serial_device = { |
| .id = -1, |
| .name = "serial_ns16550", |
| .map_base = OMAP44XX_UART3_BASE, |
| .size = 1024, |
| .platform_data = (void *)&serial_plat, |
| }; |
| |
| static int panda_console_init(void) |
| { |
| /* Register the serial port */ |
| return register_device(&panda_serial_device); |
| } |
| console_initcall(panda_console_init); |
| |
| static struct memory_platform_data sram_pdata = { |
| .name = "ram0", |
| .flags = DEVFS_RDWR, |
| }; |
| |
| static struct device_d sdram_dev = { |
| .id = -1, |
| .name = "mem", |
| .map_base = 0x80000000, |
| .size = SZ_1G, |
| .platform_data = &sram_pdata, |
| }; |
| |
| #ifdef CONFIG_MMU |
| static int panda_mmu_init(void) |
| { |
| mmu_init(); |
| |
| arm_create_section(0x80000000, 0x80000000, 256, PMD_SECT_DEF_CACHED); |
| arm_create_section(0x90000000, 0x80000000, 256, PMD_SECT_DEF_UNCACHED); |
| |
| mmu_enable(); |
| |
| return 0; |
| } |
| device_initcall(panda_mmu_init); |
| #endif |
| |
| static struct ehci_platform_data ehci_pdata = { |
| .flags = 0, |
| .hccr_offset = 0x0, |
| .hcor_offset = 0x10, |
| }; |
| |
| static struct device_d usbh_dev = { |
| .id = -1, |
| .name = "ehci", |
| .map_base = 0x4a064c00, |
| .size = 4 * 1024, |
| .platform_data = &ehci_pdata, |
| }; |
| |
| static void panda_ehci_init(void) |
| { |
| u32 val; |
| int hub_nreset; |
| |
| if (board_revision) |
| hub_nreset = GPIO_HUB_NRESET_62; |
| else |
| hub_nreset = GPIO_HUB_NRESET_39; |
| |
| /* disable the power to the usb hub prior to init */ |
| gpio_direction_output(GPIO_HUB_POWER, 0); |
| gpio_set_value(GPIO_HUB_POWER, 0); |
| |
| /* reset phy+hub */ |
| gpio_direction_output(hub_nreset, 0); |
| gpio_set_value(hub_nreset, 0); |
| gpio_set_value(hub_nreset, 1); |
| val = readl(0x4a009358); |
| val |= (1 << 24); |
| writel(val, 0x4a009358); |
| writel(0x7, 0x4a008180); |
| mdelay(10); |
| |
| writel(0x00000014, 0x4a064010); |
| writel(0x8000001c, 0x4a064040); |
| |
| /* enable power to hub */ |
| gpio_set_value(GPIO_HUB_POWER, 1); |
| |
| register_device(&usbh_dev); |
| } |
| |
| static void __init panda_boardrev_init(void) |
| { |
| board_revision = gpio_get_value(GPIO_BOARD_ID0); |
| board_revision |= (gpio_get_value(GPIO_BOARD_ID1)<<1); |
| board_revision |= (gpio_get_value(GPIO_BOARD_ID2)<<2); |
| |
| pr_info("PandaBoard Revision: %03d\n", board_revision); |
| } |
| |
| static struct device_d hsmmc_dev = { |
| .id = -1, |
| .name = "omap-hsmmc", |
| .map_base = 0x4809C100, |
| .size = SZ_4K, |
| }; |
| |
| static int panda_devices_init(void) |
| { |
| panda_boardrev_init(); |
| |
| if (gpio_get_value(182)) { |
| /* enable software ioreq */ |
| sr32(OMAP44XX_SCRM_AUXCLK3, 8, 1, 0x1); |
| /* set for sys_clk (38.4MHz) */ |
| sr32(OMAP44XX_SCRM_AUXCLK3, 1, 2, 0x0); |
| /* set divisor to 2 */ |
| sr32(OMAP44XX_SCRM_AUXCLK3, 16, 4, 0x1); |
| /* set the clock source to active */ |
| sr32(OMAP44XX_SCRM_ALTCLKSRC, 0, 1, 0x1); |
| /* enable clocks */ |
| sr32(OMAP44XX_SCRM_ALTCLKSRC, 2, 2, 0x3); |
| } else { |
| /* enable software ioreq */ |
| sr32(OMAP44XX_SCRM_AUXCLK1, 8, 1, 0x1); |
| /* set for PER_DPLL */ |
| sr32(OMAP44XX_SCRM_AUXCLK1, 1, 2, 0x2); |
| /* set divisor to 16 */ |
| sr32(OMAP44XX_SCRM_AUXCLK1, 16, 4, 0xf); |
| /* set the clock source to active */ |
| sr32(OMAP44XX_SCRM_ALTCLKSRC, 0, 1, 0x1); |
| /* enable clocks */ |
| sr32(OMAP44XX_SCRM_ALTCLKSRC, 2, 2, 0x3); |
| } |
| |
| register_device(&sdram_dev); |
| register_device(&hsmmc_dev); |
| panda_ehci_init(); |
| |
| armlinux_add_dram(&sdram_dev); |
| armlinux_set_bootparams((void *)0x80000100); |
| armlinux_set_architecture(MACH_TYPE_OMAP4_PANDA); |
| |
| return 0; |
| } |
| device_initcall(panda_devices_init); |
| |
| #ifdef CONFIG_DEFAULT_ENVIRONMENT |
| static int panda_env_init(void) |
| { |
| struct stat s; |
| char *diskdev = "/dev/disk0.0"; |
| int ret; |
| |
| ret = stat(diskdev, &s); |
| if (ret) { |
| printf("no %s. using default env\n", diskdev); |
| return 0; |
| } |
| |
| mkdir ("/boot", 0666); |
| ret = mount(diskdev, "fat", "/boot"); |
| if (ret) { |
| printf("failed to mount %s\n", diskdev); |
| return 0; |
| } |
| |
| default_environment_path = "/boot/bareboxenv"; |
| |
| return 0; |
| } |
| late_initcall(panda_env_init); |
| #endif |
| |
| |
| #ifdef CONFIG_SHELL_NONE |
| int run_shell(void) |
| { |
| int (*func)(void); |
| |
| func = omap_xload_boot_mmc(); |
| if (!func) { |
| printf("booting failed\n"); |
| while (1); |
| } |
| |
| shutdown_barebox(); |
| func(); |
| |
| while (1); |
| } |
| #endif |