static void msm_keypad_bl_led_set(struct led_classdev *led_cdev, enum led_brightness value) { #ifdef CONFIG_HUAWEI_LEDS_PMIC int ret = 0; if(machine_is_msm7x30_u8800()) { if(disable_keypad_leds) value = 0; ret = pmic_set_led_intensity(LED_KEYPAD, value / LED_FULL); } if(machine_is_msm7x30_u8820()) { ret = pmic_set_mpp6_led_intensity(value / LED_FULL); } if (ret) dev_err(led_cdev->dev, "can't set keypad backlight\n"); #else int ret; ret = pmic_set_led_intensity(LED_KEYPAD, value / MAX_KEYPAD_BL_LEVEL); if (ret) dev_err(led_cdev->dev, "can't set keypad backlight\n"); #endif }
/*configure GPIO 25 Of PIMIC as PWM to driver LED*/ int led_pwm_gpio_config(void) { int rc; struct pm_gpio backlight_drv = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_BUF_CMOS, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 0, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_2, .inv_int_pol = 1, }; if(machine_is_msm8255_u8860lp() || machine_is_msm8255_u8860_r() ||machine_is_msm8255_u8860_51()) { rc = pm8xxx_gpio_config( 24, &backlight_drv); } else { rc = -1; } if (rc) { pr_err("%s LED backlight GPIO config failed\n", __func__); return rc; } return 0; } #endif static void msm_keypad_bl_led_set(struct led_classdev *led_cdev, enum led_brightness value) { #ifdef CONFIG_HUAWEI_LEDS_PMIC int ret = 0; /* 7x27a platform use mpp7 as keypad backlight */ #ifdef CONFIG_ARCH_MSM7X27A if(machine_is_msm7x27a_C8820()) { ret = pmic_secure_mpp_config_i_sink(PM_MPP_7, PM_MPP__I_SINK__LEVEL_5mA, \ (!!value) ? PM_MPP__I_SINK__SWITCH_ENA : PM_MPP__I_SINK__SWITCH_DIS); } else { /* use pwm to control the brightness of keypad backlight*/ /* make sure the led is drived by pwm when */ /* the system sleep indicator switch is on */ pmapp_button_backlight_init(); ret = pmapp_button_backlight_set_brightness(value); } #else if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro() ) { ret = pmic_set_led_intensity(LED_KEYPAD, !( ! value)); } else if( machine_is_msm8255_u8860lp() || machine_is_msm8255_u8860_r() ||machine_is_msm8255_u8860_51()) { pwm_config(bl_pwm, LED_PWM_DUTY_LEVEL*value/NSEC_PER_USEC, LED_PWM_PERIOD/NSEC_PER_USEC); pwm_enable(bl_pwm); } else if(machine_is_msm7x30_u8820() || (machine_is_msm8255_u8730())) { ret = pmic_set_mpp6_led_intensity(!( ! value)); } /*< when the value between 0 and 255,set the key brightness is LED_BRIGHRNESS_LEVEL or set the brightness is 0 */ else if( machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860_92()) { if(LED_BRIGHTNESS_OFF >= value || LED_PWM_LEVEL < value ) { ret = pmic_set_keyled_intensity(LED_KEYPAD,LED_BRIGHTNESS_OFF ); } else { ret = pmic_set_keyled_intensity(LED_KEYPAD, LED_BRIGHTNESS_LEVEL); } } else if(machine_is_msm8255_u8680()) { /* Set keypad led brightness level 12 for U8680 */ if(LED_BRIGHTNESS_OFF >= value || LED_PWM_LEVEL < value) { ret = pmic_set_keyled_intensity(LED_KEYPAD,LED_BRIGHTNESS_OFF); } else { ret = pmic_set_keyled_intensity(LED_KEYPAD, LED_BRIGHTNESS_LEVEL_U8680); } } else if(machine_is_msm8255_u8667()) { /* Set keypad led brightness level 16 for U8667 */ if(LED_BRIGHTNESS_OFF >= value || LED_PWM_LEVEL < value) { ret = pmic_set_keyled_intensity(LED_KEYPAD, LED_BRIGHTNESS_OFF); } else { ret = pmic_set_keyled_intensity(LED_KEYPAD, LED_BRIGHTNESS_LEVEL_U8667); } } #endif if (ret) dev_err(led_cdev->dev, "can't set keypad backlight\n"); #else int ret; ret = pmic_set_led_intensity(LED_KEYPAD, value / MAX_KEYPAD_BL_LEVEL); if (ret) dev_err(led_cdev->dev, "can't set keypad backlight\n"); #endif }
int backlight_pwm_gpio_config(void) { int rc; struct pm8058_gpio backlight_drv = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_BUF_CMOS, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 0, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_2, .inv_int_pol = 1, }; /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro()) { rc = pm8058_gpio_config( 24, &backlight_drv); } else if(machine_is_msm7x30_u8820()) { rc = pm8058_gpio_config( 25, &backlight_drv); } else { rc = -1; } if (rc) { pr_err("%s LCD backlight GPIO config failed\n", __func__); return rc; } return 0; } #ifndef CONFIG_HUAWEI_LEDS_PMIC void touchkey_setbacklight(int level) { if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro()) { pmic_set_led_intensity(LED_KEYPAD, level); } if(machine_is_msm7x30_u8820()) { /*if the machine is U8820 use the mpp6 for touchkey backlight*/ pmic_set_mpp6_led_intensity(level); } } #endif void pwm_set_backlight (struct msm_fb_data_type * mfd) { int bl_level = mfd->bl_level; /*config PM GPIO25 as PWM and request PWM*/ if(TRUE == first_set_bl) { backlight_pwm_gpio_config(); /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro()) { bl_pwm = pwm_request(PM_GPIO25_PWM_ID, "backlight"); } else if(machine_is_msm7x30_u8820()) { bl_pwm = pwm_request(PM_GPIO26_PWM_ID, "backlight"); } else { bl_pwm = NULL; } if (NULL == bl_pwm || IS_ERR(bl_pwm)) { pr_err("%s: pwm_request() failed\n", __func__); bl_pwm = NULL; } first_set_bl = FALSE; } if (bl_pwm) { /* keep duty 10% < level < 90% */ if (bl_level) { bl_level = ((bl_level * PWM_LEVEL_ADJUST) / PWM_LEVEL + ADD_VALUE); if (bl_level < BL_MIN_LEVEL) { bl_level = BL_MIN_LEVEL; } } pwm_config(bl_pwm, PWM_DUTY_LEVEL*bl_level/NSEC_PER_USEC, PWM_PERIOD/NSEC_PER_USEC); pwm_enable(bl_pwm); } #ifndef CONFIG_HUAWEI_LEDS_PMIC touchkey_setbacklight(!!bl_level); #endif }