arm: tegra: pluto: enable bluetooth support
Nagarjuna Kristam [Fri, 31 Aug 2012 05:12:19 +0000 (10:12 +0530)]
Enable pinmux config for BT_EN, BT_RST, BT_EXT and BT_IRQ
Add bluesleep and rfkill platform resources

Bug 1029054

Change-Id: I652f0c771acf5087f34dab7d2498c2cd5808c7a2
Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-on: http://git-master/r/130081
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>

Rebase-Id: Rfe61f811496cecd2721ac50d5f964af365488ac5

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

index f5c9c03..f622d86 100644 (file)
@@ -154,7 +154,6 @@ static __initdata struct tegra_pingroup_config pluto_pinmux_common[] = {
        DEFAULT_PINMUX(DAP4_DOUT,       I2S3,            PULL_DOWN,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(DAP4_SCLK,       I2S3,            PULL_DOWN,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(CLK3_OUT,        EXTPERIPH3,      NORMAL,       NORMAL,     OUTPUT),
-       DEFAULT_PINMUX(CLK3_REQ,        DEV3,            NORMAL,       NORMAL,     INPUT),
 
        DEFAULT_PINMUX(GPIO_PU0,        UARTA,           NORMAL,       NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU1,        UARTA,           NORMAL,       NORMAL,     INPUT),
@@ -235,6 +234,11 @@ static __initdata struct tegra_pingroup_config pluto_pinmux_common[] = {
        DEFAULT_PINMUX(CORE_PWR_REQ,    PWRON,           NORMAL,       NORMAL,     OUTPUT),
        DEFAULT_PINMUX(PWR_INT_N,       PMI,             NORMAL,       NORMAL,     INPUT),
        DEFAULT_PINMUX(RESET_OUT_N,     RESET_OUT_N,     NORMAL,       NORMAL,     OUTPUT),
+       /* BT RST, EN, WAKEUP and IRQ pinmux */
+       DEFAULT_PINMUX(KB_COL6,         KBC,             PULL_DOWN,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(KB_COL7,         KBC,             PULL_DOWN,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(CLK3_REQ,        DEV3,            NORMAL,       NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GPIO_PU6,        RSVD1,           NORMAL,       NORMAL,     INPUT),
 };
 
 #define GPIO_INIT_PIN_MODE(_name, _gpio, _is_input, _val)      \
@@ -477,6 +481,9 @@ static __initdata struct tegra_pingroup_config pluto_pinmux_common[] = {
        DEFAULT_PINMUX(GPIO_PU5,        PWM2,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PU6,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(KB_ROW14,        KBC,             NORMAL,    TRISTATE,   OUTPUT),
+       DEFAULT_PINMUX(KB_COL6,         KBC,             PULL_DOWN, NORMAL,   OUTPUT),
+       DEFAULT_PINMUX(KB_COL7,         KBC,             PULL_DOWN, NORMAL,   OUTPUT),
+       DEFAULT_PINMUX(CLK3_REQ,        DEV3,            NORMAL,    NORMAL,   OUTPUT),
 
        /* LCD GPIO */
        DEFAULT_PINMUX(GMI_AD0,         RSVD1,           NORMAL,    NORMAL,     OUTPUT),
@@ -575,9 +582,6 @@ static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = {
        DEFAULT_PINMUX(HDMI_CEC,        CEC,           NORMAL,    TRISTATE,   OUTPUT),
        DEFAULT_PINMUX(KB_COL4,         KBC,           NORMAL,    TRISTATE,   OUTPUT),
        DEFAULT_PINMUX(KB_COL5,         KBC,           NORMAL,    TRISTATE,   OUTPUT),
-       DEFAULT_PINMUX(KB_COL6,         KBC,           NORMAL,    TRISTATE,   OUTPUT),
-       DEFAULT_PINMUX(KB_COL7,         KBC,           NORMAL,    TRISTATE,   OUTPUT),
-       DEFAULT_PINMUX(CLK3_REQ,        DEV3,          NORMAL,    TRISTATE,   OUTPUT),
        DEFAULT_PINMUX(VI_D0,           VI,            NORMAL,    TRISTATE,   OUTPUT),
        DEFAULT_PINMUX(VI_D1,           VI,            NORMAL,    TRISTATE,   OUTPUT),
        DEFAULT_PINMUX(VI_D10,          VI,            NORMAL,    TRISTATE,   OUTPUT),
index 5c57f8b..eb60ba3 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/memblock.h>
 #include <linux/spi-tegra.h>
 #include <linux/nfc/pn544.h>
+#include <linux/rfkill-gpio.h>
 #include <linux/skbuff.h>
 #include <linux/ti_wilink_st.h>
 #include <linux/regulator/consumer.h>
 #include "pm.h"
 #include "common.h"
 
+static struct rfkill_gpio_platform_data pluto_bt_rfkill_pdata = {
+       .name           = "bt_rfkill",
+       .shutdown_gpio  = TEGRA_GPIO_PQ7,
+       .type           = RFKILL_TYPE_BLUETOOTH,
+};
+
+static struct platform_device pluto_bt_rfkill_device = {
+       .name = "rfkill_gpio",
+       .id             = -1,
+       .dev = {
+               .platform_data = &pluto_bt_rfkill_pdata,
+       },
+};
+
+static noinline void __init pluto_setup_bt_rfkill(void)
+{
+       if ((tegra_get_commchip_id() == COMMCHIP_BROADCOM_BCM43241) ||
+                               (tegra_get_commchip_id() == COMMCHIP_DEFAULT))
+               pluto_bt_rfkill_pdata.reset_gpio = TEGRA_GPIO_INVALID;
+       else
+               pluto_bt_rfkill_pdata.reset_gpio = TEGRA_GPIO_PU6;
+       platform_device_register(&pluto_bt_rfkill_device);
+}
+
+static struct resource pluto_bluesleep_resources[] = {
+       [0] = {
+               .name = "gpio_host_wake",
+                       .start  = TEGRA_GPIO_PU6,
+                       .end    = TEGRA_GPIO_PU6,
+                       .flags  = IORESOURCE_IO,
+       },
+       [1] = {
+               .name = "gpio_ext_wake",
+                       .start  = TEGRA_GPIO_PEE1,
+                       .end    = TEGRA_GPIO_PEE1,
+                       .flags  = IORESOURCE_IO,
+       },
+       [2] = {
+               .name = "host_wake",
+                       .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       },
+};
+
+static struct platform_device pluto_bluesleep_device = {
+       .name           = "bluesleep",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(pluto_bluesleep_resources),
+       .resource       = pluto_bluesleep_resources,
+};
+
+static noinline void __init pluto_setup_bluesleep(void)
+{
+       pluto_bluesleep_resources[2].start =
+               pluto_bluesleep_resources[2].end =
+                       gpio_to_irq(TEGRA_GPIO_PU6);
+       platform_device_register(&pluto_bluesleep_device);
+       return;
+}
 static __initdata struct tegra_clk_init_table pluto_clk_init_table[] = {
        /* name         parent          rate            enabled */
        { "pll_m",      NULL,           0,              false},
@@ -505,6 +564,8 @@ static void __init tegra_pluto_init(void)
        pluto_emc_init();
        pluto_panel_init();
        pluto_kbc_init();
+       pluto_setup_bluesleep();
+       pluto_setup_bt_rfkill();
        tegra_release_bootloader_fb();
        pluto_modem_init();
 #ifdef CONFIG_TEGRA_WDT_RECOVERY