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/gpio.h>
  18#include <linux/delay.h>
  19#include <asm/dma.h>
  20#include <asm/bfin5xx_spi.h>
  21#include <asm/portmux.h>
  22#include <asm/dpmc.h>
  23
  24/*
  25 * Name the Board for the /proc/cpuinfo
  26 */
  27const char bfin_board_name[] = "ADI BF561-EZKIT";
  28
  29#if IS_ENABLED(CONFIG_USB_ISP1760_HCD)
  30#include <linux/usb/isp1760.h>
  31static struct resource bfin_isp1760_resources[] = {
  32        [0] = {
  33                .start  = 0x2C0F0000,
  34                .end    = 0x203C0000 + 0xfffff,
  35                .flags  = IORESOURCE_MEM,
  36        },
  37        [1] = {
  38                .start  = IRQ_PF10,
  39                .end    = IRQ_PF10,
  40                .flags  = IORESOURCE_IRQ,
  41        },
  42};
  43
  44static struct isp1760_platform_data isp1760_priv = {
  45        .is_isp1761 = 0,
  46        .bus_width_16 = 1,
  47        .port1_otg = 0,
  48        .analog_oc = 0,
  49        .dack_polarity_high = 0,
  50        .dreq_polarity_high = 0,
  51};
  52
  53static struct platform_device bfin_isp1760_device = {
  54        .name           = "isp1760",
  55        .id             = 0,
  56        .dev = {
  57                .platform_data = &isp1760_priv,
  58        },
  59        .num_resources  = ARRAY_SIZE(bfin_isp1760_resources),
  60        .resource       = bfin_isp1760_resources,
  61};
  62#endif
  63
  64#if IS_ENABLED(CONFIG_USB_ISP1362_HCD)
  65#include <linux/usb/isp1362.h>
  66
  67static struct resource isp1362_hcd_resources[] = {
  68        {
  69                .start = 0x2c060000,
  70                .end = 0x2c060000,
  71                .flags = IORESOURCE_MEM,
  72        }, {
  73                .start = 0x2c060004,
  74                .end = 0x2c060004,
  75                .flags = IORESOURCE_MEM,
  76        }, {
  77                .start = IRQ_PF8,
  78                .end = IRQ_PF8,
  79                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
  80        },
  81};
  82
  83static struct isp1362_platform_data isp1362_priv = {
  84        .sel15Kres = 1,
  85        .clknotstop = 0,
  86        .oc_enable = 0,
  87        .int_act_high = 0,
  88        .int_edge_triggered = 0,
  89        .remote_wakeup_connected = 0,
  90        .no_power_switching = 1,
  91        .power_switching_mode = 0,
  92};
  93
  94static struct platform_device isp1362_hcd_device = {
  95        .name = "isp1362-hcd",
  96        .id = 0,
  97        .dev = {
  98                .platform_data = &isp1362_priv,
  99        },
 100        .num_resources = ARRAY_SIZE(isp1362_hcd_resources),
 101        .resource = isp1362_hcd_resources,
 102};
 103#endif
 104
 105#if IS_ENABLED(CONFIG_USB_NET2272)
 106static struct resource net2272_bfin_resources[] = {
 107        {
 108                .start = 0x2C000000,
 109                .end = 0x2C000000 + 0x7F,
 110                .flags = IORESOURCE_MEM,
 111        }, {
 112                .start = 1,
 113                .flags = IORESOURCE_BUS,
 114        }, {
 115                .start = IRQ_PF10,
 116                .end = IRQ_PF10,
 117                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
 118        },
 119};
 120
 121static struct platform_device net2272_bfin_device = {
 122        .name = "net2272",
 123        .id = -1,
 124        .num_resources = ARRAY_SIZE(net2272_bfin_resources),
 125        .resource = net2272_bfin_resources,
 126};
 127#endif
 128
 129/*
 130 *  USB-LAN EzExtender board
 131 *  Driver needs to know address, irq and flag pin.
 132 */
 133#if IS_ENABLED(CONFIG_SMC91X)
 134#include <linux/smc91x.h>
 135
 136static struct smc91x_platdata smc91x_info = {
 137        .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
 138        .leda = RPC_LED_100_10,
 139        .ledb = RPC_LED_TX_RX,
 140};
 141
 142static struct resource smc91x_resources[] = {
 143        {
 144                .name = "smc91x-regs",
 145                .start = 0x2C010300,
 146                .end = 0x2C010300 + 16,
 147                .flags = IORESOURCE_MEM,
 148        }, {
 149
 150                .start = IRQ_PF9,
 151                .end = IRQ_PF9,
 152                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
 153        },
 154};
 155
 156static struct platform_device smc91x_device = {
 157        .name = "smc91x",
 158        .id = 0,
 159        .num_resources = ARRAY_SIZE(smc91x_resources),
 160        .resource = smc91x_resources,
 161        .dev    = {
 162                .platform_data  = &smc91x_info,
 163        },
 164};
 165#endif
 166
 167#if IS_ENABLED(CONFIG_SERIAL_BFIN)
 168#ifdef CONFIG_SERIAL_BFIN_UART0
 169static struct resource bfin_uart0_resources[] = {
 170        {
 171                .start = BFIN_UART_THR,
 172                .end = BFIN_UART_GCTL+2,
 173                .flags = IORESOURCE_MEM,
 174        },
 175        {
 176                .start = IRQ_UART_TX,
 177                .end = IRQ_UART_TX,
 178                .flags = IORESOURCE_IRQ,
 179        },
 180        {
 181                .start = IRQ_UART_RX,
 182                .end = IRQ_UART_RX,
 183                .flags = IORESOURCE_IRQ,
 184        },
 185        {
 186                .start = IRQ_UART_ERROR,
 187                .end = IRQ_UART_ERROR,
 188                .flags = IORESOURCE_IRQ,
 189        },
 190        {
 191                .start = CH_UART_TX,
 192                .end = CH_UART_TX,
 193                .flags = IORESOURCE_DMA,
 194        },
 195        {
 196                .start = CH_UART_RX,
 197                .end = CH_UART_RX,
 198                .flags = IORESOURCE_DMA,
 199        },
 200};
 201
 202static unsigned short bfin_uart0_peripherals[] = {
 203        P_UART0_TX, P_UART0_RX, 0
 204};
 205
 206static struct platform_device bfin_uart0_device = {
 207        .name = "bfin-uart",
 208        .id = 0,
 209        .num_resources = ARRAY_SIZE(bfin_uart0_resources),
 210        .resource = bfin_uart0_resources,
 211        .dev = {
 212                .platform_data = &bfin_uart0_peripherals, /* Passed to driver */
 213        },
 214};
 215#endif
 216#endif
 217
 218#if IS_ENABLED(CONFIG_BFIN_SIR)
 219#ifdef CONFIG_BFIN_SIR0
 220static struct resource bfin_sir0_resources[] = {
 221        {
 222                .start = 0xFFC00400,
 223                .end = 0xFFC004FF,
 224                .flags = IORESOURCE_MEM,
 225        },
 226        {
 227                .start = IRQ_UART0_RX,
 228                .end = IRQ_UART0_RX+1,
 229                .flags = IORESOURCE_IRQ,
 230        },
 231        {
 232                .start = CH_UART0_RX,
 233                .end = CH_UART0_RX+1,
 234                .flags = IORESOURCE_DMA,
 235        },
 236};
 237
 238static struct platform_device bfin_sir0_device = {
 239        .name = "bfin_sir",
 240        .id = 0,
 241        .num_resources = ARRAY_SIZE(bfin_sir0_resources),
 242        .resource = bfin_sir0_resources,
 243};
 244#endif
 245#endif
 246
 247#if IS_ENABLED(CONFIG_MTD_PHYSMAP)
 248static struct mtd_partition ezkit_partitions[] = {
 249        {
 250                .name       = "bootloader(nor)",
 251                .size       = 0x40000,
 252                .offset     = 0,
 253        }, {
 254                .name       = "linux kernel(nor)",
 255                .size       = 0x1C0000,
 256                .offset     = MTDPART_OFS_APPEND,
 257        }, {
 258                .name       = "file system(nor)",
 259                .size       = 0x800000 - 0x40000 - 0x1C0000 - 0x2000 * 8,
 260                .offset     = MTDPART_OFS_APPEND,
 261        }, {
 262                .name       = "config(nor)",
 263                .size       = 0x2000 * 7,
 264                .offset     = MTDPART_OFS_APPEND,
 265        }, {
 266                .name       = "u-boot env(nor)",
 267                .size       = 0x2000,
 268                .offset     = MTDPART_OFS_APPEND,
 269        }
 270};
 271
 272static struct physmap_flash_data ezkit_flash_data = {
 273        .width      = 2,
 274        .parts      = ezkit_partitions,
 275        .nr_parts   = ARRAY_SIZE(ezkit_partitions),
 276};
 277
 278static struct resource ezkit_flash_resource = {
 279        .start = 0x20000000,
 280        .end   = 0x207fffff,
 281        .flags = IORESOURCE_MEM,
 282};
 283
 284static struct platform_device ezkit_flash_device = {
 285        .name          = "physmap-flash",
 286        .id            = 0,
 287        .dev = {
 288                .platform_data = &ezkit_flash_data,
 289        },
 290        .num_resources = 1,
 291        .resource      = &ezkit_flash_resource,
 292};
 293#endif
 294
 295#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
 296/* SPI (0) */
 297static struct resource bfin_spi0_resource[] = {
 298        [0] = {
 299                .start = SPI0_REGBASE,
 300                .end   = SPI0_REGBASE + 0xFF,
 301                .flags = IORESOURCE_MEM,
 302        },
 303        [1] = {
 304                .start = CH_SPI,
 305                .end   = CH_SPI,
 306                .flags = IORESOURCE_DMA,
 307        },
 308        [2] = {
 309                .start = IRQ_SPI,
 310                .end   = IRQ_SPI,
 311                .flags = IORESOURCE_IRQ,
 312        }
 313};
 314
 315/* SPI controller data */
 316static struct bfin5xx_spi_master bfin_spi0_info = {
 317        .num_chipselect = 8,
 318        .enable_dma = 1,  /* master has the ability to do dma transfer */
 319        .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
 320};
 321
 322static struct platform_device bfin_spi0_device = {
 323        .name = "bfin-spi",
 324        .id = 0, /* Bus number */
 325        .num_resources = ARRAY_SIZE(bfin_spi0_resource),
 326        .resource = bfin_spi0_resource,
 327        .dev = {
 328                .platform_data = &bfin_spi0_info, /* Passed to driver */
 329        },
 330};
 331#endif
 332
 333static struct spi_board_info bfin_spi_board_info[] __initdata = {
 334#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD183X)
 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 IS_ENABLED(CONFIG_SPI_SPIDEV)
 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 IS_ENABLED(CONFIG_KEYBOARD_GPIO)
 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 IS_ENABLED(CONFIG_I2C_GPIO)
 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 IS_ENABLED(CONFIG_VIDEO_BLACKFIN_CAPTURE)
 426#include <linux/videodev2.h>
 427#include <media/blackfin/bfin_capture.h>
 428#include <media/blackfin/ppi.h>
 429
 430static const unsigned short ppi_req[] = {
 431        P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3,
 432        P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7,
 433        P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2,
 434        0,
 435};
 436
 437static const struct ppi_info ppi_info = {
 438        .type = PPI_TYPE_PPI,
 439        .dma_ch = CH_PPI0,
 440        .irq_err = IRQ_PPI1_ERROR,
 441        .base = (void __iomem *)PPI0_CONTROL,
 442        .pin_req = ppi_req,
 443};
 444
 445#if IS_ENABLED(CONFIG_VIDEO_ADV7183)
 446#include <media/adv7183.h>
 447static struct v4l2_input adv7183_inputs[] = {
 448        {
 449                .index = 0,
 450                .name = "Composite",
 451                .type = V4L2_INPUT_TYPE_CAMERA,
 452                .std = V4L2_STD_ALL,
 453                .capabilities = V4L2_IN_CAP_STD,
 454        },
 455        {
 456                .index = 1,
 457                .name = "S-Video",
 458                .type = V4L2_INPUT_TYPE_CAMERA,
 459                .std = V4L2_STD_ALL,
 460                .capabilities = V4L2_IN_CAP_STD,
 461        },
 462        {
 463                .index = 2,
 464                .name = "Component",
 465                .type = V4L2_INPUT_TYPE_CAMERA,
 466                .std = V4L2_STD_ALL,
 467                .capabilities = V4L2_IN_CAP_STD,
 468        },
 469};
 470
 471static struct bcap_route adv7183_routes[] = {
 472        {
 473                .input = ADV7183_COMPOSITE4,
 474                .output = ADV7183_8BIT_OUT,
 475        },
 476        {
 477                .input = ADV7183_SVIDEO0,
 478                .output = ADV7183_8BIT_OUT,
 479        },
 480        {
 481                .input = ADV7183_COMPONENT0,
 482                .output = ADV7183_8BIT_OUT,
 483        },
 484};
 485
 486
 487static const unsigned adv7183_gpio[] = {
 488        GPIO_PF13, /* reset pin */
 489        GPIO_PF2,  /* output enable pin */
 490};
 491
 492static struct bfin_capture_config bfin_capture_data = {
 493        .card_name = "BF561",
 494        .inputs = adv7183_inputs,
 495        .num_inputs = ARRAY_SIZE(adv7183_inputs),
 496        .routes = adv7183_routes,
 497        .i2c_adapter_id = 0,
 498        .board_info = {
 499                .type = "adv7183",
 500                .addr = 0x20,
 501                .platform_data = (void *)adv7183_gpio,
 502        },
 503        .ppi_info = &ppi_info,
 504        .ppi_control = (PACK_EN | DLEN_8 | DMA32 | FLD_SEL),
 505};
 506#endif
 507
 508static struct platform_device bfin_capture_device = {
 509        .name = "bfin_capture",
 510        .dev = {
 511                .platform_data = &bfin_capture_data,
 512        },
 513};
 514#endif
 515
 516#if IS_ENABLED(CONFIG_SND_BF5XX_I2S)
 517static struct platform_device bfin_i2s = {
 518        .name = "bfin-i2s",
 519        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 520        /* TODO: add platform data here */
 521};
 522#endif
 523
 524#if IS_ENABLED(CONFIG_SND_BF5XX_AC97)
 525static struct platform_device bfin_ac97 = {
 526        .name = "bfin-ac97",
 527        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 528        /* TODO: add platform data here */
 529};
 530#endif
 531
 532#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD1836)
 533static const char * const ad1836_link[] = {
 534        "bfin-i2s.0",
 535        "spi0.4",
 536};
 537static struct platform_device bfin_ad1836_machine = {
 538        .name = "bfin-snd-ad1836",
 539        .id = -1,
 540        .dev = {
 541                .platform_data = (void *)ad1836_link,
 542        },
 543};
 544#endif
 545
 546static struct platform_device *ezkit_devices[] __initdata = {
 547
 548        &bfin_dpmc,
 549
 550#if IS_ENABLED(CONFIG_SMC91X)
 551        &smc91x_device,
 552#endif
 553
 554#if IS_ENABLED(CONFIG_USB_NET2272)
 555        &net2272_bfin_device,
 556#endif
 557
 558#if IS_ENABLED(CONFIG_USB_ISP1760_HCD)
 559        &bfin_isp1760_device,
 560#endif
 561
 562#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
 563        &bfin_spi0_device,
 564#endif
 565
 566#if IS_ENABLED(CONFIG_SERIAL_BFIN)
 567#ifdef CONFIG_SERIAL_BFIN_UART0
 568        &bfin_uart0_device,
 569#endif
 570#endif
 571
 572#if IS_ENABLED(CONFIG_BFIN_SIR)
 573#ifdef CONFIG_BFIN_SIR0
 574        &bfin_sir0_device,
 575#endif
 576#endif
 577
 578#if IS_ENABLED(CONFIG_KEYBOARD_GPIO)
 579        &bfin_device_gpiokeys,
 580#endif
 581
 582#if IS_ENABLED(CONFIG_I2C_GPIO)
 583        &i2c_gpio_device,
 584#endif
 585
 586#if IS_ENABLED(CONFIG_USB_ISP1362_HCD)
 587        &isp1362_hcd_device,
 588#endif
 589
 590#if IS_ENABLED(CONFIG_MTD_PHYSMAP)
 591        &ezkit_flash_device,
 592#endif
 593
 594#if IS_ENABLED(CONFIG_VIDEO_BLACKFIN_CAPTURE)
 595        &bfin_capture_device,
 596#endif
 597
 598#if IS_ENABLED(CONFIG_SND_BF5XX_I2S)
 599        &bfin_i2s,
 600#endif
 601
 602#if IS_ENABLED(CONFIG_SND_BF5XX_AC97)
 603        &bfin_ac97,
 604#endif
 605
 606#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD1836)
 607        &bfin_ad1836_machine,
 608#endif
 609};
 610
 611static int __init net2272_init(void)
 612{
 613#if IS_ENABLED(CONFIG_USB_NET2272)
 614        int ret;
 615
 616        ret = gpio_request(GPIO_PF11, "net2272");
 617        if (ret)
 618                return ret;
 619
 620        /* Reset the USB chip */
 621        gpio_direction_output(GPIO_PF11, 0);
 622        mdelay(2);
 623        gpio_set_value(GPIO_PF11, 1);
 624#endif
 625
 626        return 0;
 627}
 628
 629static int __init ezkit_init(void)
 630{
 631        int ret;
 632
 633        printk(KERN_INFO "%s(): registering device resources\n", __func__);
 634
 635        ret = platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
 636        if (ret < 0)
 637                return ret;
 638
 639#if IS_ENABLED(CONFIG_SMC91X)
 640        bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 12));
 641        SSYNC();
 642#endif
 643
 644#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD183X)
 645        bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 15));
 646        bfin_write_FIO0_FLAG_S(1 << 15);
 647        SSYNC();
 648        /*
 649         * This initialization lasts for approximately 4500 MCLKs.
 650         * MCLK = 12.288MHz
 651         */
 652        udelay(400);
 653#endif
 654
 655        if (net2272_init())
 656                pr_warning("unable to configure net2272; it probably won't work\n");
 657
 658        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
 659        return 0;
 660}
 661
 662arch_initcall(ezkit_init);
 663
 664static struct platform_device *ezkit_early_devices[] __initdata = {
 665#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
 666#ifdef CONFIG_SERIAL_BFIN_UART0
 667        &bfin_uart0_device,
 668#endif
 669#endif
 670};
 671
 672void __init native_machine_early_platform_add_devices(void)
 673{
 674        printk(KERN_INFO "register early platform devices\n");
 675        early_platform_add_devices(ezkit_early_devices,
 676                ARRAY_SIZE(ezkit_early_devices));
 677}
 678