linux/arch/blackfin/mach-bf533/boards/blackstamp.c
<<
>>
Prefs
   1/*
   2 * Board Info File for the BlackStamp
   3 *
   4 * Copyright 2004-2008 Analog Devices Inc.
   5 *                2008 Benjamin Matthews <bmat@lle.rochester.edu>
   6 *                2005 National ICT Australia (NICTA)
   7 *                      Aidan Williams <aidan@nicta.com.au>
   8 *
   9 * More info about the BlackStamp at:
  10 *      http://blackfin.uclinux.org/gf/project/blackstamp/
  11 *
  12 * Licensed under the GPL-2 or later.
  13 */
  14
  15#include <linux/device.h>
  16#include <linux/platform_device.h>
  17#include <linux/mtd/mtd.h>
  18#include <linux/mtd/partitions.h>
  19#include <linux/mtd/physmap.h>
  20#include <linux/spi/spi.h>
  21#include <linux/spi/flash.h>
  22#include <linux/irq.h>
  23#include <linux/i2c.h>
  24#include <asm/dma.h>
  25#include <asm/bfin5xx_spi.h>
  26#include <asm/portmux.h>
  27#include <asm/dpmc.h>
  28
  29/*
  30 * Name the Board for the /proc/cpuinfo
  31 */
  32const char bfin_board_name[] = "BlackStamp";
  33
  34#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
  35static struct platform_device rtc_device = {
  36        .name = "rtc-bfin",
  37        .id   = -1,
  38};
  39#endif
  40
  41/*
  42 *  Driver needs to know address, irq and flag pin.
  43 */
  44#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
  45#include <linux/smc91x.h>
  46
  47static struct smc91x_platdata smc91x_info = {
  48        .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
  49        .leda = RPC_LED_100_10,
  50        .ledb = RPC_LED_TX_RX,
  51};
  52
  53static struct resource smc91x_resources[] = {
  54        {
  55                .name = "smc91x-regs",
  56                .start = 0x20300300,
  57                .end = 0x20300300 + 16,
  58                .flags = IORESOURCE_MEM,
  59        }, {
  60                .start = IRQ_PF3,
  61                .end = IRQ_PF3,
  62                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
  63        },
  64};
  65
  66static struct platform_device smc91x_device = {
  67        .name = "smc91x",
  68        .id = 0,
  69        .num_resources = ARRAY_SIZE(smc91x_resources),
  70        .resource = smc91x_resources,
  71        .dev    = {
  72                .platform_data  = &smc91x_info,
  73        },
  74};
  75#endif
  76
  77#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
  78static struct mtd_partition bfin_spi_flash_partitions[] = {
  79        {
  80                .name = "bootloader(spi)",
  81                .size = 0x00040000,
  82                .offset = 0,
  83                .mask_flags = MTD_CAP_ROM
  84        }, {
  85                .name = "linux kernel(spi)",
  86                .size = 0x180000,
  87                .offset = MTDPART_OFS_APPEND,
  88        }, {
  89                .name = "file system(spi)",
  90                .size = MTDPART_SIZ_FULL,
  91                .offset = MTDPART_OFS_APPEND,
  92        }
  93};
  94
  95static struct flash_platform_data bfin_spi_flash_data = {
  96        .name = "m25p80",
  97        .parts = bfin_spi_flash_partitions,
  98        .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
  99        .type = "m25p64",
 100};
 101
 102/* SPI flash chip (m25p64) */
 103static struct bfin5xx_spi_chip spi_flash_chip_info = {
 104        .enable_dma = 0,         /* use dma transfer with this chip*/
 105        .bits_per_word = 8,
 106};
 107#endif
 108
 109#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
 110static struct bfin5xx_spi_chip mmc_spi_chip_info = {
 111        .enable_dma = 0,
 112        .bits_per_word = 8,
 113};
 114#endif
 115
 116#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
 117static struct bfin5xx_spi_chip spidev_chip_info = {
 118        .enable_dma = 0,
 119        .bits_per_word = 8,
 120};
 121#endif
 122
 123static struct spi_board_info bfin_spi_board_info[] __initdata = {
 124#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 125        {
 126                /* the modalias must be the same as spi device driver name */
 127                .modalias = "m25p80", /* Name of spi_driver for this device */
 128                .max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
 129                .bus_num = 0, /* Framework bus number */
 130                .chip_select = 2, /* Framework chip select. */
 131                .platform_data = &bfin_spi_flash_data,
 132                .controller_data = &spi_flash_chip_info,
 133                .mode = SPI_MODE_3,
 134        },
 135#endif
 136
 137#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
 138        {
 139                .modalias = "mmc_spi",
 140                .max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
 141                .bus_num = 0,
 142                .chip_select = 5,
 143                .controller_data = &mmc_spi_chip_info,
 144                .mode = SPI_MODE_3,
 145        },
 146#endif
 147
 148#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
 149        {
 150                .modalias = "spidev",
 151                .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
 152                .bus_num = 0,
 153                .chip_select = 7,
 154                .controller_data = &spidev_chip_info,
 155        },
 156#endif
 157};
 158
 159#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
 160/* SPI (0) */
 161static struct resource bfin_spi0_resource[] = {
 162        [0] = {
 163                .start = SPI0_REGBASE,
 164                .end   = SPI0_REGBASE + 0xFF,
 165                .flags = IORESOURCE_MEM,
 166        },
 167        [1] = {
 168                .start = CH_SPI,
 169                .end   = CH_SPI,
 170                .flags = IORESOURCE_DMA,
 171        },
 172        [2] = {
 173                .start = IRQ_SPI,
 174                .end   = IRQ_SPI,
 175                .flags = IORESOURCE_IRQ,
 176        }
 177};
 178
 179/* SPI controller data */
 180static struct bfin5xx_spi_master bfin_spi0_info = {
 181        .num_chipselect = 8,
 182        .enable_dma = 1,  /* master has the ability to do dma transfer */
 183        .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
 184};
 185
 186static struct platform_device bfin_spi0_device = {
 187        .name = "bfin-spi",
 188        .id = 0, /* Bus number */
 189        .num_resources = ARRAY_SIZE(bfin_spi0_resource),
 190        .resource = bfin_spi0_resource,
 191        .dev = {
 192                .platform_data = &bfin_spi0_info, /* Passed to driver */
 193        },
 194};
 195#endif  /* spi master and devices */
 196
 197#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
 198static struct resource bfin_uart_resources[] = {
 199        {
 200                .start = 0xFFC00400,
 201                .end = 0xFFC004FF,
 202                .flags = IORESOURCE_MEM,
 203        },
 204};
 205
 206static struct platform_device bfin_uart_device = {
 207        .name = "bfin-uart",
 208        .id = 1,
 209        .num_resources = ARRAY_SIZE(bfin_uart_resources),
 210        .resource = bfin_uart_resources,
 211};
 212#endif
 213
 214#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
 215#ifdef CONFIG_BFIN_SIR0
 216static struct resource bfin_sir0_resources[] = {
 217        {
 218                .start = 0xFFC00400,
 219                .end = 0xFFC004FF,
 220                .flags = IORESOURCE_MEM,
 221        },
 222        {
 223                .start = IRQ_UART0_RX,
 224                .end = IRQ_UART0_RX+1,
 225                .flags = IORESOURCE_IRQ,
 226        },
 227        {
 228                .start = CH_UART0_RX,
 229                .end = CH_UART0_RX+1,
 230                .flags = IORESOURCE_DMA,
 231        },
 232};
 233
 234static struct platform_device bfin_sir0_device = {
 235        .name = "bfin_sir",
 236        .id = 0,
 237        .num_resources = ARRAY_SIZE(bfin_sir0_resources),
 238        .resource = bfin_sir0_resources,
 239};
 240#endif
 241#endif
 242
 243#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
 244static struct platform_device bfin_sport0_uart_device = {
 245        .name = "bfin-sport-uart",
 246        .id = 0,
 247};
 248
 249static struct platform_device bfin_sport1_uart_device = {
 250        .name = "bfin-sport-uart",
 251        .id = 1,
 252};
 253#endif
 254
 255#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 256#include <linux/input.h>
 257#include <linux/gpio_keys.h>
 258
 259static struct gpio_keys_button bfin_gpio_keys_table[] = {
 260        {BTN_0, GPIO_PF4, 0, "gpio-keys: BTN0"},
 261        {BTN_1, GPIO_PF5, 0, "gpio-keys: BTN1"},
 262        {BTN_2, GPIO_PF6, 0, "gpio-keys: BTN2"},
 263}; /* Mapped to the first three PF Test Points */
 264
 265static struct gpio_keys_platform_data bfin_gpio_keys_data = {
 266        .buttons        = bfin_gpio_keys_table,
 267        .nbuttons       = ARRAY_SIZE(bfin_gpio_keys_table),
 268};
 269
 270static struct platform_device bfin_device_gpiokeys = {
 271        .name      = "gpio-keys",
 272        .dev = {
 273                .platform_data = &bfin_gpio_keys_data,
 274        },
 275};
 276#endif
 277
 278#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 279#include <linux/i2c-gpio.h>
 280
 281static struct i2c_gpio_platform_data i2c_gpio_data = {
 282        .sda_pin                = 8,
 283        .scl_pin                = 9,
 284        .sda_is_open_drain      = 0,
 285        .scl_is_open_drain      = 0,
 286        .udelay                 = 40,
 287}; /* This hasn't actually been used these pins
 288    * are (currently) free pins on the expansion connector */
 289
 290static struct platform_device i2c_gpio_device = {
 291        .name           = "i2c-gpio",
 292        .id             = 0,
 293        .dev            = {
 294                .platform_data  = &i2c_gpio_data,
 295        },
 296};
 297#endif
 298
 299static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
 300};
 301
 302static const unsigned int cclk_vlev_datasheet[] =
 303{
 304        VRPAIR(VLEV_085, 250000000),
 305        VRPAIR(VLEV_090, 376000000),
 306        VRPAIR(VLEV_095, 426000000),
 307        VRPAIR(VLEV_100, 426000000),
 308        VRPAIR(VLEV_105, 476000000),
 309        VRPAIR(VLEV_110, 476000000),
 310        VRPAIR(VLEV_115, 476000000),
 311        VRPAIR(VLEV_120, 600000000),
 312        VRPAIR(VLEV_125, 600000000),
 313        VRPAIR(VLEV_130, 600000000),
 314};
 315
 316static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
 317        .tuple_tab = cclk_vlev_datasheet,
 318        .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
 319        .vr_settling_time = 25 /* us */,
 320};
 321
 322static struct platform_device bfin_dpmc = {
 323        .name = "bfin dpmc",
 324        .dev = {
 325                .platform_data = &bfin_dmpc_vreg_data,
 326        },
 327};
 328
 329static struct platform_device *stamp_devices[] __initdata = {
 330
 331        &bfin_dpmc,
 332
 333#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
 334        &rtc_device,
 335#endif
 336
 337#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
 338        &smc91x_device,
 339#endif
 340
 341
 342#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
 343        &bfin_spi0_device,
 344#endif
 345
 346#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
 347        &bfin_uart_device,
 348#endif
 349
 350#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
 351#ifdef CONFIG_BFIN_SIR0
 352        &bfin_sir0_device,
 353#endif
 354#endif
 355
 356#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
 357        &bfin_sport0_uart_device,
 358        &bfin_sport1_uart_device,
 359#endif
 360
 361#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 362        &bfin_device_gpiokeys,
 363#endif
 364
 365#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 366        &i2c_gpio_device,
 367#endif
 368};
 369
 370static int __init blackstamp_init(void)
 371{
 372        int ret;
 373
 374        printk(KERN_INFO "%s(): registering device resources\n", __func__);
 375
 376        i2c_register_board_info(0, bfin_i2c_board_info,
 377                                ARRAY_SIZE(bfin_i2c_board_info));
 378
 379        ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
 380        if (ret < 0)
 381                return ret;
 382
 383#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
 384        /* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */
 385        bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0);
 386        bfin_write_FIO_FLAG_S(PF0);
 387        SSYNC();
 388#endif
 389
 390        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
 391        return 0;
 392}
 393
 394arch_initcall(blackstamp_init);
 395