Path: blob/master/arch/arm/mach-omap2/board-am3517evm.c
10817 views
/*1* linux/arch/arm/mach-omap2/board-am3517evm.c2*3* Copyright (C) 2009 Texas Instruments Incorporated4* Author: Ranjith Lohithakshan <[email protected]>5*6* Based on mach-omap2/board-omap3evm.c7*8* This program is free software; you can redistribute it and/or modify it9* under the terms of the GNU General Public License as published by the10* Free Software Foundation version 2.11*12* This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,13* whether express or implied; without even the implied warranty of14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU15* General Public License for more details.16*/1718#include <linux/kernel.h>19#include <linux/init.h>20#include <linux/clk.h>21#include <linux/platform_device.h>22#include <linux/gpio.h>23#include <linux/i2c/pca953x.h>24#include <linux/can/platform/ti_hecc.h>25#include <linux/davinci_emac.h>2627#include <mach/hardware.h>28#include <mach/am35xx.h>29#include <asm/mach-types.h>30#include <asm/mach/arch.h>31#include <asm/mach/map.h>3233#include <plat/board.h>34#include <plat/common.h>35#include <plat/usb.h>36#include <video/omapdss.h>37#include <video/omap-panel-generic-dpi.h>3839#include "mux.h"40#include "control.h"4142#define AM35XX_EVM_MDIO_FREQUENCY (1000000)4344static struct mdio_platform_data am3517_evm_mdio_pdata = {45.bus_freq = AM35XX_EVM_MDIO_FREQUENCY,46};4748static struct resource am3517_mdio_resources[] = {49{50.start = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,51.end = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +52SZ_4K - 1,53.flags = IORESOURCE_MEM,54},55};5657static struct platform_device am3517_mdio_device = {58.name = "davinci_mdio",59.id = 0,60.num_resources = ARRAY_SIZE(am3517_mdio_resources),61.resource = am3517_mdio_resources,62.dev.platform_data = &am3517_evm_mdio_pdata,63};6465static struct emac_platform_data am3517_evm_emac_pdata = {66.rmii_en = 1,67};6869static struct resource am3517_emac_resources[] = {70{71.start = AM35XX_IPSS_EMAC_BASE,72.end = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,73.flags = IORESOURCE_MEM,74},75{76.start = INT_35XX_EMAC_C0_RXTHRESH_IRQ,77.end = INT_35XX_EMAC_C0_RXTHRESH_IRQ,78.flags = IORESOURCE_IRQ,79},80{81.start = INT_35XX_EMAC_C0_RX_PULSE_IRQ,82.end = INT_35XX_EMAC_C0_RX_PULSE_IRQ,83.flags = IORESOURCE_IRQ,84},85{86.start = INT_35XX_EMAC_C0_TX_PULSE_IRQ,87.end = INT_35XX_EMAC_C0_TX_PULSE_IRQ,88.flags = IORESOURCE_IRQ,89},90{91.start = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,92.end = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,93.flags = IORESOURCE_IRQ,94},95};9697static struct platform_device am3517_emac_device = {98.name = "davinci_emac",99.id = -1,100.num_resources = ARRAY_SIZE(am3517_emac_resources),101.resource = am3517_emac_resources,102};103104static void am3517_enable_ethernet_int(void)105{106u32 regval;107108regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);109regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |110AM35XX_CPGMAC_C0_TX_PULSE_CLR |111AM35XX_CPGMAC_C0_MISC_PULSE_CLR |112AM35XX_CPGMAC_C0_RX_THRESH_CLR);113omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);114regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);115}116117static void am3517_disable_ethernet_int(void)118{119u32 regval;120121regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);122regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |123AM35XX_CPGMAC_C0_TX_PULSE_CLR);124omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);125regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);126}127128static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)129{130unsigned int regval;131132pdata->ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET;133pdata->ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET;134pdata->ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET;135pdata->ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE;136pdata->version = EMAC_VERSION_2;137pdata->hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR;138pdata->interrupt_enable = am3517_enable_ethernet_int;139pdata->interrupt_disable = am3517_disable_ethernet_int;140am3517_emac_device.dev.platform_data = pdata;141platform_device_register(&am3517_emac_device);142platform_device_register(&am3517_mdio_device);143clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),144NULL, &am3517_emac_device.dev);145146regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);147regval = regval & (~(AM35XX_CPGMACSS_SW_RST));148omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);149regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);150151return ;152}153154155156#define LCD_PANEL_PWR 176157#define LCD_PANEL_BKLIGHT_PWR 182158#define LCD_PANEL_PWM 181159160static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = {161{162I2C_BOARD_INFO("s35390a", 0x30),163},164};165166/*167* RTC - S35390A168*/169#define GPIO_RTCS35390A_IRQ 55170171static void __init am3517_evm_rtc_init(void)172{173int r;174175omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);176177r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq");178if (r < 0) {179printk(KERN_WARNING "failed to request GPIO#%d\n",180GPIO_RTCS35390A_IRQ);181return;182}183184am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);185}186187/*188* I2C GPIO Expander - TCA6416189*/190191/* Mounted on Base-Board */192static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {193.gpio_base = OMAP_MAX_GPIO_LINES,194};195static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = {196{197I2C_BOARD_INFO("tlv320aic23", 0x1A),198},199{200I2C_BOARD_INFO("tca6416", 0x21),201.platform_data = &am3517evm_gpio_expander_info_0,202},203};204205/* Mounted on UI Card */206static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {207.gpio_base = OMAP_MAX_GPIO_LINES + 16,208};209static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {210.gpio_base = OMAP_MAX_GPIO_LINES + 32,211};212static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo[] = {213{214I2C_BOARD_INFO("tca6416", 0x20),215.platform_data = &am3517evm_ui_gpio_expander_info_1,216},217{218I2C_BOARD_INFO("tca6416", 0x21),219.platform_data = &am3517evm_ui_gpio_expander_info_2,220},221};222223static int __init am3517_evm_i2c_init(void)224{225omap_register_i2c_bus(1, 400, NULL, 0);226omap_register_i2c_bus(2, 400, am3517evm_i2c2_boardinfo,227ARRAY_SIZE(am3517evm_i2c2_boardinfo));228omap_register_i2c_bus(3, 400, am3517evm_i2c3_boardinfo,229ARRAY_SIZE(am3517evm_i2c3_boardinfo));230231return 0;232}233234static int lcd_enabled;235static int dvi_enabled;236237#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \238defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)239static struct gpio am3517_evm_dss_gpios[] __initdata = {240/* GPIO 182 = LCD Backlight Power */241{ LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" },242/* GPIO 181 = LCD Panel PWM */243{ LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },244/* GPIO 176 = LCD Panel Power enable pin */245{ LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" },246};247248static void __init am3517_evm_display_init(void)249{250int r;251252omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);253omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);254omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);255256r = gpio_request_array(am3517_evm_dss_gpios,257ARRAY_SIZE(am3517_evm_dss_gpios));258if (r) {259printk(KERN_ERR "failed to get DSS panel control GPIOs\n");260return;261}262263printk(KERN_INFO "Display initialized successfully\n");264}265#else266static void __init am3517_evm_display_init(void) {}267#endif268269static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)270{271if (dvi_enabled) {272printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");273return -EINVAL;274}275gpio_set_value(LCD_PANEL_PWR, 1);276lcd_enabled = 1;277278return 0;279}280281static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)282{283gpio_set_value(LCD_PANEL_PWR, 0);284lcd_enabled = 0;285}286287static struct panel_generic_dpi_data lcd_panel = {288.name = "sharp_lq",289.platform_enable = am3517_evm_panel_enable_lcd,290.platform_disable = am3517_evm_panel_disable_lcd,291};292293static struct omap_dss_device am3517_evm_lcd_device = {294.type = OMAP_DISPLAY_TYPE_DPI,295.name = "lcd",296.driver_name = "generic_dpi_panel",297.data = &lcd_panel,298.phy.dpi.data_lines = 16,299};300301static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)302{303return 0;304}305306static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)307{308}309310static struct omap_dss_device am3517_evm_tv_device = {311.type = OMAP_DISPLAY_TYPE_VENC,312.name = "tv",313.driver_name = "venc",314.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,315.platform_enable = am3517_evm_panel_enable_tv,316.platform_disable = am3517_evm_panel_disable_tv,317};318319static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev)320{321if (lcd_enabled) {322printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");323return -EINVAL;324}325dvi_enabled = 1;326327return 0;328}329330static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)331{332dvi_enabled = 0;333}334335static struct panel_generic_dpi_data dvi_panel = {336.name = "generic",337.platform_enable = am3517_evm_panel_enable_dvi,338.platform_disable = am3517_evm_panel_disable_dvi,339};340341static struct omap_dss_device am3517_evm_dvi_device = {342.type = OMAP_DISPLAY_TYPE_DPI,343.name = "dvi",344.driver_name = "generic_dpi_panel",345.data = &dvi_panel,346.phy.dpi.data_lines = 24,347};348349static struct omap_dss_device *am3517_evm_dss_devices[] = {350&am3517_evm_lcd_device,351&am3517_evm_tv_device,352&am3517_evm_dvi_device,353};354355static struct omap_dss_board_info am3517_evm_dss_data = {356.num_devices = ARRAY_SIZE(am3517_evm_dss_devices),357.devices = am3517_evm_dss_devices,358.default_device = &am3517_evm_lcd_device,359};360361/*362* Board initialization363*/364static void __init am3517_evm_init_early(void)365{366omap2_init_common_infrastructure();367omap2_init_common_devices(NULL, NULL);368}369370static struct omap_musb_board_data musb_board_data = {371.interface_type = MUSB_INTERFACE_ULPI,372.mode = MUSB_OTG,373.power = 500,374.set_phy_power = am35x_musb_phy_power,375.clear_irq = am35x_musb_clear_irq,376.set_mode = am35x_set_mode,377.reset = am35x_musb_reset,378};379380static __init void am3517_evm_musb_init(void)381{382u32 devconf2;383384/*385* Set up USB clock/mode in the DEVCONF2 register.386*/387devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);388389/* USB2.0 PHY reference clock is 13 MHz */390devconf2 &= ~(CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE);391devconf2 |= CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN392| CONF2_DATPOL;393394omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);395396usb_musb_init(&musb_board_data);397}398399static const struct usbhs_omap_board_data usbhs_bdata __initconst = {400.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,401#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \402defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)403.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,404#else405.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,406#endif407.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,408409.phy_reset = true,410.reset_gpio_port[0] = 57,411.reset_gpio_port[1] = -EINVAL,412.reset_gpio_port[2] = -EINVAL413};414415#ifdef CONFIG_OMAP_MUX416static struct omap_board_mux board_mux[] __initdata = {417/* USB OTG DRVVBUS offset = 0x212 */418OMAP3_MUX(SAD2D_MCAD23, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN),419{ .reg_offset = OMAP_MUX_TERMINATOR },420};421#endif422423424static struct resource am3517_hecc_resources[] = {425{426.start = AM35XX_IPSS_HECC_BASE,427.end = AM35XX_IPSS_HECC_BASE + 0x3FFF,428.flags = IORESOURCE_MEM,429},430{431.start = INT_35XX_HECC0_IRQ,432.end = INT_35XX_HECC0_IRQ,433.flags = IORESOURCE_IRQ,434},435};436437static struct platform_device am3517_hecc_device = {438.name = "ti_hecc",439.id = -1,440.num_resources = ARRAY_SIZE(am3517_hecc_resources),441.resource = am3517_hecc_resources,442};443444static struct ti_hecc_platform_data am3517_evm_hecc_pdata = {445.scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET,446.scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET,447.hecc_ram_offset = AM35XX_HECC_RAM_OFFSET,448.mbx_offset = AM35XX_HECC_MBOX_OFFSET,449.int_line = AM35XX_HECC_INT_LINE,450.version = AM35XX_HECC_VERSION,451};452453static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)454{455am3517_hecc_device.dev.platform_data = pdata;456platform_device_register(&am3517_hecc_device);457}458459static struct omap_board_config_kernel am3517_evm_config[] __initdata = {460};461462static void __init am3517_evm_init(void)463{464omap_board_config = am3517_evm_config;465omap_board_config_size = ARRAY_SIZE(am3517_evm_config);466omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);467468am3517_evm_i2c_init();469omap_display_init(&am3517_evm_dss_data);470omap_serial_init();471472/* Configure GPIO for EHCI port */473omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);474usbhs_init(&usbhs_bdata);475am3517_evm_hecc_init(&am3517_evm_hecc_pdata);476/* DSS */477am3517_evm_display_init();478479/* RTC - S35390A */480am3517_evm_rtc_init();481482i2c_register_board_info(1, am3517evm_i2c1_boardinfo,483ARRAY_SIZE(am3517evm_i2c1_boardinfo));484/*Ethernet*/485am3517_evm_ethernet_init(&am3517_evm_emac_pdata);486487/* MUSB */488am3517_evm_musb_init();489}490491MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")492.boot_params = 0x80000100,493.reserve = omap_reserve,494.map_io = omap3_map_io,495.init_early = am3517_evm_init_early,496.init_irq = omap_init_irq,497.init_machine = am3517_evm_init,498.timer = &omap_timer,499MACHINE_END500501502