| /* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| */ |
| |
| #include <linux/init.h> |
| #include <linux/gpio.h> |
| #include <mach/gpiomux.h> |
| #include <mach/board.h> |
| #include "board-9615.h" |
| |
| static struct gpiomux_setting ps_hold = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| static struct gpiomux_setting slimbus = { |
| .func = GPIOMUX_FUNC_2, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_KEEPER, |
| }; |
| |
| static struct gpiomux_setting gsbi4 = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| static struct gpiomux_setting gsbi5 = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_2MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| static struct gpiomux_setting gsbi3 = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| static struct gpiomux_setting gsbi3_cs1_config = { |
| .func = GPIOMUX_FUNC_4, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| #ifdef CONFIG_LTC4088_CHARGER |
| static struct gpiomux_setting ltc4088_chg_cfg = { |
| .func = GPIOMUX_FUNC_GPIO, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| #endif |
| |
| static struct gpiomux_setting sdcc2_clk_actv_cfg = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_16MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| static struct gpiomux_setting sdcc2_cmd_data_0_3_actv_cfg = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_UP, |
| }; |
| |
| static struct gpiomux_setting sdcc2_suspend_cfg = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_2MA, |
| .pull = GPIOMUX_PULL_DOWN, |
| }; |
| |
| static struct gpiomux_setting cdc_mclk = { |
| .func = GPIOMUX_FUNC_1, |
| .drv = GPIOMUX_DRV_8MA, |
| .pull = GPIOMUX_PULL_NONE, |
| }; |
| |
| #ifdef CONFIG_FB_MSM_EBI2 |
| static struct gpiomux_setting ebi2_lcdc_a_d = { |
| .func = GPIOMUX_FUNC_2, |
| .drv = GPIOMUX_DRV_12MA, |
| .pull = GPIOMUX_PULL_DOWN, |
| }; |
| |
| static struct gpiomux_setting ebi2_lcdc_cs = { |
| .func = GPIOMUX_FUNC_2, |
| .drv = GPIOMUX_DRV_12MA, |
| .pull = GPIOMUX_PULL_UP, |
| }; |
| |
| static struct gpiomux_setting ebi2_lcdc_rs = { |
| .func = GPIOMUX_FUNC_3, |
| .drv = GPIOMUX_DRV_12MA, |
| .pull = GPIOMUX_PULL_DOWN, |
| }; |
| #endif |
| |
| static struct gpiomux_setting wlan_active_config = { |
| .func = GPIOMUX_FUNC_GPIO, |
| .drv = GPIOMUX_DRV_2MA, |
| .pull = GPIOMUX_PULL_NONE, |
| .dir = GPIOMUX_OUT_LOW, |
| }; |
| |
| static struct gpiomux_setting wlan_suspend_config = { |
| .func = GPIOMUX_FUNC_GPIO, |
| .drv = GPIOMUX_DRV_2MA, |
| .pull = GPIOMUX_PULL_NONE, |
| .dir = GPIOMUX_IN, |
| }; |
| |
| static struct gpiomux_setting tabla_reset = { |
| .func = GPIOMUX_FUNC_GPIO, |
| .drv = GPIOMUX_DRV_6MA, |
| .pull = GPIOMUX_PULL_NONE, |
| .dir = GPIOMUX_OUT_LOW, |
| }; |
| |
| static struct msm_gpiomux_config msm9615_audio_codec_configs[] __initdata = { |
| { |
| .gpio = 24, |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &cdc_mclk, |
| }, |
| }, |
| { |
| .gpio = 84, /* SYS_RST_N */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &tabla_reset, |
| }, |
| } |
| }; |
| |
| static struct msm_gpiomux_config msm9615_sdcc2_configs[] __initdata = { |
| { |
| /* SDC2_DATA_0 */ |
| .gpio = 25, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, |
| }, |
| }, |
| { |
| /* SDC2_DATA_1 */ |
| .gpio = 26, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_cmd_data_0_3_actv_cfg, |
| }, |
| }, |
| { |
| /* SDC2_DATA_2 */ |
| .gpio = 27, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, |
| }, |
| }, |
| { |
| /* SDC2_DATA_3 */ |
| .gpio = 28, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, |
| }, |
| }, |
| { |
| /* SDC2_CMD */ |
| .gpio = 29, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, |
| }, |
| }, |
| { |
| /* SDC2_CLK */ |
| .gpio = 30, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg, |
| [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, |
| }, |
| }, |
| }; |
| |
| struct msm_gpiomux_config msm9615_ps_hold_config[] __initdata = { |
| { |
| .gpio = 83, |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &ps_hold, |
| }, |
| }, |
| }; |
| |
| static struct gpiomux_setting sd_card_det = { |
| .func = GPIOMUX_FUNC_GPIO, |
| .drv = GPIOMUX_DRV_2MA, |
| .pull = GPIOMUX_PULL_NONE, |
| .dir = GPIOMUX_IN, |
| }; |
| |
| struct msm_gpiomux_config sd_card_det_config[] __initdata = { |
| { |
| .gpio = 80, |
| .settings = { |
| [GPIOMUX_ACTIVE] = &sd_card_det, |
| [GPIOMUX_SUSPENDED] = &sd_card_det, |
| }, |
| }, |
| }; |
| |
| #ifdef CONFIG_LTC4088_CHARGER |
| static struct msm_gpiomux_config |
| msm9615_ltc4088_charger_config[] __initdata = { |
| { |
| .gpio = 4, |
| .settings = { |
| [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, |
| }, |
| }, |
| { |
| .gpio = 6, |
| .settings = { |
| [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, |
| }, |
| }, |
| { |
| .gpio = 7, |
| .settings = { |
| [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, |
| }, |
| }, |
| }; |
| #endif |
| |
| struct msm_gpiomux_config msm9615_gsbi_configs[] __initdata = { |
| { |
| .gpio = 8, /* GSBI3 QUP SPI_CLK */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi3, |
| }, |
| }, |
| { |
| .gpio = 9, /* GSBI3 QUP SPI_CS_N */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi3, |
| }, |
| }, |
| { |
| .gpio = 10, /* GSBI3 QUP SPI_DATA_MISO */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi3, |
| }, |
| }, |
| { |
| .gpio = 11, /* GSBI3 QUP SPI_DATA_MOSI */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi3, |
| }, |
| }, |
| { |
| .gpio = 12, /* GSBI4 UART */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi4, |
| }, |
| }, |
| { |
| .gpio = 13, /* GSBI4 UART */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi4, |
| }, |
| }, |
| { |
| .gpio = 14, /* GSBI4 UART */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi4, |
| }, |
| }, |
| { |
| .gpio = 15, /* GSBI4 UART */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi4, |
| }, |
| }, |
| { |
| .gpio = 16, /* GSBI5 I2C QUP SCL */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi5, |
| [GPIOMUX_ACTIVE] = &gsbi5, |
| }, |
| }, |
| { |
| .gpio = 17, /* GSBI5 I2C QUP SDA */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi5, |
| }, |
| }, |
| { |
| /* GPIO 19 can be used for I2C/UART on GSBI5 */ |
| .gpio = 19, /* GSBI3 QUP SPI_CS_1 */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &gsbi3_cs1_config, |
| }, |
| }, |
| }; |
| |
| static struct msm_gpiomux_config msm9615_slimbus_configs[] __initdata = { |
| { |
| .gpio = 20, /* Slimbus data */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &slimbus, |
| }, |
| }, |
| { |
| .gpio = 23, /* Slimbus clk */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &slimbus, |
| }, |
| }, |
| }; |
| |
| #ifdef CONFIG_FB_MSM_EBI2 |
| static struct msm_gpiomux_config msm9615_ebi2_lcdc_configs[] __initdata = { |
| { |
| .gpio = 21, /* a_d */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &ebi2_lcdc_a_d, |
| }, |
| }, |
| { |
| .gpio = 22, /* cs */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &ebi2_lcdc_cs, |
| }, |
| }, |
| { |
| .gpio = 24, /* rs */ |
| .settings = { |
| [GPIOMUX_SUSPENDED] = &ebi2_lcdc_rs, |
| }, |
| }, |
| }; |
| #endif |
| |
| static struct msm_gpiomux_config msm9615_wlan_configs[] __initdata = { |
| { |
| .gpio = 21,/* WLAN_RESET_N */ |
| .settings = { |
| [GPIOMUX_ACTIVE] = &wlan_active_config, |
| [GPIOMUX_SUSPENDED] = &wlan_suspend_config, |
| }, |
| }, |
| }; |
| |
| |
| int __init msm9615_init_gpiomux(void) |
| { |
| int rc; |
| |
| rc = msm_gpiomux_init(NR_GPIO_IRQS); |
| if (rc) { |
| pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc); |
| return rc; |
| } |
| msm_gpiomux_install(msm9615_gsbi_configs, |
| ARRAY_SIZE(msm9615_gsbi_configs)); |
| |
| msm_gpiomux_install(msm9615_slimbus_configs, |
| ARRAY_SIZE(msm9615_slimbus_configs)); |
| |
| msm_gpiomux_install(msm9615_ps_hold_config, |
| ARRAY_SIZE(msm9615_ps_hold_config)); |
| msm_gpiomux_install(sd_card_det_config, |
| ARRAY_SIZE(sd_card_det_config)); |
| msm_gpiomux_install(msm9615_sdcc2_configs, |
| ARRAY_SIZE(msm9615_sdcc2_configs)); |
| #ifdef CONFIG_LTC4088_CHARGER |
| msm_gpiomux_install(msm9615_ltc4088_charger_config, |
| ARRAY_SIZE(msm9615_ltc4088_charger_config)); |
| #endif |
| msm_gpiomux_install(msm9615_audio_codec_configs, |
| ARRAY_SIZE(msm9615_audio_codec_configs)); |
| |
| msm_gpiomux_install(msm9615_wlan_configs, |
| ARRAY_SIZE(msm9615_wlan_configs)); |
| |
| #ifdef CONFIG_FB_MSM_EBI2 |
| msm_gpiomux_install(msm9615_ebi2_lcdc_configs, |
| ARRAY_SIZE(msm9615_ebi2_lcdc_configs)); |
| #endif |
| |
| return 0; |
| } |