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