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