static void ktd2026_set_led_blink(enum ktd2026_led_enum led, unsigned int delay_on_time, unsigned int delay_off_time, u8 brightness) { int on_time, off_time; if (brightness == LED_OFF) { ktd2026_leds_on(led, LED_EN_OFF, brightness); return; } if (brightness > LED_MAX_CURRENT) brightness = LED_MAX_CURRENT; if (delay_off_time == LED_OFF) { ktd2026_leds_on(led, LED_EN_ON, brightness); return; } else ktd2026_leds_on(led, LED_EN_PWM1, brightness); on_time = (delay_on_time + KTD2026_TIME_UNIT - 1) / KTD2026_TIME_UNIT; off_time = (delay_off_time + KTD2026_TIME_UNIT - 1) / KTD2026_TIME_UNIT; ktd2026_set_timerslot_control(0); /* Tslot1 */ ktd2026_set_period((on_time+off_time) * 4 + 2); ktd2026_set_pwm_duty(PWM1, on_time*255 / (on_time + off_time)); ktd2026_set_trise_tfall(0, 0, 0); pr_info("%s:on_time=%d, off_time=%d, period=%d, duty=%d\n" , __func__, on_time, off_time, (on_time+off_time) * 4 + 2, on_time * 255 / (on_time + off_time) ); }
static void ktd2026_reset(void) { int retval; struct i2c_client *client; client = b_client; ktd2026_leds_on(LED_R, LED_EN_OFF, 0); ktd2026_leds_on(LED_G, LED_EN_OFF, 0); ktd2026_leds_on(LED_B, LED_EN_OFF, 0); retval = leds_i2c_write_all(client); if (retval) pr_err("%s:leds_i2c_write_all failed\n", __func__); ktd2026_set_timerslot_control(0); /* Tslot1 */ ktd2026_set_period(0); ktd2026_set_pwm_duty(PWM1, 0); ktd2026_set_pwm_duty(PWM2, 0); ktd2026_set_trise_tfall(0, 0, 0); /* get into sleep mode after turing off all the leds */ ktd2026_set_sleep(1); retval = leds_i2c_write_all(client); if (retval) pr_err("%s:leds_i2c_write_all failed\n", __func__); /* reset sleep mode, so that next i2c command would not make the driver IC go into sleep mode */ ktd2026_set_sleep(0); }
static int __devinit ktd2026_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ktd2026_data *data; int ret, i; pr_info("%s\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "need I2C_FUNC_I2C.\n"); return -ENODEV; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&client->dev, "need I2C_FUNC_SMBUS_BYTE_DATA.\n"); return -EIO; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) { dev_err(&client->adapter->dev, "failed to allocate driver data.\n"); return -ENOMEM; } i2c_set_clientdata(client, data); data->client = client; b_client = client; mutex_init(&data->mutex); /* initialize LED */ /* turn off all leds */ ktd2026_leds_on(LED_R, LED_EN_OFF, 0); ktd2026_leds_on(LED_G, LED_EN_OFF, 0); ktd2026_leds_on(LED_B, LED_EN_OFF, 0); ktd2026_set_timerslot_control(0); /* Tslot1 */ ktd2026_set_period(0); ktd2026_set_pwm_duty(PWM1, 0); ktd2026_set_pwm_duty(PWM2, 0); ktd2026_set_trise_tfall(0, 0, 0); for (i = 0; i < MAX_NUM_LEDS; i++) { ret = initialize_channel(client, &data->leds[i], i); if (ret < 0) { dev_err(&client->adapter->dev, "failure on initialization\n"); goto exit; } INIT_WORK(&(data->leds[i].brightness_work), ktd2026_led_brightness_work); } leds_i2c_write_all(client); #ifdef SEC_LED_SPECIFIC led_dev = device_create(sec_class, NULL, 0, data, "led"); if (IS_ERR(led_dev)) { dev_err(&client->dev, "Failed to create device for samsung specific led\n"); ret = -ENODEV; goto exit; } ret = sysfs_create_group(&led_dev->kobj, &sec_led_attr_group); if (ret) { dev_err(&client->dev, "Failed to create sysfs group for samsung specific led\n"); device_destroy(sec_class, 0); goto exit; } #endif return ret; exit: mutex_destroy(&data->mutex); kfree(data); return ret; }
void ktd2026_start_led_pattern(enum ktd2026_pattern mode) { int retval; struct i2c_client *client; client = b_client; if (mode > POWERING) return; /* Set all LEDs Off */ ktd2026_reset(); if (mode == LED_OFF) return; /* Set to low power consumption mode */ if (led_lowpower_mode == 1) led_dynamic_current = LED_LOW_CURRENT; else led_dynamic_current = LED_DEFAULT_CURRENT; switch (mode) { case CHARGING: ktd2026_leds_on(LED_R, LED_EN_ON, led_dynamic_current); break; case CHARGING_ERR: ktd2026_set_timerslot_control(1); /* Tslot2 */ ktd2026_set_period(6); ktd2026_set_pwm_duty(PWM1, 127); ktd2026_set_pwm_duty(PWM2, 127); ktd2026_set_trise_tfall(0, 0, 0); ktd2026_leds_on(LED_R, LED_EN_PWM2, led_dynamic_current); break; case MISSED_NOTI: ktd2026_set_timerslot_control(1); /* Tslot2 */ ktd2026_set_period(41); ktd2026_set_pwm_duty(PWM1, 232); ktd2026_set_pwm_duty(PWM2, 23); ktd2026_set_trise_tfall(0, 0, 0); ktd2026_leds_on(LED_B, LED_EN_PWM2, led_dynamic_current); break; case LOW_BATTERY: ktd2026_set_timerslot_control(1); /* Tslot2 */ ktd2026_set_period(41); ktd2026_set_pwm_duty(PWM1, 232); ktd2026_set_pwm_duty(PWM2, 23); ktd2026_set_trise_tfall(0, 0, 0); ktd2026_leds_on(LED_R, LED_EN_PWM2, led_dynamic_current); break; case FULLY_CHARGED: ktd2026_leds_on(LED_G, LED_EN_ON, led_dynamic_current); break; case POWERING: ktd2026_set_timerslot_control(0); /* Tslot1 */ ktd2026_set_period(14); ktd2026_set_pwm_duty(PWM1, 128); ktd2026_set_trise_tfall(7, 7, 0); ktd2026_leds_on(LED_B, LED_EN_ON, led_dynamic_current/2); ktd2026_leds_on(LED_G, LED_EN_PWM1, led_dynamic_current/3); break; default: return; break; } retval = leds_i2c_write_all(client); if (retval) pr_err("%s:leds_i2c_write_all failed\n", __func__); }
static int __devinit ktd2026_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ktd2026_data *data; int ret, i; pr_info("%s\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "need I2C_FUNC_I2C.\n"); return -ENODEV; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&client->dev, "need I2C_FUNC_SMBUS_BYTE_DATA.\n"); return -EIO; } if (client->dev.of_node) { data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) { dev_err(&client->adapter->dev, "failed to allocate driver data.\n"); return -ENOMEM; } } else data = client->dev.platform_data; i2c_set_clientdata(client, data); data->client = client; b_client = client; mutex_init(&data->mutex); /* initialize LED */ /* turn off all leds */ ktd2026_leds_on(LED_R, LED_EN_OFF, 0); #if defined(CONFIG_SEC_FACTORY) #if defined (CONFIG_SEC_ATLANTIC_PROJECT) if(batt_id_value == 0) ret = 1; else ret = 0; #if defined(CONFIG_FB_MSM8x26_MDSS_CHECK_LCD_CONNECTION) if(get_lcd_attached() == 0) // When LCD Not connected turning RED LED on ret++;; #endif if(jig_power_on_value == 0) ret++; if(ret == 3) // case when LCD not connected,battery power on and jig off ktd2026_leds_on(LED_R, LED_EN_ON, 30); #endif //ATLANTIC FLAG #endif ktd2026_leds_on(LED_G, LED_EN_OFF, 0); ktd2026_leds_on(LED_B, LED_EN_OFF, 0); ktd2026_set_timerslot_control(0); /* Tslot1 */ ktd2026_set_period(0); ktd2026_set_pwm_duty(PWM1, 0); ktd2026_set_pwm_duty(PWM2, 0); ktd2026_set_trise_tfall(0, 0, 0); for (i = 0; i < MAX_NUM_LEDS; i++) { ret = initialize_channel(client, &data->leds[i], i); if (ret < 0) { dev_err(&client->adapter->dev, "failure on initialization\n"); goto exit; } INIT_WORK(&(data->leds[i].brightness_work), ktd2026_led_brightness_work); } leds_i2c_write_all(client); #ifdef SEC_LED_SPECIFIC led_dev = device_create(sec_class, NULL, 0, data, "led"); if (IS_ERR(led_dev)) { dev_err(&client->dev, "Failed to create device for samsung specific led\n"); ret = -ENODEV; goto exit; } ret = sysfs_create_group(&led_dev->kobj, &sec_led_attr_group); if (ret) { dev_err(&client->dev, "Failed to create sysfs group for samsung specific led\n"); goto exit; } #endif return ret; exit: mutex_destroy(&data->mutex); kfree(data); return ret; }