@@ -44,6 +44,7 @@ const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
4444
4545int power_button_enable = 0 ;
4646static uint8_t led_level ;
47+ int breath_led_length ;
4748
4849struct pwm_led led_color_map [EC_LED_COLOR_COUNT ] = {
4950 /* Red, Green, Blue */
@@ -67,7 +68,7 @@ struct pwm_led pwr_led_color_map[EC_LED_COLOR_COUNT] = {
6768
6869struct pwm_led breath_led_color_map [EC_LED_COLOR_COUNT ] = {
6970 /* White, Green, Red */
70- [EC_LED_COLOR_WHITE ] = { 50 , 0 , 0 },
71+ [EC_LED_COLOR_WHITE ] = { FP_LED_HIGH , 0 , 0 },
7172};
7273
7374struct pwm_led pwm_leds [CONFIG_LED_PWM_COUNT ] = {
@@ -120,7 +121,7 @@ void set_pwr_led_color(enum pwm_led_id id, int color)
120121 led -> set_duty (led -> ch2 , duty .ch2 );
121122}
122123
123- void enable_pwr_breath (enum pwm_led_id id , int color , uint8_t enable )
124+ void enable_pwr_breath (enum pwm_led_id id , int color , int breath_length , uint8_t enable )
124125{
125126 struct pwm_led duty = { 0 };
126127 const struct pwm_led * led = & pwm_leds [id ];
@@ -136,11 +137,11 @@ void enable_pwr_breath(enum pwm_led_id id, int color, uint8_t enable)
136137 }
137138
138139 if (led -> ch0 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
139- bbled_enable (led -> ch0 , duty .ch0 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
140+ bbled_enable (led -> ch0 , duty .ch0 , breath_length , BREATH_OFF_LENGTH , enable );
140141 if (led -> ch1 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
141- bbled_enable (led -> ch1 , duty .ch1 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
142+ bbled_enable (led -> ch1 , duty .ch1 , breath_length , BREATH_OFF_LENGTH , enable );
142143 if (led -> ch2 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
143- bbled_enable (led -> ch2 , duty .ch2 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
144+ bbled_enable (led -> ch2 , duty .ch2 , breath_length , BREATH_OFF_LENGTH , enable );
144145}
145146
146147void led_get_brightness_range (enum ec_led_id led_id , uint8_t * brightness_range )
@@ -282,14 +283,14 @@ static void led_set_power(void)
282283 /* don't light up when at lid close */
283284 if (!lid_is_open ()) {
284285 set_pwr_led_color (PWM_LED2 , -1 );
285- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 0 );
286+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 0 );
286287 return ;
287288 }
288289
289290 if (chipset_in_state (CHIPSET_STATE_ANY_SUSPEND ))
290- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 1 );
291+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 1 );
291292 else
292- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 0 );
293+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 0 );
293294
294295 if (chipset_in_state (CHIPSET_STATE_ON ) | power_button_enable ) {
295296 if (charge_prevent_power_on (0 ))
@@ -321,6 +322,7 @@ static void led_tick(void)
321322static void led_configure (void )
322323{
323324 int i ;
325+ uint8_t breath_led_level = FP_LED_HIGH ;
324326
325327 /*Initialize PWM channels*/
326328 for (i = 0 ; i < PWM_CH_COUNT ; i ++ ) {
@@ -329,8 +331,29 @@ static void led_configure(void)
329331
330332 system_get_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , & led_level );
331333
332- if (led_level )
334+
335+ if (led_level ) {
336+ switch (led_level ) {
337+ case FP_LED_BRIGHTNESS_HIGH :
338+ breath_led_level = FP_LED_HIGH ;
339+ breath_led_length = BREATH_ON_LENGTH ;
340+ break ;
341+ case FP_LED_BRIGHTNESS_MEDIUM :
342+ breath_led_level = FP_LED_MEDIUM ;
343+ breath_led_length = 72 ;
344+ break ;
345+ case FP_LED_BRIGHTNESS_LOW :
346+ breath_led_level = 20 ;
347+ breath_led_length = 90 ;
348+ break ;
349+ default :
350+ break ;
351+ }
352+ breath_led_color_map [EC_LED_COLOR_WHITE ].ch0 = breath_led_level ;
333353 pwr_led_color_map [EC_LED_COLOR_WHITE ].ch0 = led_level ;
354+ } else
355+ breath_led_length = BREATH_ON_LENGTH ;
356+
334357
335358 led_tick ();
336359}
@@ -348,6 +371,7 @@ static enum ec_status fp_led_level_control(struct host_cmd_handler_args *args)
348371{
349372 const struct ec_params_fp_led_control * p = args -> params ;
350373 struct ec_response_fp_led_level * r = args -> response ;
374+ uint8_t breath_led_level ;
351375
352376 if (p -> get_led_level ) {
353377 system_get_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , & r -> level );
@@ -358,19 +382,27 @@ static enum ec_status fp_led_level_control(struct host_cmd_handler_args *args)
358382 switch (p -> set_led_level ) {
359383 case FP_LED_BRIGHTNESS_HIGH :
360384 led_level = FP_LED_HIGH ;
385+ breath_led_level = FP_LED_HIGH ;
386+ breath_led_length = BREATH_ON_LENGTH ;
361387 break ;
362388 case FP_LED_BRIGHTNESS_MEDIUM :
363389 led_level = FP_LED_MEDIUM ;
390+ breath_led_level = FP_LED_MEDIUM ;
391+ breath_led_length = 72 ;
364392 break ;
365393 case FP_LED_BRIGHTNESS_LOW :
366394 led_level = FP_LED_LOW ;
395+ breath_led_level = 20 ;
396+ breath_led_length = 90 ;
367397 break ;
368398 default :
369399 return EC_RES_INVALID_PARAM ;
370400 break ;
371401 }
372402
373403 system_set_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , led_level );
404+
405+ breath_led_color_map [EC_LED_COLOR_WHITE ].ch0 = breath_led_level ;
374406 pwr_led_color_map [EC_LED_COLOR_WHITE ].ch0 = led_level ;
375407
376408 return EC_RES_SUCCESS ;
0 commit comments