static int msm_sdcc_setup_gpio(int dev_id, unsigned int enable) { int rc = 0; struct sdcc_gpio *curr; curr = &sdcc_cfg_data[dev_id - 1]; if (!(test_bit(dev_id, &gpio_sts)^enable)) return rc; if (enable) { set_bit(dev_id, &gpio_sts); rc = msm_gpios_request_enable(curr->cfg_data, curr->size); if (rc) pr_err("%s: Failed to turn on GPIOs for slot %d\n", __func__, dev_id); } else { clear_bit(dev_id, &gpio_sts); if (curr->sleep_cfg_data) { rc = msm_gpios_enable(curr->sleep_cfg_data, curr->size); msm_gpios_free(curr->sleep_cfg_data, curr->size); return rc; } msm_gpios_disable_free(curr->cfg_data, curr->size); } return rc; }
static uint32_t wifi_switchvdd(struct device *dev, unsigned int vdd) { int rc; if (vdd) { if (wl1251_priv.state) { return 0; } wl1251_priv.state = true; if (wl1251_priv.vreg) { rc = vreg_enable(wl1251_priv.vreg); if (rc) { pr_err("%s: failed to enable vreg %d\n", __func__, rc); wl1251_priv.state = false; return rc; } } mdelay(10); msm_gpios_enable(wl1251_priv.gpios.on, wl1251_priv.gpios.on_length); //We need to set power here to make the card identify if (wl1251_priv.pdata->gpio_32k_osc >= 0) { gpio_direction_output(wl1251_priv.pdata->gpio_32k_osc, 1); } mdelay(100); if (wl1251_priv.pdata->gpio_reset >= 0) { gpio_set_value(wl1251_priv.pdata->gpio_reset, 0); mdelay(50); } if (wl1251_priv.pdata->gpio_enable >= 0) { gpio_direction_output(wl1251_priv.pdata->gpio_enable, 1); } mdelay(250); return 0; } if (!wl1251_priv.state) { return 0; } wl1251_priv.state = false; if (wl1251_priv.vreg) { vreg_disable(wl1251_priv.vreg); } if (wl1251_priv.pdata->gpio_enable >= 0) { gpio_direction_output(wl1251_priv.pdata->gpio_enable, 0); } if (wl1251_priv.pdata->gpio_reset >= 0) { gpio_set_value(wl1251_priv.pdata->gpio_reset, 1); } if (wl1251_priv.pdata->gpio_32k_osc >= 0) { gpio_direction_output(wl1251_priv.pdata->gpio_32k_osc, 0); } mdelay(200); msm_gpios_disable(wl1251_priv.gpios.off, wl1251_priv.gpios.off_length); return 0; }
static void qup_i2c_gpio_config(int adap_id, int config_type) { int rc = 0; struct msm_gpio *qup_i2c_table; /* Each adapter gets 2 lines from the table */ if (adap_id != 4) return; if (config_type) qup_i2c_table = qup_i2c_gpios_hw; else qup_i2c_table = qup_i2c_gpios_io; rc = msm_gpios_enable(qup_i2c_table, 2); if (rc < 0) printk(KERN_ERR "QUP GPIO enable failed: %d\n", rc); /*This needs to be enabled only for OEMS*/ #ifndef CONFIG_QUP_EXCLUSIVE_TO_CAMERA if (qup_vreg) { int rc = vreg_set_level(qup_vreg, 1800); if (rc) { pr_err("%s: vreg LVS1 set level failed (%d)\n", __func__, rc); } rc = vreg_enable(qup_vreg); if (rc) { pr_err("%s: vreg_enable() = %d \n", __func__, rc); } } #endif }
static int lcdc_common_panel_power(int on) { int rc, i; struct msm_gpio *gp; printk(KERN_INFO "%s on/off[%d]\n",__func__, on); if (on) { rc = display_common_power(on); if (rc < 0) { printk(KERN_ERR "%s display_common_power failed: %d\n", __func__, rc); return rc; } rc = msm_gpios_enable(lcd_panel_gpios, ARRAY_SIZE(lcd_panel_gpios)); if (rc < 0) { printk(KERN_ERR "%s: gpio enable failed: %d\n", __func__, rc); } printk(KERN_INFO "%s Power on\n",__func__); } else { /* off */ rc = msm_gpios_enable(lcd_panel_off_gpios, ARRAY_SIZE(lcd_panel_off_gpios)); if (rc < 0) { printk(KERN_ERR "%s: gpio enable failed: %d\n", __func__, rc); } gp = lcd_panel_off_gpios; for (i = 0; i < ARRAY_SIZE(lcd_panel_off_gpios); i++) { /* ouput low */ gpio_set_value(GPIO_PIN(gp->gpio_cfg), 0); gp++; } mdelay(20); rc = display_common_power(on); if (rc < 0) { printk(KERN_ERR "%s display_common_power failed: %d\n", __func__, rc); return rc; } printk(KERN_INFO "%s powe offed\n",__func__); } return rc; }
int msm_gpios_request_enable(const struct msm_gpio *table, int size) { int rc = msm_gpios_request(table, size); if (rc) return rc; rc = msm_gpios_enable(table, size); if (rc) msm_gpios_free(table, size); return rc; }
static void msm_i2c_gpio_config(int adap_id, int config_type) { struct msm_gpio *msm_i2c_table; /* Each adapter gets 2 lines from the table */ if (adap_id > 0) return; if (config_type) msm_i2c_table = &msm_i2c_gpios_hw[adap_id*2]; else msm_i2c_table = &msm_i2c_gpios_io[adap_id*2]; msm_gpios_enable(msm_i2c_table, 2); }
static uint32_t sdslot_switchvdd(struct device *dev, unsigned int vdd) { int rc, i; if (vdd) { if (sdslot_priv.state) { return 0; } rc = vreg_enable(sdslot_priv.vreg); if (rc) { pr_err("%s: Error enabling sd vreg %d\n", __func__, rc); return rc; } sdslot_priv.state = true; msm_gpios_enable(sdslot_priv.gpios.on, sdslot_priv.gpios.on_length); for (i = 0; i < ARRAY_SIZE(mmc_vdd_table); i++) { if (mmc_vdd_table[i].mask == (1 << vdd)) { rc = vreg_set_level(sdslot_priv.vreg, mmc_vdd_table[i].level); if (!rc) { return 0; } pr_err("%s: Error setting vreg level (%d)\n", __func__, rc); } } pr_err("%s: Invalid VDD %d specified\n", __func__, vdd); msm_gpios_disable(sdslot_priv.gpios.off, sdslot_priv.gpios.off_length); vreg_disable(sdslot_priv.vreg); return rc; } if (!sdslot_priv.state) { return 0; } sdslot_priv.state = false; rc = vreg_disable(sdslot_priv.vreg); if (rc) { pr_err("%s: Error disabling sd vreg %d\n", __func__, rc); } msm_gpios_disable(sdslot_priv.gpios.off, sdslot_priv.gpios.off_length); return rc; }
static void msm_fb_lcdc_power_save(int on) { int rc; if (on) { rc = msm_gpios_enable(lcd_panel_gpios, ARRAY_SIZE(lcd_panel_gpios)); if (rc < 0) { printk(KERN_ERR "%s: gpio config failed: %d\n", __func__, rc); } } else { msm_gpios_disable(lcd_panel_gpios, ARRAY_SIZE(lcd_panel_gpios)); } }
static int bluetooth_power(int on) { int rc=0; int pin = 0; printk("KERN_DEBUG %s: POWER %s\r\n", __FUNCTION__, on?"ON":"OFF"); if (on) { /*rc = msm_gpios_enable(bt_config_power_on, ARRAY_SIZE(bt_config_power_on)); if (rc<0) { printk(KERN_DEBUG "%s: Power ON bluetooth failed.\r\n", __FUNCTION__); return rc; }*/ gpio_tlmm_config(GPIO_CFG(32, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* RFR */ gpio_tlmm_config(GPIO_CFG(34, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA),GPIO_CFG_ENABLE); gpio_tlmm_config(GPIO_CFG(43, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* RFR */ gpio_tlmm_config(GPIO_CFG(44, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* CTS */ gpio_tlmm_config(GPIO_CFG(45, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* Rx */ gpio_tlmm_config(GPIO_CFG(46, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* Tx */ gpio_tlmm_config(GPIO_CFG(27, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* BT_HOST_WAKE */ gpio_tlmm_config(GPIO_CFG(31, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE); /* BT_WAKE */ for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_on); pin++) { rc = gpio_tlmm_config(bt_config_pcm_on[pin],GPIO_CFG_ENABLE); if (rc < 0) return rc; } //gpio_set_value(GPIO_BTUART_RFR, 0); //mdelay(20); gpio_set_value(GPIO_BT_RST_N, 0); mdelay(20); gpio_set_value(GPIO_BT_RST_N, 1); mdelay(20); gpio_set_value(HOST_WAKEUP_BT, 1); mdelay(20); //printk(KERN_DEBUG "%s: PULL UP GPIO_BT_REG_ON\r\n", __FUNCTION__); gpio_set_value(GPIO_BT_REG_ON, 1); mdelay(100); printk(KERN_DEBUG "%s: GPIO_BT_RST (%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BT_RST_N )?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BT_REG_ON (%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BT_REG_ON)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_RX !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_RX)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_TX !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_TX)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_RFR !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_RFR)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_CTS !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_CTS)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: HOST_WAKEUP_BT !(%s)\r\n", __FUNCTION__, gpio_get_value(HOST_WAKEUP_BT)?"HIGH":"LOW"); } else { rc = msm_gpios_enable(bt_config_power_off, ARRAY_SIZE(bt_config_power_off)); if (rc<0) { printk(KERN_DEBUG "%s: Power OFF bluetooth failed.\r\n", __FUNCTION__); return rc; } for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_off); pin++) { rc = gpio_tlmm_config(bt_config_pcm_off[pin],GPIO_CFG_ENABLE); if (rc < 0) return rc; } //printk(KERN_DEBUG "%s: PULL DOWN GPIO_BT_REG_ON\r\n", __FUNCTION__); gpio_set_value(GPIO_BT_REG_ON, 0); mdelay(100); gpio_set_value(HOST_WAKEUP_BT, 0); mdelay(20); gpio_set_value(GPIO_BT_RST_N, 0); mdelay(20); printk(KERN_DEBUG "%s: GPIO_BT_RST (%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BT_RST_N )?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BT_REG_ON (%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BT_REG_ON)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_RX !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_RX)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_TX !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_TX)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_RFR !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_RFR)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: GPIO_BTUART_CTS !(%s)\r\n", __FUNCTION__, gpio_get_value(GPIO_BTUART_CTS)?"HIGH":"LOW"); printk(KERN_DEBUG "%s: HOST_WAKEUP_BT !(%s)\r\n", __FUNCTION__, gpio_get_value(HOST_WAKEUP_BT)?"HIGH":"LOW"); } return 0; }
static int mmc_host_io_ctrl(int cmd) { int rc; switch (cmd){ case SD_CFG_POWER_ON: /* FUJITSU:2011-05-24 mmc_host start */ /* FUJITSU:2011-06-08 mmc_host start */ rc = msm_gpios_enable(gpio_sdcard_poweron, ARRAY_SIZE(gpio_sdcard_poweron)); if (rc >= 0){ /* FUJITSU:2011-06-08 mmc_host end */ gpio_set_value(SD_GPIONO_SD_RST, 0); /* SD_RST(GPIO[168]) -> 'L' */ #if 0 /* FUJITSU:2011/07/19 del for Sky-SDCC start */ rc = pm8058_gpio_config(SD_GPIONO_SD_CLK_EN, &sdc4_en); if (rc) { pr_err("%s SD_GPIONO_SD_CLK_EN config failed\n", __func__); } gpio_set_value_cansleep( PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 0); #endif/* FUJITSU:2011/07/19 mod for Sky-SDCC end */ }else{ pr_err("%s: GPIO_POWER_ON failed\n", __func__); return -1; } /* FUJITSU:2011-05-24 mmc_host end */ break; case SD_CFG_POWER_OFF: /* FUJITSU:2011-05-24 mmc_host start */ /* FUJITSU:2011-06-08 mmc_host start */ rc = msm_gpios_enable(gpio_sdcard_poweroff, ARRAY_SIZE(gpio_sdcard_poweroff)); if (rc >= 0){ /* FUJITSU:2011-06-08 mmc_host end */ gpio_set_value(SD_GPIONO_SD_RST, 0); /* SD_RST(GPIO[168]) -> 'L' */ #if 0 /* FUJITSU:2011/08/04 del for Sky-SDCC start */ gpio_set_value(SD_GPIONO_SD_CLK, 0); /* SD_CLK(GPIO[98]) -> 'L' */ #endif/* FUJITSU:2011/08/04 del for Sky-SDCC end */ #if 0 /* FUJITSU:2011/07/19 del for Sky-SDCC start */ rc = pm8058_gpio_config(SD_GPIONO_SD_CLK_EN, &sdc4_en); if (rc) { pr_err("%s SD_GPIONO_SD_CLK_EN config failed\n", __func__); } gpio_set_value_cansleep( PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 0); #endif/* FUJITSU:2011/07/19 del for Sky-SDCC end */ }else{ printk(KERN_ERR "%s: GPIO_POWER_OFF\n", __func__); return -1; } /* FUJITSU:2011-05-24 mmc_host end */ break; case SD_RST_ON: XYZ("SD_RST is '%c' +", gpio_get_value(SD_GPIONO_SD_RST) ? 'H' : 'L'); /* FUJITSU:2011-05-24 mmc_host start */ gpio_set_value(SD_GPIONO_SD_RST, 1); /* FUJITSU:2011-05-24 mmc_host end */ XYZ("SD_RST is '%c' +", gpio_get_value(SD_GPIONO_SD_RST) ? 'H' : 'L'); break; #if 0 case SD_RST_OFF: XYZ("SD_RST is '%c' +", gpio_get_value(SD_GPIONO_SD_RST) ? 'H' : 'L'); gpio_set_value(SD_GPIONO_SD_RST, 0); XYZ("SD_RST is '%c' +", gpio_get_value(SD_GPIONO_SD_RST) ? 'H' : 'L'); break; #endif case SD_VDD_ON: /* FUJITSU:2011-05-24 mmc_host start */ vreg_sdc = vreg_get(NULL, "gp6"/*"mmc"*/); if (IS_ERR(vreg_sdc)) { printk(KERN_ERR "%s: vreg get failed (%ld)\n", __func__, PTR_ERR(vreg_sdc)); break; } rc = vreg_set_level(vreg_sdc, 2900); if (rc) printk(KERN_ERR "%s: vreg_set_level() = %d \n", __func__, rc); rc = vreg_enable(vreg_sdc); if (rc) printk(KERN_ERR "%s: vreg_enable() = %d \n", __func__, rc); /* FUJITSU:2011-05-24 mmc_host end */ break; case SD_VDD_OFF: /* FUJITSU:2011-05-24 mmc_host start */ vreg_sdc = vreg_get(NULL, "gp6"/*"mmc"*/); if (IS_ERR(vreg_sdc)) { printk(KERN_ERR "%s: vreg get failed (%ld)\n", __func__, PTR_ERR(vreg_sdc)); break; } vreg_disable(vreg_sdc); /* FUJITSU:2011-05-24 mmc_host end */ break; case SDC_CLK_ON: #if 1 /* FUJITSU:2011/07/19 mod for Sky-SDCC start */ XYZ("SD_CLK_EN is '%c' +", gpio_get_value(SD_GPIONO_SD_CLK_EN) ? 'H' : 'L'); gpio_set_value(SD_GPIONO_SD_CLK_EN, 1); XYZ("SD_CLK_EN is '%c' +", gpio_get_value(SD_GPIONO_SD_CLK_EN) ? 'H' : 'L'); #else XYZ("SD_CLK_EN is '%c' +", gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN)) ? 'H' : 'L'); /* FUJITSU:2011-05-24 mmc_host start */ // gpio_set_value(SD_GPIONO_SD_CLK_EN, 1); // gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 1); if( ((system_rev & 0x0f) >= PRODUCT_F11SKY_2_0) && ((system_rev & 0x0f) != PRODUCT_F11SKY_EVM) ) { XYZ("SD_CLK_ON is set L MODEL = %Xh ",system_rev); gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 0); }else{ XYZ("SD_CLK_ON is set H MODEL = %Xh ",system_rev); gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 1); } /* FUJITSU:2011-05-24 mmc_host end */ XYZ("SD_CLK_EN is '%c' +", gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN)) ? 'H' : 'L'); #endif/* FUJITSU:2011/07/19 mod for Sky-SDCC end */ break; case SDC_CLK_OFF: #if 1 /* FUJITSU:2011/07/19 mod for Sky-SDCC start */ XYZ("SD_CLK_EN is '%c' +", gpio_get_value(SD_GPIONO_SD_CLK_EN) ? 'H' : 'L'); gpio_set_value(SD_GPIONO_SD_CLK_EN, 0); XYZ("SD_CLK_EN is '%c' +", gpio_get_value(SD_GPIONO_SD_CLK_EN) ? 'H' : 'L'); #else XYZ("SD_CLK_EN is '%c' +", gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN)) ? 'H' : 'L'); /* FUJITSU:2011-05-24 mmc_host start */ // gpio_set_value(SD_GPIONO_SD_CLK_EN, 0); gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN), 0); /* FUJITSU:2011-05-24 mmc_host end */ XYZ("SD_CLK_EN is '%c' +", gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(SD_GPIONO_SD_CLK_EN)) ? 'H' : 'L'); #endif/* FUJITSU:2011/07/19 mod for Sky-SDCC end */ break; default: return -1; } return 0; }