/*powerup the PMIC, configure GPIO 37, set GPIO to NO_PULL, make it as input pin. Give sleep of 10 millisecs, call registry init */ int prodrv_sns_ON(void) { int ok_flag = TRUE; PROX_DBG("=====<PROXIMITY> prodrv_sns_ON=====\n"); prox_detect.proxy_val = PROX_VAL_NEAR; prox_detect.proxy_state = PROX_DETECT_NON; sub_pmic_ldo_ctrl(SUB_PMIC_LDO4,SUB_PMIC_LDO_ON); #ifndef CONFIG_GPIOLIB gpio_configure(PROX_GPIO, GPIOF_ENABLE_WAKE | GPIOF_INPUT); #else gpio_direction_input(PROX_GPIO); #endif //added to set it to no pull as per spec gpio_tlmm_config(GPIO_CFG(PROX_GPIO, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_2MA),GPIO_ENABLE); msleep(SNS_STANDBY_TIME); ok_flag = prodrv_sns_reg_init(); if(ok_flag!=TRUE) { #ifndef CONFIG_GPIOLIB gpio_configure(PROX_GPIO, GPIOF_DRIVE_OUTPUT); #else gpio_direction_output(PROX_GPIO, 1); #endif } return ok_flag; }
//////////////////////////////// // Power OFF //////////////////////////////// static void cam12mp_sensor_poweroff(void) { LOGI("+%s()\n", __func__); gpio_set_value(RESET, 0); mdelay(1); gpio_tlmm_config(GPIO_CFG(MCLK, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_ENABLE); mdelay(1); gpio_set_value(R_STBY, 0); gpio_set_value(H_STBY, 0); mdelay(1); pmic_vreg_pull_down_switch(ON_CMD, PM_VREG_PDOWN_GP1_ID); if ( vreg_disable(vreg_get(NULL, "gp1"))) LOGE("%s: vreg disable failed !\n", __func__); mdelay(1); sub_pmic_ldo_ctrl(SUB_PMIC_CAM28V, SUB_PMIC_LDO_OFF); mdelay(1); gpio_set_value(CAM_18V, 0); mdelay(1); sub_pmic_ldo_ctrl(SUB_PMIC_CAM12V, SUB_PMIC_LDO_OFF); mdelay(1); pmic_vreg_pull_down_switch(ON_CMD, PM_VREG_PDOWN_GP6_ID); if (vreg_disable(vreg_get(NULL, "gp6"))) LOGE("%s: vreg disable failed !\n", __func__); mdelay(1); sub_pmic_reg_ctrl(SUB_PMIC_REG2, SUB_PMIC_LDO_OFF); pmic_vreg_pull_down_switch(OFF_CMD, PM_VREG_PDOWN_GP1_ID); pmic_vreg_pull_down_switch(OFF_CMD, PM_VREG_PDOWN_GP6_ID); mdelay(10); }
/*power-down the device configure GPIO 37 to out*/ void prodrv_sns_OFF(void) { PROX_DBG("=====<PROXIMITY> prodrv_sns_OFF=====\n"); #ifndef CONFIG_GPIOLIB gpio_configure(PROX_GPIO, GPIOF_DRIVE_OUTPUT); #else gpio_direction_output(PROX_GPIO, 1); #endif gpio_tlmm_config(GPIO_CFG(PROX_GPIO, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA),GPIO_DISABLE); prodrv_sns_ssd(); sub_pmic_ldo_ctrl(SUB_PMIC_LDO4,SUB_PMIC_LDO_OFF); prox_detect.proxy_val = PROX_VAL_NEAR; prox_detect.proxy_state = PROX_DETECT_NON; del_timer(&prox_timer); }
//////////////////////////////// // Power ON //////////////////////////////// static int cam12mp_sensor_poweron(void) { struct vreg *vreg_gp1, *vreg_gp6; LOGI("+%s()\n", __func__); vreg_gp6 = vreg_get(NULL, "gp6"); if (IS_ERR(vreg_gp6)) { LOGE(" - vreg_get(gp6) failed (%ld) !\n", PTR_ERR(vreg_gp6)); return -1; } if (vreg_set_level(vreg_gp6, 1800)) { LOGE(" - vreg gp6 set level failed !\n"); return -1; } vreg_gp1 = vreg_get(NULL, "gp1"); if (IS_ERR(vreg_gp1)) { LOGE(" - vreg_get(gp1) failed (%ld)\n", PTR_ERR(vreg_gp1)); return -1; } if (vreg_set_level(vreg_gp1, 2700)) { LOGE(" - vreg gp1 set level failed !\n"); return -1; } sub_pmic_reg_ctrl(SUB_PMIC_REG2, SUB_PMIC_LDO_ON); mdelay(1); if (vreg_enable(vreg_gp6)) { LOGE(" - vreg gp6 enable failed !\n"); goto _sensor_poweron_fail_1; } mdelay(1); sub_pmic_ldo_ctrl(SUB_PMIC_CAM12V, SUB_PMIC_LDO_ON); mdelay(1); gpio_set_value(CAM_18V, 1); mdelay(1); sub_pmic_ldo_ctrl(SUB_PMIC_CAM28V, SUB_PMIC_LDO_ON); mdelay(1); if (vreg_enable(vreg_gp1)) { LOGE(" - vreg gp1 enable failed !\n"); goto _sensor_poweron_fail_2; } mdelay(1); gpio_tlmm_config(GPIO_CFG(MCLK, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), GPIO_ENABLE); msm_camio_clk_rate_set(9600000); msm_camio_camif_pad_reg_reset(); gpio_set_value(H_STBY, 1); gpio_set_value(R_STBY, 1); mdelay(1); gpio_set_value(RESET, 1); mdelay(4); return 0; _sensor_poweron_fail_2: sub_pmic_ldo_ctrl(SUB_PMIC_CAM28V, SUB_PMIC_LDO_OFF); gpio_set_value(CAM_18V, 0); sub_pmic_ldo_ctrl(SUB_PMIC_CAM12V, SUB_PMIC_LDO_OFF); vreg_disable(vreg_gp6); _sensor_poweron_fail_1: sub_pmic_reg_ctrl(SUB_PMIC_REG2, SUB_PMIC_LDO_OFF); LOGI("-%s (fail.)\n", __func__); return -1; }