Esempio n. 1
0
int mt_bt_power_on(void)
{
    int error;
    printk(KERN_INFO MODULE_TAG "mt_bt_power_on ++\n");
    
/************************************************************
 *  Make sure BT_PWR_EN is default gpio output low when
 *  system boot up, otherwise MT6622 gets actived unexpectedly 
 ************************************************************/
    
    // URXD, UTXD
//    s3c_gpio_cfgpin(GPIO_BT_URXD_PIN, S3C_GPIO_SFN(0x2));
//    s3c_gpio_cfgpin(GPIO_BT_UTXD_PIN, S3C_GPIO_SFN(0x2));
    
    // PCMIN, PCMOUT, PCMCLK, PCMSYNC
    /* not configured since SMDK4x12 has no modem */
    
    // EINT

    // EINT
    /* set to EINT mode */
    gpio_direction_input(GPIO_BT_EINT_PIN);/////////important
    irq_num = gpio_to_irq(GPIO_BT_EINT_PIN);

    printk("GPIO_BT_PWR_EN_PIN before config(out_h: %d) \n", gpio_get_value(GPIO_BT_PWR_EN_PIN));
// PWR_EN & RESET pull high
    omap_mux_set_gpio(3, GPIO_BT_PWR_EN_PIN);
    gpio_direction_output(GPIO_BT_PWR_EN_PIN, 1);
    printk("GPIO_BT_PWR_EN_PIN after config(out_h: %d) \n", gpio_get_value(GPIO_BT_PWR_EN_PIN));
    msleep(1000);

    // PWR_EN & RESET
    /* PWR_EN pin output high */
//    s3c_gpio_cfgpin(GPIO_BT_PWR_EN_PIN, S3C_GPIO_SFN(0x1));
//    gpio_direction_output(GPIO_BT_PWR_EN_PIN, 1);
    /* RESET pin set to low */
//    s3c_gpio_cfgpin(GPIO_BT_RESET_PIN, S3C_GPIO_SFN(0x1));
//    gpio_direction_output(GPIO_BT_RESET_PIN, 0);
    
//    msleep(15);
    /* RESET pin pull up */
//    gpio_direction_output(GPIO_BT_RESET_PIN, 1);
//    msleep(1000);
    
    error = mt_bt_request_irq();
    if (error){
        /* Clear GPIO configurations */
        gpio_direction_output(GPIO_BT_PWR_EN_PIN, 0);
//        gpio_direction_output(GPIO_BT_RESET_PIN, 0);
//	omap_mux_set_gpio(3, GPIO_BT_EINT_PIN);
	gpio_direction_output(GPIO_BT_EINT_PIN, 0);
//        s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(0x1));
//        gpio_direction_output(GPIO_BT_EINT_PIN, 0);
//        s3c_gpio_cfgpin(GPIO_BT_URXD_PIN, S3C_GPIO_SFN(0x1));
//        gpio_direction_output(GPIO_BT_URXD_PIN, 0);
//        s3c_gpio_cfgpin(GPIO_BT_UTXD_PIN, S3C_GPIO_SFN(0x1));
//        gpio_direction_output(GPIO_BT_UTXD_PIN, 0);
        return error;
    }
    
    printk(KERN_INFO MODULE_TAG "mt_bt_power_on --\n");
    
    return 0;
}
int mt_bt_power_on(void)
{
    int error;
    struct mt6622_platform_data *pdata;
    
    printk(KERN_INFO MODULE_TAG "mt_bt_power_on ++\n");
    
    pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();
    
    if(pdata) {
	    // UART TX/RX
	    
	    // PCMIN, PCMOUT, PCMCLK, PCMSYNC
	    
	    // EINT
	    //--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(0));
	    //--s3c_gpio_setpull(GPIO_BT_EINT_PIN, S3C_GPIO_PULL_DOWN);
	    if(pdata->irq_gpio.io != INVALID_GPIO)
	    	gpio_direction_input(pdata->irq_gpio.io);
	    //gpio_pull_updown(pdata->irq_gpio->io, GPIOPullDown);
	    /* set to EINT mode */
	    //--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(0xF));
	    /* get irq number */
	    if(pdata->irq_gpio.io != INVALID_GPIO)
	    	irq_num = gpio_to_irq(pdata->irq_gpio.io);
	    //mt_set_gpio_mode(GPIO_BT_EINT_PIN, GPIO_BT_EINT_PIN_M_GPIO);
	    //mt_set_gpio_pull_enable(GPIO_BT_EINT_PIN, 1);
	    //mt_set_gpio_pull_select(GPIO_BT_EINT_PIN, GPIO_PULL_DOWN);
	    //mt_set_gpio_mode(GPIO_BT_EINT_PIN, GPIO_BT_EINT_PIN_M_EINT);
	    
	    // 32k CLK
	    //mt_set_gpio_mode(GPIO_BT_CLK_PIN , GPIO_BT_CLK_PIN_M_CLK);
	    //mt_set_clock_output(GPIO_BT_CLK_PIN_CLK, CLK_SRC_F32K, 1);
	   
         if(gpio_is_valid(pdata->rts_gpio.io)) {
             printk(KERN_INFO MODULE_TAG "mt_bt_power_on rts iomux\n");
             rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fgpio);
             gpio_direction_output(pdata->rts_gpio.io, 0);
         }	   
	    
	    // PWR_EN and RESET
	    /* PWR_EN set to gpio output low */
	    if(pdata->power_gpio.io != INVALID_GPIO)
	    	gpio_direction_output(pdata->power_gpio.io, 0);
	    /* RESET set to gpio output low */
	    if(pdata->reset_gpio.io != INVALID_GPIO)
	    	gpio_direction_output(pdata->reset_gpio.io, 0);
	    msleep(200);
	    
	    /* PWR_EN pull up */
	    if(pdata->power_gpio.io != INVALID_GPIO)
	    	gpio_direction_output(pdata->power_gpio.io, 1);
	    msleep(200);
	    /* RESET pull up */
	    if(pdata->reset_gpio.io != INVALID_GPIO)
	    	gpio_direction_output(pdata->reset_gpio.io, 1);
	    msleep(1000);

        if(gpio_is_valid(pdata->rts_gpio.io)) {
            rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fmux);
        }
	    
	    error = mt_bt_request_irq();
	    if (error){
	        if(pdata->power_gpio.io != INVALID_GPIO)
	        	gpio_direction_output(pdata->power_gpio.io, 0);
	        if(pdata->reset_gpio.io != INVALID_GPIO)	
	        	gpio_direction_output(pdata->reset_gpio.io, 0);
	        //--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(1));
	        if(pdata->irq_gpio.io != INVALID_GPIO)
	        	gpio_direction_output(pdata->irq_gpio.io, 0);
	        return error;
	    }
    }
    
    printk(KERN_INFO MODULE_TAG "mt_bt_power_on --\n");
    
    return 0;
}