diff options
| author | Igor Grinberg <grinberg@compulab.co.il> | 2010-07-27 08:07:00 -0400 |
|---|---|---|
| committer | Eric Miao <eric.y.miao@gmail.com> | 2010-10-08 04:21:17 -0400 |
| commit | 1b43d8eda71bc953c9005afd63952e0666169553 (patch) | |
| tree | 9b317ce11128578f7d799f4a651046cf9d7dfe5b | |
| parent | 6dc3ae845c56157098f8af2d793aaefac2b31840 (diff) | |
ARM: pxa/cm-x300: enable USB host port2
Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
Signed-off-by: Mike Rapoport <mike@compulab.co.il>
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
| -rw-r--r-- | arch/arm/mach-pxa/cm-x300.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c index c70e6c2f4e7c..8e0b5622b277 100644 --- a/arch/arm/mach-pxa/cm-x300.c +++ b/arch/arm/mach-pxa/cm-x300.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
| 22 | #include <linux/clk.h> | ||
| 22 | 23 | ||
| 23 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 24 | #include <linux/dm9000.h> | 25 | #include <linux/dm9000.h> |
| @@ -50,6 +51,7 @@ | |||
| 50 | #include <plat/i2c.h> | 51 | #include <plat/i2c.h> |
| 51 | #include <plat/pxa3xx_nand.h> | 52 | #include <plat/pxa3xx_nand.h> |
| 52 | #include <mach/audio.h> | 53 | #include <mach/audio.h> |
| 54 | #include <mach/pxa3xx-u2d.h> | ||
| 53 | 55 | ||
| 54 | #include <asm/mach/map.h> | 56 | #include <asm/mach/map.h> |
| 55 | 57 | ||
| @@ -68,6 +70,8 @@ | |||
| 68 | #define GPIO97_RTC_RD (97) | 70 | #define GPIO97_RTC_RD (97) |
| 69 | #define GPIO98_RTC_IO (98) | 71 | #define GPIO98_RTC_IO (98) |
| 70 | 72 | ||
| 73 | #define GPIO_ULPI_PHY_RST (127) | ||
| 74 | |||
| 71 | static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = { | 75 | static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = { |
| 72 | /* LCD */ | 76 | /* LCD */ |
| 73 | GPIO54_LCD_LDD_0, | 77 | GPIO54_LCD_LDD_0, |
| @@ -472,6 +476,78 @@ static void __init cm_x300_init_mmc(void) | |||
| 472 | static inline void cm_x300_init_mmc(void) {} | 476 | static inline void cm_x300_init_mmc(void) {} |
| 473 | #endif | 477 | #endif |
| 474 | 478 | ||
| 479 | #if defined(CONFIG_PXA310_ULPI) | ||
| 480 | static struct clk *pout_clk; | ||
| 481 | |||
| 482 | static int cm_x300_ulpi_phy_reset(void) | ||
| 483 | { | ||
| 484 | int err; | ||
| 485 | |||
| 486 | /* reset the PHY */ | ||
| 487 | err = gpio_request(GPIO_ULPI_PHY_RST, "ulpi reset"); | ||
| 488 | if (err) { | ||
| 489 | pr_err("%s: failed to request ULPI reset GPIO: %d\n", | ||
| 490 | __func__, err); | ||
| 491 | return err; | ||
| 492 | } | ||
| 493 | |||
| 494 | gpio_direction_output(GPIO_ULPI_PHY_RST, 0); | ||
| 495 | msleep(10); | ||
| 496 | gpio_set_value(GPIO_ULPI_PHY_RST, 1); | ||
| 497 | msleep(10); | ||
| 498 | |||
| 499 | gpio_free(GPIO_ULPI_PHY_RST); | ||
| 500 | |||
| 501 | return 0; | ||
| 502 | } | ||
| 503 | |||
| 504 | static inline int cm_x300_u2d_init(struct device *dev) | ||
| 505 | { | ||
| 506 | int err = 0; | ||
| 507 | |||
| 508 | if (cpu_is_pxa310()) { | ||
| 509 | /* CLK_POUT is connected to the ULPI PHY */ | ||
| 510 | pout_clk = clk_get(NULL, "CLK_POUT"); | ||
| 511 | if (IS_ERR(pout_clk)) { | ||
| 512 | err = PTR_ERR(pout_clk); | ||
| 513 | pr_err("%s: failed to get CLK_POUT: %d\n", | ||
| 514 | __func__, err); | ||
| 515 | return err; | ||
| 516 | } | ||
| 517 | clk_enable(pout_clk); | ||
| 518 | |||
| 519 | err = cm_x300_ulpi_phy_reset(); | ||
| 520 | if (err) { | ||
| 521 | clk_disable(pout_clk); | ||
| 522 | clk_put(pout_clk); | ||
| 523 | } | ||
| 524 | } | ||
| 525 | |||
| 526 | return err; | ||
| 527 | } | ||
| 528 | |||
| 529 | static void cm_x300_u2d_exit(struct device *dev) | ||
| 530 | { | ||
| 531 | if (cpu_is_pxa310()) { | ||
| 532 | clk_disable(pout_clk); | ||
| 533 | clk_put(pout_clk); | ||
| 534 | } | ||
| 535 | } | ||
| 536 | |||
| 537 | static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = { | ||
| 538 | .ulpi_mode = ULPI_SER_6PIN, | ||
| 539 | .init = cm_x300_u2d_init, | ||
| 540 | .exit = cm_x300_u2d_exit, | ||
| 541 | }; | ||
| 542 | |||
| 543 | static void cm_x300_init_u2d(void) | ||
| 544 | { | ||
| 545 | pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data); | ||
| 546 | } | ||
| 547 | #else | ||
| 548 | static inline void cm_x300_init_u2d(void) {} | ||
| 549 | #endif | ||
| 550 | |||
| 475 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | 551 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) |
| 476 | static int cm_x300_ohci_init(struct device *dev) | 552 | static int cm_x300_ohci_init(struct device *dev) |
| 477 | { | 553 | { |
| @@ -754,6 +830,7 @@ static void __init cm_x300_init(void) | |||
| 754 | cm_x300_init_da9030(); | 830 | cm_x300_init_da9030(); |
| 755 | cm_x300_init_dm9000(); | 831 | cm_x300_init_dm9000(); |
| 756 | cm_x300_init_lcd(); | 832 | cm_x300_init_lcd(); |
| 833 | cm_x300_init_u2d(); | ||
| 757 | cm_x300_init_ohci(); | 834 | cm_x300_init_ohci(); |
| 758 | cm_x300_init_mmc(); | 835 | cm_x300_init_mmc(); |
| 759 | cm_x300_init_nand(); | 836 | cm_x300_init_nand(); |
