This patch allows the ISP1707 USB tranceiver on Nokia
N900 to be disabled when usb cable is disconnected.
This saves approximately 14mA of battery current.

Patch based on work done by Heikki Krogerus on N900
maemo kernel.

Signed-off-by: Kalle Jokiniemi <kalle.jokini...@nokia.com>
Cc: Heikki Krogerus <heikki.kroge...@nokia.com>
---
 arch/arm/mach-omap2/board-rx51-peripherals.c |   32 ++++++++++++++++++++++++++
 1 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c 
b/arch/arm/mach-omap2/board-rx51-peripherals.c
index e75e240..9dd22bc 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -41,6 +41,7 @@
 
 #include "mux.h"
 #include "hsmmc.h"
+#include "cm2xxx_3xxx.h"
 
 #define SYSTEM_REV_B_USES_VAUX3        0x1699
 #define SYSTEM_REV_S_USES_VAUX3 0x8
@@ -48,6 +49,8 @@
 #define RX51_WL1251_POWER_GPIO         87
 #define RX51_WL1251_IRQ_GPIO           42
 
+#define RX51_USB_TRANSCEIVER_RST_GPIO  67
+
 /* list all spi devices here */
 enum {
        RX51_SPI_WL1251,
@@ -534,8 +537,36 @@ static struct twl4030_gpio_platform_data rx51_gpio_data = {
        .setup                  = rx51_twlgpio_setup,
 };
 
+static void __init rx51_xceiv_init(void)
+{
+       if (gpio_request(RX51_USB_TRANSCEIVER_RST_GPIO, NULL) < 0)
+               BUG();
+       gpio_direction_output(RX51_USB_TRANSCEIVER_RST_GPIO, 1);
+}
+
+static int rx51_xceiv_power(struct device *dev, int iD, int on)
+{
+       unsigned long   timeout;
+
+       if (!on) {
+               /* Let musb go stdby before powering down the transceiver */
+               timeout = jiffies + msecs_to_jiffies(100);
+               while (!time_after(jiffies, timeout))
+                       if (omap2_cm_read_mod_reg(CORE_MOD, CM_IDLEST1)
+                               & OMAP3430ES2_ST_HSOTGUSB_STDBY_MASK)
+                               break;
+               if (!(omap2_cm_read_mod_reg(CORE_MOD, CM_IDLEST1)
+                       & OMAP3430ES2_ST_HSOTGUSB_STDBY_MASK))
+                       WARN(1, "could not put musb to sleep\n");
+       }
+       gpio_set_value(RX51_USB_TRANSCEIVER_RST_GPIO, on);
+
+       return 0;
+}
+
 static struct twl4030_usb_data rx51_usb_data = {
        .usb_mode               = T2_USB_MODE_ULPI,
+       .phy_power              = rx51_xceiv_power,
 };
 
 static struct twl4030_ins sleep_on_seq[] __initdata = {
@@ -917,6 +948,7 @@ error:
 void __init rx51_peripherals_init(void)
 {
        rx51_i2c_init();
+       rx51_xceiv_init();
        gpmc_onenand_init(board_onenand_data);
        board_smc91x_init();
        rx51_add_gpio_keys();
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to