diff options
| -rw-r--r-- | arch/sh/boards/mach-ecovec24/setup.c | 97 |
1 files changed, 95 insertions, 2 deletions
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 826e62326d51..cfd958c613d4 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -19,6 +19,10 @@ | |||
| 19 | #include <linux/usb/r8a66597.h> | 19 | #include <linux/usb/r8a66597.h> |
| 20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
| 21 | #include <linux/i2c/tsc2007.h> | 21 | #include <linux/i2c/tsc2007.h> |
| 22 | #include <linux/spi/spi.h> | ||
| 23 | #include <linux/spi/sh_msiof.h> | ||
| 24 | #include <linux/spi/mmc_spi.h> | ||
| 25 | #include <linux/mmc/host.h> | ||
| 22 | #include <linux/input.h> | 26 | #include <linux/input.h> |
| 23 | #include <linux/input/sh_keysc.h> | 27 | #include <linux/input/sh_keysc.h> |
| 24 | #include <linux/mfd/sh_mobile_sdhi.h> | 28 | #include <linux/mfd/sh_mobile_sdhi.h> |
| @@ -421,6 +425,7 @@ static struct i2c_board_info ts_i2c_clients = { | |||
| 421 | .irq = IRQ0, | 425 | .irq = IRQ0, |
| 422 | }; | 426 | }; |
| 423 | 427 | ||
| 428 | #ifdef CONFIG_MFD_SH_MOBILE_SDHI | ||
| 424 | /* SHDI0 */ | 429 | /* SHDI0 */ |
| 425 | static void sdhi0_set_pwr(struct platform_device *pdev, int state) | 430 | static void sdhi0_set_pwr(struct platform_device *pdev, int state) |
| 426 | { | 431 | { |
| @@ -493,6 +498,73 @@ static struct platform_device sdhi1_device = { | |||
| 493 | }, | 498 | }, |
| 494 | }; | 499 | }; |
| 495 | 500 | ||
| 501 | #else | ||
| 502 | |||
| 503 | static int mmc_spi_get_ro(struct device *dev) | ||
| 504 | { | ||
| 505 | return gpio_get_value(GPIO_PTY6); | ||
| 506 | } | ||
| 507 | |||
| 508 | static int mmc_spi_get_cd(struct device *dev) | ||
| 509 | { | ||
| 510 | return !gpio_get_value(GPIO_PTY7); | ||
| 511 | } | ||
| 512 | |||
| 513 | static void mmc_spi_setpower(struct device *dev, unsigned int maskval) | ||
| 514 | { | ||
| 515 | gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); | ||
| 516 | } | ||
| 517 | |||
| 518 | static struct mmc_spi_platform_data mmc_spi_info = { | ||
| 519 | .get_ro = mmc_spi_get_ro, | ||
| 520 | .get_cd = mmc_spi_get_cd, | ||
| 521 | .caps = MMC_CAP_NEEDS_POLL, | ||
| 522 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ | ||
| 523 | .setpower = mmc_spi_setpower, | ||
| 524 | }; | ||
| 525 | |||
| 526 | static struct spi_board_info spi_bus[] = { | ||
| 527 | { | ||
| 528 | .modalias = "mmc_spi", | ||
| 529 | .platform_data = &mmc_spi_info, | ||
| 530 | .max_speed_hz = 5000000, | ||
| 531 | .mode = SPI_MODE_0, | ||
| 532 | .controller_data = (void *) GPIO_PTM4, | ||
| 533 | }, | ||
| 534 | }; | ||
| 535 | |||
| 536 | static struct sh_msiof_spi_info msiof0_data = { | ||
| 537 | .num_chipselect = 1, | ||
| 538 | }; | ||
| 539 | |||
| 540 | static struct resource msiof0_resources[] = { | ||
| 541 | [0] = { | ||
| 542 | .name = "MSIOF0", | ||
| 543 | .start = 0xa4c40000, | ||
| 544 | .end = 0xa4c40063, | ||
| 545 | .flags = IORESOURCE_MEM, | ||
| 546 | }, | ||
| 547 | [1] = { | ||
| 548 | .start = 84, | ||
| 549 | .flags = IORESOURCE_IRQ, | ||
| 550 | }, | ||
| 551 | }; | ||
| 552 | |||
| 553 | static struct platform_device msiof0_device = { | ||
| 554 | .name = "spi_sh_msiof", | ||
| 555 | .id = 0, /* MSIOF0 */ | ||
| 556 | .dev = { | ||
| 557 | .platform_data = &msiof0_data, | ||
| 558 | }, | ||
| 559 | .num_resources = ARRAY_SIZE(msiof0_resources), | ||
| 560 | .resource = msiof0_resources, | ||
| 561 | .archdata = { | ||
| 562 | .hwblk_id = HWBLK_MSIOF0, | ||
| 563 | }, | ||
| 564 | }; | ||
| 565 | |||
| 566 | #endif | ||
| 567 | |||
| 496 | static struct platform_device *ecovec_devices[] __initdata = { | 568 | static struct platform_device *ecovec_devices[] __initdata = { |
| 497 | &heartbeat_device, | 569 | &heartbeat_device, |
| 498 | &nor_flash_device, | 570 | &nor_flash_device, |
| @@ -503,8 +575,12 @@ static struct platform_device *ecovec_devices[] __initdata = { | |||
| 503 | &ceu0_device, | 575 | &ceu0_device, |
| 504 | &ceu1_device, | 576 | &ceu1_device, |
| 505 | &keysc_device, | 577 | &keysc_device, |
| 578 | #ifdef CONFIG_MFD_SH_MOBILE_SDHI | ||
| 506 | &sdhi0_device, | 579 | &sdhi0_device, |
| 507 | &sdhi1_device, | 580 | &sdhi1_device, |
| 581 | #else | ||
| 582 | &msiof0_device, | ||
| 583 | #endif | ||
| 508 | }; | 584 | }; |
| 509 | 585 | ||
| 510 | #define EEPROM_ADDR 0x50 | 586 | #define EEPROM_ADDR 0x50 |
| @@ -773,7 +849,8 @@ static int __init arch_setup(void) | |||
| 773 | gpio_direction_input(GPIO_PTR5); | 849 | gpio_direction_input(GPIO_PTR5); |
| 774 | gpio_direction_input(GPIO_PTR6); | 850 | gpio_direction_input(GPIO_PTR6); |
| 775 | 851 | ||
| 776 | /* enable SDHI0 (needs DS2.4 set to ON) */ | 852 | #ifdef CONFIG_MFD_SH_MOBILE_SDHI |
| 853 | /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ | ||
| 777 | gpio_request(GPIO_FN_SDHI0CD, NULL); | 854 | gpio_request(GPIO_FN_SDHI0CD, NULL); |
| 778 | gpio_request(GPIO_FN_SDHI0WP, NULL); | 855 | gpio_request(GPIO_FN_SDHI0WP, NULL); |
| 779 | gpio_request(GPIO_FN_SDHI0CMD, NULL); | 856 | gpio_request(GPIO_FN_SDHI0CMD, NULL); |
| @@ -785,7 +862,7 @@ static int __init arch_setup(void) | |||
| 785 | gpio_request(GPIO_PTB6, NULL); | 862 | gpio_request(GPIO_PTB6, NULL); |
| 786 | gpio_direction_output(GPIO_PTB6, 0); | 863 | gpio_direction_output(GPIO_PTB6, 0); |
| 787 | 864 | ||
| 788 | /* enable SDHI1 (needs DS2.6,7 set to ON,OFF) */ | 865 | /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */ |
| 789 | gpio_request(GPIO_FN_SDHI1CD, NULL); | 866 | gpio_request(GPIO_FN_SDHI1CD, NULL); |
| 790 | gpio_request(GPIO_FN_SDHI1WP, NULL); | 867 | gpio_request(GPIO_FN_SDHI1WP, NULL); |
| 791 | gpio_request(GPIO_FN_SDHI1CMD, NULL); | 868 | gpio_request(GPIO_FN_SDHI1CMD, NULL); |
| @@ -799,6 +876,22 @@ static int __init arch_setup(void) | |||
| 799 | 876 | ||
| 800 | /* I/O buffer drive ability is high for SDHI1 */ | 877 | /* I/O buffer drive ability is high for SDHI1 */ |
| 801 | ctrl_outw((ctrl_inw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA); | 878 | ctrl_outw((ctrl_inw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA); |
| 879 | #else | ||
| 880 | /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ | ||
| 881 | gpio_request(GPIO_FN_MSIOF0_TXD, NULL); | ||
| 882 | gpio_request(GPIO_FN_MSIOF0_RXD, NULL); | ||
| 883 | gpio_request(GPIO_FN_MSIOF0_TSCK, NULL); | ||
| 884 | gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */ | ||
| 885 | gpio_direction_output(GPIO_PTM4, 1); /* active low CS */ | ||
| 886 | gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ | ||
| 887 | gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ | ||
| 888 | gpio_request(GPIO_PTY6, NULL); /* write protect */ | ||
| 889 | gpio_direction_input(GPIO_PTY6); | ||
| 890 | gpio_request(GPIO_PTY7, NULL); /* card detect */ | ||
| 891 | gpio_direction_input(GPIO_PTY7); | ||
| 892 | |||
| 893 | spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); | ||
| 894 | #endif | ||
| 802 | 895 | ||
| 803 | /* enable I2C device */ | 896 | /* enable I2C device */ |
| 804 | i2c_register_board_info(1, i2c1_devices, | 897 | i2c_register_board_info(1, i2c1_devices, |
