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