linux/arch/blackfin/mach-bf533/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/plat-ram.h>
  14#include <linux/mtd/physmap.h>
  15#include <linux/spi/spi.h>
  16#include <linux/spi/flash.h>
  17#if IS_ENABLED(CONFIG_USB_ISP1362_HCD)
  18#include <linux/usb/isp1362.h>
  19#endif
  20#include <linux/irq.h>
  21#include <linux/i2c.h>
  22#include <asm/dma.h>
  23#include <asm/bfin5xx_spi.h>
  24#include <asm/portmux.h>
  25#include <asm/dpmc.h>
  26
  27/*
  28 * Name the Board for the /proc/cpuinfo
  29 */
  30const char bfin_board_name[] = "ADI BF533-EZKIT";
  31
  32#if IS_ENABLED(CONFIG_RTC_DRV_BFIN)
  33static struct platform_device rtc_device = {
  34        .name = "rtc-bfin",
  35        .id   = -1,
  36};
  37#endif
  38
  39/*
  40 *  USB-LAN EzExtender board
  41 *  Driver needs to know address, irq and flag pin.
  42 */
  43#if IS_ENABLED(CONFIG_SMC91X)
  44#include <linux/smc91x.h>
  45
  46static struct smc91x_platdata smc91x_info = {
  47        .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
  48        .leda = RPC_LED_100_10,
  49        .ledb = RPC_LED_TX_RX,
  50};
  51
  52static struct resource smc91x_resources[] = {
  53        {
  54                .name = "smc91x-regs",
  55                .start = 0x20310300,
  56                .end = 0x20310300 + 16,
  57                .flags = IORESOURCE_MEM,
  58        }, {
  59                .start = IRQ_PF9,
  60                .end = IRQ_PF9,
  61                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
  62        },
  63};
  64static struct platform_device smc91x_device = {
  65        .name = "smc91x",
  66        .id = 0,
  67        .num_resources = ARRAY_SIZE(smc91x_resources),
  68        .resource = smc91x_resources,
  69        .dev    = {
  70                .platform_data  = &smc91x_info,
  71        },
  72};
  73#endif
  74
  75#if IS_ENABLED(CONFIG_MTD_PHYSMAP)
  76static struct mtd_partition ezkit_partitions_a[] = {
  77        {
  78                .name       = "bootloader(nor a)",
  79                .size       = 0x40000,
  80                .offset     = 0,
  81        }, {
  82                .name       = "linux kernel(nor a)",
  83                .size       = MTDPART_SIZ_FULL,
  84                .offset     = MTDPART_OFS_APPEND,
  85        },
  86};
  87
  88static struct physmap_flash_data ezkit_flash_data_a = {
  89        .width      = 2,
  90        .parts      = ezkit_partitions_a,
  91        .nr_parts   = ARRAY_SIZE(ezkit_partitions_a),
  92};
  93
  94static struct resource ezkit_flash_resource_a = {
  95        .start = 0x20000000,
  96        .end   = 0x200fffff,
  97        .flags = IORESOURCE_MEM,
  98};
  99
 100static struct platform_device ezkit_flash_device_a = {
 101        .name          = "physmap-flash",
 102        .id            = 0,
 103        .dev = {
 104                .platform_data = &ezkit_flash_data_a,
 105        },
 106        .num_resources = 1,
 107        .resource      = &ezkit_flash_resource_a,
 108};
 109
 110static struct mtd_partition ezkit_partitions_b[] = {
 111        {
 112                .name   = "file system(nor b)",
 113                .size   = MTDPART_SIZ_FULL,
 114                .offset = MTDPART_OFS_APPEND,
 115        },
 116};
 117
 118static struct physmap_flash_data ezkit_flash_data_b = {
 119        .width      = 2,
 120        .parts      = ezkit_partitions_b,
 121        .nr_parts   = ARRAY_SIZE(ezkit_partitions_b),
 122};
 123
 124static struct resource ezkit_flash_resource_b = {
 125        .start = 0x20100000,
 126        .end   = 0x201fffff,
 127        .flags = IORESOURCE_MEM,
 128};
 129
 130static struct platform_device ezkit_flash_device_b = {
 131        .name          = "physmap-flash",
 132        .id            = 4,
 133        .dev = {
 134                .platform_data = &ezkit_flash_data_b,
 135        },
 136        .num_resources = 1,
 137        .resource      = &ezkit_flash_resource_b,
 138};
 139#endif
 140
 141#if IS_ENABLED(CONFIG_MTD_PLATRAM)
 142static struct platdata_mtd_ram sram_data_a = {
 143        .mapname   = "Flash A SRAM",
 144        .bankwidth = 2,
 145};
 146
 147static struct resource sram_resource_a = {
 148        .start = 0x20240000,
 149        .end   = 0x2024ffff,
 150        .flags = IORESOURCE_MEM,
 151};
 152
 153static struct platform_device sram_device_a = {
 154        .name          = "mtd-ram",
 155        .id            = 8,
 156        .dev = {
 157                .platform_data = &sram_data_a,
 158        },
 159        .num_resources = 1,
 160        .resource      = &sram_resource_a,
 161};
 162
 163static struct platdata_mtd_ram sram_data_b = {
 164        .mapname   = "Flash B SRAM",
 165        .bankwidth = 2,
 166};
 167
 168static struct resource sram_resource_b = {
 169        .start = 0x202c0000,
 170        .end   = 0x202cffff,
 171        .flags = IORESOURCE_MEM,
 172};
 173
 174static struct platform_device sram_device_b = {
 175        .name          = "mtd-ram",
 176        .id            = 9,
 177        .dev = {
 178                .platform_data = &sram_data_b,
 179        },
 180        .num_resources = 1,
 181        .resource      = &sram_resource_b,
 182};
 183#endif
 184
 185#if IS_ENABLED(CONFIG_MTD_M25P80)
 186static struct mtd_partition bfin_spi_flash_partitions[] = {
 187        {
 188                .name = "bootloader(spi)",
 189                .size = 0x00020000,
 190                .offset = 0,
 191                .mask_flags = MTD_CAP_ROM
 192        }, {
 193                .name = "linux kernel(spi)",
 194                .size = 0xe0000,
 195                .offset = MTDPART_OFS_APPEND,
 196        }, {
 197                .name = "file system(spi)",
 198                .size = MTDPART_SIZ_FULL,
 199                .offset = MTDPART_OFS_APPEND,
 200        }
 201};
 202
 203static struct flash_platform_data bfin_spi_flash_data = {
 204        .name = "m25p80",
 205        .parts = bfin_spi_flash_partitions,
 206        .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
 207        .type = "m25p64",
 208};
 209
 210/* SPI flash chip (m25p64) */
 211static struct bfin5xx_spi_chip spi_flash_chip_info = {
 212        .enable_dma = 0,         /* use dma transfer with this chip*/
 213};
 214#endif
 215
 216static struct spi_board_info bfin_spi_board_info[] __initdata = {
 217#if IS_ENABLED(CONFIG_MTD_M25P80)
 218        {
 219                /* the modalias must be the same as spi device driver name */
 220                .modalias = "m25p80", /* Name of spi_driver for this device */
 221                .max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */
 222                .bus_num = 0, /* Framework bus number */
 223                .chip_select = 2, /* Framework chip select. On STAMP537 it is SPISSEL2*/
 224                .platform_data = &bfin_spi_flash_data,
 225                .controller_data = &spi_flash_chip_info,
 226                .mode = SPI_MODE_3,
 227        },
 228#endif
 229
 230#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD183X)
 231        {
 232                .modalias = "ad183x",
 233                .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
 234                .bus_num = 0,
 235                .chip_select = 4,
 236        },
 237#endif
 238#if IS_ENABLED(CONFIG_SPI_SPIDEV)
 239        {
 240                .modalias = "spidev",
 241                .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
 242                .bus_num = 0,
 243                .chip_select = 1,
 244        },
 245#endif
 246};
 247
 248#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
 249/* SPI (0) */
 250static struct resource bfin_spi0_resource[] = {
 251        [0] = {
 252                .start = SPI0_REGBASE,
 253                .end   = SPI0_REGBASE + 0xFF,
 254                .flags = IORESOURCE_MEM,
 255        },
 256        [1] = {
 257                .start = CH_SPI,
 258                .end   = CH_SPI,
 259                .flags = IORESOURCE_DMA,
 260        },
 261        [2] = {
 262                .start = IRQ_SPI,
 263                .end   = IRQ_SPI,
 264                .flags = IORESOURCE_IRQ,
 265        }
 266};
 267
 268/* SPI controller data */
 269static struct bfin5xx_spi_master bfin_spi0_info = {
 270        .num_chipselect = 8,
 271        .enable_dma = 1,  /* master has the ability to do dma transfer */
 272        .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
 273};
 274
 275static struct platform_device bfin_spi0_device = {
 276        .name = "bfin-spi",
 277        .id = 0, /* Bus number */
 278        .num_resources = ARRAY_SIZE(bfin_spi0_resource),
 279        .resource = bfin_spi0_resource,
 280        .dev = {
 281                .platform_data = &bfin_spi0_info, /* Passed to driver */
 282        },
 283};
 284#endif  /* spi master and devices */
 285
 286#if IS_ENABLED(CONFIG_SERIAL_BFIN)
 287#ifdef CONFIG_SERIAL_BFIN_UART0
 288static struct resource bfin_uart0_resources[] = {
 289        {
 290                .start = BFIN_UART_THR,
 291                .end = BFIN_UART_GCTL+2,
 292                .flags = IORESOURCE_MEM,
 293        },
 294        {
 295                .start = IRQ_UART0_TX,
 296                .end = IRQ_UART0_TX,
 297                .flags = IORESOURCE_IRQ,
 298        },
 299        {
 300                .start = IRQ_UART0_RX,
 301                .end = IRQ_UART0_RX,
 302                .flags = IORESOURCE_IRQ,
 303        },
 304        {
 305                .start = IRQ_UART0_ERROR,
 306                .end = IRQ_UART0_ERROR,
 307                .flags = IORESOURCE_IRQ,
 308        },
 309        {
 310                .start = CH_UART0_TX,
 311                .end = CH_UART0_TX,
 312                .flags = IORESOURCE_DMA,
 313        },
 314        {
 315                .start = CH_UART0_RX,
 316                .end = CH_UART0_RX,
 317                .flags = IORESOURCE_DMA,
 318        },
 319};
 320
 321static unsigned short bfin_uart0_peripherals[] = {
 322        P_UART0_TX, P_UART0_RX, 0
 323};
 324
 325static struct platform_device bfin_uart0_device = {
 326        .name = "bfin-uart",
 327        .id = 0,
 328        .num_resources = ARRAY_SIZE(bfin_uart0_resources),
 329        .resource = bfin_uart0_resources,
 330        .dev = {
 331                .platform_data = &bfin_uart0_peripherals, /* Passed to driver */
 332        },
 333};
 334#endif
 335#endif
 336
 337#if IS_ENABLED(CONFIG_BFIN_SIR)
 338#ifdef CONFIG_BFIN_SIR0
 339static struct resource bfin_sir0_resources[] = {
 340        {
 341                .start = 0xFFC00400,
 342                .end = 0xFFC004FF,
 343                .flags = IORESOURCE_MEM,
 344        },
 345        {
 346                .start = IRQ_UART0_RX,
 347                .end = IRQ_UART0_RX+1,
 348                .flags = IORESOURCE_IRQ,
 349        },
 350        {
 351                .start = CH_UART0_RX,
 352                .end = CH_UART0_RX+1,
 353                .flags = IORESOURCE_DMA,
 354        },
 355};
 356
 357static struct platform_device bfin_sir0_device = {
 358        .name = "bfin_sir",
 359        .id = 0,
 360        .num_resources = ARRAY_SIZE(bfin_sir0_resources),
 361        .resource = bfin_sir0_resources,
 362};
 363#endif
 364#endif
 365
 366#if IS_ENABLED(CONFIG_KEYBOARD_GPIO)
 367#include <linux/input.h>
 368#include <linux/gpio_keys.h>
 369
 370static struct gpio_keys_button bfin_gpio_keys_table[] = {
 371        {BTN_0, GPIO_PF7, 1, "gpio-keys: BTN0"},
 372        {BTN_1, GPIO_PF8, 1, "gpio-keys: BTN1"},
 373        {BTN_2, GPIO_PF9, 1, "gpio-keys: BTN2"},
 374        {BTN_3, GPIO_PF10, 1, "gpio-keys: BTN3"},
 375};
 376
 377static struct gpio_keys_platform_data bfin_gpio_keys_data = {
 378        .buttons        = bfin_gpio_keys_table,
 379        .nbuttons       = ARRAY_SIZE(bfin_gpio_keys_table),
 380};
 381
 382static struct platform_device bfin_device_gpiokeys = {
 383        .name      = "gpio-keys",
 384        .dev = {
 385                .platform_data = &bfin_gpio_keys_data,
 386        },
 387};
 388#endif
 389
 390#if IS_ENABLED(CONFIG_I2C_GPIO)
 391#include <linux/i2c-gpio.h>
 392
 393static struct i2c_gpio_platform_data i2c_gpio_data = {
 394        .sda_pin                = GPIO_PF1,
 395        .scl_pin                = GPIO_PF0,
 396        .sda_is_open_drain      = 0,
 397        .scl_is_open_drain      = 0,
 398        .udelay                 = 40,
 399};
 400
 401static struct platform_device i2c_gpio_device = {
 402        .name           = "i2c-gpio",
 403        .id             = 0,
 404        .dev            = {
 405                .platform_data  = &i2c_gpio_data,
 406        },
 407};
 408#endif
 409
 410static const unsigned int cclk_vlev_datasheet[] =
 411{
 412        VRPAIR(VLEV_085, 250000000),
 413        VRPAIR(VLEV_090, 376000000),
 414        VRPAIR(VLEV_095, 426000000),
 415        VRPAIR(VLEV_100, 426000000),
 416        VRPAIR(VLEV_105, 476000000),
 417        VRPAIR(VLEV_110, 476000000),
 418        VRPAIR(VLEV_115, 476000000),
 419        VRPAIR(VLEV_120, 600000000),
 420        VRPAIR(VLEV_125, 600000000),
 421        VRPAIR(VLEV_130, 600000000),
 422};
 423
 424static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
 425        .tuple_tab = cclk_vlev_datasheet,
 426        .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
 427        .vr_settling_time = 25 /* us */,
 428};
 429
 430static struct platform_device bfin_dpmc = {
 431        .name = "bfin dpmc",
 432        .dev = {
 433                .platform_data = &bfin_dmpc_vreg_data,
 434        },
 435};
 436
 437static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
 438#if IS_ENABLED(CONFIG_FB_BFIN_7393)
 439        {
 440                I2C_BOARD_INFO("bfin-adv7393", 0x2B),
 441        },
 442#endif
 443};
 444
 445#if IS_ENABLED(CONFIG_SND_BF5XX_I2S)
 446static struct platform_device bfin_i2s = {
 447        .name = "bfin-i2s",
 448        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 449        /* TODO: add platform data here */
 450};
 451#endif
 452
 453#if IS_ENABLED(CONFIG_SND_BF5XX_AC97)
 454static struct platform_device bfin_ac97 = {
 455        .name = "bfin-ac97",
 456        .id = CONFIG_SND_BF5XX_SPORT_NUM,
 457        /* TODO: add platform data here */
 458};
 459#endif
 460
 461static struct platform_device *ezkit_devices[] __initdata = {
 462
 463        &bfin_dpmc,
 464
 465#if IS_ENABLED(CONFIG_MTD_PHYSMAP)
 466        &ezkit_flash_device_a,
 467        &ezkit_flash_device_b,
 468#endif
 469
 470#if IS_ENABLED(CONFIG_MTD_PLATRAM)
 471        &sram_device_a,
 472        &sram_device_b,
 473#endif
 474
 475#if IS_ENABLED(CONFIG_SMC91X)
 476        &smc91x_device,
 477#endif
 478
 479#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
 480        &bfin_spi0_device,
 481#endif
 482
 483#if IS_ENABLED(CONFIG_RTC_DRV_BFIN)
 484        &rtc_device,
 485#endif
 486
 487#if IS_ENABLED(CONFIG_SERIAL_BFIN)
 488#ifdef CONFIG_SERIAL_BFIN_UART0
 489        &bfin_uart0_device,
 490#endif
 491#endif
 492
 493#if IS_ENABLED(CONFIG_BFIN_SIR)
 494#ifdef CONFIG_BFIN_SIR0
 495        &bfin_sir0_device,
 496#endif
 497#endif
 498
 499#if IS_ENABLED(CONFIG_KEYBOARD_GPIO)
 500        &bfin_device_gpiokeys,
 501#endif
 502
 503#if IS_ENABLED(CONFIG_I2C_GPIO)
 504        &i2c_gpio_device,
 505#endif
 506
 507#if IS_ENABLED(CONFIG_SND_BF5XX_I2S)
 508        &bfin_i2s,
 509#endif
 510
 511#if IS_ENABLED(CONFIG_SND_BF5XX_AC97)
 512        &bfin_ac97,
 513#endif
 514};
 515
 516static int __init ezkit_init(void)
 517{
 518        printk(KERN_INFO "%s(): registering device resources\n", __func__);
 519        platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
 520        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
 521        i2c_register_board_info(0, bfin_i2c_board_info,
 522                                ARRAY_SIZE(bfin_i2c_board_info));
 523        return 0;
 524}
 525
 526arch_initcall(ezkit_init);
 527
 528static struct platform_device *ezkit_early_devices[] __initdata = {
 529#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
 530#ifdef CONFIG_SERIAL_BFIN_UART0
 531        &bfin_uart0_device,
 532#endif
 533#endif
 534};
 535
 536void __init native_machine_early_platform_add_devices(void)
 537{
 538        printk(KERN_INFO "register early platform devices\n");
 539        early_platform_add_devices(ezkit_early_devices,
 540                ARRAY_SIZE(ezkit_early_devices));
 541}
 542