linux/arch/blackfin/mach-bf561/boards/ezkit.c
<<
>>
Prefs
   1/*
   2 * Copyright 2004-2009 Analog Devices Inc.
   3 *               2005 National ICT Australia (NICTA)
   4 *                    Aidan Williams <aidan@nicta.com.au>
   5 *
   6 * Licensed under the GPL-2 or later.
   7 */
   8
   9#include <linux/device.h>
  10#include <linux/platform_device.h>
  11#include <linux/mtd/mtd.h>
  12#include <linux/mtd/partitions.h>
  13#include <linux/mtd/physmap.h>
  14#include <linux/spi/spi.h>
  15#include <linux/irq.h>
  16#include <linux/interrupt.h>
  17#include <linux/delay.h>
  18#include <asm/dma.h>
  19#include <asm/bfin5xx_spi.h>
  20#include <asm/portmux.h>
  21#include <asm/dpmc.h>
  22
  23/*
  24 * Name the Board for the /proc/cpuinfo
  25 */
  26const char bfin_board_name[] = "ADI BF561-EZKIT";
  27
  28#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
  29#include <linux/usb/isp1760.h>
  30static struct resource bfin_isp1760_resources[] = {
  31        [0] = {
  32                .start  = 0x2C0F0000,
  33                .end    = 0x203C0000 + 0xfffff,
  34                .flags  = IORESOURCE_MEM,
  35        },
  36        [1] = {
  37                .start  = IRQ_PF10,
  38                .end    = IRQ_PF10,
  39                .flags  = IORESOURCE_IRQ,
  40        },
  41};
  42
  43static struct isp1760_platform_data isp1760_priv = {
  44        .is_isp1761 = 0,
  45        .bus_width_16 = 1,
  46        .port1_otg = 0,
  47        .analog_oc = 0,
  48        .dack_polarity_high = 0,
  49        .dreq_polarity_high = 0,
  50};
  51
  52static struct platform_device bfin_isp1760_device = {
  53        .name           = "isp1760",
  54        .id             = 0,
  55        .dev = {
  56                .platform_data = &isp1760_priv,
  57        },
  58        .num_resources  = ARRAY_SIZE(bfin_isp1760_resources),
  59        .resource       = bfin_isp1760_resources,
  60};
  61#endif
  62
  63#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
  64#include <linux/usb/isp1362.h>
  65
  66static struct resource isp1362_hcd_resources[] = {
  67        {
  68                .start = 0x2c060000,
  69                .end = 0x2c060000,
  70                .flags = IORESOURCE_MEM,
  71        }, {
  72                .start = 0x2c060004,
  73                .end = 0x2c060004,
  74                .flags = IORESOURCE_MEM,
  75        }, {
  76                .start = IRQ_PF8,
  77                .end = IRQ_PF8,
  78                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
  79        },
  80};
  81
  82static struct isp1362_platform_data isp1362_priv = {
  83        .sel15Kres = 1,
  84        .clknotstop = 0,
  85        .oc_enable = 0,
  86        .int_act_high = 0,
  87        .int_edge_triggered = 0,
  88        .remote_wakeup_connected = 0,
  89        .no_power_switching = 1,
  90        .power_switching_mode = 0,
  91};
  92
  93static struct platform_device isp1362_hcd_device = {
  94        .name = "isp1362-hcd",
  95        .id = 0,
  96        .dev = {
  97                .platform_data = &isp1362_priv,
  98        },
  99        .num_resources = ARRAY_SIZE(isp1362_hcd_resources),
 100        .resource = isp1362_hcd_resources,
 101};
 102#endif
 103
 104#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
 105static struct resource net2272_bfin_resources[] = {
 106        {
 107                .start = 0x2C000000,
 108                .end = 0x2C000000 + 0x7F,
 109                .flags = IORESOURCE_MEM,
 110        }, {
 111                .start = 1,
 112                .flags = IORESOURCE_BUS,
 113        }, {
 114                .start = IRQ_PF10,
 115                .end = IRQ_PF10,
 116                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
 117        },
 118};
 119
 120static struct platform_device net2272_bfin_device = {
 121        .name = "net2272",
 122        .id = -1,
 123        .num_resources = ARRAY_SIZE(net2272_bfin_resources),
 124        .resource = net2272_bfin_resources,
 125};
 126#endif
 127
 128/*
 129 *  USB-LAN EzExtender board
 130 *  Driver needs to know address, irq and flag pin.
 131 */
 132#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
 133#include <linux/smc91x.h>
 134
 135static struct smc91x_platdata smc91x_info = {
 136        .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
 137        .leda = RPC_LED_100_10,
 138        .ledb = RPC_LED_TX_RX,
 139};
 140
 141static struct resource smc91x_resources[] = {
 142        {
 143                .name = "smc91x-regs",
 144                .start = 0x2C010300,
 145                .end = 0x2C010300 + 16,
 146                .flags = IORESOURCE_MEM,
 147        }, {
 148
 149                .start = IRQ_PF9,
 150                .end = IRQ_PF9,
 151                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
 152        },
 153};
 154
 155static struct platform_device smc91x_device = {
 156        .name = "smc91x",
 157        .id = 0,
 158        .num_resources = ARRAY_SIZE(smc91x_resources),
 159        .resource = smc91x_resources,
 160        .dev    = {
 161                .platform_data  = &smc91x_info,
 162        },
 163};
 164#endif
 165
 166#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
 167#ifdef CONFIG_SERIAL_BFIN_UART0
 168static struct resource bfin_uart0_resources[] = {
 169        {
 170                .start = BFIN_UART_THR,
 171                .end = BFIN_UART_GCTL+2,
 172                .flags = IORESOURCE_MEM,
 173        },
 174        {
 175                .start = IRQ_UART_TX,
 176                .end = IRQ_UART_TX,
 177                .flags = IORESOURCE_IRQ,
 178        },
 179        {
 180                .start = IRQ_UART_RX,
 181                .end = IRQ_UART_RX,
 182                .flags = IORESOURCE_IRQ,
 183        },
 184        {
 185                .start = IRQ_UART_ERROR,
 186                .end = IRQ_UART_ERROR,
 187                .flags = IORESOURCE_IRQ,
 188        },
 189        {
 190                .start = CH_UART_TX,
 191                .end = CH_UART_TX,
 192                .flags = IORESOURCE_DMA,
 193        },
 194        {
 195                .start = CH_UART_RX,
 196                .end = CH_UART_RX,
 197                .flags = IORESOURCE_DMA,
 198        },
 199};
 200
 201static unsigned short bfin_uart0_peripherals[] = {
 202        P_UART0_TX, P_UART0_RX, 0
 203};
 204
 205static struct platform_device bfin_uart0_device = {
 206        .name = "bfin-uart",
 207        .id = 0,
 208        .num_resources = ARRAY_SIZE(bfin_uart0_resources),
 209        .resource = bfin_uart0_resources,
 210        .dev = {
 211                .platform_data = &bfin_uart0_peripherals, /* Passed to driver */
 212        },
 213};
 214#endif
 215#endif
 216
 217#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
 218#ifdef CONFIG_BFIN_SIR0
 219static struct resource bfin_sir0_resources[] = {
 220        {
 221                .start = 0xFFC00400,
 222                .end = 0xFFC004FF,
 223                .flags = IORESOURCE_MEM,
 224        },
 225        {
 226                .start = IRQ_UART0_RX,
 227                .end = IRQ_UART0_RX+1,
 228                .flags = IORESOURCE_IRQ,
 229        },
 230        {
 231                .start = CH_UART0_RX,
 232                .end = CH_UART0_RX+1,
 233                .flags = IORESOURCE_DMA,
 234        },
 235};
 236
 237static struct platform_device bfin_sir0_device = {
 238        .name = "bfin_sir",
 239        .id = 0,
 240        .num_resources = ARRAY_SIZE(bfin_sir0_resources),
 241        .resource = bfin_sir0_resources,
 242};
 243#endif
 244#endif
 245
 246#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 247static struct mtd_partition ezkit_partitions[] = {
 248        {
 249                .name       = "bootloader(nor)",
 250                .size       = 0x40000,
 251                .offset     = 0,
 252        }, {
 253                .name       = "linux kernel(nor)",
 254                .size       = 0x1C0000,
 255                .offset     = MTDPART_OFS_APPEND,
 256        }, {
 257                .name       = "file system(nor)",
 258                .size       = 0x800000 - 0x40000 - 0x1C0000 - 0x2000 * 8,
 259                .offset     = MTDPART_OFS_APPEND,
 260        }, {
 261                .name       = "config(nor)",
 262                .size       = 0x2000 * 7,
 263                .offset     = MTDPART_OFS_APPEND,
 264        }, {
 265                .name       = "u-boot env(nor)",
 266                .size       = 0x2000,
 267                .offset     = MTDPART_OFS_APPEND,
 268        }
 269};
 270
 271static struct physmap_flash_data ezkit_flash_data = {
 272        .width      = 2,
 273        .parts      = ezkit_partitions,
 274        .nr_parts   = ARRAY_SIZE(ezkit_partitions),
 275};
 276
 277static struct resource ezkit_flash_resource = {
 278        .start = 0x20000000,
 279        .end   = 0x207fffff,
 280        .flags = IORESOURCE_MEM,
 281};
 282
 283static struct platform_device ezkit_flash_device = {
 284        .name          = "physmap-flash",
 285        .id            = 0,
 286        .dev = {
 287                .platform_data = &ezkit_flash_data,
 288        },
 289        .num_resources = 1,
 290        .resource      = &ezkit_flash_resource,
 291};
 292#endif
 293
 294#if defined(CONFIG_SPI_BFIN5XX) || defined(CONFIG_SPI_BFIN5XX_MODULE)
 295/* SPI (0) */
 296static struct resource bfin_spi0_resource[] = {
 297        [0] = {
 298                .start = SPI0_REGBASE,
 299                .end   = SPI0_REGBASE + 0xFF,
 300                .flags = IORESOURCE_MEM,
 301        },
 302        [1] = {
 303                .start = CH_SPI,
 304                .end   = CH_SPI,
 305                .flags = IORESOURCE_DMA,
 306        },
 307        [2] = {
 308                .start = IRQ_SPI,
 309                .end   = IRQ_SPI,
 310                .flags = IORESOURCE_IRQ,
 311        }
 312};
 313
 314/* SPI controller data */
 315static struct bfin5xx_spi_master bfin_spi0_info = {
 316        .num_chipselect = 8,
 317        .enable_dma = 1,  /* master has the ability to do dma transfer */
 318        .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
 319};
 320
 321static struct platform_device bfin_spi0_device = {
 322        .name = "bfin-spi",
 323        .id = 0, /* Bus number */
 324        .num_resources = ARRAY_SIZE(bfin_spi0_resource),
 325        .resource = bfin_spi0_resource,
 326        .dev = {
 327                .platform_data = &bfin_spi0_info, /* Passed to driver */
 328        },
 329};
 330#endif
 331
 332static struct spi_board_info bfin_spi_board_info[] __initdata = {
 333#if defined(CONFIG_SND_BF5XX_SOC_AD183X) \
 334        || defined(CONFIG_SND_BF5XX_SOC_AD183X_MODULE)
 335        {
 336                .modalias = "ad183x",
 337                .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
 338                .bus_num = 0,
 339                .chip_select = 4,
 340                .platform_data = "ad1836", /* only includes chip name for the moment */
 341                .mode = SPI_MODE_3,
 342        },
 343#endif
 344#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
 345        {
 346                .modalias = "spidev",
 347                .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
 348                .bus_num = 0,
 349                .chip_select = 1,
 350        },
 351#endif
 352};
 353
 354#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 355#include <linux/input.h>
 356#include <linux/gpio_keys.h>
 357
 358static struct gpio_keys_button bfin_gpio_keys_table[] = {
 359        {BTN_0, GPIO_PF5, 1, "gpio-keys: BTN0"},
 360        {BTN_1, GPIO_PF6, 1, "gpio-keys: BTN1"},
 361        {BTN_2, GPIO_PF7, 1, "gpio-keys: BTN2"},
 362        {BTN_3, GPIO_PF8, 1, "gpio-keys: BTN3"},
 363};
 364
 365static struct gpio_keys_platform_data bfin_gpio_keys_data = {
 366        .buttons        = bfin_gpio_keys_table,
 367        .nbuttons       = ARRAY_SIZE(bfin_gpio_keys_table),
 368};
 369
 370static struct platform_device bfin_device_gpiokeys = {
 371        .name      = "gpio-keys",
 372        .dev = {
 373                .platform_data = &bfin_gpio_keys_data,
 374        },
 375};
 376#endif
 377
 378#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 379#include <linux/i2c-gpio.h>
 380
 381static struct i2c_gpio_platform_data i2c_gpio_data = {
 382        .sda_pin                = GPIO_PF1,
 383        .scl_pin                = GPIO_PF0,
 384        .sda_is_open_drain      = 0,
 385        .scl_is_open_drain      = 0,
 386        .udelay                 = 10,
 387};
 388
 389static struct platform_device i2c_gpio_device = {
 390        .name           = "i2c-gpio",
 391        .id             = 0,
 392        .dev            = {
 393                .platform_data  = &i2c_gpio_data,
 394        },
 395};
 396#endif
 397
 398static const unsigned int cclk_vlev_datasheet[] =
 399{
 400        VRPAIR(VLEV_085, 250000000),
 401        VRPAIR(VLEV_090, 300000000),
 402        VRPAIR(VLEV_095, 313000000),
 403        VRPAIR(VLEV_100, 350000000),
 404        VRPAIR(VLEV_105, 400000000),
 405        VRPAIR(VLEV_110, 444000000),
 406        VRPAIR(VLEV_115, 450000000),
 407        VRPAIR(VLEV_120, 475000000),
 408        VRPAIR(VLEV_125, 500000000),
 409        VRPAIR(VLEV_130, 600000000),
 410};
 411
 412static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
 413        .tuple_tab = cclk_vlev_datasheet,
 414        .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
 415        .vr_settling_time = 25 /* us */,
 416};
 417
 418static struct platform_device bfin_dpmc = {
 419        .name = "bfin dpmc",
 420        .dev = {
 421                .platform_data = &bfin_dmpc_vreg_data,
 422        },
 423};
 424
 425#if defined(CONFIG_VIDEO_BLACKFIN_CAPTURE) \
 426        || defined(CONFIG_VIDEO_BLACKFIN_CAPTURE_MODULE)
 427#include <linux/videodev2.h>
 428#include <media/blackfin/bfin_capture.h>
 429#include <media/blackfin/ppi.h>
 430
 431static const unsigned short ppi_req[] = {
 432        P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3,
 433        P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7,
 434        P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2,
 435        0,
 436};
 437
 438static const struct ppi_info ppi_info = {
 439        .type = PPI_TYPE_PPI,
 440        .dma_ch = CH_PPI0,
 441        .irq_err = IRQ_PPI1_ERROR,
 442        .base = (void __iomem *)PPI0_CONTROL,
 443        .pin_req = ppi_req,
 444};
 445
 446#if defined(CONFIG_VIDEO_ADV7183) \
 447        || defined(CONFIG_VIDEO_ADV7183_MODULE)
 448#include <media/adv7183.h>
 449static struct v4l2_input adv7183_inputs[] = {
 450        {
 451                .index = 0,
 452                .name = "Composite",
 453                .type = V4L2_INPUT_TYPE_CAMERA,
 454                .std = V4L2_STD_ALL,
 455                .capabilities = V4L2_IN_CAP_STD,
 456        },
 457        {
 458                .index = 1,
 459                .name = "S-Video",
 460                .type = V4L2_INPUT_TYPE_CAMERA,
 461                .std = V4L2_STD_ALL,
 462                .capabilities = V4L2_IN_CAP_STD,
 463        },
 464        {
 465                .index = 2,
 466                .name = "Component",
 467                .type = V4L2_INPUT_TYPE_CAMERA,
 468                .std = V4L2_STD_ALL,
 469                .capabilities = V4L2_IN_CAP_STD,
 470        },
 471};
 472
 473static struct bcap_route adv7183_routes[] = {
 474        {
 475                .input = ADV7183_COMPOSITE4,
 476                .output = ADV7183_8BIT_OUT,
 477        },
 478        {
 479                .input = ADV7183_SVIDEO0,
 480                .output = ADV7183_8BIT_OUT,
 481        },
 482        {
 483                .input = ADV7183_COMPONENT0,
 484                .output = ADV7183_8BIT_OUT,
 485        },
 486};
 487
 488
 489static const unsigned adv7183_gpio[] = {
 490        GPIO_PF13, /* reset pin */
 491        GPIO_PF2,  /* output enable pin */
 492};
 493
 494static struct bfin_capture_config bfin_capture_data = {
 495        .card_name = "BF561",
 496        .inputs = adv7183_inputs,
 497        .num_inputs = ARRAY_SIZE(adv7183_inputs),
 498        .routes = adv7183_routes,
 499        .i2c_adapter_id = 0,
 500        .board_info = {
 501                .type = "adv7183",
 502                .addr = 0x20,
 503                .platform_data = (void *)adv7183_gpio,
 504        },
 505        .ppi_info = &ppi_info,
 506        .ppi_control = (PACK_EN | DLEN_8 | DMA32 | FLD_SEL),
 507};
 508#endif
 509
 510static struct platform_device bfin_capture_device = {
 511        .name = "bfin_capture",
 512        .dev = {
 513                .platform_data = &bfin_capture_data,
 514        },
 515};
 516#endif
 517
 518#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
 519static struct platform_device bfin_i2s = {
 520        .name = "bfin-i2s",
 521        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 522        /* TODO: add platform data here */
 523};
 524#endif
 525
 526#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
 527static struct platform_device bfin_tdm = {
 528        .name = "bfin-tdm",
 529        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 530        /* TODO: add platform data here */
 531};
 532#endif
 533
 534#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
 535static struct platform_device bfin_ac97 = {
 536        .name = "bfin-ac97",
 537        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 538        /* TODO: add platform data here */
 539};
 540#endif
 541
 542#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
 543                || defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
 544static const char * const ad1836_link[] = {
 545        "bfin-tdm.0",
 546        "spi0.4",
 547};
 548static struct platform_device bfin_ad1836_machine = {
 549        .name = "bfin-snd-ad1836",
 550        .id = -1,
 551        .dev = {
 552                .platform_data = (void *)ad1836_link,
 553        },
 554};
 555#endif
 556
 557static struct platform_device *ezkit_devices[] __initdata = {
 558
 559        &bfin_dpmc,
 560
 561#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
 562        &smc91x_device,
 563#endif
 564
 565#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
 566        &net2272_bfin_device,
 567#endif
 568
 569#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
 570        &bfin_isp1760_device,
 571#endif
 572
 573#if defined(CONFIG_SPI_BFIN5XX) || defined(CONFIG_SPI_BFIN5XX_MODULE)
 574        &bfin_spi0_device,
 575#endif
 576
 577#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
 578#ifdef CONFIG_SERIAL_BFIN_UART0
 579        &bfin_uart0_device,
 580#endif
 581#endif
 582
 583#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
 584#ifdef CONFIG_BFIN_SIR0
 585        &bfin_sir0_device,
 586#endif
 587#endif
 588
 589#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 590        &bfin_device_gpiokeys,
 591#endif
 592
 593#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 594        &i2c_gpio_device,
 595#endif
 596
 597#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 598        &isp1362_hcd_device,
 599#endif
 600
 601#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 602        &ezkit_flash_device,
 603#endif
 604
 605#if defined(CONFIG_VIDEO_BLACKFIN_CAPTURE) \
 606        || defined(CONFIG_VIDEO_BLACKFIN_CAPTURE_MODULE)
 607        &bfin_capture_device,
 608#endif
 609
 610#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
 611        &bfin_i2s,
 612#endif
 613
 614#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
 615        &bfin_tdm,
 616#endif
 617
 618#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
 619        &bfin_ac97,
 620#endif
 621
 622#if defined(CONFIG_SND_BF5XX_SOC_AD1836) || \
 623        defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
 624        &bfin_ad1836_machine,
 625#endif
 626};
 627
 628static int __init net2272_init(void)
 629{
 630#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
 631        int ret;
 632
 633        ret = gpio_request(GPIO_PF11, "net2272");
 634        if (ret)
 635                return ret;
 636
 637        /* Reset the USB chip */
 638        gpio_direction_output(GPIO_PF11, 0);
 639        mdelay(2);
 640        gpio_set_value(GPIO_PF11, 1);
 641#endif
 642
 643        return 0;
 644}
 645
 646static int __init ezkit_init(void)
 647{
 648        int ret;
 649
 650        printk(KERN_INFO "%s(): registering device resources\n", __func__);
 651
 652        ret = platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
 653        if (ret < 0)
 654                return ret;
 655
 656#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
 657        bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 12));
 658        SSYNC();
 659#endif
 660
 661#if defined(CONFIG_SND_BF5XX_SOC_AD183X) || defined(CONFIG_SND_BF5XX_SOC_AD183X_MODULE)
 662        bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 15));
 663        bfin_write_FIO0_FLAG_S(1 << 15);
 664        SSYNC();
 665        /*
 666         * This initialization lasts for approximately 4500 MCLKs.
 667         * MCLK = 12.288MHz
 668         */
 669        udelay(400);
 670#endif
 671
 672        if (net2272_init())
 673                pr_warning("unable to configure net2272; it probably won't work\n");
 674
 675        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
 676        return 0;
 677}
 678
 679arch_initcall(ezkit_init);
 680
 681static struct platform_device *ezkit_early_devices[] __initdata = {
 682#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
 683#ifdef CONFIG_SERIAL_BFIN_UART0
 684        &bfin_uart0_device,
 685#endif
 686#endif
 687};
 688
 689void __init native_machine_early_platform_add_devices(void)
 690{
 691        printk(KERN_INFO "register early platform devices\n");
 692        early_platform_add_devices(ezkit_early_devices,
 693                ARRAY_SIZE(ezkit_early_devices));
 694}
 695