linux/arch/arm/mach-davinci/board-da850-evm.c
<<
>>
Prefs
   1/*
   2 * TI DA850/OMAP-L138 EVM board
   3 *
   4 * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
   5 *
   6 * Derived from: arch/arm/mach-davinci/board-da830-evm.c
   7 * Original Copyrights follow:
   8 *
   9 * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
  10 * the terms of the GNU General Public License version 2. This program
  11 * is licensed "as is" without any warranty of any kind, whether express
  12 * or implied.
  13 */
  14#include <linux/kernel.h>
  15#include <linux/module.h>
  16#include <linux/init.h>
  17#include <linux/console.h>
  18#include <linux/i2c.h>
  19#include <linux/i2c/at24.h>
  20#include <linux/gpio.h>
  21#include <linux/platform_device.h>
  22#include <linux/mtd/mtd.h>
  23#include <linux/mtd/nand.h>
  24#include <linux/mtd/partitions.h>
  25#include <linux/mtd/physmap.h>
  26
  27#include <asm/mach-types.h>
  28#include <asm/mach/arch.h>
  29
  30#include <mach/common.h>
  31#include <mach/irqs.h>
  32#include <mach/cp_intc.h>
  33#include <mach/da8xx.h>
  34#include <mach/nand.h>
  35
  36#define DA850_EVM_PHY_MASK              0x1
  37#define DA850_EVM_MDIO_FREQUENCY        2200000 /* PHY bus frequency */
  38
  39#define DA850_LCD_BL_PIN                GPIO_TO_PIN(2, 15)
  40#define DA850_LCD_PWR_PIN               GPIO_TO_PIN(8, 10)
  41
  42#define DA850_MMCSD_CD_PIN              GPIO_TO_PIN(4, 0)
  43#define DA850_MMCSD_WP_PIN              GPIO_TO_PIN(4, 1)
  44
  45static struct mtd_partition da850_evm_norflash_partition[] = {
  46        {
  47                .name           = "NOR filesystem",
  48                .offset         = 0,
  49                .size           = MTDPART_SIZ_FULL,
  50                .mask_flags     = 0,
  51        },
  52};
  53
  54static struct physmap_flash_data da850_evm_norflash_data = {
  55        .width          = 2,
  56        .parts          = da850_evm_norflash_partition,
  57        .nr_parts       = ARRAY_SIZE(da850_evm_norflash_partition),
  58};
  59
  60static struct resource da850_evm_norflash_resource[] = {
  61        {
  62                .start  = DA8XX_AEMIF_CS2_BASE,
  63                .end    = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
  64                .flags  = IORESOURCE_MEM,
  65        },
  66};
  67
  68static struct platform_device da850_evm_norflash_device = {
  69        .name           = "physmap-flash",
  70        .id             = 0,
  71        .dev            = {
  72                .platform_data  = &da850_evm_norflash_data,
  73        },
  74        .num_resources  = 1,
  75        .resource       = da850_evm_norflash_resource,
  76};
  77
  78/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
  79 * (128K blocks). It may be used instead of the (default) SPI flash
  80 * to boot, using TI's tools to install the secondary boot loader
  81 * (UBL) and U-Boot.
  82 */
  83struct mtd_partition da850_evm_nandflash_partition[] = {
  84        {
  85                .name           = "u-boot env",
  86                .offset         = 0,
  87                .size           = SZ_128K,
  88                .mask_flags     = MTD_WRITEABLE,
  89         },
  90        {
  91                .name           = "UBL",
  92                .offset         = MTDPART_OFS_APPEND,
  93                .size           = SZ_128K,
  94                .mask_flags     = MTD_WRITEABLE,
  95        },
  96        {
  97                .name           = "u-boot",
  98                .offset         = MTDPART_OFS_APPEND,
  99                .size           = 4 * SZ_128K,
 100                .mask_flags     = MTD_WRITEABLE,
 101        },
 102        {
 103                .name           = "kernel",
 104                .offset         = 0x200000,
 105                .size           = SZ_2M,
 106                .mask_flags     = 0,
 107        },
 108        {
 109                .name           = "filesystem",
 110                .offset         = MTDPART_OFS_APPEND,
 111                .size           = MTDPART_SIZ_FULL,
 112                .mask_flags     = 0,
 113        },
 114};
 115
 116static struct davinci_nand_pdata da850_evm_nandflash_data = {
 117        .parts          = da850_evm_nandflash_partition,
 118        .nr_parts       = ARRAY_SIZE(da850_evm_nandflash_partition),
 119        .ecc_mode       = NAND_ECC_HW,
 120        .options        = NAND_USE_FLASH_BBT,
 121};
 122
 123static struct resource da850_evm_nandflash_resource[] = {
 124        {
 125                .start  = DA8XX_AEMIF_CS3_BASE,
 126                .end    = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
 127                .flags  = IORESOURCE_MEM,
 128        },
 129        {
 130                .start  = DA8XX_AEMIF_CTL_BASE,
 131                .end    = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
 132                .flags  = IORESOURCE_MEM,
 133        },
 134};
 135
 136static struct platform_device da850_evm_nandflash_device = {
 137        .name           = "davinci_nand",
 138        .id             = 1,
 139        .dev            = {
 140                .platform_data  = &da850_evm_nandflash_data,
 141        },
 142        .num_resources  = ARRAY_SIZE(da850_evm_nandflash_resource),
 143        .resource       = da850_evm_nandflash_resource,
 144};
 145
 146static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
 147        {
 148                I2C_BOARD_INFO("tlv320aic3x", 0x18),
 149        }
 150};
 151
 152static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
 153        .bus_freq       = 100,  /* kHz */
 154        .bus_delay      = 0,    /* usec */
 155};
 156
 157static struct davinci_uart_config da850_evm_uart_config __initdata = {
 158        .enabled_uarts = 0x7,
 159};
 160
 161static struct platform_device *da850_evm_devices[] __initdata = {
 162        &da850_evm_nandflash_device,
 163        &da850_evm_norflash_device,
 164};
 165
 166/* davinci da850 evm audio machine driver */
 167static u8 da850_iis_serializer_direction[] = {
 168        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 169        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 170        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  TX_MODE,
 171        RX_MODE,        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 172};
 173
 174static struct snd_platform_data da850_evm_snd_data = {
 175        .tx_dma_offset  = 0x2000,
 176        .rx_dma_offset  = 0x2000,
 177        .op_mode        = DAVINCI_MCASP_IIS_MODE,
 178        .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
 179        .tdm_slots      = 2,
 180        .serial_dir     = da850_iis_serializer_direction,
 181        .eventq_no      = EVENTQ_1,
 182        .version        = MCASP_VERSION_2,
 183        .txnumevt       = 1,
 184        .rxnumevt       = 1,
 185};
 186
 187static int da850_evm_mmc_get_ro(int index)
 188{
 189        return gpio_get_value(DA850_MMCSD_WP_PIN);
 190}
 191
 192static int da850_evm_mmc_get_cd(int index)
 193{
 194        return !gpio_get_value(DA850_MMCSD_CD_PIN);
 195}
 196
 197static struct davinci_mmc_config da850_mmc_config = {
 198        .get_ro         = da850_evm_mmc_get_ro,
 199        .get_cd         = da850_evm_mmc_get_cd,
 200        .wires          = 4,
 201        .version        = MMC_CTLR_VERSION_2,
 202};
 203
 204static int da850_lcd_hw_init(void)
 205{
 206        int status;
 207
 208        status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
 209        if (status < 0)
 210                return status;
 211
 212        status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
 213        if (status < 0) {
 214                gpio_free(DA850_LCD_BL_PIN);
 215                return status;
 216        }
 217
 218        gpio_direction_output(DA850_LCD_BL_PIN, 0);
 219        gpio_direction_output(DA850_LCD_PWR_PIN, 0);
 220
 221        /* disable lcd backlight */
 222        gpio_set_value(DA850_LCD_BL_PIN, 0);
 223
 224        /* disable lcd power */
 225        gpio_set_value(DA850_LCD_PWR_PIN, 0);
 226
 227        /* enable lcd power */
 228        gpio_set_value(DA850_LCD_PWR_PIN, 1);
 229
 230        /* enable lcd backlight */
 231        gpio_set_value(DA850_LCD_BL_PIN, 1);
 232
 233        return 0;
 234}
 235
 236#define DA8XX_AEMIF_CE2CFG_OFFSET       0x10
 237#define DA8XX_AEMIF_ASIZE_16BIT         0x1
 238
 239static void __init da850_evm_init_nor(void)
 240{
 241        void __iomem *aemif_addr;
 242
 243        aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
 244
 245        /* Configure data bus width of CS2 to 16 bit */
 246        writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
 247                DA8XX_AEMIF_ASIZE_16BIT,
 248                aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
 249
 250        iounmap(aemif_addr);
 251}
 252
 253#if defined(CONFIG_MTD_PHYSMAP) || \
 254    defined(CONFIG_MTD_PHYSMAP_MODULE)
 255#define HAS_NOR 1
 256#else
 257#define HAS_NOR 0
 258#endif
 259
 260#if defined(CONFIG_MMC_DAVINCI) || \
 261    defined(CONFIG_MMC_DAVINCI_MODULE)
 262#define HAS_MMC 1
 263#else
 264#define HAS_MMC 0
 265#endif
 266
 267static __init void da850_evm_init(void)
 268{
 269        struct davinci_soc_info *soc_info = &davinci_soc_info;
 270        int ret;
 271
 272        ret = da8xx_pinmux_setup(da850_nand_pins);
 273        if (ret)
 274                pr_warning("da850_evm_init: nand mux setup failed: %d\n",
 275                                ret);
 276
 277        ret = da8xx_pinmux_setup(da850_nor_pins);
 278        if (ret)
 279                pr_warning("da850_evm_init: nor mux setup failed: %d\n",
 280                                ret);
 281
 282        da850_evm_init_nor();
 283
 284        platform_add_devices(da850_evm_devices,
 285                                ARRAY_SIZE(da850_evm_devices));
 286
 287        ret = da8xx_register_edma();
 288        if (ret)
 289                pr_warning("da850_evm_init: edma registration failed: %d\n",
 290                                ret);
 291
 292        ret = da8xx_pinmux_setup(da850_i2c0_pins);
 293        if (ret)
 294                pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",
 295                                ret);
 296
 297        ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
 298        if (ret)
 299                pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
 300                                ret);
 301
 302        soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK;
 303        soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY;
 304        soc_info->emac_pdata->rmii_en = 0;
 305
 306        ret = da8xx_pinmux_setup(da850_cpgmac_pins);
 307        if (ret)
 308                pr_warning("da850_evm_init: cpgmac mux setup failed: %d\n",
 309                                ret);
 310
 311        ret = da8xx_register_emac();
 312        if (ret)
 313                pr_warning("da850_evm_init: emac registration failed: %d\n",
 314                                ret);
 315
 316        ret = da8xx_register_watchdog();
 317        if (ret)
 318                pr_warning("da830_evm_init: watchdog registration failed: %d\n",
 319                                ret);
 320
 321        if (HAS_MMC) {
 322                if (HAS_NOR)
 323                        pr_warning("WARNING: both NOR Flash and MMC/SD are "
 324                                "enabled, but they share AEMIF pins.\n"
 325                                "\tDisable one of them.\n");
 326
 327                ret = da8xx_pinmux_setup(da850_mmcsd0_pins);
 328                if (ret)
 329                        pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
 330                                        " %d\n", ret);
 331
 332                ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
 333                if (ret)
 334                        pr_warning("da850_evm_init: can not open GPIO %d\n",
 335                                        DA850_MMCSD_CD_PIN);
 336                gpio_direction_input(DA850_MMCSD_CD_PIN);
 337
 338                ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
 339                if (ret)
 340                        pr_warning("da850_evm_init: can not open GPIO %d\n",
 341                                        DA850_MMCSD_WP_PIN);
 342                gpio_direction_input(DA850_MMCSD_WP_PIN);
 343
 344                ret = da8xx_register_mmcsd0(&da850_mmc_config);
 345                if (ret)
 346                        pr_warning("da850_evm_init: mmcsd0 registration failed:"
 347                                        " %d\n", ret);
 348        }
 349
 350        davinci_serial_init(&da850_evm_uart_config);
 351
 352        i2c_register_board_info(1, da850_evm_i2c_devices,
 353                        ARRAY_SIZE(da850_evm_i2c_devices));
 354
 355        /*
 356         * shut down uart 0 and 1; they are not used on the board and
 357         * accessing them causes endless "too much work in irq53" messages
 358         * with arago fs
 359         */
 360        __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
 361        __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
 362
 363        ret = da8xx_pinmux_setup(da850_mcasp_pins);
 364        if (ret)
 365                pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
 366                                ret);
 367
 368        da8xx_init_mcasp(0, &da850_evm_snd_data);
 369
 370        ret = da8xx_pinmux_setup(da850_lcdcntl_pins);
 371        if (ret)
 372                pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",
 373                                ret);
 374
 375        ret = da850_lcd_hw_init();
 376        if (ret)
 377                pr_warning("da850_evm_init: lcd initialization failed: %d\n",
 378                                ret);
 379
 380        ret = da8xx_register_lcdc();
 381        if (ret)
 382                pr_warning("da850_evm_init: lcdc registration failed: %d\n",
 383                                ret);
 384}
 385
 386#ifdef CONFIG_SERIAL_8250_CONSOLE
 387static int __init da850_evm_console_init(void)
 388{
 389        return add_preferred_console("ttyS", 2, "115200");
 390}
 391console_initcall(da850_evm_console_init);
 392#endif
 393
 394static __init void da850_evm_irq_init(void)
 395{
 396        struct davinci_soc_info *soc_info = &davinci_soc_info;
 397
 398        cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA850_N_CP_INTC_IRQ,
 399                        soc_info->intc_irq_prios);
 400}
 401
 402static void __init da850_evm_map_io(void)
 403{
 404        da850_init();
 405}
 406
 407MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138 EVM")
 408        .phys_io        = IO_PHYS,
 409        .io_pg_offst    = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
 410        .boot_params    = (DA8XX_DDR_BASE + 0x100),
 411        .map_io         = da850_evm_map_io,
 412        .init_irq       = da850_evm_irq_init,
 413        .timer          = &davinci_timer,
 414        .init_machine   = da850_evm_init,
 415MACHINE_END
 416