linux/arch/arm/mach-pxa/eseries.c
<<
>>
Prefs
   1/*
   2 * Hardware definitions for the Toshiba eseries PDAs
   3 *
   4 * Copyright (c) 2003 Ian Molton <spyro@f2s.com>
   5 *
   6 * This file is licensed under
   7 * the terms of the GNU General Public License version 2. This program
   8 * is licensed "as is" without any warranty of any kind, whether express
   9 * or implied.
  10 *
  11 */
  12
  13#include <linux/clkdev.h>
  14#include <linux/kernel.h>
  15#include <linux/init.h>
  16#include <linux/clk-provider.h>
  17#include <linux/gpio.h>
  18#include <linux/delay.h>
  19#include <linux/platform_device.h>
  20#include <linux/mfd/tc6387xb.h>
  21#include <linux/mfd/tc6393xb.h>
  22#include <linux/mfd/t7l66xb.h>
  23#include <linux/mtd/nand.h>
  24#include <linux/mtd/partitions.h>
  25#include <linux/usb/gpio_vbus.h>
  26#include <linux/memblock.h>
  27
  28#include <video/w100fb.h>
  29
  30#include <asm/setup.h>
  31#include <asm/mach/arch.h>
  32#include <asm/mach-types.h>
  33
  34#include "pxa25x.h"
  35#include <mach/eseries-gpio.h>
  36#include "eseries-irq.h"
  37#include <mach/audio.h>
  38#include <linux/platform_data/video-pxafb.h>
  39#include "udc.h"
  40#include <linux/platform_data/irda-pxaficp.h>
  41
  42#include "devices.h"
  43#include "generic.h"
  44
  45/* Only e800 has 128MB RAM */
  46void __init eseries_fixup(struct tag *tags, char **cmdline)
  47{
  48        if (machine_is_e800())
  49                memblock_add(0xa0000000, SZ_128M);
  50        else
  51                memblock_add(0xa0000000, SZ_64M);
  52}
  53
  54struct gpio_vbus_mach_info e7xx_udc_info = {
  55        .gpio_vbus   = GPIO_E7XX_USB_DISC,
  56        .gpio_pullup = GPIO_E7XX_USB_PULLUP,
  57        .gpio_pullup_inverted = 1
  58};
  59
  60static struct platform_device e7xx_gpio_vbus __maybe_unused = {
  61        .name   = "gpio-vbus",
  62        .id     = -1,
  63        .dev    = {
  64                .platform_data  = &e7xx_udc_info,
  65        },
  66};
  67
  68struct pxaficp_platform_data e7xx_ficp_platform_data = {
  69        .gpio_pwdown            = GPIO_E7XX_IR_OFF,
  70        .transceiver_cap        = IR_SIRMODE | IR_OFF,
  71};
  72
  73int eseries_tmio_enable(struct platform_device *dev)
  74{
  75        /* Reset - bring SUSPEND high before PCLR */
  76        gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
  77        gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0);
  78        msleep(1);
  79        gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1);
  80        msleep(1);
  81        gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 1);
  82        msleep(1);
  83        return 0;
  84}
  85
  86int eseries_tmio_disable(struct platform_device *dev)
  87{
  88        gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
  89        gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0);
  90        return 0;
  91}
  92
  93int eseries_tmio_suspend(struct platform_device *dev)
  94{
  95        gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
  96        return 0;
  97}
  98
  99int eseries_tmio_resume(struct platform_device *dev)
 100{
 101        gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1);
 102        msleep(1);
 103        return 0;
 104}
 105
 106void eseries_get_tmio_gpios(void)
 107{
 108        gpio_request(GPIO_ESERIES_TMIO_SUSPEND, NULL);
 109        gpio_request(GPIO_ESERIES_TMIO_PCLR, NULL);
 110        gpio_direction_output(GPIO_ESERIES_TMIO_SUSPEND, 0);
 111        gpio_direction_output(GPIO_ESERIES_TMIO_PCLR, 0);
 112}
 113
 114/* TMIO controller uses the same resources on all e-series machines. */
 115struct resource eseries_tmio_resources[] = {
 116        [0] = {
 117                .start  = PXA_CS4_PHYS,
 118                .end    = PXA_CS4_PHYS + 0x1fffff,
 119                .flags  = IORESOURCE_MEM,
 120        },
 121        [1] = {
 122                .start  = PXA_GPIO_TO_IRQ(GPIO_ESERIES_TMIO_IRQ),
 123                .end    = PXA_GPIO_TO_IRQ(GPIO_ESERIES_TMIO_IRQ),
 124                .flags  = IORESOURCE_IRQ,
 125        },
 126};
 127
 128/* Some e-series hardware cannot control the 32K clock */
 129static void __init __maybe_unused eseries_register_clks(void)
 130{
 131        clk_register_fixed_rate(NULL, "CLK_CK32K", NULL, CLK_IS_ROOT, 32768);
 132}
 133
 134#ifdef CONFIG_MACH_E330
 135/* -------------------- e330 tc6387xb parameters -------------------- */
 136
 137static struct tc6387xb_platform_data e330_tc6387xb_info = {
 138        .enable   = &eseries_tmio_enable,
 139        .disable  = &eseries_tmio_disable,
 140        .suspend  = &eseries_tmio_suspend,
 141        .resume   = &eseries_tmio_resume,
 142};
 143
 144static struct platform_device e330_tc6387xb_device = {
 145        .name           = "tc6387xb",
 146        .id             = -1,
 147        .dev            = {
 148                .platform_data = &e330_tc6387xb_info,
 149        },
 150        .num_resources = 2,
 151        .resource      = eseries_tmio_resources,
 152};
 153
 154/* --------------------------------------------------------------- */
 155
 156static struct platform_device *e330_devices[] __initdata = {
 157        &e330_tc6387xb_device,
 158        &e7xx_gpio_vbus,
 159};
 160
 161static void __init e330_init(void)
 162{
 163        pxa_set_ffuart_info(NULL);
 164        pxa_set_btuart_info(NULL);
 165        pxa_set_stuart_info(NULL);
 166        eseries_register_clks();
 167        eseries_get_tmio_gpios();
 168        platform_add_devices(ARRAY_AND_SIZE(e330_devices));
 169}
 170
 171MACHINE_START(E330, "Toshiba e330")
 172        /* Maintainer: Ian Molton (spyro@f2s.com) */
 173        .atag_offset    = 0x100,
 174        .map_io         = pxa25x_map_io,
 175        .nr_irqs        = ESERIES_NR_IRQS,
 176        .init_irq       = pxa25x_init_irq,
 177        .handle_irq     = pxa25x_handle_irq,
 178        .fixup          = eseries_fixup,
 179        .init_machine   = e330_init,
 180        .init_time      = pxa_timer_init,
 181        .restart        = pxa_restart,
 182MACHINE_END
 183#endif
 184
 185#ifdef CONFIG_MACH_E350
 186/* -------------------- e350 t7l66xb parameters -------------------- */
 187
 188static struct t7l66xb_platform_data e350_t7l66xb_info = {
 189        .irq_base               = IRQ_BOARD_START,
 190        .enable                 = &eseries_tmio_enable,
 191        .suspend                = &eseries_tmio_suspend,
 192        .resume                 = &eseries_tmio_resume,
 193};
 194
 195static struct platform_device e350_t7l66xb_device = {
 196        .name           = "t7l66xb",
 197        .id             = -1,
 198        .dev            = {
 199                .platform_data = &e350_t7l66xb_info,
 200        },
 201        .num_resources = 2,
 202        .resource      = eseries_tmio_resources,
 203};
 204
 205/* ---------------------------------------------------------- */
 206
 207static struct platform_device *e350_devices[] __initdata = {
 208        &e350_t7l66xb_device,
 209        &e7xx_gpio_vbus,
 210};
 211
 212static void __init e350_init(void)
 213{
 214        pxa_set_ffuart_info(NULL);
 215        pxa_set_btuart_info(NULL);
 216        pxa_set_stuart_info(NULL);
 217        eseries_register_clks();
 218        eseries_get_tmio_gpios();
 219        platform_add_devices(ARRAY_AND_SIZE(e350_devices));
 220}
 221
 222MACHINE_START(E350, "Toshiba e350")
 223        /* Maintainer: Ian Molton (spyro@f2s.com) */
 224        .atag_offset    = 0x100,
 225        .map_io         = pxa25x_map_io,
 226        .nr_irqs        = ESERIES_NR_IRQS,
 227        .init_irq       = pxa25x_init_irq,
 228        .handle_irq     = pxa25x_handle_irq,
 229        .fixup          = eseries_fixup,
 230        .init_machine   = e350_init,
 231        .init_time      = pxa_timer_init,
 232        .restart        = pxa_restart,
 233MACHINE_END
 234#endif
 235
 236#ifdef CONFIG_MACH_E400
 237/* ------------------------ E400 LCD definitions ------------------------ */
 238
 239static struct pxafb_mode_info e400_pxafb_mode_info = {
 240        .pixclock       = 140703,
 241        .xres           = 240,
 242        .yres           = 320,
 243        .bpp            = 16,
 244        .hsync_len      = 4,
 245        .left_margin    = 28,
 246        .right_margin   = 8,
 247        .vsync_len      = 3,
 248        .upper_margin   = 5,
 249        .lower_margin   = 6,
 250        .sync           = 0,
 251};
 252
 253static struct pxafb_mach_info e400_pxafb_mach_info = {
 254        .modes          = &e400_pxafb_mode_info,
 255        .num_modes      = 1,
 256        .lcd_conn       = LCD_COLOR_TFT_16BPP,
 257        .lccr3          = 0,
 258        .pxafb_backlight_power  = NULL,
 259};
 260
 261/* ------------------------ E400 MFP config ----------------------------- */
 262
 263static unsigned long e400_pin_config[] __initdata = {
 264        /* Chip selects */
 265        GPIO15_nCS_1,   /* CS1 - Flash */
 266        GPIO80_nCS_4,   /* CS4 - TMIO */
 267
 268        /* Clocks */
 269        GPIO12_32KHz,
 270
 271        /* BTUART */
 272        GPIO42_BTUART_RXD,
 273        GPIO43_BTUART_TXD,
 274        GPIO44_BTUART_CTS,
 275
 276        /* TMIO controller */
 277        GPIO19_GPIO, /* t7l66xb #PCLR */
 278        GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
 279
 280        /* wakeup */
 281        GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
 282};
 283
 284/* ---------------------------------------------------------------------- */
 285
 286static struct mtd_partition partition_a = {
 287        .name = "Internal NAND flash",
 288        .offset =  0,
 289        .size =  MTDPART_SIZ_FULL,
 290};
 291
 292static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
 293
 294static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
 295        .options = 0,
 296        .offs = 4,
 297        .len = 2,
 298        .pattern = scan_ff_pattern
 299};
 300
 301static struct tmio_nand_data e400_t7l66xb_nand_config = {
 302        .num_partitions = 1,
 303        .partition = &partition_a,
 304        .badblock_pattern = &e400_t7l66xb_nand_bbt,
 305};
 306
 307static struct t7l66xb_platform_data e400_t7l66xb_info = {
 308        .irq_base               = IRQ_BOARD_START,
 309        .enable                 = &eseries_tmio_enable,
 310        .suspend                = &eseries_tmio_suspend,
 311        .resume                 = &eseries_tmio_resume,
 312
 313        .nand_data              = &e400_t7l66xb_nand_config,
 314};
 315
 316static struct platform_device e400_t7l66xb_device = {
 317        .name           = "t7l66xb",
 318        .id             = -1,
 319        .dev            = {
 320                .platform_data = &e400_t7l66xb_info,
 321        },
 322        .num_resources = 2,
 323        .resource      = eseries_tmio_resources,
 324};
 325
 326/* ---------------------------------------------------------- */
 327
 328static struct platform_device *e400_devices[] __initdata = {
 329        &e400_t7l66xb_device,
 330        &e7xx_gpio_vbus,
 331};
 332
 333static void __init e400_init(void)
 334{
 335        pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
 336        pxa_set_ffuart_info(NULL);
 337        pxa_set_btuart_info(NULL);
 338        pxa_set_stuart_info(NULL);
 339        /* Fixme - e400 may have a switched clock */
 340        eseries_register_clks();
 341        eseries_get_tmio_gpios();
 342        pxa_set_fb_info(NULL, &e400_pxafb_mach_info);
 343        platform_add_devices(ARRAY_AND_SIZE(e400_devices));
 344}
 345
 346MACHINE_START(E400, "Toshiba e400")
 347        /* Maintainer: Ian Molton (spyro@f2s.com) */
 348        .atag_offset    = 0x100,
 349        .map_io         = pxa25x_map_io,
 350        .nr_irqs        = ESERIES_NR_IRQS,
 351        .init_irq       = pxa25x_init_irq,
 352        .handle_irq     = pxa25x_handle_irq,
 353        .fixup          = eseries_fixup,
 354        .init_machine   = e400_init,
 355        .init_time      = pxa_timer_init,
 356        .restart        = pxa_restart,
 357MACHINE_END
 358#endif
 359
 360#ifdef CONFIG_MACH_E740
 361/* ------------------------ e740 video support --------------------------- */
 362
 363static struct w100_gen_regs e740_lcd_regs = {
 364        .lcd_format =            0x00008023,
 365        .lcdd_cntl1 =            0x0f000000,
 366        .lcdd_cntl2 =            0x0003ffff,
 367        .genlcd_cntl1 =          0x00ffff03,
 368        .genlcd_cntl2 =          0x003c0f03,
 369        .genlcd_cntl3 =          0x000143aa,
 370};
 371
 372static struct w100_mode e740_lcd_mode = {
 373        .xres            = 240,
 374        .yres            = 320,
 375        .left_margin     = 20,
 376        .right_margin    = 28,
 377        .upper_margin    = 9,
 378        .lower_margin    = 8,
 379        .crtc_ss         = 0x80140013,
 380        .crtc_ls         = 0x81150110,
 381        .crtc_gs         = 0x80050005,
 382        .crtc_vpos_gs    = 0x000a0009,
 383        .crtc_rev        = 0x0040010a,
 384        .crtc_dclk       = 0xa906000a,
 385        .crtc_gclk       = 0x80050108,
 386        .crtc_goe        = 0x80050108,
 387        .pll_freq        = 57,
 388        .pixclk_divider         = 4,
 389        .pixclk_divider_rotated = 4,
 390        .pixclk_src     = CLK_SRC_XTAL,
 391        .sysclk_divider  = 1,
 392        .sysclk_src     = CLK_SRC_PLL,
 393        .crtc_ps1_active =       0x41060010,
 394};
 395
 396static struct w100_gpio_regs e740_w100_gpio_info = {
 397        .init_data1 = 0x21002103,
 398        .gpio_dir1  = 0xffffdeff,
 399        .gpio_oe1   = 0x03c00643,
 400        .init_data2 = 0x003f003f,
 401        .gpio_dir2  = 0xffffffff,
 402        .gpio_oe2   = 0x000000ff,
 403};
 404
 405static struct w100fb_mach_info e740_fb_info = {
 406        .modelist   = &e740_lcd_mode,
 407        .num_modes  = 1,
 408        .regs       = &e740_lcd_regs,
 409        .gpio       = &e740_w100_gpio_info,
 410        .xtal_freq = 14318000,
 411        .xtal_dbl   = 1,
 412};
 413
 414static struct resource e740_fb_resources[] = {
 415        [0] = {
 416                .start          = 0x0c000000,
 417                .end            = 0x0cffffff,
 418                .flags          = IORESOURCE_MEM,
 419        },
 420};
 421
 422static struct platform_device e740_fb_device = {
 423        .name           = "w100fb",
 424        .id             = -1,
 425        .dev            = {
 426                .platform_data  = &e740_fb_info,
 427        },
 428        .num_resources  = ARRAY_SIZE(e740_fb_resources),
 429        .resource       = e740_fb_resources,
 430};
 431
 432/* --------------------------- MFP Pin config -------------------------- */
 433
 434static unsigned long e740_pin_config[] __initdata = {
 435        /* Chip selects */
 436        GPIO15_nCS_1,   /* CS1 - Flash */
 437        GPIO79_nCS_3,   /* CS3 - IMAGEON */
 438        GPIO80_nCS_4,   /* CS4 - TMIO */
 439
 440        /* Clocks */
 441        GPIO12_32KHz,
 442
 443        /* BTUART */
 444        GPIO42_BTUART_RXD,
 445        GPIO43_BTUART_TXD,
 446        GPIO44_BTUART_CTS,
 447
 448        /* TMIO controller */
 449        GPIO19_GPIO, /* t7l66xb #PCLR */
 450        GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
 451
 452        /* UDC */
 453        GPIO13_GPIO,
 454        GPIO3_GPIO,
 455
 456        /* IrDA */
 457        GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
 458
 459        /* AC97 */
 460        GPIO28_AC97_BITCLK,
 461        GPIO29_AC97_SDATA_IN_0,
 462        GPIO30_AC97_SDATA_OUT,
 463        GPIO31_AC97_SYNC,
 464
 465        /* Audio power control */
 466        GPIO16_GPIO,  /* AC97 codec AVDD2 supply (analogue power) */
 467        GPIO40_GPIO,  /* Mic amp power */
 468        GPIO41_GPIO,  /* Headphone amp power */
 469
 470        /* PC Card */
 471        GPIO8_GPIO,   /* CD0 */
 472        GPIO44_GPIO,  /* CD1 */
 473        GPIO11_GPIO,  /* IRQ0 */
 474        GPIO6_GPIO,   /* IRQ1 */
 475        GPIO27_GPIO,  /* RST0 */
 476        GPIO24_GPIO,  /* RST1 */
 477        GPIO20_GPIO,  /* PWR0 */
 478        GPIO23_GPIO,  /* PWR1 */
 479        GPIO48_nPOE,
 480        GPIO49_nPWE,
 481        GPIO50_nPIOR,
 482        GPIO51_nPIOW,
 483        GPIO52_nPCE_1,
 484        GPIO53_nPCE_2,
 485        GPIO54_nPSKTSEL,
 486        GPIO55_nPREG,
 487        GPIO56_nPWAIT,
 488        GPIO57_nIOIS16,
 489
 490        /* wakeup */
 491        GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
 492};
 493
 494/* -------------------- e740 t7l66xb parameters -------------------- */
 495
 496static struct t7l66xb_platform_data e740_t7l66xb_info = {
 497        .irq_base               = IRQ_BOARD_START,
 498        .enable                 = &eseries_tmio_enable,
 499        .suspend                = &eseries_tmio_suspend,
 500        .resume                 = &eseries_tmio_resume,
 501};
 502
 503static struct platform_device e740_t7l66xb_device = {
 504        .name           = "t7l66xb",
 505        .id             = -1,
 506        .dev            = {
 507                .platform_data = &e740_t7l66xb_info,
 508        },
 509        .num_resources = 2,
 510        .resource      = eseries_tmio_resources,
 511};
 512
 513static struct platform_device e740_audio_device = {
 514        .name           = "e740-audio",
 515        .id             = -1,
 516};
 517
 518/* ----------------------------------------------------------------------- */
 519
 520static struct platform_device *e740_devices[] __initdata = {
 521        &e740_fb_device,
 522        &e740_t7l66xb_device,
 523        &e7xx_gpio_vbus,
 524        &e740_audio_device,
 525};
 526
 527static void __init e740_init(void)
 528{
 529        pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
 530        pxa_set_ffuart_info(NULL);
 531        pxa_set_btuart_info(NULL);
 532        pxa_set_stuart_info(NULL);
 533        eseries_register_clks();
 534        clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
 535                        "UDCCLK", &pxa25x_device_udc.dev),
 536        eseries_get_tmio_gpios();
 537        platform_add_devices(ARRAY_AND_SIZE(e740_devices));
 538        pxa_set_ac97_info(NULL);
 539        pxa_set_ficp_info(&e7xx_ficp_platform_data);
 540}
 541
 542MACHINE_START(E740, "Toshiba e740")
 543        /* Maintainer: Ian Molton (spyro@f2s.com) */
 544        .atag_offset    = 0x100,
 545        .map_io         = pxa25x_map_io,
 546        .nr_irqs        = ESERIES_NR_IRQS,
 547        .init_irq       = pxa25x_init_irq,
 548        .handle_irq     = pxa25x_handle_irq,
 549        .fixup          = eseries_fixup,
 550        .init_machine   = e740_init,
 551        .init_time      = pxa_timer_init,
 552        .restart        = pxa_restart,
 553MACHINE_END
 554#endif
 555
 556#ifdef CONFIG_MACH_E750
 557/* ---------------------- E750 LCD definitions -------------------- */
 558
 559static struct w100_gen_regs e750_lcd_regs = {
 560        .lcd_format =            0x00008003,
 561        .lcdd_cntl1 =            0x00000000,
 562        .lcdd_cntl2 =            0x0003ffff,
 563        .genlcd_cntl1 =          0x00fff003,
 564        .genlcd_cntl2 =          0x003c0f03,
 565        .genlcd_cntl3 =          0x000143aa,
 566};
 567
 568static struct w100_mode e750_lcd_mode = {
 569        .xres            = 240,
 570        .yres            = 320,
 571        .left_margin     = 21,
 572        .right_margin    = 22,
 573        .upper_margin    = 5,
 574        .lower_margin    = 4,
 575        .crtc_ss         = 0x80150014,
 576        .crtc_ls         = 0x8014000d,
 577        .crtc_gs         = 0xc1000005,
 578        .crtc_vpos_gs    = 0x00020147,
 579        .crtc_rev        = 0x0040010a,
 580        .crtc_dclk       = 0xa1700030,
 581        .crtc_gclk       = 0x80cc0015,
 582        .crtc_goe        = 0x80cc0015,
 583        .crtc_ps1_active = 0x61060017,
 584        .pll_freq        = 57,
 585        .pixclk_divider         = 4,
 586        .pixclk_divider_rotated = 4,
 587        .pixclk_src     = CLK_SRC_XTAL,
 588        .sysclk_divider  = 1,
 589        .sysclk_src     = CLK_SRC_PLL,
 590};
 591
 592static struct w100_gpio_regs e750_w100_gpio_info = {
 593        .init_data1 = 0x01192f1b,
 594        .gpio_dir1  = 0xd5ffdeff,
 595        .gpio_oe1   = 0x000020bf,
 596        .init_data2 = 0x010f010f,
 597        .gpio_dir2  = 0xffffffff,
 598        .gpio_oe2   = 0x000001cf,
 599};
 600
 601static struct w100fb_mach_info e750_fb_info = {
 602        .modelist   = &e750_lcd_mode,
 603        .num_modes  = 1,
 604        .regs       = &e750_lcd_regs,
 605        .gpio       = &e750_w100_gpio_info,
 606        .xtal_freq  = 14318000,
 607        .xtal_dbl   = 1,
 608};
 609
 610static struct resource e750_fb_resources[] = {
 611        [0] = {
 612                .start          = 0x0c000000,
 613                .end            = 0x0cffffff,
 614                .flags          = IORESOURCE_MEM,
 615        },
 616};
 617
 618static struct platform_device e750_fb_device = {
 619        .name           = "w100fb",
 620        .id             = -1,
 621        .dev            = {
 622                .platform_data  = &e750_fb_info,
 623        },
 624        .num_resources  = ARRAY_SIZE(e750_fb_resources),
 625        .resource       = e750_fb_resources,
 626};
 627
 628/* -------------------- e750 MFP parameters -------------------- */
 629
 630static unsigned long e750_pin_config[] __initdata = {
 631        /* Chip selects */
 632        GPIO15_nCS_1,   /* CS1 - Flash */
 633        GPIO79_nCS_3,   /* CS3 - IMAGEON */
 634        GPIO80_nCS_4,   /* CS4 - TMIO */
 635
 636        /* Clocks */
 637        GPIO11_3_6MHz,
 638
 639        /* BTUART */
 640        GPIO42_BTUART_RXD,
 641        GPIO43_BTUART_TXD,
 642        GPIO44_BTUART_CTS,
 643
 644        /* TMIO controller */
 645        GPIO19_GPIO, /* t7l66xb #PCLR */
 646        GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
 647
 648        /* UDC */
 649        GPIO13_GPIO,
 650        GPIO3_GPIO,
 651
 652        /* IrDA */
 653        GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
 654
 655        /* AC97 */
 656        GPIO28_AC97_BITCLK,
 657        GPIO29_AC97_SDATA_IN_0,
 658        GPIO30_AC97_SDATA_OUT,
 659        GPIO31_AC97_SYNC,
 660
 661        /* Audio power control */
 662        GPIO4_GPIO,  /* Headphone amp power */
 663        GPIO7_GPIO,  /* Speaker amp power */
 664        GPIO37_GPIO, /* Headphone detect */
 665
 666        /* PC Card */
 667        GPIO8_GPIO,   /* CD0 */
 668        GPIO44_GPIO,  /* CD1 */
 669        /* GPIO11_GPIO,  IRQ0 */
 670        GPIO6_GPIO,   /* IRQ1 */
 671        GPIO27_GPIO,  /* RST0 */
 672        GPIO24_GPIO,  /* RST1 */
 673        GPIO20_GPIO,  /* PWR0 */
 674        GPIO23_GPIO,  /* PWR1 */
 675        GPIO48_nPOE,
 676        GPIO49_nPWE,
 677        GPIO50_nPIOR,
 678        GPIO51_nPIOW,
 679        GPIO52_nPCE_1,
 680        GPIO53_nPCE_2,
 681        GPIO54_nPSKTSEL,
 682        GPIO55_nPREG,
 683        GPIO56_nPWAIT,
 684        GPIO57_nIOIS16,
 685
 686        /* wakeup */
 687        GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
 688};
 689
 690/* ----------------- e750 tc6393xb parameters ------------------ */
 691
 692static struct tc6393xb_platform_data e750_tc6393xb_info = {
 693        .irq_base       = IRQ_BOARD_START,
 694        .scr_pll2cr     = 0x0cc1,
 695        .scr_gper       = 0,
 696        .gpio_base      = -1,
 697        .suspend        = &eseries_tmio_suspend,
 698        .resume         = &eseries_tmio_resume,
 699        .enable         = &eseries_tmio_enable,
 700        .disable        = &eseries_tmio_disable,
 701};
 702
 703static struct platform_device e750_tc6393xb_device = {
 704        .name           = "tc6393xb",
 705        .id             = -1,
 706        .dev            = {
 707                .platform_data = &e750_tc6393xb_info,
 708        },
 709        .num_resources = 2,
 710        .resource      = eseries_tmio_resources,
 711};
 712
 713static struct platform_device e750_audio_device = {
 714        .name           = "e750-audio",
 715        .id             = -1,
 716};
 717
 718/* ------------------------------------------------------------- */
 719
 720static struct platform_device *e750_devices[] __initdata = {
 721        &e750_fb_device,
 722        &e750_tc6393xb_device,
 723        &e7xx_gpio_vbus,
 724        &e750_audio_device,
 725};
 726
 727static void __init e750_init(void)
 728{
 729        pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
 730        pxa_set_ffuart_info(NULL);
 731        pxa_set_btuart_info(NULL);
 732        pxa_set_stuart_info(NULL);
 733        clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
 734                        "GPIO11_CLK", NULL),
 735        eseries_get_tmio_gpios();
 736        platform_add_devices(ARRAY_AND_SIZE(e750_devices));
 737        pxa_set_ac97_info(NULL);
 738        pxa_set_ficp_info(&e7xx_ficp_platform_data);
 739}
 740
 741MACHINE_START(E750, "Toshiba e750")
 742        /* Maintainer: Ian Molton (spyro@f2s.com) */
 743        .atag_offset    = 0x100,
 744        .map_io         = pxa25x_map_io,
 745        .nr_irqs        = ESERIES_NR_IRQS,
 746        .init_irq       = pxa25x_init_irq,
 747        .handle_irq     = pxa25x_handle_irq,
 748        .fixup          = eseries_fixup,
 749        .init_machine   = e750_init,
 750        .init_time      = pxa_timer_init,
 751        .restart        = pxa_restart,
 752MACHINE_END
 753#endif
 754
 755#ifdef CONFIG_MACH_E800
 756/* ------------------------ e800 LCD definitions ------------------------- */
 757
 758static unsigned long e800_pin_config[] __initdata = {
 759        /* AC97 */
 760        GPIO28_AC97_BITCLK,
 761        GPIO29_AC97_SDATA_IN_0,
 762        GPIO30_AC97_SDATA_OUT,
 763        GPIO31_AC97_SYNC,
 764
 765        /* tc6393xb */
 766        GPIO11_3_6MHz,
 767};
 768
 769static struct w100_gen_regs e800_lcd_regs = {
 770        .lcd_format =            0x00008003,
 771        .lcdd_cntl1 =            0x02a00000,
 772        .lcdd_cntl2 =            0x0003ffff,
 773        .genlcd_cntl1 =          0x000ff2a3,
 774        .genlcd_cntl2 =          0x000002a3,
 775        .genlcd_cntl3 =          0x000102aa,
 776};
 777
 778static struct w100_mode e800_lcd_mode[2] = {
 779        [0] = {
 780                .xres            = 480,
 781                .yres            = 640,
 782                .left_margin     = 52,
 783                .right_margin    = 148,
 784                .upper_margin    = 2,
 785                .lower_margin    = 6,
 786                .crtc_ss         = 0x80350034,
 787                .crtc_ls         = 0x802b0026,
 788                .crtc_gs         = 0x80160016,
 789                .crtc_vpos_gs    = 0x00020003,
 790                .crtc_rev        = 0x0040001d,
 791                .crtc_dclk       = 0xe0000000,
 792                .crtc_gclk       = 0x82a50049,
 793                .crtc_goe        = 0x80ee001c,
 794                .crtc_ps1_active = 0x00000000,
 795                .pll_freq        = 128,
 796                .pixclk_divider         = 4,
 797                .pixclk_divider_rotated = 6,
 798                .pixclk_src     = CLK_SRC_PLL,
 799                .sysclk_divider  = 0,
 800                .sysclk_src     = CLK_SRC_PLL,
 801        },
 802        [1] = {
 803                .xres            = 240,
 804                .yres            = 320,
 805                .left_margin     = 15,
 806                .right_margin    = 88,
 807                .upper_margin    = 0,
 808                .lower_margin    = 7,
 809                .crtc_ss         = 0xd010000f,
 810                .crtc_ls         = 0x80070003,
 811                .crtc_gs         = 0x80000000,
 812                .crtc_vpos_gs    = 0x01460147,
 813                .crtc_rev        = 0x00400003,
 814                .crtc_dclk       = 0xa1700030,
 815                .crtc_gclk       = 0x814b0008,
 816                .crtc_goe        = 0x80cc0015,
 817                .crtc_ps1_active = 0x00000000,
 818                .pll_freq        = 100,
 819                .pixclk_divider         = 6, /* Wince uses 14 which gives a */
 820                .pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
 821                .pixclk_src     = CLK_SRC_PLL,
 822                .sysclk_divider  = 0,
 823                .sysclk_src     = CLK_SRC_PLL,
 824        }
 825};
 826
 827
 828static struct w100_gpio_regs e800_w100_gpio_info = {
 829        .init_data1 = 0xc13fc019,
 830        .gpio_dir1  = 0x3e40df7f,
 831        .gpio_oe1   = 0x003c3000,
 832        .init_data2 = 0x00000000,
 833        .gpio_dir2  = 0x00000000,
 834        .gpio_oe2   = 0x00000000,
 835};
 836
 837static struct w100_mem_info e800_w100_mem_info = {
 838        .ext_cntl        = 0x09640011,
 839        .sdram_mode_reg  = 0x00600021,
 840        .ext_timing_cntl = 0x10001545,
 841        .io_cntl         = 0x7ddd7333,
 842        .size            = 0x1fffff,
 843};
 844
 845static void e800_tg_change(struct w100fb_par *par)
 846{
 847        unsigned long tmp;
 848
 849        tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
 850        if (par->mode->xres == 480)
 851                tmp |= 0x100;
 852        else
 853                tmp &= ~0x100;
 854        w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
 855}
 856
 857static struct w100_tg_info e800_tg_info = {
 858        .change = e800_tg_change,
 859};
 860
 861static struct w100fb_mach_info e800_fb_info = {
 862        .modelist   = e800_lcd_mode,
 863        .num_modes  = 2,
 864        .regs       = &e800_lcd_regs,
 865        .gpio       = &e800_w100_gpio_info,
 866        .mem        = &e800_w100_mem_info,
 867        .tg         = &e800_tg_info,
 868        .xtal_freq  = 16000000,
 869};
 870
 871static struct resource e800_fb_resources[] = {
 872        [0] = {
 873                .start          = 0x0c000000,
 874                .end            = 0x0cffffff,
 875                .flags          = IORESOURCE_MEM,
 876        },
 877};
 878
 879static struct platform_device e800_fb_device = {
 880        .name           = "w100fb",
 881        .id             = -1,
 882        .dev            = {
 883                .platform_data  = &e800_fb_info,
 884        },
 885        .num_resources  = ARRAY_SIZE(e800_fb_resources),
 886        .resource       = e800_fb_resources,
 887};
 888
 889/* --------------------------- UDC definitions --------------------------- */
 890
 891static struct gpio_vbus_mach_info e800_udc_info = {
 892        .gpio_vbus   = GPIO_E800_USB_DISC,
 893        .gpio_pullup = GPIO_E800_USB_PULLUP,
 894        .gpio_pullup_inverted = 1
 895};
 896
 897static struct platform_device e800_gpio_vbus = {
 898        .name   = "gpio-vbus",
 899        .id     = -1,
 900        .dev    = {
 901                .platform_data  = &e800_udc_info,
 902        },
 903};
 904
 905
 906/* ----------------- e800 tc6393xb parameters ------------------ */
 907
 908static struct tc6393xb_platform_data e800_tc6393xb_info = {
 909        .irq_base       = IRQ_BOARD_START,
 910        .scr_pll2cr     = 0x0cc1,
 911        .scr_gper       = 0,
 912        .gpio_base      = -1,
 913        .suspend        = &eseries_tmio_suspend,
 914        .resume         = &eseries_tmio_resume,
 915        .enable         = &eseries_tmio_enable,
 916        .disable        = &eseries_tmio_disable,
 917};
 918
 919static struct platform_device e800_tc6393xb_device = {
 920        .name           = "tc6393xb",
 921        .id             = -1,
 922        .dev            = {
 923                .platform_data = &e800_tc6393xb_info,
 924        },
 925        .num_resources = 2,
 926        .resource      = eseries_tmio_resources,
 927};
 928
 929static struct platform_device e800_audio_device = {
 930        .name           = "e800-audio",
 931        .id             = -1,
 932};
 933
 934/* ----------------------------------------------------------------------- */
 935
 936static struct platform_device *e800_devices[] __initdata = {
 937        &e800_fb_device,
 938        &e800_tc6393xb_device,
 939        &e800_gpio_vbus,
 940        &e800_audio_device,
 941};
 942
 943static void __init e800_init(void)
 944{
 945        pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
 946        pxa_set_ffuart_info(NULL);
 947        pxa_set_btuart_info(NULL);
 948        pxa_set_stuart_info(NULL);
 949        clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
 950                        "GPIO11_CLK", NULL),
 951        eseries_get_tmio_gpios();
 952        platform_add_devices(ARRAY_AND_SIZE(e800_devices));
 953        pxa_set_ac97_info(NULL);
 954}
 955
 956MACHINE_START(E800, "Toshiba e800")
 957        /* Maintainer: Ian Molton (spyro@f2s.com) */
 958        .atag_offset    = 0x100,
 959        .map_io         = pxa25x_map_io,
 960        .nr_irqs        = ESERIES_NR_IRQS,
 961        .init_irq       = pxa25x_init_irq,
 962        .handle_irq     = pxa25x_handle_irq,
 963        .fixup          = eseries_fixup,
 964        .init_machine   = e800_init,
 965        .init_time      = pxa_timer_init,
 966        .restart        = pxa_restart,
 967MACHINE_END
 968#endif
 969