/*==================================================================== FUNCTION dmb_power_off DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_power_off(void) { DMB_MSG_HW("[%s] start!!!\n", __func__); #ifdef FEATURE_DMB_PMIC_POWER dmb_pmic_power_onoff(0); #endif #ifdef DMB_PWR_EN dmb_set_gpio(DMB_PWR_EN, 0); #endif msleep(1); #ifdef FEATURE_DMB_SET_ANT_PATH_POWER dmb_pmic_ant_switch_power(FALSE); #endif #ifdef FEATURE_DMB_SET_ANT_PATH dmb_set_gpio(DMB_ANT_SEL, 0); #ifdef DMB_ANT_SEL2 dmb_set_gpio(DMB_ANT_SEL2, 0); #endif #endif #ifdef FEATURE_DMB_PMIC_TCXO_192M dmb_set_gpio(DMB_XO_SEL, 0); #endif DMB_MSG_HW("[%s] end!!!\n", __func__); #if (defined(FEATURE_DMB_TSIF_IF) && defined(FEATURE_DMB_TSIF_CLK_CTL)) dmb_tsif_clk_disable(); #endif }
/*==================================================================== FUNCTION dmb_set_ant_path DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_set_ant_path(int ant_type) { #ifdef FEATURE_DMB_SET_ANT_PATH DMB_MSG_HW("[%s] ant_type[%d]\n", __func__, ant_type); #if defined(CONFIG_ARCH_MSM8960) && (DMB_ANT_SEL == 26) gpio_tlmm_config(GPIO_CFG(DMB_ANT_SEL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); #endif if (ant_type == DMB_ANT_EARJACK) { dmb_set_gpio(DMB_ANT_SEL, DMB_ANT_EAR_ACT); #ifdef DMB_ANT_SEL2 dmb_set_gpio(DMB_ANT_SEL2, DMB_ANT_EAR_ACT2); #endif } else { dmb_set_gpio(DMB_ANT_SEL, (DMB_ANT_EAR_ACT)?0:1); #ifdef DMB_ANT_SEL2 dmb_set_gpio(DMB_ANT_SEL2, (DMB_ANT_EAR_ACT2)?0:1); #endif } #else DMB_MSG_HW("[%s] Do nothing, No ANT. switch\n", __func__); #endif /* FEATURE_DMB_SET_ANT_PATH */ }
/*==================================================================== FUNCTION dmb_set_gpio DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_set_gpio(uint gpio, bool value) { #if 1 gpio_set_value(gpio, value); DMB_MSG_HW("[%s] gpio [%d] set [%d]\n", __func__, gpio, value); #ifdef FEATURE_DMB_GPIO_DEBUG DMB_MSG_HW("[%s] gpio [%d] get [%d]\n", __func__, gpio, gpio_get_value(gpio)); #endif #else int rc = 0; rc = gpio_request(gpio, "dmb_gpio"); if (!rc) { rc = gpio_direction_output(gpio, value); DMB_MSG_HW("[%s] gpio [%d] set [%d]\n", __func__, gpio, value); } else { DMB_MSG_HW("[%s] gpio_request fail!!!\n", __func__); } #ifdef FEATURE_DMB_GPIO_DEBUG DMB_MSG_HW("[%s] gpio [%d] get [%d]\n", __func__, gpio, gpio_get_value(gpio)); #endif gpio_free(gpio); #endif // 0 }
static void dmb_pmic_xo_onoff(int on) { int rc=0; DMB_MSG_HW("[%s] \n", __func__); if(!xo_handle_a2) { xo_handle_a2 = clk_get_sys("dmb_clk", "xo"); if (IS_ERR(xo_handle_a2)) DMB_MSG_HW("[%s] clk_get err \n", __func__); } if(on) { rc = clk_prepare_enable(xo_handle_a2); if(rc != 0) DMB_MSG_HW("[%s] clk_prepare_enable err [%d]\n", __func__, rc); } else { clk_disable_unprepare(xo_handle_a2); } if (rc < 0) { DMB_MSG_HW("[%s] Configuring dmb_pmic_xo_onoff failed (%d)\n", __func__, rc); return; } return; }
/*==================================================================== FUNCTION dmb_gpio_init DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_gpio_init(void) { int i; #ifdef CONFIG_ARCH_MSM int rc; #endif DMB_MSG_HW("[%s] dmb_gpio_init!!!\n",__func__); for(i = 0; i < ARRAY_SIZE(dmb_gpio_init_table); i ++) { #ifdef CONFIG_ARCH_MSM rc = gpio_tlmm_config(dmb_gpio_init_table[i], GPIO_CFG_ENABLE); if (rc) { DMB_MSG_HW("[%s] gpio_tlmm_config(%#x)=%d\n",__func__, dmb_gpio_init_table[i], rc); break; } #elif defined(CONFIG_ARCH_TEGRA) tegra_gpio_enable(dmb_gpio_init_table[i][0]); tegra_gpio_init_configure(dmb_gpio_init_table[i][0],dmb_gpio_init_table[i][1],dmb_gpio_init_table[i][2]); //DMB_MSG_HW("[%s] dmb_gpio_init gpio[%d], is_input[%d], value[%d]\n", __func__, dmb_gpio_init_table[i][0], dmb_gpio_init_table[i][1], dmb_gpio_init_table[i][2]); #endif } // EF39S ant_sel low #if (defined(CONFIG_SKY_EF39S_BOARD) && (BOARD_REV > WS10)) dmb_set_gpio(DMB_ANT_SEL, 0); #endif DMB_MSG_HW("[%s] end cnt[%d]!!!\n",__func__, i); }
/*==================================================================== FUNCTION dmb_pmic_power_onoff DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ static boolean dmb_pmic_power_onoff(int on) { int ret = 0; #if defined(CONFIG_MACH_MSM8974_EF65S) ret = dmb_pmic_8921_onoff(on, "8941_l3", 1225000, 1225000); DMB_MSG_HW("8941 L3 onoff [%d] !!!\n",ret); #endif #if defined(CONFIG_MACH_MSM8974_EF56S) || defined(CONFIG_MACH_MSM8974_EF58L) ret = dmb_pmic_8921_onoff(on, "8941_l3", 1150000, 1150000); //wgon test DMB_MSG_HW("dmb_pmic_power_onoff [%d] !!!\n",ret); #endif #if defined(CONFIG_MACH_MSM8960_EF46L) ret = dmb_pmic_8921_onoff(on, "8921_l18", 1300000, 1300000); #endif #if defined(CONFIG_MACH_MSM8960_SIRIUSLTE) && (BOARD_VER != PT11) ret = dmb_pmic_8921_onoff(on, "8921_l18", 1200000, 1200000); ret = dmb_pmic_8921_onoff(on, "8921_lvs7", 0, 0); #endif #if defined(CONFIG_EF31S_32K_BOARD) //ret = ; #endif #if (defined(CONFIG_EF10_BOARD) || defined(CONFIG_EF12_BOARD)) //ret = ; #endif return ret; }
/*==================================================================== FUNCTION dmb_gpio_init DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_gpio_init(void) { int i; #ifdef CONFIG_ARCH_MSM int rc; #endif DMB_MSG_HW("[%s] dmb_gpio_init!!!\n",__func__); for(i = 0; i < ARRAY_SIZE(dmb_gpio_init_table); i ++) { #ifdef CONFIG_ARCH_MSM #ifdef FEATURE_DMB_PMIC_GPIO if(GPIO_PIN(dmb_gpio_init_table[i]) >= FEATURE_DMB_PMIC_GPIO) continue; // PMIC GPIO인 경우 board-8064-pmic.c에서 초기화 한다. #endif rc = gpio_request(dmb_gpio_num[i], dmb_gpio_name[i]); if(rc) { DMB_MSG_HW("[%s] gpio_request fail %d rc %d\n",__func__, dmb_gpio_num[i], rc); break; } rc = gpio_tlmm_config(dmb_gpio_init_table[i], GPIO_CFG_ENABLE); if(rc) { DMB_MSG_HW("[%s] gpio_tlmm_config(%#x)=%d\n",__func__, dmb_gpio_init_table[i], rc); break; } #elif defined(CONFIG_ARCH_TEGRA) tegra_gpio_enable(dmb_gpio_init_table[i][0]); tegra_gpio_init_configure(dmb_gpio_init_table[i][0],dmb_gpio_init_table[i][1],dmb_gpio_init_table[i][2]); //DMB_MSG_HW("[%s] dmb_gpio_init gpio[%d], is_input[%d], value[%d]\n", __func__, dmb_gpio_init_table[i][0], dmb_gpio_init_table[i][1], dmb_gpio_init_table[i][2]); #endif } #if (defined(CONFIG_MACH_APQ8064_EF48S)||defined(CONFIG_MACH_APQ8064_EF49K)||defined(CONFIG_MACH_APQ8064_EF50L)||defined(CONFIG_MACH_APQ8064_EF51S)||defined(CONFIG_MACH_APQ8064_EF51K)||defined(CONFIG_MACH_APQ8064_EF51L)) #ifdef DMB_ANT_SEL dmb_set_gpio(DMB_ANT_SEL, 0); #endif #endif // EF39S ant_sel low #if (defined(CONFIG_SKY_EF39S_BOARD) && (BOARD_REV > WS10)) dmb_set_gpio(DMB_ANT_SEL, 0); #endif DMB_MSG_HW("[%s] end cnt[%d]!!!\n",__func__, i); }
/*==================================================================== FUNCTION dmb_power_on DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_power_on(void) { DMB_MSG_HW("[%s] start!!!\n", __func__); #ifdef FEATURE_DMB_SET_ANT_PATH_POWER dmb_pmic_ant_switch_power(TRUE); #endif #ifdef FEATURE_DMB_PMIC_19200 dmb_pmic_xo_onoff(1); #endif #ifdef DMB_XO_SEL dmb_set_gpio(DMB_XO_SEL, 1); #endif #ifdef DMB_LNA_EN dmb_set_gpio(DMB_LNA_EN, 1); #if 0 // zeros temp dmb_set_gpio(DMB_LNA, 0); #endif //0 #endif #if (defined(FEATURE_DMB_TSIF_IF) && defined(FEATURE_DMB_TSIF_CLK_CTL)) dmb_tsif_clk_enable(); #endif }
static void dmb_pmic_xo_onoff(int on) { int rc =0; if(!xo_handle_a1) { xo_handle_a1 = msm_xo_get(MSM_XO_TCXO_A1, "DMB_XTAL"); } if(on) { rc = msm_xo_mode_vote(xo_handle_a1, MSM_XO_MODE_ON); } else { rc = msm_xo_mode_vote(xo_handle_a1, MSM_XO_MODE_OFF); } if (rc < 0) { DMB_MSG_HW("[%s] Configuring MSM_XO_MODE_ON_OFF failed (%d)\n", __func__, rc); return; } return; }
/*==================================================================== FUNCTION dmb_micro_usb_ant_detect DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ int dmb_micro_usb_ant_detect(void) { int ret = 0; DMB_MSG_HW("[%s] on[%d]!!!\n", __func__, on); ret = pm8058_is_dmb_ant(); return ret; }
/*==================================================================== FUNCTION dmb_set_gpio DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_set_gpio(uint gpio, bool value) { #ifdef FEATURE_DMB_USE_DTS #ifdef FEATURE_DMB_PMIC_GPIO int pmic_gpio; dmb_ext_dev *ext_gpio = get_dmb_pmic_data(); #endif #endif #ifdef FEATURE_DMB_PMIC_GPIO if(gpio >= FEATURE_DMB_PMIC_GPIO) { #ifdef FEATURE_DMB_USE_DTS if(DMB_PMIC_GPIO_NUM == 1) { pmic_gpio = ext_gpio->pmic_gpio[0]; } else { //pmic_gpio = (gpio == DMB_RESET) ? ext_gpio->pmic_gpio[0] : ext_gpio->pmic_gpio[1]; } gpio_set_value_cansleep(pmic_gpio, value); DMB_MSG_HW("[%s] PMIC gpio [%d] set [%d]\n", __func__, pmic_gpio, value); #else gpio_set_value_cansleep(PMIC_GPIO_PM_TO_SYS(gpio), value); #endif } else #endif gpio_set_value(gpio, value); DMB_MSG_HW("[%s] gpio [%d] set [%d]\n", __func__, gpio, value); #ifdef FEATURE_DMB_GPIO_DEBUG #ifdef FEATURE_DMB_PMIC_GPIO if(gpio >= FEATURE_DMB_PMIC_GPIO) DMB_MSG_HW("[%s] gpio [%d] get [%d]\n", __func__, gpio, gpio_get_value_cansleep(PMIC_GPIO_PM_TO_SYS(gpio))); else #endif DMB_MSG_HW("[%s] gpio [%d] get [%d]\n", __func__, gpio, gpio_get_value(gpio)); #endif }
/*==================================================================== FUNCTION dmb_pmic_8058_onoff DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ static boolean dmb_pmic_8058_onoff(int on, const char *id, int min_uV, int max_uV) { static struct regulator *vreg; //If verg value was changed, can not disable regulator int ret = 0; DMB_MSG_HW("[%s] on[%d]!!!\n", __func__, on); vreg = regulator_get(NULL, id); if ((min_uV > 0) && (max_uV > 0)) { ret = regulator_set_voltage(vreg, min_uV, max_uV); } if(on) { if(!ret) ret = regulator_enable(vreg); if(ret) { DMB_MSG_HW("DMB regulator_enable Fail [%d] !!!\n",ret); return FALSE; } } else { ret = regulator_disable(vreg); if(ret) { DMB_MSG_HW("DMB regulator_disable Fail [%d] !!!\n",ret); return FALSE; } } return TRUE; }
/*==================================================================== FUNCTION dmb_power_on_chip DESCRIPTION DEPENDENCIES RETURN VALUE SIDE EFFECTS ======================================================================*/ void dmb_power_on_chip(void) { DMB_MSG_HW("[%s] start!!!\n", __func__); #ifdef FEATURE_DMB_PMIC_POWER dmb_pmic_power_onoff(1); #endif #ifdef DMB_PWR_EN dmb_set_gpio(DMB_PWR_EN, 1); #endif #if defined(CONFIG_MACH_MSM8960_SIRIUSLTE) && (BOARD_VER == PT11) dmb_set_gpio(58, 1); dmb_set_gpio(77, 1); #endif }