arm: tegra: cardhu: enabling bt auto power save
[linux-2.6.git] / arch / arm / mach-tegra / board-cardhu.c
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();