Path: blob/master/arch/arm/mach-omap1/board-voiceblue.c
10817 views
/*1* linux/arch/arm/mach-omap1/board-voiceblue.c2*3* Modified from board-generic.c4*5* Copyright (C) 2004 2N Telekomunikace, Ladislav Michl <[email protected]>6*7* Code for OMAP5910 based VoiceBlue board (VoIP to GSM gateway).8*9* This program is free software; you can redistribute it and/or modify10* it under the terms of the GNU General Public License version 2 as11* published by the Free Software Foundation.12*/1314#include <linux/delay.h>15#include <linux/platform_device.h>16#include <linux/interrupt.h>17#include <linux/irq.h>18#include <linux/init.h>19#include <linux/kernel.h>20#include <linux/mtd/physmap.h>21#include <linux/notifier.h>22#include <linux/reboot.h>23#include <linux/serial_8250.h>24#include <linux/serial_reg.h>25#include <linux/smc91x.h>2627#include <mach/hardware.h>28#include <mach/system.h>29#include <asm/mach-types.h>30#include <asm/mach/arch.h>31#include <asm/mach/map.h>3233#include <plat/board-voiceblue.h>34#include <plat/common.h>35#include <mach/gpio.h>36#include <plat/flash.h>37#include <plat/mux.h>38#include <plat/tc.h>39#include <plat/usb.h>4041static struct plat_serial8250_port voiceblue_ports[] = {42{43.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x40000),44.irq = OMAP_GPIO_IRQ(12),45.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,46.iotype = UPIO_MEM,47.regshift = 1,48.uartclk = 3686400,49},50{51.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x50000),52.irq = OMAP_GPIO_IRQ(13),53.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,54.iotype = UPIO_MEM,55.regshift = 1,56.uartclk = 3686400,57},58{59.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x60000),60.irq = OMAP_GPIO_IRQ(14),61.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,62.iotype = UPIO_MEM,63.regshift = 1,64.uartclk = 3686400,65},66{67.mapbase = (unsigned long)(OMAP_CS1_PHYS + 0x70000),68.irq = OMAP_GPIO_IRQ(15),69.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,70.iotype = UPIO_MEM,71.regshift = 1,72.uartclk = 3686400,73},74{ },75};7677static struct platform_device serial_device = {78.name = "serial8250",79.id = PLAT8250_DEV_PLATFORM1,80.dev = {81.platform_data = voiceblue_ports,82},83};8485static int __init ext_uart_init(void)86{87if (!machine_is_voiceblue())88return -ENODEV;8990return platform_device_register(&serial_device);91}92arch_initcall(ext_uart_init);9394static struct physmap_flash_data voiceblue_flash_data = {95.width = 2,96.set_vpp = omap1_set_vpp,97};9899static struct resource voiceblue_flash_resource = {100.start = OMAP_CS0_PHYS,101.end = OMAP_CS0_PHYS + SZ_32M - 1,102.flags = IORESOURCE_MEM,103};104105static struct platform_device voiceblue_flash_device = {106.name = "physmap-flash",107.id = 0,108.dev = {109.platform_data = &voiceblue_flash_data,110},111.num_resources = 1,112.resource = &voiceblue_flash_resource,113};114115static struct smc91x_platdata voiceblue_smc91x_info = {116.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,117.leda = RPC_LED_100_10,118.ledb = RPC_LED_TX_RX,119};120121static struct resource voiceblue_smc91x_resources[] = {122[0] = {123.start = OMAP_CS2_PHYS + 0x300,124.end = OMAP_CS2_PHYS + 0x300 + 16,125.flags = IORESOURCE_MEM,126},127[1] = {128.start = OMAP_GPIO_IRQ(8),129.end = OMAP_GPIO_IRQ(8),130.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,131},132};133134static struct platform_device voiceblue_smc91x_device = {135.name = "smc91x",136.id = 0,137.dev = {138.platform_data = &voiceblue_smc91x_info,139},140.num_resources = ARRAY_SIZE(voiceblue_smc91x_resources),141.resource = voiceblue_smc91x_resources,142};143144static struct platform_device *voiceblue_devices[] __initdata = {145&voiceblue_flash_device,146&voiceblue_smc91x_device,147};148149static struct omap_usb_config voiceblue_usb_config __initdata = {150.hmc_mode = 3,151.register_host = 1,152.register_dev = 1,153.pins[0] = 2,154.pins[1] = 6,155.pins[2] = 6,156};157158static struct omap_board_config_kernel voiceblue_config[] = {159};160161static void __init voiceblue_init_irq(void)162{163omap1_init_common_hw();164omap_init_irq();165}166167static void __init voiceblue_map_io(void)168{169omap1_map_common_io();170}171172#define MACHINE_PANICED 1173#define MACHINE_REBOOTING 2174#define MACHINE_REBOOT 4175static unsigned long machine_state;176177static int panic_event(struct notifier_block *this, unsigned long event,178void *ptr)179{180if (test_and_set_bit(MACHINE_PANICED, &machine_state))181return NOTIFY_DONE;182183/* Flash power LED */184omap_writeb(0x78, OMAP_LPG1_LCR);185omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */186187return NOTIFY_DONE;188}189190static struct notifier_block panic_block = {191.notifier_call = panic_event,192};193194static int __init voiceblue_setup(void)195{196if (!machine_is_voiceblue())197return -ENODEV;198199/* Setup panic notifier */200atomic_notifier_chain_register(&panic_notifier_list, &panic_block);201202return 0;203}204postcore_initcall(voiceblue_setup);205206static int wdt_gpio_state;207208void voiceblue_wdt_enable(void)209{210gpio_direction_output(0, 0);211gpio_set_value(0, 1);212gpio_set_value(0, 0);213wdt_gpio_state = 0;214}215216void voiceblue_wdt_disable(void)217{218gpio_set_value(0, 0);219gpio_set_value(0, 1);220gpio_set_value(0, 0);221gpio_direction_input(0);222}223224void voiceblue_wdt_ping(void)225{226if (test_bit(MACHINE_REBOOT, &machine_state))227return;228229wdt_gpio_state = !wdt_gpio_state;230gpio_set_value(0, wdt_gpio_state);231}232233static void voiceblue_reset(char mode, const char *cmd)234{235/*236* Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28237* "Global Software Reset Affects Traffic Controller Frequency".238*/239if (cpu_is_omap5912()) {240omap_writew(omap_readw(DPLL_CTL) & ~(1 << 4), DPLL_CTL);241omap_writew(0x8, ARM_RSTCT1);242}243244set_bit(MACHINE_REBOOT, &machine_state);245voiceblue_wdt_enable();246while (1) ;247}248249EXPORT_SYMBOL(voiceblue_wdt_enable);250EXPORT_SYMBOL(voiceblue_wdt_disable);251EXPORT_SYMBOL(voiceblue_wdt_ping);252253static void __init voiceblue_init(void)254{255/* mux pins for uarts */256omap_cfg_reg(UART1_TX);257omap_cfg_reg(UART1_RTS);258omap_cfg_reg(UART2_TX);259omap_cfg_reg(UART2_RTS);260omap_cfg_reg(UART3_TX);261omap_cfg_reg(UART3_RX);262263/* Watchdog */264gpio_request(0, "Watchdog");265/* smc91x reset */266gpio_request(7, "SMC91x reset");267gpio_direction_output(7, 1);268udelay(2); /* wait at least 100ns */269gpio_set_value(7, 0);270mdelay(50); /* 50ms until PHY ready */271/* smc91x interrupt pin */272gpio_request(8, "SMC91x irq");273/* 16C554 reset*/274gpio_request(6, "16C554 reset");275gpio_direction_output(6, 0);276/* 16C554 interrupt pins */277gpio_request(12, "16C554 irq");278gpio_request(13, "16C554 irq");279gpio_request(14, "16C554 irq");280gpio_request(15, "16C554 irq");281irq_set_irq_type(gpio_to_irq(12), IRQ_TYPE_EDGE_RISING);282irq_set_irq_type(gpio_to_irq(13), IRQ_TYPE_EDGE_RISING);283irq_set_irq_type(gpio_to_irq(14), IRQ_TYPE_EDGE_RISING);284irq_set_irq_type(gpio_to_irq(15), IRQ_TYPE_EDGE_RISING);285286platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));287omap_board_config = voiceblue_config;288omap_board_config_size = ARRAY_SIZE(voiceblue_config);289omap_serial_init();290omap1_usb_init(&voiceblue_usb_config);291omap_register_i2c_bus(1, 100, NULL, 0);292293/* There is a good chance board is going up, so enable power LED294* (it is connected through invertor) */295omap_writeb(0x00, OMAP_LPG1_LCR);296omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */297298arch_reset = voiceblue_reset;299}300301MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")302/* Maintainer: Ladislav Michl <[email protected]> */303.boot_params = 0x10000100,304.map_io = voiceblue_map_io,305.reserve = omap_reserve,306.init_irq = voiceblue_init_irq,307.init_machine = voiceblue_init,308.timer = &omap_timer,309MACHINE_END310311312