static int __devinit an30259a_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct an30259a_data *data; int ret, i; dev_dbg(&client->adapter->dev, "%s\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "need I2C_FUNC_I2C.\n"); return -ENODEV; } 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 */ for (i = 0; i < MAX_NUM_LEDS; i++) { ret = an30259a_initialize(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), an30259a_led_brightness_work); } #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; }
static int __devinit an30259a_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct an30259a_data *data; int ret, i; dev_err(&client->adapter->dev, "%s\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "need I2C_FUNC_I2C.\n"); return -ENODEV; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) { dev_err(&client->adapter->dev, "failed to allocate driver data.\n"); return -ENOMEM; } #ifdef CONFIG_OF ret = an30259a_parse_dt(&client->dev); if (ret) { pr_err("[%s] an30259a parse dt failed\n", __func__); kfree(data); return ret; } #endif i2c_set_clientdata(client, data); data->client = client; b_client = client; mutex_init(&data->mutex); /* initialize LED */ LED_R_CURRENT = LED_G_CURRENT = LED_B_CURRENT = led_default_cur; led_conf[0].max_brightness = LED_R_CURRENT; led_conf[1].max_brightness = LED_G_CURRENT; led_conf[2].max_brightness = LED_B_CURRENT; for (i = 0; i < MAX_NUM_LEDS; i++) { ret = an30259a_initialize(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), an30259a_led_brightness_work); } #if defined (CONFIG_SEC_FACTORY) #if defined (CONFIG_SEC_S_PROJECT) if ( (f_jig_cable == 0) && (get_lcd_attached() == 0) ) { pr_info("%s:Factory MODE - No OCTA, Battery BOOTING\n", __func__); leds_on(LED_R, true, false, LED_R_CURRENT); leds_i2c_write_all(data->client); } #endif #endif #ifdef SEC_LED_SPECIFIC led_enable_fade = 0; /* default to stock behaviour = blink */ // led_intensity = 0; /* default to CM behaviour = brighter blink intensity allowed */ led_intensity = 40; /* default to Samsung behaviour = normal intensity */ led_speed = 1; /* default to stock behaviour = normal blinking/fading speed */ led_slope_up_1 = 1; /* default slope durations for fading */ led_slope_up_2 = 1; led_slope_down_1 = 1; led_slope_down_2 = 1; 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 exit1; } 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; #ifdef SEC_LED_SPECIFIC exit1: device_destroy(sec_class, 0); #endif exit: mutex_destroy(&data->mutex); kfree(data); return ret; }