linux/arch/arm/mach-ep93xx/edb93xx.c
<<
>>
Prefs
   1/*
   2 * arch/arm/mach-ep93xx/edb93xx.c
   3 * Cirrus Logic EDB93xx Development Board support.
   4 *
   5 * EDB93XX, EDB9301, EDB9307A
   6 * Copyright (C) 2008-2009 H Hartley Sweeten <hsweeten@visionengravers.com>
   7 *
   8 * EDB9302
   9 * Copyright (C) 2006 George Kashperko <george@chas.com.ua>
  10 *
  11 * EDB9302A, EDB9315, EDB9315A
  12 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
  13 *
  14 * EDB9307
  15 * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
  16 *
  17 * EDB9312
  18 * Copyright (C) 2006 Infosys Technologies Limited
  19 *                    Toufeeq Hussain <toufeeq_hussain@infosys.com>
  20 *
  21 * This program is free software; you can redistribute it and/or modify
  22 * it under the terms of the GNU General Public License as published by
  23 * the Free Software Foundation; either version 2 of the License, or (at
  24 * your option) any later version.
  25 */
  26
  27#include <linux/kernel.h>
  28#include <linux/init.h>
  29#include <linux/platform_device.h>
  30#include <linux/gpio.h>
  31#include <linux/i2c.h>
  32#include <linux/i2c-gpio.h>
  33#include <linux/spi/spi.h>
  34
  35#include <sound/cs4271.h>
  36
  37#include <mach/hardware.h>
  38#include <linux/platform_data/video-ep93xx.h>
  39#include <linux/platform_data/spi-ep93xx.h>
  40#include <mach/gpio-ep93xx.h>
  41
  42#include <asm/mach-types.h>
  43#include <asm/mach/arch.h>
  44
  45#include "soc.h"
  46
  47static void __init edb93xx_register_flash(void)
  48{
  49        if (machine_is_edb9307() || machine_is_edb9312() ||
  50            machine_is_edb9315()) {
  51                ep93xx_register_flash(4, EP93XX_CS6_PHYS_BASE, SZ_32M);
  52        } else {
  53                ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
  54        }
  55}
  56
  57static struct ep93xx_eth_data __initdata edb93xx_eth_data = {
  58        .phy_id         = 1,
  59};
  60
  61
  62/*************************************************************************
  63 * EDB93xx i2c peripheral handling
  64 *************************************************************************/
  65static struct i2c_gpio_platform_data __initdata edb93xx_i2c_gpio_data = {
  66        .sda_pin                = EP93XX_GPIO_LINE_EEDAT,
  67        .sda_is_open_drain      = 0,
  68        .scl_pin                = EP93XX_GPIO_LINE_EECLK,
  69        .scl_is_open_drain      = 0,
  70        .udelay                 = 0,    /* default to 100 kHz */
  71        .timeout                = 0,    /* default to 100 ms */
  72};
  73
  74static struct i2c_board_info __initdata edb93xxa_i2c_board_info[] = {
  75        {
  76                I2C_BOARD_INFO("isl1208", 0x6f),
  77        },
  78};
  79
  80static struct i2c_board_info __initdata edb93xx_i2c_board_info[] = {
  81        {
  82                I2C_BOARD_INFO("ds1337", 0x68),
  83        },
  84};
  85
  86static void __init edb93xx_register_i2c(void)
  87{
  88        if (machine_is_edb9302a() || machine_is_edb9307a() ||
  89            machine_is_edb9315a()) {
  90                ep93xx_register_i2c(&edb93xx_i2c_gpio_data,
  91                                    edb93xxa_i2c_board_info,
  92                                    ARRAY_SIZE(edb93xxa_i2c_board_info));
  93        } else if (machine_is_edb9302() || machine_is_edb9307()
  94                || machine_is_edb9312() || machine_is_edb9315()) {
  95                ep93xx_register_i2c(&edb93xx_i2c_gpio_data,
  96                                    edb93xx_i2c_board_info,
  97                                    ARRAY_SIZE(edb93xx_i2c_board_info));
  98        }
  99}
 100
 101
 102/*************************************************************************
 103 * EDB93xx SPI peripheral handling
 104 *************************************************************************/
 105static struct cs4271_platform_data edb93xx_cs4271_data = {
 106        .gpio_nreset    = -EINVAL,      /* filled in later */
 107};
 108
 109static int edb93xx_cs4271_hw_setup(struct spi_device *spi)
 110{
 111        return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6,
 112                                GPIOF_OUT_INIT_HIGH, spi->modalias);
 113}
 114
 115static void edb93xx_cs4271_hw_cleanup(struct spi_device *spi)
 116{
 117        gpio_free(EP93XX_GPIO_LINE_EGPIO6);
 118}
 119
 120static void edb93xx_cs4271_hw_cs_control(struct spi_device *spi, int value)
 121{
 122        gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value);
 123}
 124
 125static struct ep93xx_spi_chip_ops edb93xx_cs4271_hw = {
 126        .setup          = edb93xx_cs4271_hw_setup,
 127        .cleanup        = edb93xx_cs4271_hw_cleanup,
 128        .cs_control     = edb93xx_cs4271_hw_cs_control,
 129};
 130
 131static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
 132        {
 133                .modalias               = "cs4271",
 134                .platform_data          = &edb93xx_cs4271_data,
 135                .controller_data        = &edb93xx_cs4271_hw,
 136                .max_speed_hz           = 6000000,
 137                .bus_num                = 0,
 138                .chip_select            = 0,
 139                .mode                   = SPI_MODE_3,
 140        },
 141};
 142
 143static struct ep93xx_spi_info edb93xx_spi_info __initdata = {
 144        .num_chipselect = ARRAY_SIZE(edb93xx_spi_board_info),
 145};
 146
 147static void __init edb93xx_register_spi(void)
 148{
 149        if (machine_is_edb9301() || machine_is_edb9302())
 150                edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO1;
 151        else if (machine_is_edb9302a() || machine_is_edb9307a())
 152                edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_H(2);
 153        else if (machine_is_edb9315a())
 154                edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO14;
 155
 156        ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info,
 157                            ARRAY_SIZE(edb93xx_spi_board_info));
 158}
 159
 160
 161/*************************************************************************
 162 * EDB93xx I2S
 163 *************************************************************************/
 164static struct platform_device edb93xx_audio_device = {
 165        .name           = "edb93xx-audio",
 166        .id             = -1,
 167};
 168
 169static int __init edb93xx_has_audio(void)
 170{
 171        return (machine_is_edb9301() || machine_is_edb9302() ||
 172                machine_is_edb9302a() || machine_is_edb9307a() ||
 173                machine_is_edb9315a());
 174}
 175
 176static void __init edb93xx_register_i2s(void)
 177{
 178        if (edb93xx_has_audio()) {
 179                ep93xx_register_i2s();
 180                platform_device_register(&edb93xx_audio_device);
 181        }
 182}
 183
 184
 185/*************************************************************************
 186 * EDB93xx pwm
 187 *************************************************************************/
 188static void __init edb93xx_register_pwm(void)
 189{
 190        if (machine_is_edb9301() ||
 191            machine_is_edb9302() || machine_is_edb9302a()) {
 192                /* EP9301 and EP9302 only have pwm.1 (EGPIO14) */
 193                ep93xx_register_pwm(0, 1);
 194        } else if (machine_is_edb9307() || machine_is_edb9307a()) {
 195                /* EP9307 only has pwm.0 (PWMOUT) */
 196                ep93xx_register_pwm(1, 0);
 197        } else {
 198                /* EP9312 and EP9315 have both */
 199                ep93xx_register_pwm(1, 1);
 200        }
 201}
 202
 203
 204/*************************************************************************
 205 * EDB93xx framebuffer
 206 *************************************************************************/
 207static struct ep93xxfb_mach_info __initdata edb93xxfb_info = {
 208        .flags          = 0,
 209};
 210
 211static int __init edb93xx_has_fb(void)
 212{
 213        /* These platforms have an ep93xx with video capability */
 214        return machine_is_edb9307() || machine_is_edb9307a() ||
 215               machine_is_edb9312() || machine_is_edb9315() ||
 216               machine_is_edb9315a();
 217}
 218
 219static void __init edb93xx_register_fb(void)
 220{
 221        if (!edb93xx_has_fb())
 222                return;
 223
 224        if (machine_is_edb9307a() || machine_is_edb9315a())
 225                edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN0;
 226        else
 227                edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN3;
 228
 229        ep93xx_register_fb(&edb93xxfb_info);
 230}
 231
 232
 233/*************************************************************************
 234 * EDB93xx IDE
 235 *************************************************************************/
 236static int __init edb93xx_has_ide(void)
 237{
 238        /*
 239         * Although EDB9312 and EDB9315 do have IDE capability, they have
 240         * INTRQ line wired as pull-up, which makes using IDE interface
 241         * problematic.
 242         */
 243        return machine_is_edb9312() || machine_is_edb9315() ||
 244               machine_is_edb9315a();
 245}
 246
 247static void __init edb93xx_register_ide(void)
 248{
 249        if (!edb93xx_has_ide())
 250                return;
 251
 252        ep93xx_register_ide();
 253}
 254
 255
 256static void __init edb93xx_init_machine(void)
 257{
 258        ep93xx_init_devices();
 259        edb93xx_register_flash();
 260        ep93xx_register_eth(&edb93xx_eth_data, 1);
 261        edb93xx_register_i2c();
 262        edb93xx_register_spi();
 263        edb93xx_register_i2s();
 264        edb93xx_register_pwm();
 265        edb93xx_register_fb();
 266        edb93xx_register_ide();
 267}
 268
 269
 270#ifdef CONFIG_MACH_EDB9301
 271MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")
 272        /* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
 273        .atag_offset    = 0x100,
 274        .map_io         = ep93xx_map_io,
 275        .init_irq       = ep93xx_init_irq,
 276        .init_time      = ep93xx_timer_init,
 277        .init_machine   = edb93xx_init_machine,
 278        .init_late      = ep93xx_init_late,
 279        .restart        = ep93xx_restart,
 280MACHINE_END
 281#endif
 282
 283#ifdef CONFIG_MACH_EDB9302
 284MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")
 285        /* Maintainer: George Kashperko <george@chas.com.ua> */
 286        .atag_offset    = 0x100,
 287        .map_io         = ep93xx_map_io,
 288        .init_irq       = ep93xx_init_irq,
 289        .init_time      = ep93xx_timer_init,
 290        .init_machine   = edb93xx_init_machine,
 291        .init_late      = ep93xx_init_late,
 292        .restart        = ep93xx_restart,
 293MACHINE_END
 294#endif
 295
 296#ifdef CONFIG_MACH_EDB9302A
 297MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")
 298        /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 299        .atag_offset    = 0x100,
 300        .map_io         = ep93xx_map_io,
 301        .init_irq       = ep93xx_init_irq,
 302        .init_time      = ep93xx_timer_init,
 303        .init_machine   = edb93xx_init_machine,
 304        .init_late      = ep93xx_init_late,
 305        .restart        = ep93xx_restart,
 306MACHINE_END
 307#endif
 308
 309#ifdef CONFIG_MACH_EDB9307
 310MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")
 311        /* Maintainer: Herbert Valerio Riedel <hvr@gnu.org> */
 312        .atag_offset    = 0x100,
 313        .map_io         = ep93xx_map_io,
 314        .init_irq       = ep93xx_init_irq,
 315        .init_time      = ep93xx_timer_init,
 316        .init_machine   = edb93xx_init_machine,
 317        .init_late      = ep93xx_init_late,
 318        .restart        = ep93xx_restart,
 319MACHINE_END
 320#endif
 321
 322#ifdef CONFIG_MACH_EDB9307A
 323MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")
 324        /* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
 325        .atag_offset    = 0x100,
 326        .map_io         = ep93xx_map_io,
 327        .init_irq       = ep93xx_init_irq,
 328        .init_time      = ep93xx_timer_init,
 329        .init_machine   = edb93xx_init_machine,
 330        .init_late      = ep93xx_init_late,
 331        .restart        = ep93xx_restart,
 332MACHINE_END
 333#endif
 334
 335#ifdef CONFIG_MACH_EDB9312
 336MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")
 337        /* Maintainer: Toufeeq Hussain <toufeeq_hussain@infosys.com> */
 338        .atag_offset    = 0x100,
 339        .map_io         = ep93xx_map_io,
 340        .init_irq       = ep93xx_init_irq,
 341        .init_time      = ep93xx_timer_init,
 342        .init_machine   = edb93xx_init_machine,
 343        .init_late      = ep93xx_init_late,
 344        .restart        = ep93xx_restart,
 345MACHINE_END
 346#endif
 347
 348#ifdef CONFIG_MACH_EDB9315
 349MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")
 350        /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 351        .atag_offset    = 0x100,
 352        .map_io         = ep93xx_map_io,
 353        .init_irq       = ep93xx_init_irq,
 354        .init_time      = ep93xx_timer_init,
 355        .init_machine   = edb93xx_init_machine,
 356        .init_late      = ep93xx_init_late,
 357        .restart        = ep93xx_restart,
 358MACHINE_END
 359#endif
 360
 361#ifdef CONFIG_MACH_EDB9315A
 362MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")
 363        /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 364        .atag_offset    = 0x100,
 365        .map_io         = ep93xx_map_io,
 366        .init_irq       = ep93xx_init_irq,
 367        .init_time      = ep93xx_timer_init,
 368        .init_machine   = edb93xx_init_machine,
 369        .init_late      = ep93xx_init_late,
 370        .restart        = ep93xx_restart,
 371MACHINE_END
 372#endif
 373