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/console.h>
  15#include <linux/delay.h>
  16#include <linux/gpio.h>
  17#include <linux/gpio_keys.h>
  18#include <linux/init.h>
  19#include <linux/kernel.h>
  20#include <linux/i2c.h>
  21#include <linux/i2c/at24.h>
  22#include <linux/i2c/pca953x.h>
  23#include <linux/input.h>
  24#include <linux/input/tps6507x-ts.h>
  25#include <linux/mfd/tps6507x.h>
  26#include <linux/mtd/mtd.h>
  27#include <linux/mtd/nand.h>
  28#include <linux/mtd/partitions.h>
  29#include <linux/mtd/physmap.h>
  30#include <linux/platform_device.h>
  31#include <linux/platform_data/mtd-davinci.h>
  32#include <linux/platform_data/mtd-davinci-aemif.h>
  33#include <linux/platform_data/spi-davinci.h>
  34#include <linux/platform_data/uio_pruss.h>
  35#include <linux/regulator/machine.h>
  36#include <linux/regulator/tps6507x.h>
  37#include <linux/spi/spi.h>
  38#include <linux/spi/flash.h>
  39#include <linux/wl12xx.h>
  40
  41#include <mach/cp_intc.h>
  42#include <mach/da8xx.h>
  43#include <mach/mux.h>
  44#include <mach/sram.h>
  45
  46#include <asm/mach-types.h>
  47#include <asm/mach/arch.h>
  48#include <asm/system_info.h>
  49
  50#include <media/tvp514x.h>
  51#include <media/adv7343.h>
  52
  53#define DA850_EVM_PHY_ID                "davinci_mdio-0:00"
  54#define DA850_LCD_PWR_PIN               GPIO_TO_PIN(2, 8)
  55#define DA850_LCD_BL_PIN                GPIO_TO_PIN(2, 15)
  56
  57#define DA850_MMCSD_CD_PIN              GPIO_TO_PIN(4, 0)
  58#define DA850_MMCSD_WP_PIN              GPIO_TO_PIN(4, 1)
  59
  60#define DA850_WLAN_EN                   GPIO_TO_PIN(6, 9)
  61#define DA850_WLAN_IRQ                  GPIO_TO_PIN(6, 10)
  62
  63#define DA850_MII_MDIO_CLKEN_PIN        GPIO_TO_PIN(2, 6)
  64
  65static struct mtd_partition da850evm_spiflash_part[] = {
  66        [0] = {
  67                .name = "UBL",
  68                .offset = 0,
  69                .size = SZ_64K,
  70                .mask_flags = MTD_WRITEABLE,
  71        },
  72        [1] = {
  73                .name = "U-Boot",
  74                .offset = MTDPART_OFS_APPEND,
  75                .size = SZ_512K,
  76                .mask_flags = MTD_WRITEABLE,
  77        },
  78        [2] = {
  79                .name = "U-Boot-Env",
  80                .offset = MTDPART_OFS_APPEND,
  81                .size = SZ_64K,
  82                .mask_flags = MTD_WRITEABLE,
  83        },
  84        [3] = {
  85                .name = "Kernel",
  86                .offset = MTDPART_OFS_APPEND,
  87                .size = SZ_2M + SZ_512K,
  88                .mask_flags = 0,
  89        },
  90        [4] = {
  91                .name = "Filesystem",
  92                .offset = MTDPART_OFS_APPEND,
  93                .size = SZ_4M,
  94                .mask_flags = 0,
  95        },
  96        [5] = {
  97                .name = "MAC-Address",
  98                .offset = SZ_8M - SZ_64K,
  99                .size = SZ_64K,
 100                .mask_flags = MTD_WRITEABLE,
 101        },
 102};
 103
 104static struct flash_platform_data da850evm_spiflash_data = {
 105        .name           = "m25p80",
 106        .parts          = da850evm_spiflash_part,
 107        .nr_parts       = ARRAY_SIZE(da850evm_spiflash_part),
 108        .type           = "m25p64",
 109};
 110
 111static struct davinci_spi_config da850evm_spiflash_cfg = {
 112        .io_type        = SPI_IO_TYPE_DMA,
 113        .c2tdelay       = 8,
 114        .t2cdelay       = 8,
 115};
 116
 117static struct spi_board_info da850evm_spi_info[] = {
 118        {
 119                .modalias               = "m25p80",
 120                .platform_data          = &da850evm_spiflash_data,
 121                .controller_data        = &da850evm_spiflash_cfg,
 122                .mode                   = SPI_MODE_0,
 123                .max_speed_hz           = 30000000,
 124                .bus_num                = 1,
 125                .chip_select            = 0,
 126        },
 127};
 128
 129#ifdef CONFIG_MTD
 130static void da850_evm_m25p80_notify_add(struct mtd_info *mtd)
 131{
 132        char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
 133        size_t retlen;
 134
 135        if (!strcmp(mtd->name, "MAC-Address")) {
 136                mtd_read(mtd, 0, ETH_ALEN, &retlen, mac_addr);
 137                if (retlen == ETH_ALEN)
 138                        pr_info("Read MAC addr from SPI Flash: %pM\n",
 139                                mac_addr);
 140        }
 141}
 142
 143static struct mtd_notifier da850evm_spi_notifier = {
 144        .add    = da850_evm_m25p80_notify_add,
 145};
 146
 147static void da850_evm_setup_mac_addr(void)
 148{
 149        register_mtd_user(&da850evm_spi_notifier);
 150}
 151#else
 152static void da850_evm_setup_mac_addr(void) { }
 153#endif
 154
 155static struct mtd_partition da850_evm_norflash_partition[] = {
 156        {
 157                .name           = "bootloaders + env",
 158                .offset         = 0,
 159                .size           = SZ_512K,
 160                .mask_flags     = MTD_WRITEABLE,
 161        },
 162        {
 163                .name           = "kernel",
 164                .offset         = MTDPART_OFS_APPEND,
 165                .size           = SZ_2M,
 166                .mask_flags     = 0,
 167        },
 168        {
 169                .name           = "filesystem",
 170                .offset         = MTDPART_OFS_APPEND,
 171                .size           = MTDPART_SIZ_FULL,
 172                .mask_flags     = 0,
 173        },
 174};
 175
 176static struct physmap_flash_data da850_evm_norflash_data = {
 177        .width          = 2,
 178        .parts          = da850_evm_norflash_partition,
 179        .nr_parts       = ARRAY_SIZE(da850_evm_norflash_partition),
 180};
 181
 182static struct resource da850_evm_norflash_resource[] = {
 183        {
 184                .start  = DA8XX_AEMIF_CS2_BASE,
 185                .end    = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
 186                .flags  = IORESOURCE_MEM,
 187        },
 188};
 189
 190static struct platform_device da850_evm_norflash_device = {
 191        .name           = "physmap-flash",
 192        .id             = 0,
 193        .dev            = {
 194                .platform_data  = &da850_evm_norflash_data,
 195        },
 196        .num_resources  = 1,
 197        .resource       = da850_evm_norflash_resource,
 198};
 199
 200static struct davinci_pm_config da850_pm_pdata = {
 201        .sleepcount = 128,
 202};
 203
 204static struct platform_device da850_pm_device = {
 205        .name           = "pm-davinci",
 206        .dev = {
 207                .platform_data  = &da850_pm_pdata,
 208        },
 209        .id             = -1,
 210};
 211
 212/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
 213 * (128K blocks). It may be used instead of the (default) SPI flash
 214 * to boot, using TI's tools to install the secondary boot loader
 215 * (UBL) and U-Boot.
 216 */
 217static struct mtd_partition da850_evm_nandflash_partition[] = {
 218        {
 219                .name           = "u-boot env",
 220                .offset         = 0,
 221                .size           = SZ_128K,
 222                .mask_flags     = MTD_WRITEABLE,
 223         },
 224        {
 225                .name           = "UBL",
 226                .offset         = MTDPART_OFS_APPEND,
 227                .size           = SZ_128K,
 228                .mask_flags     = MTD_WRITEABLE,
 229        },
 230        {
 231                .name           = "u-boot",
 232                .offset         = MTDPART_OFS_APPEND,
 233                .size           = 4 * SZ_128K,
 234                .mask_flags     = MTD_WRITEABLE,
 235        },
 236        {
 237                .name           = "kernel",
 238                .offset         = 0x200000,
 239                .size           = SZ_2M,
 240                .mask_flags     = 0,
 241        },
 242        {
 243                .name           = "filesystem",
 244                .offset         = MTDPART_OFS_APPEND,
 245                .size           = MTDPART_SIZ_FULL,
 246                .mask_flags     = 0,
 247        },
 248};
 249
 250static struct davinci_aemif_timing da850_evm_nandflash_timing = {
 251        .wsetup         = 24,
 252        .wstrobe        = 21,
 253        .whold          = 14,
 254        .rsetup         = 19,
 255        .rstrobe        = 50,
 256        .rhold          = 0,
 257        .ta             = 20,
 258};
 259
 260static struct davinci_nand_pdata da850_evm_nandflash_data = {
 261        .parts          = da850_evm_nandflash_partition,
 262        .nr_parts       = ARRAY_SIZE(da850_evm_nandflash_partition),
 263        .ecc_mode       = NAND_ECC_HW,
 264        .ecc_bits       = 4,
 265        .bbt_options    = NAND_BBT_USE_FLASH,
 266        .timing         = &da850_evm_nandflash_timing,
 267};
 268
 269static struct resource da850_evm_nandflash_resource[] = {
 270        {
 271                .start  = DA8XX_AEMIF_CS3_BASE,
 272                .end    = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
 273                .flags  = IORESOURCE_MEM,
 274        },
 275        {
 276                .start  = DA8XX_AEMIF_CTL_BASE,
 277                .end    = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
 278                .flags  = IORESOURCE_MEM,
 279        },
 280};
 281
 282static struct platform_device da850_evm_nandflash_device = {
 283        .name           = "davinci_nand",
 284        .id             = 1,
 285        .dev            = {
 286                .platform_data  = &da850_evm_nandflash_data,
 287        },
 288        .num_resources  = ARRAY_SIZE(da850_evm_nandflash_resource),
 289        .resource       = da850_evm_nandflash_resource,
 290};
 291
 292static struct platform_device *da850_evm_devices[] = {
 293        &da850_evm_nandflash_device,
 294        &da850_evm_norflash_device,
 295};
 296
 297#define DA8XX_AEMIF_CE2CFG_OFFSET       0x10
 298#define DA8XX_AEMIF_ASIZE_16BIT         0x1
 299
 300static void __init da850_evm_init_nor(void)
 301{
 302        void __iomem *aemif_addr;
 303
 304        aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
 305
 306        /* Configure data bus width of CS2 to 16 bit */
 307        writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
 308                DA8XX_AEMIF_ASIZE_16BIT,
 309                aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
 310
 311        iounmap(aemif_addr);
 312}
 313
 314static const short da850_evm_nand_pins[] = {
 315        DA850_EMA_D_0, DA850_EMA_D_1, DA850_EMA_D_2, DA850_EMA_D_3,
 316        DA850_EMA_D_4, DA850_EMA_D_5, DA850_EMA_D_6, DA850_EMA_D_7,
 317        DA850_EMA_A_1, DA850_EMA_A_2, DA850_NEMA_CS_3, DA850_NEMA_CS_4,
 318        DA850_NEMA_WE, DA850_NEMA_OE,
 319        -1
 320};
 321
 322static const short da850_evm_nor_pins[] = {
 323        DA850_EMA_BA_1, DA850_EMA_CLK, DA850_EMA_WAIT_1, DA850_NEMA_CS_2,
 324        DA850_NEMA_WE, DA850_NEMA_OE, DA850_EMA_D_0, DA850_EMA_D_1,
 325        DA850_EMA_D_2, DA850_EMA_D_3, DA850_EMA_D_4, DA850_EMA_D_5,
 326        DA850_EMA_D_6, DA850_EMA_D_7, DA850_EMA_D_8, DA850_EMA_D_9,
 327        DA850_EMA_D_10, DA850_EMA_D_11, DA850_EMA_D_12, DA850_EMA_D_13,
 328        DA850_EMA_D_14, DA850_EMA_D_15, DA850_EMA_A_0, DA850_EMA_A_1,
 329        DA850_EMA_A_2, DA850_EMA_A_3, DA850_EMA_A_4, DA850_EMA_A_5,
 330        DA850_EMA_A_6, DA850_EMA_A_7, DA850_EMA_A_8, DA850_EMA_A_9,
 331        DA850_EMA_A_10, DA850_EMA_A_11, DA850_EMA_A_12, DA850_EMA_A_13,
 332        DA850_EMA_A_14, DA850_EMA_A_15, DA850_EMA_A_16, DA850_EMA_A_17,
 333        DA850_EMA_A_18, DA850_EMA_A_19, DA850_EMA_A_20, DA850_EMA_A_21,
 334        DA850_EMA_A_22, DA850_EMA_A_23,
 335        -1
 336};
 337
 338#define HAS_MMC         IS_ENABLED(CONFIG_MMC_DAVINCI)
 339
 340static inline void da850_evm_setup_nor_nand(void)
 341{
 342        int ret = 0;
 343
 344        if (!HAS_MMC) {
 345                ret = davinci_cfg_reg_list(da850_evm_nand_pins);
 346                if (ret)
 347                        pr_warn("%s: NAND mux setup failed: %d\n",
 348                                __func__, ret);
 349
 350                ret = davinci_cfg_reg_list(da850_evm_nor_pins);
 351                if (ret)
 352                        pr_warn("%s: NOR mux setup failed: %d\n",
 353                                __func__, ret);
 354
 355                da850_evm_init_nor();
 356
 357                platform_add_devices(da850_evm_devices,
 358                                        ARRAY_SIZE(da850_evm_devices));
 359        }
 360}
 361
 362#ifdef CONFIG_DA850_UI_RMII
 363static inline void da850_evm_setup_emac_rmii(int rmii_sel)
 364{
 365        struct davinci_soc_info *soc_info = &davinci_soc_info;
 366
 367        soc_info->emac_pdata->rmii_en = 1;
 368        gpio_set_value_cansleep(rmii_sel, 0);
 369}
 370#else
 371static inline void da850_evm_setup_emac_rmii(int rmii_sel) { }
 372#endif
 373
 374
 375#define DA850_KEYS_DEBOUNCE_MS  10
 376/*
 377 * At 200ms polling interval it is possible to miss an
 378 * event by tapping very lightly on the push button but most
 379 * pushes do result in an event; longer intervals require the
 380 * user to hold the button whereas shorter intervals require
 381 * more CPU time for polling.
 382 */
 383#define DA850_GPIO_KEYS_POLL_MS 200
 384
 385enum da850_evm_ui_exp_pins {
 386        DA850_EVM_UI_EXP_SEL_C = 5,
 387        DA850_EVM_UI_EXP_SEL_B,
 388        DA850_EVM_UI_EXP_SEL_A,
 389        DA850_EVM_UI_EXP_PB8,
 390        DA850_EVM_UI_EXP_PB7,
 391        DA850_EVM_UI_EXP_PB6,
 392        DA850_EVM_UI_EXP_PB5,
 393        DA850_EVM_UI_EXP_PB4,
 394        DA850_EVM_UI_EXP_PB3,
 395        DA850_EVM_UI_EXP_PB2,
 396        DA850_EVM_UI_EXP_PB1,
 397};
 398
 399static const char * const da850_evm_ui_exp[] = {
 400        [DA850_EVM_UI_EXP_SEL_C]        = "sel_c",
 401        [DA850_EVM_UI_EXP_SEL_B]        = "sel_b",
 402        [DA850_EVM_UI_EXP_SEL_A]        = "sel_a",
 403        [DA850_EVM_UI_EXP_PB8]          = "pb8",
 404        [DA850_EVM_UI_EXP_PB7]          = "pb7",
 405        [DA850_EVM_UI_EXP_PB6]          = "pb6",
 406        [DA850_EVM_UI_EXP_PB5]          = "pb5",
 407        [DA850_EVM_UI_EXP_PB4]          = "pb4",
 408        [DA850_EVM_UI_EXP_PB3]          = "pb3",
 409        [DA850_EVM_UI_EXP_PB2]          = "pb2",
 410        [DA850_EVM_UI_EXP_PB1]          = "pb1",
 411};
 412
 413#define DA850_N_UI_PB           8
 414
 415static struct gpio_keys_button da850_evm_ui_keys[] = {
 416        [0 ... DA850_N_UI_PB - 1] = {
 417                .type                   = EV_KEY,
 418                .active_low             = 1,
 419                .wakeup                 = 0,
 420                .debounce_interval      = DA850_KEYS_DEBOUNCE_MS,
 421                .code                   = -1, /* assigned at runtime */
 422                .gpio                   = -1, /* assigned at runtime */
 423                .desc                   = NULL, /* assigned at runtime */
 424        },
 425};
 426
 427static struct gpio_keys_platform_data da850_evm_ui_keys_pdata = {
 428        .buttons = da850_evm_ui_keys,
 429        .nbuttons = ARRAY_SIZE(da850_evm_ui_keys),
 430        .poll_interval = DA850_GPIO_KEYS_POLL_MS,
 431};
 432
 433static struct platform_device da850_evm_ui_keys_device = {
 434        .name = "gpio-keys-polled",
 435        .id = 0,
 436        .dev = {
 437                .platform_data = &da850_evm_ui_keys_pdata
 438        },
 439};
 440
 441static void da850_evm_ui_keys_init(unsigned gpio)
 442{
 443        int i;
 444        struct gpio_keys_button *button;
 445
 446        for (i = 0; i < DA850_N_UI_PB; i++) {
 447                button = &da850_evm_ui_keys[i];
 448                button->code = KEY_F8 - i;
 449                button->desc = (char *)
 450                                da850_evm_ui_exp[DA850_EVM_UI_EXP_PB8 + i];
 451                button->gpio = gpio + DA850_EVM_UI_EXP_PB8 + i;
 452        }
 453}
 454
 455#ifdef CONFIG_DA850_UI_SD_VIDEO_PORT
 456static inline void da850_evm_setup_video_port(int video_sel)
 457{
 458        gpio_set_value_cansleep(video_sel, 0);
 459}
 460#else
 461static inline void da850_evm_setup_video_port(int video_sel) { }
 462#endif
 463
 464static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio,
 465                                                unsigned ngpio, void *c)
 466{
 467        int sel_a, sel_b, sel_c, ret;
 468
 469        sel_a = gpio + DA850_EVM_UI_EXP_SEL_A;
 470        sel_b = gpio + DA850_EVM_UI_EXP_SEL_B;
 471        sel_c = gpio + DA850_EVM_UI_EXP_SEL_C;
 472
 473        ret = gpio_request(sel_a, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_A]);
 474        if (ret) {
 475                pr_warn("Cannot open UI expander pin %d\n", sel_a);
 476                goto exp_setup_sela_fail;
 477        }
 478
 479        ret = gpio_request(sel_b, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_B]);
 480        if (ret) {
 481                pr_warn("Cannot open UI expander pin %d\n", sel_b);
 482                goto exp_setup_selb_fail;
 483        }
 484
 485        ret = gpio_request(sel_c, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_C]);
 486        if (ret) {
 487                pr_warn("Cannot open UI expander pin %d\n", sel_c);
 488                goto exp_setup_selc_fail;
 489        }
 490
 491        /* deselect all functionalities */
 492        gpio_direction_output(sel_a, 1);
 493        gpio_direction_output(sel_b, 1);
 494        gpio_direction_output(sel_c, 1);
 495
 496        da850_evm_ui_keys_init(gpio);
 497        ret = platform_device_register(&da850_evm_ui_keys_device);
 498        if (ret) {
 499                pr_warn("Could not register UI GPIO expander push-buttons");
 500                goto exp_setup_keys_fail;
 501        }
 502
 503        pr_info("DA850/OMAP-L138 EVM UI card detected\n");
 504
 505        da850_evm_setup_nor_nand();
 506
 507        da850_evm_setup_emac_rmii(sel_a);
 508
 509        da850_evm_setup_video_port(sel_c);
 510
 511        return 0;
 512
 513exp_setup_keys_fail:
 514        gpio_free(sel_c);
 515exp_setup_selc_fail:
 516        gpio_free(sel_b);
 517exp_setup_selb_fail:
 518        gpio_free(sel_a);
 519exp_setup_sela_fail:
 520        return ret;
 521}
 522
 523static int da850_evm_ui_expander_teardown(struct i2c_client *client,
 524                                        unsigned gpio, unsigned ngpio, void *c)
 525{
 526        platform_device_unregister(&da850_evm_ui_keys_device);
 527
 528        /* deselect all functionalities */
 529        gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_C, 1);
 530        gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_B, 1);
 531        gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_A, 1);
 532
 533        gpio_free(gpio + DA850_EVM_UI_EXP_SEL_C);
 534        gpio_free(gpio + DA850_EVM_UI_EXP_SEL_B);
 535        gpio_free(gpio + DA850_EVM_UI_EXP_SEL_A);
 536
 537        return 0;
 538}
 539
 540/* assign the baseboard expander's GPIOs after the UI board's */
 541#define DA850_UI_EXPANDER_N_GPIOS ARRAY_SIZE(da850_evm_ui_exp)
 542#define DA850_BB_EXPANDER_GPIO_BASE (DAVINCI_N_GPIO + DA850_UI_EXPANDER_N_GPIOS)
 543
 544enum da850_evm_bb_exp_pins {
 545        DA850_EVM_BB_EXP_DEEP_SLEEP_EN = 0,
 546        DA850_EVM_BB_EXP_SW_RST,
 547        DA850_EVM_BB_EXP_TP_23,
 548        DA850_EVM_BB_EXP_TP_22,
 549        DA850_EVM_BB_EXP_TP_21,
 550        DA850_EVM_BB_EXP_USER_PB1,
 551        DA850_EVM_BB_EXP_USER_LED2,
 552        DA850_EVM_BB_EXP_USER_LED1,
 553        DA850_EVM_BB_EXP_USER_SW1,
 554        DA850_EVM_BB_EXP_USER_SW2,
 555        DA850_EVM_BB_EXP_USER_SW3,
 556        DA850_EVM_BB_EXP_USER_SW4,
 557        DA850_EVM_BB_EXP_USER_SW5,
 558        DA850_EVM_BB_EXP_USER_SW6,
 559        DA850_EVM_BB_EXP_USER_SW7,
 560        DA850_EVM_BB_EXP_USER_SW8
 561};
 562
 563static const char * const da850_evm_bb_exp[] = {
 564        [DA850_EVM_BB_EXP_DEEP_SLEEP_EN]        = "deep_sleep_en",
 565        [DA850_EVM_BB_EXP_SW_RST]               = "sw_rst",
 566        [DA850_EVM_BB_EXP_TP_23]                = "tp_23",
 567        [DA850_EVM_BB_EXP_TP_22]                = "tp_22",
 568        [DA850_EVM_BB_EXP_TP_21]                = "tp_21",
 569        [DA850_EVM_BB_EXP_USER_PB1]             = "user_pb1",
 570        [DA850_EVM_BB_EXP_USER_LED2]            = "user_led2",
 571        [DA850_EVM_BB_EXP_USER_LED1]            = "user_led1",
 572        [DA850_EVM_BB_EXP_USER_SW1]             = "user_sw1",
 573        [DA850_EVM_BB_EXP_USER_SW2]             = "user_sw2",
 574        [DA850_EVM_BB_EXP_USER_SW3]             = "user_sw3",
 575        [DA850_EVM_BB_EXP_USER_SW4]             = "user_sw4",
 576        [DA850_EVM_BB_EXP_USER_SW5]             = "user_sw5",
 577        [DA850_EVM_BB_EXP_USER_SW6]             = "user_sw6",
 578        [DA850_EVM_BB_EXP_USER_SW7]             = "user_sw7",
 579        [DA850_EVM_BB_EXP_USER_SW8]             = "user_sw8",
 580};
 581
 582#define DA850_N_BB_USER_SW      8
 583
 584static struct gpio_keys_button da850_evm_bb_keys[] = {
 585        [0] = {
 586                .type                   = EV_KEY,
 587                .active_low             = 1,
 588                .wakeup                 = 0,
 589                .debounce_interval      = DA850_KEYS_DEBOUNCE_MS,
 590                .code                   = KEY_PROG1,
 591                .desc                   = NULL, /* assigned at runtime */
 592                .gpio                   = -1, /* assigned at runtime */
 593        },
 594        [1 ... DA850_N_BB_USER_SW] = {
 595                .type                   = EV_SW,
 596                .active_low             = 1,
 597                .wakeup                 = 0,
 598                .debounce_interval      = DA850_KEYS_DEBOUNCE_MS,
 599                .code                   = -1, /* assigned at runtime */
 600                .desc                   = NULL, /* assigned at runtime */
 601                .gpio                   = -1, /* assigned at runtime */
 602        },
 603};
 604
 605static struct gpio_keys_platform_data da850_evm_bb_keys_pdata = {
 606        .buttons = da850_evm_bb_keys,
 607        .nbuttons = ARRAY_SIZE(da850_evm_bb_keys),
 608        .poll_interval = DA850_GPIO_KEYS_POLL_MS,
 609};
 610
 611static struct platform_device da850_evm_bb_keys_device = {
 612        .name = "gpio-keys-polled",
 613        .id = 1,
 614        .dev = {
 615                .platform_data = &da850_evm_bb_keys_pdata
 616        },
 617};
 618
 619static void da850_evm_bb_keys_init(unsigned gpio)
 620{
 621        int i;
 622        struct gpio_keys_button *button;
 623
 624        button = &da850_evm_bb_keys[0];
 625        button->desc = (char *)
 626                da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_PB1];
 627        button->gpio = gpio + DA850_EVM_BB_EXP_USER_PB1;
 628
 629        for (i = 0; i < DA850_N_BB_USER_SW; i++) {
 630                button = &da850_evm_bb_keys[i + 1];
 631                button->code = SW_LID + i;
 632                button->desc = (char *)
 633                                da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_SW1 + i];
 634                button->gpio = gpio + DA850_EVM_BB_EXP_USER_SW1 + i;
 635        }
 636}
 637
 638#define DA850_N_BB_USER_LED     2
 639
 640static struct gpio_led da850_evm_bb_leds[] = {
 641        [0 ... DA850_N_BB_USER_LED - 1] = {
 642                .active_low = 1,
 643                .gpio = -1, /* assigned at runtime */
 644                .name = NULL, /* assigned at runtime */
 645        },
 646};
 647
 648static struct gpio_led_platform_data da850_evm_bb_leds_pdata = {
 649        .leds = da850_evm_bb_leds,
 650        .num_leds = ARRAY_SIZE(da850_evm_bb_leds),
 651};
 652
 653static struct platform_device da850_evm_bb_leds_device = {
 654        .name           = "leds-gpio",
 655        .id             = -1,
 656        .dev = {
 657                .platform_data = &da850_evm_bb_leds_pdata
 658        }
 659};
 660
 661static void da850_evm_bb_leds_init(unsigned gpio)
 662{
 663        int i;
 664        struct gpio_led *led;
 665
 666        for (i = 0; i < DA850_N_BB_USER_LED; i++) {
 667                led = &da850_evm_bb_leds[i];
 668
 669                led->gpio = gpio + DA850_EVM_BB_EXP_USER_LED2 + i;
 670                led->name =
 671                        da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_LED2 + i];
 672        }
 673}
 674
 675static int da850_evm_bb_expander_setup(struct i2c_client *client,
 676                                                unsigned gpio, unsigned ngpio,
 677                                                void *c)
 678{
 679        int ret;
 680
 681        /*
 682         * Register the switches and pushbutton on the baseboard as a gpio-keys
 683         * device.
 684         */
 685        da850_evm_bb_keys_init(gpio);
 686        ret = platform_device_register(&da850_evm_bb_keys_device);
 687        if (ret) {
 688                pr_warn("Could not register baseboard GPIO expander keys");
 689                goto io_exp_setup_sw_fail;
 690        }
 691
 692        da850_evm_bb_leds_init(gpio);
 693        ret = platform_device_register(&da850_evm_bb_leds_device);
 694        if (ret) {
 695                pr_warn("Could not register baseboard GPIO expander LEDs");
 696                goto io_exp_setup_leds_fail;
 697        }
 698
 699        return 0;
 700
 701io_exp_setup_leds_fail:
 702        platform_device_unregister(&da850_evm_bb_keys_device);
 703io_exp_setup_sw_fail:
 704        return ret;
 705}
 706
 707static int da850_evm_bb_expander_teardown(struct i2c_client *client,
 708                                        unsigned gpio, unsigned ngpio, void *c)
 709{
 710        platform_device_unregister(&da850_evm_bb_leds_device);
 711        platform_device_unregister(&da850_evm_bb_keys_device);
 712
 713        return 0;
 714}
 715
 716static struct pca953x_platform_data da850_evm_ui_expander_info = {
 717        .gpio_base      = DAVINCI_N_GPIO,
 718        .setup          = da850_evm_ui_expander_setup,
 719        .teardown       = da850_evm_ui_expander_teardown,
 720        .names          = da850_evm_ui_exp,
 721};
 722
 723static struct pca953x_platform_data da850_evm_bb_expander_info = {
 724        .gpio_base      = DA850_BB_EXPANDER_GPIO_BASE,
 725        .setup          = da850_evm_bb_expander_setup,
 726        .teardown       = da850_evm_bb_expander_teardown,
 727        .names          = da850_evm_bb_exp,
 728};
 729
 730static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
 731        {
 732                I2C_BOARD_INFO("tlv320aic3x", 0x18),
 733        },
 734        {
 735                I2C_BOARD_INFO("tca6416", 0x20),
 736                .platform_data = &da850_evm_ui_expander_info,
 737        },
 738        {
 739                I2C_BOARD_INFO("tca6416", 0x21),
 740                .platform_data = &da850_evm_bb_expander_info,
 741        },
 742};
 743
 744static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
 745        .bus_freq       = 100,  /* kHz */
 746        .bus_delay      = 0,    /* usec */
 747};
 748
 749static struct davinci_uart_config da850_evm_uart_config __initdata = {
 750        .enabled_uarts = 0x7,
 751};
 752
 753/* davinci da850 evm audio machine driver */
 754static u8 da850_iis_serializer_direction[] = {
 755        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 756        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 757        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  TX_MODE,
 758        RX_MODE,        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
 759};
 760
 761static struct snd_platform_data da850_evm_snd_data = {
 762        .tx_dma_offset          = 0x2000,
 763        .rx_dma_offset          = 0x2000,
 764        .op_mode                = DAVINCI_MCASP_IIS_MODE,
 765        .num_serializer         = ARRAY_SIZE(da850_iis_serializer_direction),
 766        .tdm_slots              = 2,
 767        .serial_dir             = da850_iis_serializer_direction,
 768        .asp_chan_q             = EVENTQ_0,
 769        .ram_chan_q             = EVENTQ_1,
 770        .version                = MCASP_VERSION_2,
 771        .txnumevt               = 1,
 772        .rxnumevt               = 1,
 773        .sram_size_playback     = SZ_8K,
 774        .sram_size_capture      = SZ_8K,
 775};
 776
 777static const short da850_evm_mcasp_pins[] __initconst = {
 778        DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
 779        DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
 780        DA850_AXR_11, DA850_AXR_12,
 781        -1
 782};
 783
 784static int da850_evm_mmc_get_ro(int index)
 785{
 786        return gpio_get_value(DA850_MMCSD_WP_PIN);
 787}
 788
 789static int da850_evm_mmc_get_cd(int index)
 790{
 791        return !gpio_get_value(DA850_MMCSD_CD_PIN);
 792}
 793
 794static struct davinci_mmc_config da850_mmc_config = {
 795        .get_ro         = da850_evm_mmc_get_ro,
 796        .get_cd         = da850_evm_mmc_get_cd,
 797        .wires          = 4,
 798        .max_freq       = 50000000,
 799        .caps           = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
 800};
 801
 802static const short da850_evm_mmcsd0_pins[] __initconst = {
 803        DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
 804        DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
 805        DA850_GPIO4_0, DA850_GPIO4_1,
 806        -1
 807};
 808
 809static void da850_panel_power_ctrl(int val)
 810{
 811        /* lcd backlight */
 812        gpio_set_value(DA850_LCD_BL_PIN, val);
 813
 814        /* lcd power */
 815        gpio_set_value(DA850_LCD_PWR_PIN, val);
 816}
 817
 818static int da850_lcd_hw_init(void)
 819{
 820        int status;
 821
 822        status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
 823        if (status < 0)
 824                return status;
 825
 826        status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
 827        if (status < 0) {
 828                gpio_free(DA850_LCD_BL_PIN);
 829                return status;
 830        }
 831
 832        gpio_direction_output(DA850_LCD_BL_PIN, 0);
 833        gpio_direction_output(DA850_LCD_PWR_PIN, 0);
 834
 835        /* Switch off panel power and backlight */
 836        da850_panel_power_ctrl(0);
 837
 838        /* Switch on panel power and backlight */
 839        da850_panel_power_ctrl(1);
 840
 841        return 0;
 842}
 843
 844/* TPS65070 voltage regulator support */
 845
 846/* 3.3V */
 847static struct regulator_consumer_supply tps65070_dcdc1_consumers[] = {
 848        {
 849                .supply = "usb0_vdda33",
 850        },
 851        {
 852                .supply = "usb1_vdda33",
 853        },
 854};
 855
 856/* 3.3V or 1.8V */
 857static struct regulator_consumer_supply tps65070_dcdc2_consumers[] = {
 858        {
 859                .supply = "dvdd3318_a",
 860        },
 861        {
 862                .supply = "dvdd3318_b",
 863        },
 864        {
 865                .supply = "dvdd3318_c",
 866        },
 867};
 868
 869/* 1.2V */
 870static struct regulator_consumer_supply tps65070_dcdc3_consumers[] = {
 871        {
 872                .supply = "cvdd",
 873        },
 874};
 875
 876/* 1.8V LDO */
 877static struct regulator_consumer_supply tps65070_ldo1_consumers[] = {
 878        {
 879                .supply = "sata_vddr",
 880        },
 881        {
 882                .supply = "usb0_vdda18",
 883        },
 884        {
 885                .supply = "usb1_vdda18",
 886        },
 887        {
 888                .supply = "ddr_dvdd18",
 889        },
 890};
 891
 892/* 1.2V LDO */
 893static struct regulator_consumer_supply tps65070_ldo2_consumers[] = {
 894        {
 895                .supply = "sata_vdd",
 896        },
 897        {
 898                .supply = "pll0_vdda",
 899        },
 900        {
 901                .supply = "pll1_vdda",
 902        },
 903        {
 904                .supply = "usbs_cvdd",
 905        },
 906        {
 907                .supply = "vddarnwa1",
 908        },
 909};
 910
 911/* We take advantage of the fact that both defdcdc{2,3} are tied high */
 912static struct tps6507x_reg_platform_data tps6507x_platform_data = {
 913        .defdcdc_default = true,
 914};
 915
 916static struct regulator_init_data tps65070_regulator_data[] = {
 917        /* dcdc1 */
 918        {
 919                .constraints = {
 920                        .min_uV = 3150000,
 921                        .max_uV = 3450000,
 922                        .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
 923                                REGULATOR_CHANGE_STATUS),
 924                        .boot_on = 1,
 925                },
 926                .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers),
 927                .consumer_supplies = tps65070_dcdc1_consumers,
 928        },
 929
 930        /* dcdc2 */
 931        {
 932                .constraints = {
 933                        .min_uV = 1710000,
 934                        .max_uV = 3450000,
 935                        .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
 936                                REGULATOR_CHANGE_STATUS),
 937                        .boot_on = 1,
 938                },
 939                .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers),
 940                .consumer_supplies = tps65070_dcdc2_consumers,
 941                .driver_data = &tps6507x_platform_data,
 942        },
 943
 944        /* dcdc3 */
 945        {
 946                .constraints = {
 947                        .min_uV = 950000,
 948                        .max_uV = 1350000,
 949                        .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
 950                                REGULATOR_CHANGE_STATUS),
 951                        .boot_on = 1,
 952                },
 953                .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers),
 954                .consumer_supplies = tps65070_dcdc3_consumers,
 955                .driver_data = &tps6507x_platform_data,
 956        },
 957
 958        /* ldo1 */
 959        {
 960                .constraints = {
 961                        .min_uV = 1710000,
 962                        .max_uV = 1890000,
 963                        .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
 964                                REGULATOR_CHANGE_STATUS),
 965                        .boot_on = 1,
 966                },
 967                .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers),
 968                .consumer_supplies = tps65070_ldo1_consumers,
 969        },
 970
 971        /* ldo2 */
 972        {
 973                .constraints = {
 974                        .min_uV = 1140000,
 975                        .max_uV = 1320000,
 976                        .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
 977                                REGULATOR_CHANGE_STATUS),
 978                        .boot_on = 1,
 979                },
 980                .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers),
 981                .consumer_supplies = tps65070_ldo2_consumers,
 982        },
 983};
 984
 985static struct touchscreen_init_data tps6507x_touchscreen_data = {
 986        .poll_period =  30,     /* ms between touch samples */
 987        .min_pressure = 0x30,   /* minimum pressure to trigger touch */
 988        .vendor = 0,            /* /sys/class/input/input?/id/vendor */
 989        .product = 65070,       /* /sys/class/input/input?/id/product */
 990        .version = 0x100,       /* /sys/class/input/input?/id/version */
 991};
 992
 993static struct tps6507x_board tps_board = {
 994        .tps6507x_pmic_init_data = &tps65070_regulator_data[0],
 995        .tps6507x_ts_init_data = &tps6507x_touchscreen_data,
 996};
 997
 998static struct i2c_board_info __initdata da850_evm_tps65070_info[] = {
 999        {
1000                I2C_BOARD_INFO("tps6507x", 0x48),
1001                .platform_data = &tps_board,
1002        },
1003};
1004
1005static int __init pmic_tps65070_init(void)
1006{
1007        return i2c_register_board_info(1, da850_evm_tps65070_info,
1008                                        ARRAY_SIZE(da850_evm_tps65070_info));
1009}
1010
1011static const short da850_evm_lcdc_pins[] = {
1012        DA850_GPIO2_8, DA850_GPIO2_15,
1013        -1
1014};
1015
1016static const short da850_evm_mii_pins[] = {
1017        DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
1018        DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
1019        DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
1020        DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
1021        DA850_MDIO_D,
1022        -1
1023};
1024
1025static const short da850_evm_rmii_pins[] = {
1026        DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
1027        DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
1028        DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
1029        DA850_MDIO_D,
1030        -1
1031};
1032
1033static int __init da850_evm_config_emac(void)
1034{
1035        void __iomem *cfg_chip3_base;
1036        int ret;
1037        u32 val;
1038        struct davinci_soc_info *soc_info = &davinci_soc_info;
1039        u8 rmii_en = soc_info->emac_pdata->rmii_en;
1040
1041        if (!machine_is_davinci_da850_evm())
1042                return 0;
1043
1044        cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
1045
1046        val = __raw_readl(cfg_chip3_base);
1047
1048        if (rmii_en) {
1049                val |= BIT(8);
1050                ret = davinci_cfg_reg_list(da850_evm_rmii_pins);
1051                pr_info("EMAC: RMII PHY configured, MII PHY will not be"
1052                                                        " functional\n");
1053        } else {
1054                val &= ~BIT(8);
1055                ret = davinci_cfg_reg_list(da850_evm_mii_pins);
1056                pr_info("EMAC: MII PHY configured, RMII PHY will not be"
1057                                                        " functional\n");
1058        }
1059
1060        if (ret)
1061                pr_warn("%s: CPGMAC/RMII mux setup failed: %d\n",
1062                        __func__, ret);
1063
1064        /* configure the CFGCHIP3 register for RMII or MII */
1065        __raw_writel(val, cfg_chip3_base);
1066
1067        ret = davinci_cfg_reg(DA850_GPIO2_6);
1068        if (ret)
1069                pr_warn("%s:GPIO(2,6) mux setup failed\n", __func__);
1070
1071        ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en");
1072        if (ret) {
1073                pr_warn("Cannot open GPIO %d\n", DA850_MII_MDIO_CLKEN_PIN);
1074                return ret;
1075        }
1076
1077        /* Enable/Disable MII MDIO clock */
1078        gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, rmii_en);
1079
1080        soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID;
1081
1082        ret = da8xx_register_emac();
1083        if (ret)
1084                pr_warn("%s: EMAC registration failed: %d\n", __func__, ret);
1085
1086        return 0;
1087}
1088device_initcall(da850_evm_config_emac);
1089
1090/*
1091 * The following EDMA channels/slots are not being used by drivers (for
1092 * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM, hence
1093 * they are being reserved for codecs on the DSP side.
1094 */
1095static const s16 da850_dma0_rsv_chans[][2] = {
1096        /* (offset, number) */
1097        { 8,  6},
1098        {24,  4},
1099        {30,  2},
1100        {-1, -1}
1101};
1102
1103static const s16 da850_dma0_rsv_slots[][2] = {
1104        /* (offset, number) */
1105        { 8,  6},
1106        {24,  4},
1107        {30, 50},
1108        {-1, -1}
1109};
1110
1111static const s16 da850_dma1_rsv_chans[][2] = {
1112        /* (offset, number) */
1113        { 0, 28},
1114        {30,  2},
1115        {-1, -1}
1116};
1117
1118static const s16 da850_dma1_rsv_slots[][2] = {
1119        /* (offset, number) */
1120        { 0, 28},
1121        {30, 90},
1122        {-1, -1}
1123};
1124
1125static struct edma_rsv_info da850_edma_cc0_rsv = {
1126        .rsv_chans      = da850_dma0_rsv_chans,
1127        .rsv_slots      = da850_dma0_rsv_slots,
1128};
1129
1130static struct edma_rsv_info da850_edma_cc1_rsv = {
1131        .rsv_chans      = da850_dma1_rsv_chans,
1132        .rsv_slots      = da850_dma1_rsv_slots,
1133};
1134
1135static struct edma_rsv_info *da850_edma_rsv[2] = {
1136        &da850_edma_cc0_rsv,
1137        &da850_edma_cc1_rsv,
1138};
1139
1140#ifdef CONFIG_CPU_FREQ
1141static __init int da850_evm_init_cpufreq(void)
1142{
1143        switch (system_rev & 0xF) {
1144        case 3:
1145                da850_max_speed = 456000;
1146                break;
1147        case 2:
1148                da850_max_speed = 408000;
1149                break;
1150        case 1:
1151                da850_max_speed = 372000;
1152                break;
1153        }
1154
1155        return da850_register_cpufreq("pll0_sysclk3");
1156}
1157#else
1158static __init int da850_evm_init_cpufreq(void) { return 0; }
1159#endif
1160
1161#if defined(CONFIG_DA850_UI_SD_VIDEO_PORT)
1162
1163#define TVP5147_CH0             "tvp514x-0"
1164#define TVP5147_CH1             "tvp514x-1"
1165
1166/* VPIF capture configuration */
1167static struct tvp514x_platform_data tvp5146_pdata = {
1168                .clk_polarity = 0,
1169                .hs_polarity  = 1,
1170                .vs_polarity  = 1,
1171};
1172
1173#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
1174
1175static const struct vpif_input da850_ch0_inputs[] = {
1176        {
1177                .input = {
1178                        .index = 0,
1179                        .name  = "Composite",
1180                        .type  = V4L2_INPUT_TYPE_CAMERA,
1181                        .capabilities = V4L2_IN_CAP_STD,
1182                        .std   = TVP514X_STD_ALL,
1183                },
1184                .input_route = INPUT_CVBS_VI2B,
1185                .output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
1186                .subdev_name = TVP5147_CH0,
1187        },
1188};
1189
1190static const struct vpif_input da850_ch1_inputs[] = {
1191        {
1192                .input = {
1193                        .index = 0,
1194                        .name  = "S-Video",
1195                        .type  = V4L2_INPUT_TYPE_CAMERA,
1196                        .capabilities = V4L2_IN_CAP_STD,
1197                        .std   = TVP514X_STD_ALL,
1198                },
1199                .input_route = INPUT_SVIDEO_VI2C_VI1C,
1200                .output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
1201                .subdev_name = TVP5147_CH1,
1202        },
1203};
1204
1205static struct vpif_subdev_info da850_vpif_capture_sdev_info[] = {
1206        {
1207                .name = TVP5147_CH0,
1208                .board_info = {
1209                        I2C_BOARD_INFO("tvp5146", 0x5d),
1210                        .platform_data = &tvp5146_pdata,
1211                },
1212        },
1213        {
1214                .name = TVP5147_CH1,
1215                .board_info = {
1216                        I2C_BOARD_INFO("tvp5146", 0x5c),
1217                        .platform_data = &tvp5146_pdata,
1218                },
1219        },
1220};
1221
1222static struct vpif_capture_config da850_vpif_capture_config = {
1223        .subdev_info = da850_vpif_capture_sdev_info,
1224        .subdev_count = ARRAY_SIZE(da850_vpif_capture_sdev_info),
1225        .chan_config[0] = {
1226                .inputs = da850_ch0_inputs,
1227                .input_count = ARRAY_SIZE(da850_ch0_inputs),
1228                .vpif_if = {
1229                        .if_type = VPIF_IF_BT656,
1230                        .hd_pol  = 1,
1231                        .vd_pol  = 1,
1232                        .fid_pol = 0,
1233                },
1234        },
1235        .chan_config[1] = {
1236                .inputs = da850_ch1_inputs,
1237                .input_count = ARRAY_SIZE(da850_ch1_inputs),
1238                .vpif_if = {
1239                        .if_type = VPIF_IF_BT656,
1240                        .hd_pol  = 1,
1241                        .vd_pol  = 1,
1242                        .fid_pol = 0,
1243                },
1244        },
1245        .card_name = "DA850/OMAP-L138 Video Capture",
1246};
1247
1248/* VPIF display configuration */
1249
1250static struct adv7343_platform_data adv7343_pdata = {
1251        .mode_config = {
1252                .dac_3 = 1,
1253                .dac_2 = 1,
1254                .dac_1 = 1,
1255        },
1256        .sd_config = {
1257                .sd_dac_out1 = 1,
1258        },
1259};
1260
1261static struct vpif_subdev_info da850_vpif_subdev[] = {
1262        {
1263                .name = "adv7343",
1264                .board_info = {
1265                        I2C_BOARD_INFO("adv7343", 0x2a),
1266                        .platform_data = &adv7343_pdata,
1267                },
1268        },
1269};
1270
1271static const struct vpif_output da850_ch0_outputs[] = {
1272        {
1273                .output = {
1274                        .index = 0,
1275                        .name = "Composite",
1276                        .type = V4L2_OUTPUT_TYPE_ANALOG,
1277                        .capabilities = V4L2_OUT_CAP_STD,
1278                        .std = V4L2_STD_ALL,
1279                },
1280                .subdev_name = "adv7343",
1281                .output_route = ADV7343_COMPOSITE_ID,
1282        },
1283        {
1284                .output = {
1285                        .index = 1,
1286                        .name = "S-Video",
1287                        .type = V4L2_OUTPUT_TYPE_ANALOG,
1288                        .capabilities = V4L2_OUT_CAP_STD,
1289                        .std = V4L2_STD_ALL,
1290                },
1291                .subdev_name = "adv7343",
1292                .output_route = ADV7343_SVIDEO_ID,
1293        },
1294};
1295
1296static struct vpif_display_config da850_vpif_display_config = {
1297        .subdevinfo   = da850_vpif_subdev,
1298        .subdev_count = ARRAY_SIZE(da850_vpif_subdev),
1299        .chan_config[0] = {
1300                .outputs = da850_ch0_outputs,
1301                .output_count = ARRAY_SIZE(da850_ch0_outputs),
1302        },
1303        .card_name    = "DA850/OMAP-L138 Video Display",
1304};
1305
1306static __init void da850_vpif_init(void)
1307{
1308        int ret;
1309
1310        ret = da850_register_vpif();
1311        if (ret)
1312                pr_warn("da850_evm_init: VPIF setup failed: %d\n", ret);
1313
1314        ret = davinci_cfg_reg_list(da850_vpif_capture_pins);
1315        if (ret)
1316                pr_warn("da850_evm_init: VPIF capture mux setup failed: %d\n",
1317                        ret);
1318
1319        ret = da850_register_vpif_capture(&da850_vpif_capture_config);
1320        if (ret)
1321                pr_warn("da850_evm_init: VPIF capture setup failed: %d\n", ret);
1322
1323        ret = davinci_cfg_reg_list(da850_vpif_display_pins);
1324        if (ret)
1325                pr_warn("da850_evm_init: VPIF display mux setup failed: %d\n",
1326                        ret);
1327
1328        ret = da850_register_vpif_display(&da850_vpif_display_config);
1329        if (ret)
1330                pr_warn("da850_evm_init: VPIF display setup failed: %d\n", ret);
1331}
1332
1333#else
1334static __init void da850_vpif_init(void) {}
1335#endif
1336
1337#ifdef CONFIG_DA850_WL12XX
1338
1339static void wl12xx_set_power(int index, bool power_on)
1340{
1341        static bool power_state;
1342
1343        pr_debug("Powering %s wl12xx", power_on ? "on" : "off");
1344
1345        if (power_on == power_state)
1346                return;
1347        power_state = power_on;
1348
1349        if (power_on) {
1350                /* Power up sequence required for wl127x devices */
1351                gpio_set_value(DA850_WLAN_EN, 1);
1352                usleep_range(15000, 15000);
1353                gpio_set_value(DA850_WLAN_EN, 0);
1354                usleep_range(1000, 1000);
1355                gpio_set_value(DA850_WLAN_EN, 1);
1356                msleep(70);
1357        } else {
1358                gpio_set_value(DA850_WLAN_EN, 0);
1359        }
1360}
1361
1362static struct davinci_mmc_config da850_wl12xx_mmc_config = {
1363        .set_power      = wl12xx_set_power,
1364        .wires          = 4,
1365        .max_freq       = 25000000,
1366        .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_NONREMOVABLE |
1367                          MMC_CAP_POWER_OFF_CARD,
1368};
1369
1370static const short da850_wl12xx_pins[] __initconst = {
1371        DA850_MMCSD1_DAT_0, DA850_MMCSD1_DAT_1, DA850_MMCSD1_DAT_2,
1372        DA850_MMCSD1_DAT_3, DA850_MMCSD1_CLK, DA850_MMCSD1_CMD,
1373        DA850_GPIO6_9, DA850_GPIO6_10,
1374        -1
1375};
1376
1377static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
1378        .irq                    = -1,
1379        .board_ref_clock        = WL12XX_REFCLOCK_38,
1380        .platform_quirks        = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
1381};
1382
1383static __init int da850_wl12xx_init(void)
1384{
1385        int ret;
1386
1387        ret = davinci_cfg_reg_list(da850_wl12xx_pins);
1388        if (ret) {
1389                pr_err("wl12xx/mmc mux setup failed: %d\n", ret);
1390                goto exit;
1391        }
1392
1393        ret = da850_register_mmcsd1(&da850_wl12xx_mmc_config);
1394        if (ret) {
1395                pr_err("wl12xx/mmc registration failed: %d\n", ret);
1396                goto exit;
1397        }
1398
1399        ret = gpio_request_one(DA850_WLAN_EN, GPIOF_OUT_INIT_LOW, "wl12xx_en");
1400        if (ret) {
1401                pr_err("Could not request wl12xx enable gpio: %d\n", ret);
1402                goto exit;
1403        }
1404
1405        ret = gpio_request_one(DA850_WLAN_IRQ, GPIOF_IN, "wl12xx_irq");
1406        if (ret) {
1407                pr_err("Could not request wl12xx irq gpio: %d\n", ret);
1408                goto free_wlan_en;
1409        }
1410
1411        da850_wl12xx_wlan_data.irq = gpio_to_irq(DA850_WLAN_IRQ);
1412
1413        ret = wl12xx_set_platform_data(&da850_wl12xx_wlan_data);
1414        if (ret) {
1415                pr_err("Could not set wl12xx data: %d\n", ret);
1416                goto free_wlan_irq;
1417        }
1418
1419        return 0;
1420
1421free_wlan_irq:
1422        gpio_free(DA850_WLAN_IRQ);
1423
1424free_wlan_en:
1425        gpio_free(DA850_WLAN_EN);
1426
1427exit:
1428        return ret;
1429}
1430
1431#else /* CONFIG_DA850_WL12XX */
1432
1433static __init int da850_wl12xx_init(void)
1434{
1435        return 0;
1436}
1437
1438#endif /* CONFIG_DA850_WL12XX */
1439
1440#define DA850EVM_SATA_REFCLKPN_RATE     (100 * 1000 * 1000)
1441
1442static __init void da850_evm_init(void)
1443{
1444        int ret;
1445
1446        ret = pmic_tps65070_init();
1447        if (ret)
1448                pr_warn("%s: TPS65070 PMIC init failed: %d\n", __func__, ret);
1449
1450        ret = da850_register_edma(da850_edma_rsv);
1451        if (ret)
1452                pr_warn("%s: EDMA registration failed: %d\n", __func__, ret);
1453
1454        ret = davinci_cfg_reg_list(da850_i2c0_pins);
1455        if (ret)
1456                pr_warn("%s: I2C0 mux setup failed: %d\n", __func__, ret);
1457
1458        ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
1459        if (ret)
1460                pr_warn("%s: I2C0 registration failed: %d\n", __func__, ret);
1461
1462
1463        ret = da8xx_register_watchdog();
1464        if (ret)
1465                pr_warn("%s: watchdog registration failed: %d\n",
1466                        __func__, ret);
1467
1468        if (HAS_MMC) {
1469                ret = davinci_cfg_reg_list(da850_evm_mmcsd0_pins);
1470                if (ret)
1471                        pr_warn("%s: MMCSD0 mux setup failed: %d\n",
1472                                __func__, ret);
1473
1474                ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
1475                if (ret)
1476                        pr_warn("%s: can not open GPIO %d\n",
1477                                __func__, DA850_MMCSD_CD_PIN);
1478                gpio_direction_input(DA850_MMCSD_CD_PIN);
1479
1480                ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
1481                if (ret)
1482                        pr_warn("%s: can not open GPIO %d\n",
1483                                __func__, DA850_MMCSD_WP_PIN);
1484                gpio_direction_input(DA850_MMCSD_WP_PIN);
1485
1486                ret = da8xx_register_mmcsd0(&da850_mmc_config);
1487                if (ret)
1488                        pr_warn("%s: MMCSD0 registration failed: %d\n",
1489                                __func__, ret);
1490
1491                ret = da850_wl12xx_init();
1492                if (ret)
1493                        pr_warn("%s: WL12xx initialization failed: %d\n",
1494                                __func__, ret);
1495        }
1496
1497        davinci_serial_init(&da850_evm_uart_config);
1498
1499        i2c_register_board_info(1, da850_evm_i2c_devices,
1500                        ARRAY_SIZE(da850_evm_i2c_devices));
1501
1502        /*
1503         * shut down uart 0 and 1; they are not used on the board and
1504         * accessing them causes endless "too much work in irq53" messages
1505         * with arago fs
1506         */
1507        __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
1508        __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
1509
1510        ret = davinci_cfg_reg_list(da850_evm_mcasp_pins);
1511        if (ret)
1512                pr_warn("%s: McASP mux setup failed: %d\n", __func__, ret);
1513
1514        da850_evm_snd_data.sram_pool = sram_get_gen_pool();
1515        da8xx_register_mcasp(0, &da850_evm_snd_data);
1516
1517        ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
1518        if (ret)
1519                pr_warn("%s: LCDC mux setup failed: %d\n", __func__, ret);
1520
1521        ret = da8xx_register_uio_pruss();
1522        if (ret)
1523                pr_warn("da850_evm_init: pruss initialization failed: %d\n",
1524                                ret);
1525
1526        /* Handle board specific muxing for LCD here */
1527        ret = davinci_cfg_reg_list(da850_evm_lcdc_pins);
1528        if (ret)
1529                pr_warn("%s: EVM specific LCD mux setup failed: %d\n",
1530                        __func__, ret);
1531
1532        ret = da850_lcd_hw_init();
1533        if (ret)
1534                pr_warn("%s: LCD initialization failed: %d\n", __func__, ret);
1535
1536        sharp_lk043t1dg01_pdata.panel_power_ctrl = da850_panel_power_ctrl,
1537        ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata);
1538        if (ret)
1539                pr_warn("%s: LCDC registration failed: %d\n", __func__, ret);
1540
1541        ret = da8xx_register_rtc();
1542        if (ret)
1543                pr_warn("%s: RTC setup failed: %d\n", __func__, ret);
1544
1545        ret = da850_evm_init_cpufreq();
1546        if (ret)
1547                pr_warn("%s: cpufreq registration failed: %d\n", __func__, ret);
1548
1549        ret = da8xx_register_cpuidle();
1550        if (ret)
1551                pr_warn("%s: cpuidle registration failed: %d\n", __func__, ret);
1552
1553        ret = da850_register_pm(&da850_pm_device);
1554        if (ret)
1555                pr_warn("%s: suspend registration failed: %d\n", __func__, ret);
1556
1557        da850_vpif_init();
1558
1559        ret = spi_register_board_info(da850evm_spi_info,
1560                                      ARRAY_SIZE(da850evm_spi_info));
1561        if (ret)
1562                pr_warn("%s: spi info registration failed: %d\n", __func__,
1563                        ret);
1564
1565        ret = da8xx_register_spi_bus(1, ARRAY_SIZE(da850evm_spi_info));
1566        if (ret)
1567                pr_warn("%s: SPI 1 registration failed: %d\n", __func__, ret);
1568
1569        ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
1570        if (ret)
1571                pr_warn("%s: SATA registration failed: %d\n", __func__, ret);
1572
1573        da850_evm_setup_mac_addr();
1574
1575        ret = da8xx_register_rproc();
1576        if (ret)
1577                pr_warn("%s: dsp/rproc registration failed: %d\n",
1578                        __func__, ret);
1579}
1580
1581#ifdef CONFIG_SERIAL_8250_CONSOLE
1582static int __init da850_evm_console_init(void)
1583{
1584        if (!machine_is_davinci_da850_evm())
1585                return 0;
1586
1587        return add_preferred_console("ttyS", 2, "115200");
1588}
1589console_initcall(da850_evm_console_init);
1590#endif
1591
1592static void __init da850_evm_map_io(void)
1593{
1594        da850_init();
1595}
1596
1597MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")
1598        .atag_offset    = 0x100,
1599        .map_io         = da850_evm_map_io,
1600        .init_irq       = cp_intc_init,
1601        .init_time      = davinci_timer_init,
1602        .init_machine   = da850_evm_init,
1603        .init_late      = davinci_init_late,
1604        .dma_zone_size  = SZ_128M,
1605        .restart        = da8xx_restart,
1606        .reserve        = da8xx_rproc_reserve_cma,
1607MACHINE_END
1608