158 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * TI DA830/OMAP L137 EVM board
 | |
|  *
 | |
|  * Author: Mark A. Greer <mgreer@mvista.com>
 | |
|  * Derived from: arch/arm/mach-davinci/board-dm644x-evm.c
 | |
|  *
 | |
|  * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
 | |
|  * the terms of the GNU General Public License version 2. This program
 | |
|  * is licensed "as is" without any warranty of any kind, whether express
 | |
|  * or implied.
 | |
|  */
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/init.h>
 | |
| #include <linux/console.h>
 | |
| #include <linux/i2c.h>
 | |
| #include <linux/i2c/at24.h>
 | |
| 
 | |
| #include <asm/mach-types.h>
 | |
| #include <asm/mach/arch.h>
 | |
| 
 | |
| #include <mach/common.h>
 | |
| #include <mach/irqs.h>
 | |
| #include <mach/cp_intc.h>
 | |
| #include <mach/da8xx.h>
 | |
| #include <mach/asp.h>
 | |
| 
 | |
| #define DA830_EVM_PHY_MASK		0x0
 | |
| #define DA830_EVM_MDIO_FREQUENCY	2200000	/* PHY bus frequency */
 | |
| 
 | |
| static struct at24_platform_data da830_evm_i2c_eeprom_info = {
 | |
| 	.byte_len	= SZ_256K / 8,
 | |
| 	.page_size	= 64,
 | |
| 	.flags		= AT24_FLAG_ADDR16,
 | |
| 	.setup		= davinci_get_mac_addr,
 | |
| 	.context	= (void *)0x7f00,
 | |
| };
 | |
| 
 | |
| static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
 | |
| 	{
 | |
| 		I2C_BOARD_INFO("24c256", 0x50),
 | |
| 		.platform_data	= &da830_evm_i2c_eeprom_info,
 | |
| 	},
 | |
| 	{
 | |
| 		I2C_BOARD_INFO("tlv320aic3x", 0x18),
 | |
| 	}
 | |
| };
 | |
| 
 | |
| static struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
 | |
| 	.bus_freq	= 100,	/* kHz */
 | |
| 	.bus_delay	= 0,	/* usec */
 | |
| };
 | |
| 
 | |
| static struct davinci_uart_config da830_evm_uart_config __initdata = {
 | |
| 	.enabled_uarts = 0x7,
 | |
| };
 | |
| 
 | |
| static u8 da830_iis_serializer_direction[] = {
 | |
| 	RX_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
 | |
| 	INACTIVE_MODE,	TX_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
 | |
| 	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
 | |
| };
 | |
| 
 | |
| static struct snd_platform_data da830_evm_snd_data = {
 | |
| 	.tx_dma_offset  = 0x2000,
 | |
| 	.rx_dma_offset  = 0x2000,
 | |
| 	.op_mode        = DAVINCI_MCASP_IIS_MODE,
 | |
| 	.num_serializer = ARRAY_SIZE(da830_iis_serializer_direction),
 | |
| 	.tdm_slots      = 2,
 | |
| 	.serial_dir     = da830_iis_serializer_direction,
 | |
| 	.eventq_no      = EVENTQ_0,
 | |
| 	.version	= MCASP_VERSION_2,
 | |
| 	.txnumevt	= 1,
 | |
| 	.rxnumevt	= 1,
 | |
| };
 | |
| 
 | |
| static __init void da830_evm_init(void)
 | |
| {
 | |
| 	struct davinci_soc_info *soc_info = &davinci_soc_info;
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = da8xx_register_edma();
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: edma registration failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	ret = da8xx_pinmux_setup(da830_i2c0_pins);
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: i2c0 mux setup failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	ret = da8xx_register_i2c(0, &da830_evm_i2c_0_pdata);
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: i2c0 registration failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	soc_info->emac_pdata->phy_mask = DA830_EVM_PHY_MASK;
 | |
| 	soc_info->emac_pdata->mdio_max_freq = DA830_EVM_MDIO_FREQUENCY;
 | |
| 	soc_info->emac_pdata->rmii_en = 1;
 | |
| 
 | |
| 	ret = da8xx_pinmux_setup(da830_cpgmac_pins);
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: cpgmac mux setup failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	ret = da8xx_register_emac();
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: emac registration failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	ret = da8xx_register_watchdog();
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: watchdog registration failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	davinci_serial_init(&da830_evm_uart_config);
 | |
| 	i2c_register_board_info(1, da830_evm_i2c_devices,
 | |
| 			ARRAY_SIZE(da830_evm_i2c_devices));
 | |
| 
 | |
| 	ret = da8xx_pinmux_setup(da830_mcasp1_pins);
 | |
| 	if (ret)
 | |
| 		pr_warning("da830_evm_init: mcasp1 mux setup failed: %d\n",
 | |
| 				ret);
 | |
| 
 | |
| 	da8xx_init_mcasp(1, &da830_evm_snd_data);
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_SERIAL_8250_CONSOLE
 | |
| static int __init da830_evm_console_init(void)
 | |
| {
 | |
| 	return add_preferred_console("ttyS", 2, "115200");
 | |
| }
 | |
| console_initcall(da830_evm_console_init);
 | |
| #endif
 | |
| 
 | |
| static __init void da830_evm_irq_init(void)
 | |
| {
 | |
| 	struct davinci_soc_info *soc_info = &davinci_soc_info;
 | |
| 
 | |
| 	cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA830_N_CP_INTC_IRQ,
 | |
| 			soc_info->intc_irq_prios);
 | |
| }
 | |
| 
 | |
| static void __init da830_evm_map_io(void)
 | |
| {
 | |
| 	da830_init();
 | |
| }
 | |
| 
 | |
| MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP L137 EVM")
 | |
| 	.phys_io	= IO_PHYS,
 | |
| 	.io_pg_offst	= (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
 | |
| 	.boot_params	= (DA8XX_DDR_BASE + 0x100),
 | |
| 	.map_io		= da830_evm_map_io,
 | |
| 	.init_irq	= da830_evm_irq_init,
 | |
| 	.timer		= &davinci_timer,
 | |
| 	.init_machine	= da830_evm_init,
 | |
| MACHINE_END
 |