arm: tegra: cardhu: enabling bt auto power save
Rakesh Goyal [Fri, 18 Feb 2011 10:02:37 +0000 (15:02 +0530)]
Registering platform device to enable low power mode for
bcm4329 chip. This feture is dependent on CONFIG_BT_BLUESLEEP.

BUG 793831

Original-Change-Id: If261a3231d465ec1caf26d2dc4e71e5573b72882
Reviewed-on: http://git-master/r/20026
Reviewed-by: Niket Sirsi <nsirsi@nvidia.com>
Tested-by: Niket Sirsi <nsirsi@nvidia.com>
Original-Change-Id: I30082a938f239db5105b56b154e8d0bef6ede53f

Rebase-Id: R9c6f920483d9e3d2f3e3b56c992787bdeb125176

arch/arm/mach-tegra/board-cardhu-pinmux.c
arch/arm/mach-tegra/board-cardhu.c

index 01ec5d1..9056887 100644 (file)
@@ -253,12 +253,12 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(UART3_CTS_N,     UARTC,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(UART3_RTS_N,     UARTC,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU0,        RSVD1,           NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GPIO_PU1,        RSVD1,           NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GPIO_PU1,        RSVD1,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU2,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PU3,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PU4,        PWM1,            NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU5,        PWM2,            NORMAL,    NORMAL,     OUTPUT),
-       DEFAULT_PINMUX(GPIO_PU6,        PWM3,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GPIO_PU6,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP4_FS,         I2S3,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP4_DIN,        I2S3,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP4_DOUT,       I2S3,            NORMAL,    NORMAL,     INPUT),
index 9ad1fc2..1569c36 100644 (file)
@@ -135,6 +135,63 @@ static noinline void __init cardhu_bt_rfkill(void)
 static inline void cardhu_bt_rfkill(void) { }
 #endif
 
+#ifdef CONFIG_BT_BLUESLEEP
+static noinline void __init tegra_setup_bluesleep(void)
+{
+       struct platform_device *pdev = NULL;
+       struct resource *res;
+
+       pdev = platform_device_alloc("bluesleep", 0);
+       if (!pdev) {
+               pr_err("unable to allocate platform device for bluesleep");
+               return;
+       }
+
+       res = kzalloc(sizeof(struct resource) * 3, GFP_KERNEL);
+       if (!res) {
+               pr_err("unable to allocate resource for bluesleep\n");
+               goto err_free_dev;
+       }
+
+       res[0].name   = "gpio_host_wake";
+       res[0].start  = TEGRA_GPIO_PU6;
+       res[0].end    = TEGRA_GPIO_PU6;
+       res[0].flags  = IORESOURCE_IO;
+
+       res[1].name   = "gpio_ext_wake";
+       res[1].start  = TEGRA_GPIO_PU1;
+       res[1].end    = TEGRA_GPIO_PU1;
+       res[1].flags  = IORESOURCE_IO;
+
+       res[2].name   = "host_wake";
+       res[2].start  = gpio_to_irq(TEGRA_GPIO_PU6);
+       res[2].end    = gpio_to_irq(TEGRA_GPIO_PU6);
+       res[2].flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE ;
+
+       if (platform_device_add_resources(pdev, res, 3)) {
+               pr_err("unable to add resources to bluesleep device\n");
+               goto err_free_res;
+       }
+
+       if (platform_device_add(pdev)) {
+               pr_err("unable to add bluesleep device\n");
+               goto err_free_res;
+       }
+       tegra_gpio_enable(TEGRA_GPIO_PU6);
+       tegra_gpio_enable(TEGRA_GPIO_PU1);
+
+return;
+
+err_free_res:
+       kfree(res);
+err_free_dev:
+       platform_device_put(pdev);
+       return;
+}
+#else
+static inline void tegra_setup_bluesleep(void) { }
+#endif
+
 static __initdata struct tegra_clk_init_table cardhu_clk_init_table[] = {
        /* name         parent          rate            enabled */
        { "uarta",      "pll_p",        216000000,      true},
@@ -407,6 +464,7 @@ static void __init tegra_cardhu_init(void)
        cardhu_panel_init();
        cardhu_sensors_init();
        cardhu_bt_rfkill();
+       tegra_setup_bluesleep();
        cardhu_sata_init();
        audio_wired_jack_init();
        cardhu_pins_state_init();