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; }