static void an30259a_set_led_blink(enum an30259a_led_enum led, unsigned int delay_on_time, unsigned int delay_off_time, u8 brightness) { struct i2c_client *client; client = b_client; if (brightness == LED_OFF) { leds_on(led, false, false, brightness); return; } if (brightness > LED_MAX_CURRENT) brightness = LED_MAX_CURRENT; if (led == LED_R) LED_DYNAMIC_CURRENT = LED_R_CURRENT; else if (led == LED_G) LED_DYNAMIC_CURRENT = LED_G_CURRENT; else if (led == LED_B) LED_DYNAMIC_CURRENT = LED_B_CURRENT; /* Yank555.lu : Control LED intensity (CM, Samsung, override) */ if (led_intensity == 40) /* Samsung stock behaviour */ brightness = (brightness * LED_DYNAMIC_CURRENT) / LED_MAX_CURRENT; else if (led_intensity != 0) /* CM stock behaviour */ brightness = (brightness * led_intensity) / LED_MAX_CURRENT; /* override, darker or brighter */ if (delay_on_time > SLPTT_MAX_VALUE) delay_on_time = SLPTT_MAX_VALUE; if (delay_off_time > SLPTT_MAX_VALUE) delay_off_time = SLPTT_MAX_VALUE; if (delay_off_time == LED_OFF) { leds_on(led, true, false, brightness); if (brightness == LED_OFF) leds_on(led, false, false, brightness); return; } else leds_on(led, true, true, brightness); /* Yank555.lu : Handle fading / blinking */ if (led_enable_fade == 1) { leds_set_slope_mode(client, led, 0, (15 / led_speed), (7 / led_speed), 0, ((delay_on_time / led_speed) + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, ((delay_off_time / led_speed) + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, led_slope_up_1, led_slope_up_2, led_slope_down_1, led_slope_down_2); } else { leds_set_slope_mode(client, led, 0, (15 / led_speed), (15 / led_speed), 0, ((delay_on_time / led_speed) + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, ((delay_off_time / led_speed) + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, 0, 0, 0, 0); } }
static void an30259a_set_led_blink(enum an30259a_led_enum led, unsigned int delay_on_time, unsigned int delay_off_time, u8 brightness) { struct i2c_client *client; client = b_client; if (delay_on_time > SLPTT_MAX_VALUE) delay_on_time = SLPTT_MAX_VALUE; if (delay_off_time > SLPTT_MAX_VALUE) delay_off_time = SLPTT_MAX_VALUE; if (delay_off_time == LED_OFF) { leds_on(led, true, false, brightness); if (brightness == LED_OFF) leds_on(led, false, false, brightness); return; } else if (brightness == LED_OFF) { leds_on(led, false, false, brightness); return; } else leds_on(led, true, true, brightness); leds_set_slope_mode(client, led, 0, 15, 15, 0, (delay_on_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, (delay_off_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, 0, 0, 0, 0); }
static void an30259a_set_led_blink(enum an30259a_led_enum led, unsigned int delay_on_time, unsigned int delay_off_time, u8 brightness) { struct i2c_client *client; client = b_client; if (brightness == LED_OFF) { leds_on(led, false, false, brightness); return; } if (brightness > LED_MAX_CURRENT) brightness = LED_MAX_CURRENT; if (led == LED_R) LED_DYNAMIC_CURRENT = LED_R_CURRENT; else if (led == LED_G) LED_DYNAMIC_CURRENT = LED_G_CURRENT; else if (led == LED_B) LED_DYNAMIC_CURRENT = LED_B_CURRENT; /* In user case, LED current is restricted */ if (led_intensity == 0 || led_intensity == 40) { // if stock intesity is used (see LED_x_CURRENT = 0x28) brightness = (brightness * LED_DYNAMIC_CURRENT) / LED_MAX_CURRENT; } else if (led_intensity != 0) { // adapt current to led_intensity brightness = (brightness * led_intensity) / LED_MAX_CURRENT; } if (led_enable_fade_charging == 1) { if (led_time_on) delay_on_time = led_time_on; if (led_time_off) delay_off_time = led_time_off; } if (delay_on_time > SLPTT_MAX_VALUE) delay_on_time = SLPTT_MAX_VALUE; if (delay_off_time > SLPTT_MAX_VALUE) delay_off_time = SLPTT_MAX_VALUE; if (delay_off_time == LED_OFF) { leds_on(led, true, false, brightness); if (brightness == LED_OFF) leds_on(led, false, false, brightness); return; } else leds_on(led, true, true, brightness); if (led_time_on) { pr_alert("LED OVER-RIDE - DELAY_ON_Orig=%d, DELAY_OFF_Orig=%d, DELAY_ON_New=%d, DELAY_OFF_New=%d", delay_on_time, delay_off_time, led_time_on, led_time_off); delay_on_time = led_time_on; } if (led_time_off) { pr_alert("LED OVER-RIDE - DELAY_ON_Orig=%d, DELAY_OFF_Orig=%d, DELAY_ON_New=%d, DELAY_OFF_New=%d", delay_on_time, delay_off_time, led_time_on, led_time_off); delay_off_time = led_time_off; } if (led_enable_fade == 1) { leds_set_slope_mode(client, led, 0, 30, 15, 0, (delay_on_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, (delay_off_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, led_step_speed1, led_step_speed2, led_step_speed3, led_step_speed4); } else { leds_set_slope_mode(client, led, 0, 15, 15, 0, (delay_on_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, (delay_off_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, 0, 0, 0, 0); } }
static void an30259a_start_led_pattern(int mode) { int retval; u8 led_r_brightness; u8 led_g_brightness; u8 led_b_brightness; struct i2c_client *client; struct work_struct *reset = 0; unsigned int delay_on_time = 500; unsigned int delay_off_time = 2000; client = b_client; if (mode > POWERING) return; /* Set all LEDs Off */ an30259a_reset_register_work(reset); if (mode == LED_OFF) return; /* Set to low power consumption mode */ if (LED_LOWPOWER_MODE == 1) LED_DYNAMIC_CURRENT = 0x9; else if (led_enable_fade) LED_DYNAMIC_CURRENT = 0x1; else LED_DYNAMIC_CURRENT = 0x48; if (led_intensity == 0) { // then use stock values led_r_brightness = LED_R_CURRENT; led_g_brightness = LED_G_CURRENT; led_b_brightness = LED_B_CURRENT; } else { // otherwise brightness adapts to led_intensity led_r_brightness = led_intensity / LED_DYNAMIC_CURRENT; led_g_brightness = led_intensity / LED_DYNAMIC_CURRENT; led_b_brightness = led_intensity / LED_DYNAMIC_CURRENT; } switch (mode) { /* leds_set_slope_mode(client, LED_SEL, DELAY, MAX, MID, MIN, SLPTT1, SLPTT2, DT1, DT2, DT3, DT4) */ case CHARGING: pr_info("LED Battery Charging Pattern on\n"); if (led_enable_fade_charging == 1) { if (led_time_on) delay_on_time = led_time_on; if (led_time_off) delay_off_time = led_time_off; leds_on(LED_R, true, true, led_r_brightness); leds_set_slope_mode(client, LED_R, 0, 30, 15, 0, (delay_on_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, (delay_off_time + AN30259A_TIME_UNIT - 1) / AN30259A_TIME_UNIT, led_step_speed1, led_step_speed2, led_step_speed3, led_step_speed4); } else leds_on(LED_R, true, false, led_r_brightness); break; case CHARGING_ERR: pr_info("LED Battery Charging error Pattern on\n"); leds_on(LED_R, true, true, led_r_brightness); leds_set_slope_mode(client, LED_R, 1, 15, 15, 0, 1, 1, 0, 0, 0, 0); break; case MISSED_NOTI: pr_info("LED Missed Notifications Pattern on\n"); leds_on(LED_B, true, true, led_b_brightness); leds_set_slope_mode(client, LED_B, 10, 15, 15, 0, 1, 10, 0, 0, 0, 0); break; case LOW_BATTERY: pr_info("LED Low Battery Pattern on\n"); leds_on(LED_R, true, true, led_r_brightness); leds_set_slope_mode(client, LED_R, 10, 15, 15, 0, 1, 10, 0, 0, 0, 0); break; case FULLY_CHARGED: pr_info("LED full Charged battery Pattern on\n"); leds_on(LED_G, true, false, led_g_brightness); break; case POWERING: pr_info("LED Powering Pattern on\n"); leds_on(LED_G, true, true, LED_G_CURRENT); leds_on(LED_B, true, true, LED_B_CURRENT); leds_set_slope_mode(client, LED_G, 0, 8, 4, 1, 2, 2, 3, 3, 3, 3); leds_set_slope_mode(client, LED_B, 0, 15, 14, 12, 2, 2, 7, 7, 7, 7); break; default: return; break; } retval = leds_i2c_write_all(client); if (retval) printk(KERN_WARNING "leds_i2c_write_all failed\n"); }
static void an30259a_start_led_pattern(int mode) { int retval; u8 r_brightness; /* Yank555.lu : Control LED intensity (normal, bright) */ u8 g_brightness; u8 b_brightness; struct i2c_client *client; struct work_struct *reset = 0; client = b_client; if (mode > POWERING) return; /* Set all LEDs Off */ an30259a_reset_register_work(reset); if (mode == LED_OFF) return; /* Set to low power consumption mode */ if (LED_LOWPOWER_MODE == 1) LED_DYNAMIC_CURRENT = 0x8; else LED_DYNAMIC_CURRENT = 0x1; /* Yank555.lu : Control LED intensity (normal, bright) */ if (led_intensity == 0) { r_brightness = LED_R_CURRENT; /* CM stock behaviour */ g_brightness = LED_G_CURRENT; b_brightness = LED_B_CURRENT; } else { r_brightness = led_intensity / LED_DYNAMIC_CURRENT; g_brightness = led_intensity / LED_DYNAMIC_CURRENT; b_brightness = led_intensity / LED_DYNAMIC_CURRENT; } switch (mode) { /* leds_set_slope_mode(client, LED_SEL, DELAY, MAX, MID, MIN, SLPTT1, SLPTT2, DT1, DT2, DT3, DT4) */ case CHARGING: leds_on(LED_R, true, false, r_brightness); break; case CHARGING_ERR: leds_on(LED_R, true, true, r_brightness); /* Yank555.lu : Handle fading / blinking */ if (led_enable_fade == 1) { leds_set_slope_mode(client, LED_R, 1, (15 / led_speed), (7 / led_speed), 0, 1, 1, led_slope_up_1, led_slope_up_2, led_slope_down_1, led_slope_down_2); } else { leds_set_slope_mode(client, LED_R, 1, (15 / led_speed), (15 / led_speed), 0, 1, 1, 0, 0, 0, 0); } break; case MISSED_NOTI: leds_on(LED_B, true, true, b_brightness); /* Yank555.lu : Handle fading / blinking */ if (led_enable_fade == 1) { leds_set_slope_mode(client, LED_B, 10, (15 / led_speed), (7 / led_speed), 0, 1, (10 / led_speed), led_slope_up_1, led_slope_up_2, led_slope_down_1, led_slope_down_2); } else { leds_set_slope_mode(client, LED_B, 10, (15 / led_speed), (15 / led_speed), 0, 1, (10 / led_speed), 0, 0, 0, 0); } break; case LOW_BATTERY: leds_on(LED_R, true, true, r_brightness); /* Yank555.lu : Handle fading / blinking */ if (led_enable_fade == 1) { leds_set_slope_mode(client, LED_R, 10, (15 / led_speed), (7 / led_speed), 0, 1, (10 / led_speed), led_slope_up_1, led_slope_up_2, led_slope_down_1, led_slope_down_2); } else { leds_set_slope_mode(client, LED_R, 10, (15 / led_speed), (15 / led_speed), 0, 1, (10 / led_speed), 0, 0, 0, 0); } break; case FULLY_CHARGED: leds_on(LED_G, true, false, g_brightness); break; case POWERING: leds_on(LED_G, true, true, LED_G_CURRENT); leds_on(LED_B, true, true, LED_B_CURRENT); leds_set_slope_mode(client, LED_G, 0, 8, 4, 1, 2, 2, 3, 3, 3, 3); leds_set_slope_mode(client, LED_B, 0, 15, 14, 12, 2, 2, 7, 7, 7, 7); break; default: return; break; } retval = leds_i2c_write_all(client); if (retval) printk(KERN_WARNING "leds_i2c_write_all failed\n"); }
static void an30259a_start_led_pattern(int mode) { int retval; struct i2c_client *client; struct work_struct *reset = 0; client = b_client; if (mode > POWERING) return; /* Set all LEDs Off */ an30259a_reset_register_work(reset); if (mode == LED_OFF) return; switch (mode) { /* leds_set_slope_mode(client, LED_SEL, DELAY, MAX, MID, MIN, SLPTT1, SLPTT2, DT1, DT2, DT3, DT4) */ case CHARGING: leds_on(LED_R, true, false, LED_R_CURRENT); leds_on(LED_G, false, false, LED_OFF); leds_on(LED_B, false, false, LED_OFF); break; case CHARGING_ERR: leds_on(LED_R, true, true, LED_R_CURRENT); leds_on(LED_G, false, false, LED_OFF); leds_on(LED_B, false, false, LED_OFF); leds_set_slope_mode(client, LED_R, 1, 15, 15, 0, 1, 1, 0, 0, 0, 0); break; case MISSED_NOTI: leds_on(LED_R, false, false, LED_OFF); leds_on(LED_G, false, false, LED_OFF); leds_on(LED_B, true, true, LED_B_CURRENT); leds_set_slope_mode(client, LED_B, 10, 15, 15, 0, 1, 10, 0, 0, 0, 0); break; case LOW_BATTERY: leds_on(LED_R, true, true, LED_R_CURRENT); leds_on(LED_G, false, false, LED_OFF); leds_on(LED_B, false, false, LED_OFF); leds_set_slope_mode(client, LED_R, 10, 15, 15, 0, 1, 10, 0, 0, 0, 0); break; case FULLY_CHARGED: leds_on(LED_R, false, false, LED_OFF); leds_on(LED_G, true, false, LED_G_CURRENT); leds_on(LED_B, false, false, LED_OFF); break; case POWERING: leds_on(LED_R, false, false, 0); leds_on(LED_G, true, true, LED_G_CURRENT); leds_on(LED_B, true, true, LED_B_CURRENT); leds_set_slope_mode(client, LED_G, 0, 8, 4, 1, 2, 2, 3, 3, 3, 3); leds_set_slope_mode(client, LED_B, 0, 15, 14, 12, 2, 2, 7, 7, 7, 7); break; default: return; break; } retval = leds_i2c_write_all(client); if (retval) printk(KERN_WARNING "leds_i2c_write_all failed\n"); }