Exemple #1
0
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;
}
Exemple #8
0
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));
    }

}
Exemple #9
0
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;
}
Exemple #10
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;
}