tosa.c (21481B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Support for Sharp SL-C6000x PDAs 4 * Model: (Tosa) 5 * 6 * Copyright (c) 2005 Dirk Opfer 7 * 8 * Based on code written by Sharp/Lineo for 2.4 kernels 9 */ 10 11#include <linux/clkdev.h> 12#include <linux/kernel.h> 13#include <linux/init.h> 14#include <linux/platform_device.h> 15#include <linux/major.h> 16#include <linux/fs.h> 17#include <linux/interrupt.h> 18#include <linux/delay.h> 19#include <linux/fb.h> 20#include <linux/mmc/host.h> 21#include <linux/mfd/tc6393xb.h> 22#include <linux/mfd/tmio.h> 23#include <linux/mtd/rawnand.h> 24#include <linux/mtd/partitions.h> 25#include <linux/mtd/physmap.h> 26#include <linux/pm.h> 27#include <linux/gpio_keys.h> 28#include <linux/input.h> 29#include <linux/gpio.h> 30#include <linux/gpio/machine.h> 31#include <linux/power/gpio-charger.h> 32#include <linux/spi/spi.h> 33#include <linux/spi/pxa2xx_spi.h> 34#include <linux/input/matrix_keypad.h> 35#include <linux/platform_data/i2c-pxa.h> 36#include <linux/reboot.h> 37#include <linux/memblock.h> 38 39#include <asm/setup.h> 40#include <asm/mach-types.h> 41 42#include "pxa25x.h" 43#include "reset.h" 44#include <linux/platform_data/irda-pxaficp.h> 45#include <linux/platform_data/mmc-pxamci.h> 46#include "udc.h" 47#include "tosa_bt.h" 48#include <linux/platform_data/asoc-pxa.h> 49#include "smemc.h" 50 51#include <asm/mach/arch.h> 52#include "tosa.h" 53 54#include <asm/hardware/scoop.h> 55#include <asm/mach/sharpsl_param.h> 56 57#include "generic.h" 58#include "devices.h" 59 60static unsigned long tosa_pin_config[] = { 61 GPIO78_nCS_2, /* Scoop */ 62 GPIO80_nCS_4, /* tg6393xb */ 63 GPIO33_nCS_5, /* Scoop */ 64 65 // GPIO76 CARD_VCC_ON1 66 67 GPIO19_GPIO, /* Reset out */ 68 GPIO1_RST | WAKEUP_ON_EDGE_FALL, 69 70 GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* WAKE_UP */ 71 GPIO2_GPIO | WAKEUP_ON_EDGE_BOTH, /* AC_IN */ 72 GPIO3_GPIO | WAKEUP_ON_EDGE_FALL, /* RECORD */ 73 GPIO4_GPIO | WAKEUP_ON_EDGE_FALL, /* SYNC */ 74 GPIO20_GPIO, /* EAR_IN */ 75 GPIO22_GPIO, /* On */ 76 77 GPIO5_GPIO, /* USB_IN */ 78 GPIO32_GPIO, /* Pen IRQ */ 79 80 GPIO7_GPIO, /* Jacket Detect */ 81 GPIO14_GPIO, /* BAT0_CRG */ 82 GPIO12_GPIO, /* BAT1_CRG */ 83 GPIO17_GPIO, /* BAT0_LOW */ 84 GPIO84_GPIO, /* BAT1_LOW */ 85 GPIO38_GPIO, /* BAT_LOCK */ 86 87 GPIO11_3_6MHz, 88 GPIO15_GPIO, /* TC6393XB IRQ */ 89 GPIO18_RDY, 90 GPIO27_GPIO, /* LCD Sync */ 91 92 /* MMC */ 93 GPIO6_MMC_CLK, 94 GPIO8_MMC_CS0, 95 GPIO9_GPIO, /* Detect */ 96 GPIO10_GPIO, /* nSD_INT */ 97 98 /* CF */ 99 GPIO13_GPIO, /* CD_IRQ */ 100 GPIO21_GPIO, /* Main Slot IRQ */ 101 GPIO36_GPIO, /* Jacket Slot IRQ */ 102 GPIO48_nPOE, 103 GPIO49_nPWE, 104 GPIO50_nPIOR, 105 GPIO51_nPIOW, 106 GPIO52_nPCE_1, 107 GPIO53_nPCE_2, 108 GPIO54_nPSKTSEL, 109 GPIO55_nPREG, 110 GPIO56_nPWAIT, 111 GPIO57_nIOIS16, 112 113 /* AC97 */ 114 GPIO31_AC97_SYNC, 115 GPIO30_AC97_SDATA_OUT, 116 GPIO28_AC97_BITCLK, 117 GPIO29_AC97_SDATA_IN_0, 118 // GPIO79 nAUD_IRQ 119 120 /* FFUART */ 121 GPIO34_FFUART_RXD, 122 GPIO35_FFUART_CTS, 123 GPIO37_FFUART_DSR, 124 GPIO39_FFUART_TXD, 125 GPIO40_FFUART_DTR, 126 GPIO41_FFUART_RTS, 127 128 /* BTUART */ 129 GPIO42_BTUART_RXD, 130 GPIO43_BTUART_TXD, 131 GPIO44_BTUART_CTS, 132 GPIO45_BTUART_RTS, 133 134 /* Keybd */ 135 GPIO58_GPIO | MFP_LPM_DRIVE_LOW, /* Column 0 */ 136 GPIO59_GPIO | MFP_LPM_DRIVE_LOW, /* Column 1 */ 137 GPIO60_GPIO | MFP_LPM_DRIVE_LOW, /* Column 2 */ 138 GPIO61_GPIO | MFP_LPM_DRIVE_LOW, /* Column 3 */ 139 GPIO62_GPIO | MFP_LPM_DRIVE_LOW, /* Column 4 */ 140 GPIO63_GPIO | MFP_LPM_DRIVE_LOW, /* Column 5 */ 141 GPIO64_GPIO | MFP_LPM_DRIVE_LOW, /* Column 6 */ 142 GPIO65_GPIO | MFP_LPM_DRIVE_LOW, /* Column 7 */ 143 GPIO66_GPIO | MFP_LPM_DRIVE_LOW, /* Column 8 */ 144 GPIO67_GPIO | MFP_LPM_DRIVE_LOW, /* Column 9 */ 145 GPIO68_GPIO | MFP_LPM_DRIVE_LOW, /* Column 10 */ 146 GPIO69_GPIO | MFP_LPM_DRIVE_LOW, /* Row 0 */ 147 GPIO70_GPIO | MFP_LPM_DRIVE_LOW, /* Row 1 */ 148 GPIO71_GPIO | MFP_LPM_DRIVE_LOW, /* Row 2 */ 149 GPIO72_GPIO | MFP_LPM_DRIVE_LOW, /* Row 3 */ 150 GPIO73_GPIO | MFP_LPM_DRIVE_LOW, /* Row 4 */ 151 GPIO74_GPIO | MFP_LPM_DRIVE_LOW, /* Row 5 */ 152 GPIO75_GPIO | MFP_LPM_DRIVE_LOW, /* Row 6 */ 153 154 /* SPI */ 155 GPIO81_SSP2_CLK_OUT, 156 GPIO82_SSP2_FRM_OUT, 157 GPIO83_SSP2_TXD, 158 159 /* IrDA is managed in other way */ 160 GPIO46_GPIO, 161 GPIO47_GPIO, 162}; 163 164/* 165 * SCOOP Device 166 */ 167static struct resource tosa_scoop_resources[] = { 168 [0] = { 169 .start = TOSA_CF_PHYS, 170 .end = TOSA_CF_PHYS + 0xfff, 171 .flags = IORESOURCE_MEM, 172 }, 173}; 174 175static struct scoop_config tosa_scoop_setup = { 176 .io_dir = TOSA_SCOOP_IO_DIR, 177 .gpio_base = TOSA_SCOOP_GPIO_BASE, 178}; 179 180static struct platform_device tosascoop_device = { 181 .name = "sharp-scoop", 182 .id = 0, 183 .dev = { 184 .platform_data = &tosa_scoop_setup, 185 }, 186 .num_resources = ARRAY_SIZE(tosa_scoop_resources), 187 .resource = tosa_scoop_resources, 188}; 189 190 191/* 192 * SCOOP Device Jacket 193 */ 194static struct resource tosa_scoop_jc_resources[] = { 195 [0] = { 196 .start = TOSA_SCOOP_PHYS + 0x40, 197 .end = TOSA_SCOOP_PHYS + 0xfff, 198 .flags = IORESOURCE_MEM, 199 }, 200}; 201 202static struct scoop_config tosa_scoop_jc_setup = { 203 .io_dir = TOSA_SCOOP_JC_IO_DIR, 204 .gpio_base = TOSA_SCOOP_JC_GPIO_BASE, 205}; 206 207static struct platform_device tosascoop_jc_device = { 208 .name = "sharp-scoop", 209 .id = 1, 210 .dev = { 211 .platform_data = &tosa_scoop_jc_setup, 212 .parent = &tosascoop_device.dev, 213 }, 214 .num_resources = ARRAY_SIZE(tosa_scoop_jc_resources), 215 .resource = tosa_scoop_jc_resources, 216}; 217 218/* 219 * PCMCIA 220 */ 221static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = { 222{ 223 .dev = &tosascoop_device.dev, 224 .irq = TOSA_IRQ_GPIO_CF_IRQ, 225 .cd_irq = TOSA_IRQ_GPIO_CF_CD, 226 .cd_irq_str = "PCMCIA0 CD", 227},{ 228 .dev = &tosascoop_jc_device.dev, 229 .irq = TOSA_IRQ_GPIO_JC_CF_IRQ, 230 .cd_irq = -1, 231}, 232}; 233 234static struct scoop_pcmcia_config tosa_pcmcia_config = { 235 .devs = &tosa_pcmcia_scoop[0], 236 .num_devs = 2, 237}; 238 239/* 240 * USB Device Controller 241 */ 242static struct gpiod_lookup_table tosa_udc_gpiod_table = { 243 .dev_id = "gpio-vbus", 244 .table = { 245 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_USB_IN, 246 "vbus", GPIO_ACTIVE_LOW), 247 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_USB_PULLUP, 248 "pullup", GPIO_ACTIVE_HIGH), 249 { }, 250 }, 251}; 252 253static struct platform_device tosa_gpio_vbus = { 254 .name = "gpio-vbus", 255 .id = -1, 256}; 257 258/* 259 * MMC/SD Device 260 */ 261static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void *data) 262{ 263 int err; 264 265 err = gpio_request(TOSA_GPIO_nSD_INT, "SD Int"); 266 if (err) { 267 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n"); 268 goto err_gpio_int; 269 } 270 err = gpio_direction_input(TOSA_GPIO_nSD_INT); 271 if (err) 272 goto err_gpio_int_dir; 273 274 return 0; 275 276err_gpio_int_dir: 277 gpio_free(TOSA_GPIO_nSD_INT); 278err_gpio_int: 279 return err; 280} 281 282static void tosa_mci_exit(struct device *dev, void *data) 283{ 284 gpio_free(TOSA_GPIO_nSD_INT); 285} 286 287static struct pxamci_platform_data tosa_mci_platform_data = { 288 .detect_delay_ms = 250, 289 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 290 .init = tosa_mci_init, 291 .exit = tosa_mci_exit, 292}; 293 294static struct gpiod_lookup_table tosa_mci_gpio_table = { 295 .dev_id = "pxa2xx-mci.0", 296 .table = { 297 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_nSD_DETECT, 298 "cd", GPIO_ACTIVE_LOW), 299 GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_SD_WP - TOSA_SCOOP_GPIO_BASE, 300 "wp", GPIO_ACTIVE_LOW), 301 GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_PWR_ON - TOSA_SCOOP_GPIO_BASE, 302 "power", GPIO_ACTIVE_HIGH), 303 { }, 304 }, 305}; 306 307/* 308 * Irda 309 */ 310static void tosa_irda_transceiver_mode(struct device *dev, int mode) 311{ 312 if (mode & IR_OFF) { 313 gpio_set_value(TOSA_GPIO_IR_POWERDWN, 0); 314 pxa2xx_transceiver_mode(dev, mode); 315 gpio_direction_output(TOSA_GPIO_IRDA_TX, 0); 316 } else { 317 pxa2xx_transceiver_mode(dev, mode); 318 gpio_set_value(TOSA_GPIO_IR_POWERDWN, 1); 319 } 320} 321 322static int tosa_irda_startup(struct device *dev) 323{ 324 int ret; 325 326 ret = gpio_request(TOSA_GPIO_IRDA_TX, "IrDA TX"); 327 if (ret) 328 goto err_tx; 329 ret = gpio_direction_output(TOSA_GPIO_IRDA_TX, 0); 330 if (ret) 331 goto err_tx_dir; 332 333 ret = gpio_request(TOSA_GPIO_IR_POWERDWN, "IrDA powerdown"); 334 if (ret) 335 goto err_pwr; 336 337 ret = gpio_direction_output(TOSA_GPIO_IR_POWERDWN, 0); 338 if (ret) 339 goto err_pwr_dir; 340 341 tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF); 342 343 return 0; 344 345err_pwr_dir: 346 gpio_free(TOSA_GPIO_IR_POWERDWN); 347err_pwr: 348err_tx_dir: 349 gpio_free(TOSA_GPIO_IRDA_TX); 350err_tx: 351 return ret; 352} 353 354static void tosa_irda_shutdown(struct device *dev) 355{ 356 tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF); 357 gpio_free(TOSA_GPIO_IR_POWERDWN); 358 gpio_free(TOSA_GPIO_IRDA_TX); 359} 360 361static struct pxaficp_platform_data tosa_ficp_platform_data = { 362 .gpio_pwdown = -1, 363 .transceiver_cap = IR_SIRMODE | IR_OFF, 364 .transceiver_mode = tosa_irda_transceiver_mode, 365 .startup = tosa_irda_startup, 366 .shutdown = tosa_irda_shutdown, 367}; 368 369/* 370 * Tosa AC IN 371 */ 372static struct gpiod_lookup_table tosa_power_gpiod_table = { 373 .dev_id = "gpio-charger", 374 .table = { 375 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_AC_IN, 376 NULL, GPIO_ACTIVE_LOW), 377 { }, 378 }, 379}; 380 381static char *tosa_ac_supplied_to[] = { 382 "main-battery", 383 "backup-battery", 384 "jacket-battery", 385}; 386 387static struct gpio_charger_platform_data tosa_power_data = { 388 .name = "charger", 389 .type = POWER_SUPPLY_TYPE_MAINS, 390 .supplied_to = tosa_ac_supplied_to, 391 .num_supplicants = ARRAY_SIZE(tosa_ac_supplied_to), 392}; 393 394static struct resource tosa_power_resource[] = { 395 { 396 .name = "ac", 397 .start = PXA_GPIO_TO_IRQ(TOSA_GPIO_AC_IN), 398 .end = PXA_GPIO_TO_IRQ(TOSA_GPIO_AC_IN), 399 .flags = IORESOURCE_IRQ | 400 IORESOURCE_IRQ_HIGHEDGE | 401 IORESOURCE_IRQ_LOWEDGE, 402 }, 403}; 404 405static struct platform_device tosa_power_device = { 406 .name = "gpio-charger", 407 .id = -1, 408 .dev.platform_data = &tosa_power_data, 409 .resource = tosa_power_resource, 410 .num_resources = ARRAY_SIZE(tosa_power_resource), 411}; 412 413/* 414 * Tosa Keyboard 415 */ 416static const uint32_t tosakbd_keymap[] = { 417 KEY(0, 1, KEY_W), 418 KEY(0, 5, KEY_K), 419 KEY(0, 6, KEY_BACKSPACE), 420 KEY(0, 7, KEY_P), 421 KEY(1, 0, KEY_Q), 422 KEY(1, 1, KEY_E), 423 KEY(1, 2, KEY_T), 424 KEY(1, 3, KEY_Y), 425 KEY(1, 5, KEY_O), 426 KEY(1, 6, KEY_I), 427 KEY(1, 7, KEY_COMMA), 428 KEY(2, 0, KEY_A), 429 KEY(2, 1, KEY_D), 430 KEY(2, 2, KEY_G), 431 KEY(2, 3, KEY_U), 432 KEY(2, 5, KEY_L), 433 KEY(2, 6, KEY_ENTER), 434 KEY(2, 7, KEY_DOT), 435 KEY(3, 0, KEY_Z), 436 KEY(3, 1, KEY_C), 437 KEY(3, 2, KEY_V), 438 KEY(3, 3, KEY_J), 439 KEY(3, 4, TOSA_KEY_ADDRESSBOOK), 440 KEY(3, 5, TOSA_KEY_CANCEL), 441 KEY(3, 6, TOSA_KEY_CENTER), 442 KEY(3, 7, TOSA_KEY_OK), 443 KEY(3, 8, KEY_LEFTSHIFT), 444 KEY(4, 0, KEY_S), 445 KEY(4, 1, KEY_R), 446 KEY(4, 2, KEY_B), 447 KEY(4, 3, KEY_N), 448 KEY(4, 4, TOSA_KEY_CALENDAR), 449 KEY(4, 5, TOSA_KEY_HOMEPAGE), 450 KEY(4, 6, KEY_LEFTCTRL), 451 KEY(4, 7, TOSA_KEY_LIGHT), 452 KEY(4, 9, KEY_RIGHTSHIFT), 453 KEY(5, 0, KEY_TAB), 454 KEY(5, 1, KEY_SLASH), 455 KEY(5, 2, KEY_H), 456 KEY(5, 3, KEY_M), 457 KEY(5, 4, TOSA_KEY_MENU), 458 KEY(5, 6, KEY_UP), 459 KEY(5, 10, TOSA_KEY_FN), 460 KEY(6, 0, KEY_X), 461 KEY(6, 1, KEY_F), 462 KEY(6, 2, KEY_SPACE), 463 KEY(6, 3, KEY_APOSTROPHE), 464 KEY(6, 4, TOSA_KEY_MAIL), 465 KEY(6, 5, KEY_LEFT), 466 KEY(6, 6, KEY_DOWN), 467 KEY(6, 7, KEY_RIGHT), 468}; 469 470static struct matrix_keymap_data tosakbd_keymap_data = { 471 .keymap = tosakbd_keymap, 472 .keymap_size = ARRAY_SIZE(tosakbd_keymap), 473}; 474 475static const int tosakbd_col_gpios[] = 476 { 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68 }; 477static const int tosakbd_row_gpios[] = 478 { 69, 70, 71, 72, 73, 74, 75 }; 479 480static struct matrix_keypad_platform_data tosakbd_pdata = { 481 .keymap_data = &tosakbd_keymap_data, 482 .row_gpios = tosakbd_row_gpios, 483 .col_gpios = tosakbd_col_gpios, 484 .num_row_gpios = ARRAY_SIZE(tosakbd_row_gpios), 485 .num_col_gpios = ARRAY_SIZE(tosakbd_col_gpios), 486 .col_scan_delay_us = 10, 487 .debounce_ms = 10, 488 .wakeup = 1, 489}; 490 491static struct platform_device tosakbd_device = { 492 .name = "matrix-keypad", 493 .id = -1, 494 .dev = { 495 .platform_data = &tosakbd_pdata, 496 }, 497}; 498 499static struct gpio_keys_button tosa_gpio_keys[] = { 500 /* 501 * Two following keys are directly tied to "ON" button of tosa. Why? 502 * The first one can be used as a wakeup source, the second can't; 503 * also the first one is OR of ac_powered and on_button. 504 */ 505 { 506 .type = EV_PWR, 507 .code = KEY_RESERVED, 508 .gpio = TOSA_GPIO_POWERON, 509 .desc = "Poweron", 510 .wakeup = 1, 511 .active_low = 1, 512 }, 513 { 514 .type = EV_PWR, 515 .code = KEY_SUSPEND, 516 .gpio = TOSA_GPIO_ON_KEY, 517 .desc = "On key", 518 /* 519 * can't be used as wakeup 520 * .wakeup = 1, 521 */ 522 .active_low = 1, 523 }, 524 { 525 .type = EV_KEY, 526 .code = TOSA_KEY_RECORD, 527 .gpio = TOSA_GPIO_RECORD_BTN, 528 .desc = "Record Button", 529 .wakeup = 1, 530 .active_low = 1, 531 }, 532 { 533 .type = EV_KEY, 534 .code = TOSA_KEY_SYNC, 535 .gpio = TOSA_GPIO_SYNC, 536 .desc = "Sync Button", 537 .wakeup = 1, 538 .active_low = 1, 539 }, 540 { 541 .type = EV_SW, 542 .code = SW_HEADPHONE_INSERT, 543 .gpio = TOSA_GPIO_EAR_IN, 544 .desc = "HeadPhone insert", 545 .active_low = 1, 546 .debounce_interval = 300, 547 }, 548}; 549 550static struct gpio_keys_platform_data tosa_gpio_keys_platform_data = { 551 .buttons = tosa_gpio_keys, 552 .nbuttons = ARRAY_SIZE(tosa_gpio_keys), 553}; 554 555static struct platform_device tosa_gpio_keys_device = { 556 .name = "gpio-keys", 557 .id = -1, 558 .dev = { 559 .platform_data = &tosa_gpio_keys_platform_data, 560 }, 561}; 562 563/* 564 * Tosa LEDs 565 */ 566static struct gpio_led tosa_gpio_leds[] = { 567 { 568 .name = "tosa:amber:charge", 569 .default_trigger = "main-battery-charging", 570 .gpio = TOSA_GPIO_CHRG_ERR_LED, 571 }, 572 { 573 .name = "tosa:green:mail", 574 .default_trigger = "nand-disk", 575 .gpio = TOSA_GPIO_NOTE_LED, 576 }, 577 { 578 .name = "tosa:dual:wlan", 579 .default_trigger = "none", 580 .gpio = TOSA_GPIO_WLAN_LED, 581 }, 582 { 583 .name = "tosa:blue:bluetooth", 584 .default_trigger = "tosa-bt", 585 .gpio = TOSA_GPIO_BT_LED, 586 }, 587}; 588 589static struct gpio_led_platform_data tosa_gpio_leds_platform_data = { 590 .leds = tosa_gpio_leds, 591 .num_leds = ARRAY_SIZE(tosa_gpio_leds), 592}; 593 594static struct platform_device tosaled_device = { 595 .name = "leds-gpio", 596 .id = -1, 597 .dev = { 598 .platform_data = &tosa_gpio_leds_platform_data, 599 }, 600}; 601 602/* 603 * Toshiba Mobile IO Controller 604 */ 605static struct resource tc6393xb_resources[] = { 606 [0] = { 607 .start = TOSA_LCDC_PHYS, 608 .end = TOSA_LCDC_PHYS + 0x3ffffff, 609 .flags = IORESOURCE_MEM, 610 }, 611 612 [1] = { 613 .start = TOSA_IRQ_GPIO_TC6393XB_INT, 614 .end = TOSA_IRQ_GPIO_TC6393XB_INT, 615 .flags = IORESOURCE_IRQ, 616 }, 617}; 618 619static struct gpiod_lookup_table tosa_battery_gpio_table = { 620 .dev_id = "wm97xx-battery", 621 .table = { 622 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT0_CRG, 623 "main battery full", GPIO_ACTIVE_HIGH), 624 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT1_CRG, 625 "jacket battery full", GPIO_ACTIVE_HIGH), 626 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT0_LOW, 627 "main battery low", GPIO_ACTIVE_HIGH), 628 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT1_LOW, 629 "jacket battery low", GPIO_ACTIVE_HIGH), 630 GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_JACKET_DETECT, 631 "jacket detect", GPIO_ACTIVE_HIGH), 632 { }, 633 }, 634}; 635 636static int tosa_tc6393xb_enable(struct platform_device *dev) 637{ 638 int rc; 639 640 rc = gpio_request(TOSA_GPIO_TC6393XB_REST_IN, "tc6393xb #pclr"); 641 if (rc) 642 goto err_req_pclr; 643 rc = gpio_request(TOSA_GPIO_TC6393XB_SUSPEND, "tc6393xb #suspend"); 644 if (rc) 645 goto err_req_suspend; 646 rc = gpio_request(TOSA_GPIO_TC6393XB_L3V_ON, "tc6393xb l3v"); 647 if (rc) 648 goto err_req_l3v; 649 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_L3V_ON, 0); 650 if (rc) 651 goto err_dir_l3v; 652 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_SUSPEND, 0); 653 if (rc) 654 goto err_dir_suspend; 655 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_REST_IN, 0); 656 if (rc) 657 goto err_dir_pclr; 658 659 mdelay(1); 660 661 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1); 662 663 mdelay(10); 664 665 gpio_set_value(TOSA_GPIO_TC6393XB_REST_IN, 1); 666 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1); 667 668 return 0; 669err_dir_pclr: 670err_dir_suspend: 671err_dir_l3v: 672 gpio_free(TOSA_GPIO_TC6393XB_L3V_ON); 673err_req_l3v: 674 gpio_free(TOSA_GPIO_TC6393XB_SUSPEND); 675err_req_suspend: 676 gpio_free(TOSA_GPIO_TC6393XB_REST_IN); 677err_req_pclr: 678 return rc; 679} 680 681static int tosa_tc6393xb_disable(struct platform_device *dev) 682{ 683 gpio_free(TOSA_GPIO_TC6393XB_L3V_ON); 684 gpio_free(TOSA_GPIO_TC6393XB_SUSPEND); 685 gpio_free(TOSA_GPIO_TC6393XB_REST_IN); 686 687 return 0; 688} 689 690static int tosa_tc6393xb_resume(struct platform_device *dev) 691{ 692 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1); 693 mdelay(10); 694 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1); 695 mdelay(10); 696 697 return 0; 698} 699 700static int tosa_tc6393xb_suspend(struct platform_device *dev) 701{ 702 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 0); 703 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 0); 704 return 0; 705} 706 707static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; 708 709static struct nand_bbt_descr tosa_tc6393xb_nand_bbt = { 710 .options = 0, 711 .offs = 4, 712 .len = 2, 713 .pattern = scan_ff_pattern 714}; 715 716static const char * const probes[] = { 717 "cmdlinepart", 718 "ofpart", 719 "sharpslpart", 720 NULL, 721}; 722 723static struct tmio_nand_data tosa_tc6393xb_nand_config = { 724 .badblock_pattern = &tosa_tc6393xb_nand_bbt, 725 .part_parsers = probes, 726}; 727 728#ifdef CONFIG_MFD_TC6393XB 729static struct fb_videomode tosa_tc6393xb_lcd_mode[] = { 730 { 731 .xres = 480, 732 .yres = 640, 733 .pixclock = 0x002cdf00,/* PLL divisor */ 734 .left_margin = 0x004c, 735 .right_margin = 0x005b, 736 .upper_margin = 0x0001, 737 .lower_margin = 0x000d, 738 .hsync_len = 0x0002, 739 .vsync_len = 0x0001, 740 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 741 .vmode = FB_VMODE_NONINTERLACED, 742 },{ 743 .xres = 240, 744 .yres = 320, 745 .pixclock = 0x00e7f203,/* PLL divisor */ 746 .left_margin = 0x0024, 747 .right_margin = 0x002f, 748 .upper_margin = 0x0001, 749 .lower_margin = 0x000d, 750 .hsync_len = 0x0002, 751 .vsync_len = 0x0001, 752 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 753 .vmode = FB_VMODE_NONINTERLACED, 754 } 755}; 756 757static struct tmio_fb_data tosa_tc6393xb_fb_config = { 758 .lcd_set_power = tc6393xb_lcd_set_power, 759 .lcd_mode = tc6393xb_lcd_mode, 760 .num_modes = ARRAY_SIZE(tosa_tc6393xb_lcd_mode), 761 .modes = &tosa_tc6393xb_lcd_mode[0], 762 .height = 82, 763 .width = 60, 764}; 765#endif 766 767static struct tc6393xb_platform_data tosa_tc6393xb_data = { 768 .scr_pll2cr = 0x0cc1, 769 .scr_gper = 0x3300, 770 771 .irq_base = IRQ_BOARD_START, 772 773 .enable = tosa_tc6393xb_enable, 774 .disable = tosa_tc6393xb_disable, 775 .suspend = tosa_tc6393xb_suspend, 776 .resume = tosa_tc6393xb_resume, 777 778 .nand_data = &tosa_tc6393xb_nand_config, 779#ifdef CONFIG_MFD_TC6393XB 780 .fb_data = &tosa_tc6393xb_fb_config, 781#endif 782 783 .resume_restore = 1, 784}; 785 786 787static struct platform_device tc6393xb_device = { 788 .name = "tc6393xb", 789 .id = -1, 790 .dev = { 791 .platform_data = &tosa_tc6393xb_data, 792 }, 793 .num_resources = ARRAY_SIZE(tc6393xb_resources), 794 .resource = tc6393xb_resources, 795}; 796 797static struct tosa_bt_data tosa_bt_data = { 798 .gpio_pwr = TOSA_GPIO_BT_PWR_EN, 799 .gpio_reset = TOSA_GPIO_BT_RESET, 800}; 801 802static struct platform_device tosa_bt_device = { 803 .name = "tosa-bt", 804 .id = -1, 805 .dev.platform_data = &tosa_bt_data, 806}; 807 808static struct pxa2xx_spi_controller pxa_ssp_master_info = { 809 .num_chipselect = 1, 810}; 811 812static struct spi_board_info spi_board_info[] __initdata = { 813 { 814 .modalias = "tosa-lcd", 815 // .platform_data 816 .max_speed_hz = 28750, 817 .bus_num = 2, 818 .chip_select = 0, 819 .mode = SPI_MODE_0, 820 }, 821}; 822 823static struct mtd_partition sharpsl_rom_parts[] = { 824 { 825 .name ="Boot PROM Filesystem", 826 .offset = 0x00160000, 827 .size = MTDPART_SIZ_FULL, 828 }, 829}; 830 831static struct physmap_flash_data sharpsl_rom_data = { 832 .width = 2, 833 .nr_parts = ARRAY_SIZE(sharpsl_rom_parts), 834 .parts = sharpsl_rom_parts, 835}; 836 837static struct resource sharpsl_rom_resources[] = { 838 { 839 .start = 0x00000000, 840 .end = 0x007fffff, 841 .flags = IORESOURCE_MEM, 842 }, 843}; 844 845static struct platform_device sharpsl_rom_device = { 846 .name = "physmap-flash", 847 .id = -1, 848 .resource = sharpsl_rom_resources, 849 .num_resources = ARRAY_SIZE(sharpsl_rom_resources), 850 .dev.platform_data = &sharpsl_rom_data, 851}; 852 853static struct platform_device wm9712_device = { 854 .name = "wm9712-codec", 855 .id = -1, 856}; 857 858static struct platform_device tosa_audio_device = { 859 .name = "tosa-audio", 860 .id = -1, 861}; 862 863static struct platform_device *devices[] __initdata = { 864 &tosascoop_device, 865 &tosascoop_jc_device, 866 &tc6393xb_device, 867 &tosa_power_device, 868 &tosakbd_device, 869 &tosa_gpio_keys_device, 870 &tosaled_device, 871 &tosa_bt_device, 872 &sharpsl_rom_device, 873 &wm9712_device, 874 &tosa_gpio_vbus, 875 &tosa_audio_device, 876}; 877 878static void tosa_poweroff(void) 879{ 880 pxa_restart(REBOOT_GPIO, NULL); 881} 882 883static void tosa_restart(enum reboot_mode mode, const char *cmd) 884{ 885 uint32_t msc0 = __raw_readl(MSC0); 886 887 /* Bootloader magic for a reboot */ 888 if((msc0 & 0xffff0000) == 0x7ff00000) 889 __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0); 890 891 tosa_poweroff(); 892} 893 894static void __init tosa_init(void) 895{ 896 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config)); 897 898 pxa_set_ffuart_info(NULL); 899 pxa_set_btuart_info(NULL); 900 pxa_set_stuart_info(NULL); 901 902 gpio_set_wake(MFP_PIN_GPIO1, 1); 903 /* We can't pass to gpio-keys since it will drop the Reset altfunc */ 904 905 init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0); 906 907 pm_power_off = tosa_poweroff; 908 909 PCFR |= PCFR_OPDE; 910 911 /* enable batt_fault */ 912 PMCR = 0x01; 913 914 gpiod_add_lookup_table(&tosa_battery_gpio_table); 915 916 gpiod_add_lookup_table(&tosa_mci_gpio_table); 917 pxa_set_mci_info(&tosa_mci_platform_data); 918 pxa_set_ficp_info(&tosa_ficp_platform_data); 919 pxa_set_i2c_info(NULL); 920 pxa_set_ac97_info(NULL); 921 platform_scoop_config = &tosa_pcmcia_config; 922 923 pxa2xx_set_spi_info(2, &pxa_ssp_master_info); 924 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); 925 926 clk_add_alias("CLK_CK3P6MI", tc6393xb_device.name, "GPIO11_CLK", NULL); 927 928 gpiod_add_lookup_table(&tosa_udc_gpiod_table); 929 gpiod_add_lookup_table(&tosa_power_gpiod_table); 930 platform_add_devices(devices, ARRAY_SIZE(devices)); 931} 932 933static void __init fixup_tosa(struct tag *tags, char **cmdline) 934{ 935 sharpsl_save_param(); 936 memblock_add(0xa0000000, SZ_64M); 937} 938 939MACHINE_START(TOSA, "SHARP Tosa") 940 .fixup = fixup_tosa, 941 .map_io = pxa25x_map_io, 942 .nr_irqs = TOSA_NR_IRQS, 943 .init_irq = pxa25x_init_irq, 944 .handle_irq = pxa25x_handle_irq, 945 .init_machine = tosa_init, 946 .init_time = pxa_timer_init, 947 .restart = tosa_restart, 948MACHINE_END