linux/arch/arm/mach-davinci/board-dm646x-evm.c
<<
>>
Prefs
   1/*
   2 * TI DaVinci DM646X EVM board
   3 *
   4 * Derived from: arch/arm/mach-davinci/board-evm.c
   5 * Copyright (C) 2006 Texas Instruments.
   6 *
   7 * (C) 2007-2008, MontaVista Software, Inc.
   8 *
   9 * This file is licensed under the terms of the GNU General Public License
  10 * version 2. This program is licensed "as is" without any warranty of any
  11 * kind, whether express or implied.
  12 *
  13 */
  14
  15/**************************************************************************
  16 * Included Files
  17 **************************************************************************/
  18
  19#include <linux/kernel.h>
  20#include <linux/init.h>
  21#include <linux/leds.h>
  22#include <linux/gpio.h>
  23#include <linux/platform_device.h>
  24#include <linux/i2c.h>
  25#include <linux/platform_data/at24.h>
  26#include <linux/platform_data/pcf857x.h>
  27
  28#include <media/i2c/tvp514x.h>
  29#include <media/i2c/adv7343.h>
  30
  31#include <linux/mtd/mtd.h>
  32#include <linux/mtd/rawnand.h>
  33#include <linux/mtd/partitions.h>
  34#include <linux/clk.h>
  35#include <linux/export.h>
  36#include <linux/platform_data/gpio-davinci.h>
  37#include <linux/platform_data/i2c-davinci.h>
  38#include <linux/platform_data/mtd-davinci.h>
  39#include <linux/platform_data/mtd-davinci-aemif.h>
  40
  41#include <asm/mach-types.h>
  42#include <asm/mach/arch.h>
  43
  44#include <mach/common.h>
  45#include <mach/irqs.h>
  46#include <mach/serial.h>
  47
  48#include "davinci.h"
  49
  50#define NAND_BLOCK_SIZE         SZ_128K
  51
  52/* Note: We are setting first partition as 'bootloader' constituting UBL, U-Boot
  53 * and U-Boot environment this avoids dependency on any particular combination
  54 * of UBL, U-Boot or flashing tools etc.
  55 */
  56static struct mtd_partition davinci_nand_partitions[] = {
  57        {
  58                /* UBL, U-Boot with environment */
  59                .name           = "bootloader",
  60                .offset         = MTDPART_OFS_APPEND,
  61                .size           = 16 * NAND_BLOCK_SIZE,
  62                .mask_flags     = MTD_WRITEABLE,        /* force read-only */
  63        }, {
  64                .name           = "kernel",
  65                .offset         = MTDPART_OFS_APPEND,
  66                .size           = SZ_4M,
  67                .mask_flags     = 0,
  68        }, {
  69                .name           = "filesystem",
  70                .offset         = MTDPART_OFS_APPEND,
  71                .size           = MTDPART_SIZ_FULL,
  72                .mask_flags     = 0,
  73        }
  74};
  75
  76static struct davinci_aemif_timing dm6467tevm_nandflash_timing = {
  77        .wsetup         = 29,
  78        .wstrobe        = 24,
  79        .whold          = 14,
  80        .rsetup         = 19,
  81        .rstrobe        = 33,
  82        .rhold          = 0,
  83        .ta             = 29,
  84};
  85
  86static struct davinci_nand_pdata davinci_nand_data = {
  87        .core_chipsel           = 0,
  88        .mask_cle               = 0x80000,
  89        .mask_ale               = 0x40000,
  90        .parts                  = davinci_nand_partitions,
  91        .nr_parts               = ARRAY_SIZE(davinci_nand_partitions),
  92        .ecc_mode               = NAND_ECC_HW,
  93        .ecc_bits               = 1,
  94        .options                = 0,
  95};
  96
  97static struct resource davinci_nand_resources[] = {
  98        {
  99                .start          = DM646X_ASYNC_EMIF_CS2_SPACE_BASE,
 100                .end            = DM646X_ASYNC_EMIF_CS2_SPACE_BASE + SZ_32M - 1,
 101                .flags          = IORESOURCE_MEM,
 102        }, {
 103                .start          = DM646X_ASYNC_EMIF_CONTROL_BASE,
 104                .end            = DM646X_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1,
 105                .flags          = IORESOURCE_MEM,
 106        },
 107};
 108
 109static struct platform_device davinci_nand_device = {
 110        .name                   = "davinci_nand",
 111        .id                     = 0,
 112
 113        .num_resources          = ARRAY_SIZE(davinci_nand_resources),
 114        .resource               = davinci_nand_resources,
 115
 116        .dev                    = {
 117                .platform_data  = &davinci_nand_data,
 118        },
 119};
 120
 121#define HAS_ATA         (IS_ENABLED(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
 122                         IS_ENABLED(CONFIG_PATA_BK3710))
 123
 124#ifdef CONFIG_I2C
 125/* CPLD Register 0 bits to control ATA */
 126#define DM646X_EVM_ATA_RST              BIT(0)
 127#define DM646X_EVM_ATA_PWD              BIT(1)
 128
 129/* CPLD Register 0 Client: used for I/O Control */
 130static int cpld_reg0_probe(struct i2c_client *client,
 131                           const struct i2c_device_id *id)
 132{
 133        if (HAS_ATA) {
 134                u8 data;
 135                struct i2c_msg msg[2] = {
 136                        {
 137                                .addr = client->addr,
 138                                .flags = I2C_M_RD,
 139                                .len = 1,
 140                                .buf = &data,
 141                        },
 142                        {
 143                                .addr = client->addr,
 144                                .flags = 0,
 145                                .len = 1,
 146                                .buf = &data,
 147                        },
 148                };
 149
 150                /* Clear ATA_RSTn and ATA_PWD bits to enable ATA operation. */
 151                i2c_transfer(client->adapter, msg, 1);
 152                data &= ~(DM646X_EVM_ATA_RST | DM646X_EVM_ATA_PWD);
 153                i2c_transfer(client->adapter, msg + 1, 1);
 154        }
 155
 156        return 0;
 157}
 158
 159static const struct i2c_device_id cpld_reg_ids[] = {
 160        { "cpld_reg0", 0, },
 161        { },
 162};
 163
 164static struct i2c_driver dm6467evm_cpld_driver = {
 165        .driver.name    = "cpld_reg0",
 166        .id_table       = cpld_reg_ids,
 167        .probe          = cpld_reg0_probe,
 168};
 169
 170/* LEDS */
 171
 172static struct gpio_led evm_leds[] = {
 173        { .name = "DS1", .active_low = 1, },
 174        { .name = "DS2", .active_low = 1, },
 175        { .name = "DS3", .active_low = 1, },
 176        { .name = "DS4", .active_low = 1, },
 177};
 178
 179static const struct gpio_led_platform_data evm_led_data = {
 180        .num_leds = ARRAY_SIZE(evm_leds),
 181        .leds     = evm_leds,
 182};
 183
 184static struct platform_device *evm_led_dev;
 185
 186static int evm_led_setup(struct i2c_client *client, int gpio,
 187                        unsigned int ngpio, void *c)
 188{
 189        struct gpio_led *leds = evm_leds;
 190        int status;
 191
 192        while (ngpio--) {
 193                leds->gpio = gpio++;
 194                leds++;
 195        }
 196
 197        evm_led_dev = platform_device_alloc("leds-gpio", 0);
 198        platform_device_add_data(evm_led_dev, &evm_led_data,
 199                                sizeof(evm_led_data));
 200
 201        evm_led_dev->dev.parent = &client->dev;
 202        status = platform_device_add(evm_led_dev);
 203        if (status < 0) {
 204                platform_device_put(evm_led_dev);
 205                evm_led_dev = NULL;
 206        }
 207        return status;
 208}
 209
 210static int evm_led_teardown(struct i2c_client *client, int gpio,
 211                                unsigned ngpio, void *c)
 212{
 213        if (evm_led_dev) {
 214                platform_device_unregister(evm_led_dev);
 215                evm_led_dev = NULL;
 216        }
 217        return 0;
 218}
 219
 220static int evm_sw_gpio[4] = { -EINVAL, -EINVAL, -EINVAL, -EINVAL };
 221
 222static int evm_sw_setup(struct i2c_client *client, int gpio,
 223                        unsigned ngpio, void *c)
 224{
 225        int status;
 226        int i;
 227        char label[10];
 228
 229        for (i = 0; i < 4; ++i) {
 230                snprintf(label, 10, "user_sw%d", i);
 231                status = gpio_request(gpio, label);
 232                if (status)
 233                        goto out_free;
 234                evm_sw_gpio[i] = gpio++;
 235
 236                status = gpio_direction_input(evm_sw_gpio[i]);
 237                if (status) {
 238                        gpio_free(evm_sw_gpio[i]);
 239                        evm_sw_gpio[i] = -EINVAL;
 240                        goto out_free;
 241                }
 242
 243                status = gpio_export(evm_sw_gpio[i], 0);
 244                if (status) {
 245                        gpio_free(evm_sw_gpio[i]);
 246                        evm_sw_gpio[i] = -EINVAL;
 247                        goto out_free;
 248                }
 249        }
 250        return status;
 251out_free:
 252        for (i = 0; i < 4; ++i) {
 253                if (evm_sw_gpio[i] != -EINVAL) {
 254                        gpio_free(evm_sw_gpio[i]);
 255                        evm_sw_gpio[i] = -EINVAL;
 256                }
 257        }
 258        return status;
 259}
 260
 261static int evm_sw_teardown(struct i2c_client *client, int gpio,
 262                        unsigned ngpio, void *c)
 263{
 264        int i;
 265
 266        for (i = 0; i < 4; ++i) {
 267                if (evm_sw_gpio[i] != -EINVAL) {
 268                        gpio_unexport(evm_sw_gpio[i]);
 269                        gpio_free(evm_sw_gpio[i]);
 270                        evm_sw_gpio[i] = -EINVAL;
 271                }
 272        }
 273        return 0;
 274}
 275
 276static int evm_pcf_setup(struct i2c_client *client, int gpio,
 277                        unsigned int ngpio, void *c)
 278{
 279        int status;
 280
 281        if (ngpio < 8)
 282                return -EINVAL;
 283
 284        status = evm_sw_setup(client, gpio, 4, c);
 285        if (status)
 286                return status;
 287
 288        return evm_led_setup(client, gpio+4, 4, c);
 289}
 290
 291static int evm_pcf_teardown(struct i2c_client *client, int gpio,
 292                        unsigned int ngpio, void *c)
 293{
 294        BUG_ON(ngpio < 8);
 295
 296        evm_sw_teardown(client, gpio, 4, c);
 297        evm_led_teardown(client, gpio+4, 4, c);
 298
 299        return 0;
 300}
 301
 302static struct pcf857x_platform_data pcf_data = {
 303        .gpio_base      = DAVINCI_N_GPIO+1,
 304        .setup          = evm_pcf_setup,
 305        .teardown       = evm_pcf_teardown,
 306};
 307
 308/* Most of this EEPROM is unused, but U-Boot uses some data:
 309 *  - 0x7f00, 6 bytes Ethernet Address
 310 *  - ... newer boards may have more
 311 */
 312
 313static struct at24_platform_data eeprom_info = {
 314        .byte_len       = (256*1024) / 8,
 315        .page_size      = 64,
 316        .flags          = AT24_FLAG_ADDR16,
 317        .setup          = davinci_get_mac_addr,
 318        .context        = (void *)0x7f00,
 319};
 320#endif
 321
 322static u8 dm646x_iis_serializer_direction[] = {
 323       TX_MODE, RX_MODE, INACTIVE_MODE, INACTIVE_MODE,
 324};
 325
 326static u8 dm646x_dit_serializer_direction[] = {
 327       TX_MODE,
 328};
 329
 330static struct snd_platform_data dm646x_evm_snd_data[] = {
 331        {
 332                .tx_dma_offset  = 0x400,
 333                .rx_dma_offset  = 0x400,
 334                .op_mode        = DAVINCI_MCASP_IIS_MODE,
 335                .num_serializer = ARRAY_SIZE(dm646x_iis_serializer_direction),
 336                .tdm_slots      = 2,
 337                .serial_dir     = dm646x_iis_serializer_direction,
 338                .asp_chan_q     = EVENTQ_0,
 339        },
 340        {
 341                .tx_dma_offset  = 0x400,
 342                .rx_dma_offset  = 0,
 343                .op_mode        = DAVINCI_MCASP_DIT_MODE,
 344                .num_serializer = ARRAY_SIZE(dm646x_dit_serializer_direction),
 345                .tdm_slots      = 32,
 346                .serial_dir     = dm646x_dit_serializer_direction,
 347                .asp_chan_q     = EVENTQ_0,
 348        },
 349};
 350
 351#ifdef CONFIG_I2C
 352static struct i2c_client *cpld_client;
 353
 354static int cpld_video_probe(struct i2c_client *client,
 355                        const struct i2c_device_id *id)
 356{
 357        cpld_client = client;
 358        return 0;
 359}
 360
 361static int cpld_video_remove(struct i2c_client *client)
 362{
 363        cpld_client = NULL;
 364        return 0;
 365}
 366
 367static const struct i2c_device_id cpld_video_id[] = {
 368        { "cpld_video", 0 },
 369        { }
 370};
 371
 372static struct i2c_driver cpld_video_driver = {
 373        .driver = {
 374                .name   = "cpld_video",
 375        },
 376        .probe          = cpld_video_probe,
 377        .remove         = cpld_video_remove,
 378        .id_table       = cpld_video_id,
 379};
 380
 381static void evm_init_cpld(void)
 382{
 383        i2c_add_driver(&cpld_video_driver);
 384}
 385
 386static struct i2c_board_info __initdata i2c_info[] =  {
 387        {
 388                I2C_BOARD_INFO("24c256", 0x50),
 389                .platform_data  = &eeprom_info,
 390        },
 391        {
 392                I2C_BOARD_INFO("pcf8574a", 0x38),
 393                .platform_data  = &pcf_data,
 394        },
 395        {
 396                I2C_BOARD_INFO("cpld_reg0", 0x3a),
 397        },
 398        {
 399                I2C_BOARD_INFO("tlv320aic33", 0x18),
 400        },
 401        {
 402                I2C_BOARD_INFO("cpld_video", 0x3b),
 403        },
 404};
 405
 406static struct davinci_i2c_platform_data i2c_pdata = {
 407        .bus_freq       = 100 /* kHz */,
 408        .bus_delay      = 0 /* usec */,
 409};
 410
 411#define VCH2CLK_MASK            (BIT_MASK(10) | BIT_MASK(9) | BIT_MASK(8))
 412#define VCH2CLK_SYSCLK8         (BIT(9))
 413#define VCH2CLK_AUXCLK          (BIT(9) | BIT(8))
 414#define VCH3CLK_MASK            (BIT_MASK(14) | BIT_MASK(13) | BIT_MASK(12))
 415#define VCH3CLK_SYSCLK8         (BIT(13))
 416#define VCH3CLK_AUXCLK          (BIT(14) | BIT(13))
 417
 418#define VIDCH2CLK               (BIT(10))
 419#define VIDCH3CLK               (BIT(11))
 420#define VIDCH1CLK               (BIT(4))
 421#define TVP7002_INPUT           (BIT(4))
 422#define TVP5147_INPUT           (~BIT(4))
 423#define VPIF_INPUT_ONE_CHANNEL  (BIT(5))
 424#define VPIF_INPUT_TWO_CHANNEL  (~BIT(5))
 425#define TVP5147_CH0             "tvp514x-0"
 426#define TVP5147_CH1             "tvp514x-1"
 427
 428/* spin lock for updating above registers */
 429static spinlock_t vpif_reg_lock;
 430
 431static int set_vpif_clock(int mux_mode, int hd)
 432{
 433        unsigned long flags;
 434        unsigned int value;
 435        int val = 0;
 436        int err = 0;
 437
 438        if (!cpld_client)
 439                return -ENXIO;
 440
 441        /* disable the clock */
 442        spin_lock_irqsave(&vpif_reg_lock, flags);
 443        value = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_VSCLKDIS));
 444        value |= (VIDCH3CLK | VIDCH2CLK);
 445        __raw_writel(value, DAVINCI_SYSMOD_VIRT(SYSMOD_VSCLKDIS));
 446        spin_unlock_irqrestore(&vpif_reg_lock, flags);
 447
 448        val = i2c_smbus_read_byte(cpld_client);
 449        if (val < 0)
 450                return val;
 451
 452        if (mux_mode == 1)
 453                val &= ~0x40;
 454        else
 455                val |= 0x40;
 456
 457        err = i2c_smbus_write_byte(cpld_client, val);
 458        if (err)
 459                return err;
 460
 461        value = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_VIDCLKCTL));
 462        value &= ~(VCH2CLK_MASK);
 463        value &= ~(VCH3CLK_MASK);
 464
 465        if (hd >= 1)
 466                value |= (VCH2CLK_SYSCLK8 | VCH3CLK_SYSCLK8);
 467        else
 468                value |= (VCH2CLK_AUXCLK | VCH3CLK_AUXCLK);
 469
 470        __raw_writel(value, DAVINCI_SYSMOD_VIRT(SYSMOD_VIDCLKCTL));
 471
 472        spin_lock_irqsave(&vpif_reg_lock, flags);
 473        value = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_VSCLKDIS));
 474        /* enable the clock */
 475        value &= ~(VIDCH3CLK | VIDCH2CLK);
 476        __raw_writel(value, DAVINCI_SYSMOD_VIRT(SYSMOD_VSCLKDIS));
 477        spin_unlock_irqrestore(&vpif_reg_lock, flags);
 478
 479        return 0;
 480}
 481
 482static struct vpif_subdev_info dm646x_vpif_subdev[] = {
 483        {
 484                .name   = "adv7343",
 485                .board_info = {
 486                        I2C_BOARD_INFO("adv7343", 0x2a),
 487                },
 488        },
 489        {
 490                .name   = "ths7303",
 491                .board_info = {
 492                        I2C_BOARD_INFO("ths7303", 0x2c),
 493                },
 494        },
 495};
 496
 497static const struct vpif_output dm6467_ch0_outputs[] = {
 498        {
 499                .output = {
 500                        .index = 0,
 501                        .name = "Composite",
 502                        .type = V4L2_OUTPUT_TYPE_ANALOG,
 503                        .capabilities = V4L2_OUT_CAP_STD,
 504                        .std = V4L2_STD_ALL,
 505                },
 506                .subdev_name = "adv7343",
 507                .output_route = ADV7343_COMPOSITE_ID,
 508        },
 509        {
 510                .output = {
 511                        .index = 1,
 512                        .name = "Component",
 513                        .type = V4L2_OUTPUT_TYPE_ANALOG,
 514                        .capabilities = V4L2_OUT_CAP_DV_TIMINGS,
 515                },
 516                .subdev_name = "adv7343",
 517                .output_route = ADV7343_COMPONENT_ID,
 518        },
 519        {
 520                .output = {
 521                        .index = 2,
 522                        .name = "S-Video",
 523                        .type = V4L2_OUTPUT_TYPE_ANALOG,
 524                        .capabilities = V4L2_OUT_CAP_STD,
 525                        .std = V4L2_STD_ALL,
 526                },
 527                .subdev_name = "adv7343",
 528                .output_route = ADV7343_SVIDEO_ID,
 529        },
 530};
 531
 532static struct vpif_display_config dm646x_vpif_display_config = {
 533        .set_clock      = set_vpif_clock,
 534        .subdevinfo     = dm646x_vpif_subdev,
 535        .subdev_count   = ARRAY_SIZE(dm646x_vpif_subdev),
 536        .i2c_adapter_id = 1,
 537        .chan_config[0] = {
 538                .outputs = dm6467_ch0_outputs,
 539                .output_count = ARRAY_SIZE(dm6467_ch0_outputs),
 540        },
 541        .card_name      = "DM646x EVM Video Display",
 542};
 543
 544/**
 545 * setup_vpif_input_path()
 546 * @channel: channel id (0 - CH0, 1 - CH1)
 547 * @sub_dev_name: ptr sub device name
 548 *
 549 * This will set vpif input to capture data from tvp514x or
 550 * tvp7002.
 551 */
 552static int setup_vpif_input_path(int channel, const char *sub_dev_name)
 553{
 554        int err = 0;
 555        int val;
 556
 557        /* for channel 1, we don't do anything */
 558        if (channel != 0)
 559                return 0;
 560
 561        if (!cpld_client)
 562                return -ENXIO;
 563
 564        val = i2c_smbus_read_byte(cpld_client);
 565        if (val < 0)
 566                return val;
 567
 568        if (!strcmp(sub_dev_name, TVP5147_CH0) ||
 569            !strcmp(sub_dev_name, TVP5147_CH1))
 570                val &= TVP5147_INPUT;
 571        else
 572                val |= TVP7002_INPUT;
 573
 574        err = i2c_smbus_write_byte(cpld_client, val);
 575        if (err)
 576                return err;
 577        return 0;
 578}
 579
 580/**
 581 * setup_vpif_input_channel_mode()
 582 * @mux_mode:  mux mode. 0 - 1 channel or (1) - 2 channel
 583 *
 584 * This will setup input mode to one channel (TVP7002) or 2 channel (TVP5147)
 585 */
 586static int setup_vpif_input_channel_mode(int mux_mode)
 587{
 588        unsigned long flags;
 589        int err = 0;
 590        int val;
 591        u32 value;
 592
 593        if (!cpld_client)
 594                return -ENXIO;
 595
 596        val = i2c_smbus_read_byte(cpld_client);
 597        if (val < 0)
 598                return val;
 599
 600        spin_lock_irqsave(&vpif_reg_lock, flags);
 601        value = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_VIDCLKCTL));
 602        if (mux_mode) {
 603                val &= VPIF_INPUT_TWO_CHANNEL;
 604                value |= VIDCH1CLK;
 605        } else {
 606                val |= VPIF_INPUT_ONE_CHANNEL;
 607                value &= ~VIDCH1CLK;
 608        }
 609        __raw_writel(value, DAVINCI_SYSMOD_VIRT(SYSMOD_VIDCLKCTL));
 610        spin_unlock_irqrestore(&vpif_reg_lock, flags);
 611
 612        err = i2c_smbus_write_byte(cpld_client, val);
 613        if (err)
 614                return err;
 615
 616        return 0;
 617}
 618
 619static struct tvp514x_platform_data tvp5146_pdata = {
 620        .clk_polarity = 0,
 621        .hs_polarity = 1,
 622        .vs_polarity = 1
 623};
 624
 625#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
 626
 627static struct vpif_subdev_info vpif_capture_sdev_info[] = {
 628        {
 629                .name   = TVP5147_CH0,
 630                .board_info = {
 631                        I2C_BOARD_INFO("tvp5146", 0x5d),
 632                        .platform_data = &tvp5146_pdata,
 633                },
 634        },
 635        {
 636                .name   = TVP5147_CH1,
 637                .board_info = {
 638                        I2C_BOARD_INFO("tvp5146", 0x5c),
 639                        .platform_data = &tvp5146_pdata,
 640                },
 641        },
 642};
 643
 644static struct vpif_input dm6467_ch0_inputs[] = {
 645        {
 646                .input = {
 647                        .index = 0,
 648                        .name = "Composite",
 649                        .type = V4L2_INPUT_TYPE_CAMERA,
 650                        .capabilities = V4L2_IN_CAP_STD,
 651                        .std = TVP514X_STD_ALL,
 652                },
 653                .subdev_name = TVP5147_CH0,
 654                .input_route = INPUT_CVBS_VI2B,
 655                .output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
 656        },
 657};
 658
 659static struct vpif_input dm6467_ch1_inputs[] = {
 660       {
 661                .input = {
 662                        .index = 0,
 663                        .name = "S-Video",
 664                        .type = V4L2_INPUT_TYPE_CAMERA,
 665                        .capabilities = V4L2_IN_CAP_STD,
 666                        .std = TVP514X_STD_ALL,
 667                },
 668                .subdev_name = TVP5147_CH1,
 669                .input_route = INPUT_SVIDEO_VI2C_VI1C,
 670                .output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
 671        },
 672};
 673
 674static struct vpif_capture_config dm646x_vpif_capture_cfg = {
 675        .setup_input_path = setup_vpif_input_path,
 676        .setup_input_channel_mode = setup_vpif_input_channel_mode,
 677        .subdev_info = vpif_capture_sdev_info,
 678        .subdev_count = ARRAY_SIZE(vpif_capture_sdev_info),
 679        .i2c_adapter_id = 1,
 680        .chan_config[0] = {
 681                .inputs = dm6467_ch0_inputs,
 682                .input_count = ARRAY_SIZE(dm6467_ch0_inputs),
 683                .vpif_if = {
 684                        .if_type = VPIF_IF_BT656,
 685                        .hd_pol = 1,
 686                        .vd_pol = 1,
 687                        .fid_pol = 0,
 688                },
 689        },
 690        .chan_config[1] = {
 691                .inputs = dm6467_ch1_inputs,
 692                .input_count = ARRAY_SIZE(dm6467_ch1_inputs),
 693                .vpif_if = {
 694                        .if_type = VPIF_IF_BT656,
 695                        .hd_pol = 1,
 696                        .vd_pol = 1,
 697                        .fid_pol = 0,
 698                },
 699        },
 700        .card_name = "DM646x EVM Video Capture",
 701};
 702
 703static void __init evm_init_video(void)
 704{
 705        spin_lock_init(&vpif_reg_lock);
 706
 707        dm646x_setup_vpif(&dm646x_vpif_display_config,
 708                          &dm646x_vpif_capture_cfg);
 709}
 710
 711static void __init evm_init_i2c(void)
 712{
 713        davinci_init_i2c(&i2c_pdata);
 714        i2c_add_driver(&dm6467evm_cpld_driver);
 715        i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
 716        evm_init_cpld();
 717        evm_init_video();
 718}
 719#endif
 720
 721#define DM646X_REF_FREQ                 27000000
 722#define DM646X_AUX_FREQ                 24000000
 723#define DM6467T_EVM_REF_FREQ            33000000
 724
 725static void __init davinci_map_io(void)
 726{
 727        dm646x_init();
 728}
 729
 730static void __init dm646x_evm_init_time(void)
 731{
 732        dm646x_init_time(DM646X_REF_FREQ, DM646X_AUX_FREQ);
 733}
 734
 735static void __init dm6467t_evm_init_time(void)
 736{
 737        dm646x_init_time(DM6467T_EVM_REF_FREQ, DM646X_AUX_FREQ);
 738}
 739
 740#define DM646X_EVM_PHY_ID               "davinci_mdio-0:01"
 741/*
 742 * The following EDMA channels/slots are not being used by drivers (for
 743 * example: Timer, GPIO, UART events etc) on dm646x, hence they are being
 744 * reserved for codecs on the DSP side.
 745 */
 746static const s16 dm646x_dma_rsv_chans[][2] = {
 747        /* (offset, number) */
 748        { 0,  4},
 749        {13,  3},
 750        {24,  4},
 751        {30,  2},
 752        {54,  3},
 753        {-1, -1}
 754};
 755
 756static const s16 dm646x_dma_rsv_slots[][2] = {
 757        /* (offset, number) */
 758        { 0,  4},
 759        {13,  3},
 760        {24,  4},
 761        {30,  2},
 762        {54,  3},
 763        {128, 384},
 764        {-1, -1}
 765};
 766
 767static struct edma_rsv_info dm646x_edma_rsv[] = {
 768        {
 769                .rsv_chans      = dm646x_dma_rsv_chans,
 770                .rsv_slots      = dm646x_dma_rsv_slots,
 771        },
 772};
 773
 774static __init void evm_init(void)
 775{
 776        int ret;
 777        struct davinci_soc_info *soc_info = &davinci_soc_info;
 778
 779        ret = dm646x_gpio_register();
 780        if (ret)
 781                pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
 782
 783#ifdef CONFIG_I2C
 784        evm_init_i2c();
 785#endif
 786
 787        davinci_serial_init(dm646x_serial_device);
 788        dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
 789        dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
 790
 791        if (machine_is_davinci_dm6467tevm())
 792                davinci_nand_data.timing = &dm6467tevm_nandflash_timing;
 793
 794        platform_device_register(&davinci_nand_device);
 795
 796        if (davinci_aemif_setup(&davinci_nand_device))
 797                pr_warn("%s: Cannot configure AEMIF.\n", __func__);
 798
 799        dm646x_init_edma(dm646x_edma_rsv);
 800
 801        if (HAS_ATA)
 802                davinci_init_ide();
 803
 804        soc_info->emac_pdata->phy_id = DM646X_EVM_PHY_ID;
 805}
 806
 807MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM")
 808        .atag_offset  = 0x100,
 809        .map_io       = davinci_map_io,
 810        .init_irq     = davinci_irq_init,
 811        .init_time      = dm646x_evm_init_time,
 812        .init_machine = evm_init,
 813        .init_late      = davinci_init_late,
 814        .dma_zone_size  = SZ_128M,
 815MACHINE_END
 816
 817MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM")
 818        .atag_offset  = 0x100,
 819        .map_io       = davinci_map_io,
 820        .init_irq     = davinci_irq_init,
 821        .init_time      = dm6467t_evm_init_time,
 822        .init_machine = evm_init,
 823        .init_late      = davinci_init_late,
 824        .dma_zone_size  = SZ_128M,
 825MACHINE_END
 826
 827