static int rt9396_probe(struct i2c_client *i2c_dev, const struct i2c_device_id *i2c_dev_id)
{
	struct lge_backlight_platform_data *pdata;
	struct rt9396_driver_data *drvdata;
	struct backlight_device *bd;
	int err;

	rt9396_powerstate = NORMAL_STATE;
	dprintk("start, client addr=0x%x\n", i2c_dev->addr);

	pdata = i2c_dev->dev.platform_data;
	if(!pdata)
		return -EINVAL;

	drvdata = kzalloc(sizeof(struct rt9396_driver_data), GFP_KERNEL);
	if (!drvdata) {
		dev_err(&i2c_dev->dev, "failed to allocate memory\n");
		return -ENOMEM;
	}

	if (pdata && pdata->platform_init)
		pdata->platform_init();

	drvdata->client = i2c_dev;
	drvdata->gpio = pdata->gpio;
	drvdata->max_intensity = LCD_LED_MAX;
	if (pdata->max_current > 0)
		drvdata->max_intensity = pdata->max_current;
	drvdata->intensity = LCD_LED_MIN;
	drvdata->mode = NORMAL_MODE;
	drvdata->state = UNINIT_STATE;
	drvdata->version = pdata->version;

	if(rt9396_setup_version(drvdata) != 0) {
		eprintk("Error while requesting gpio %d\n", drvdata->gpio);
		kfree(drvdata);
		return -ENODEV;
	}

	if (drvdata->gpio && gpio_request(drvdata->gpio, "rt9396_en") != 0) {
		eprintk("Error while requesting gpio %d\n", drvdata->gpio);
		kfree(drvdata);
		return -ENODEV;
	}
	gpio_tlmm_config(GPIO_CFG(drvdata->gpio, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);

	bd = backlight_device_register("rt9396-bl", &i2c_dev->dev, NULL, &rt9396_ops, NULL);
	if (bd == NULL) {
		eprintk("entering rt9396 probe function error \n");
		kfree(drvdata);
		return -1;
	}
	bd->props.power = FB_BLANK_UNBLANK;
	bd->props.brightness = drvdata->intensity;
	bd->props.max_brightness = drvdata->max_intensity;
	drvdata->bd = bd;

	if (led_classdev_register(&i2c_dev->dev, &rt9396_led_dev) == 0) {
		eprintk("Registering led class dev successfully.\n");
		drvdata->led = &rt9396_led_dev;
		err = device_create_file(drvdata->led->dev, &dev_attr_alc);
		err = device_create_file(drvdata->led->dev, &dev_attr_reg);
		err = device_create_file(drvdata->led->dev, &dev_attr_drvstat);
		err = device_create_file(drvdata->led->dev, &dev_attr_chargerlogo);
	}
// [Caio99BR][[email protected]] Workaround for bug of screen still awake after lock
#ifndef CONFIG_MACH_LGE_2ND_GEN_KK_WORKAROUD
	if (led_classdev_register(&i2c_dev->dev, &rt9396_keyled_dev) == 0) {
		eprintk("Registering led class dev successfully.\n");
		drvdata->led = &rt9396_keyled_dev;
	}
#endif

	i2c_set_clientdata(i2c_dev, drvdata);
	i2c_set_adapdata(i2c_dev->adapter, i2c_dev);

	rt9396_device_init(drvdata);
	rt9396_send_intensity(drvdata, RT9396BL_DEFAULT_BRIGHTNESS);

#ifdef CONFIG_HAS_EARLYSUSPEND
	drvdata->early_suspend.suspend = rt9396_early_suspend;
	drvdata->early_suspend.resume = rt9396_late_resume;
	drvdata->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 40;
	register_early_suspend(&drvdata->early_suspend);
#endif

	rt9396_ref = drvdata;

	eprintk("done\n");
	return 0;
}
static void leds_brightness_set(struct led_classdev *led_cdev, enum led_brightness value)
{
	struct rt9396_driver_data *drvdata = dev_get_drvdata(led_cdev->dev->parent);
	int brightness;
	int next;	

	if (!drvdata) {
		eprintk("Error getting drvier data\n");
		return;
	}

	brightness = rt9396_get_intensity(drvdata);
	if(!value)
		next = value;
	else if(value !=0 && value < HAL_MIN_VALUE)
		value = HAL_MIN_VALUE;

	if(value == HAL_MIN_VALUE)
	{
		next = RT9396BL_MIN_BRIGHTNESS;
	}
	else if(value > HAL_MIN_VALUE && value <= HAL_20PER_VALUE)
	{				
		next = RT9396BL_MIN_BRIGHTNESS + (RT9396BL_20PER_BRIGHTNESS - RT9396BL_MIN_BRIGHTNESS)
			*(value-HAL_MIN_VALUE)/( HAL_20PER_VALUE - HAL_MIN_VALUE);
	}
	else if(value > HAL_20PER_VALUE && value <= HAL_40PER_VALUE)
	{
		next = RT9396BL_20PER_BRIGHTNESS + (RT9396BL_40PER_BRIGHTNESS - RT9396BL_20PER_BRIGHTNESS)
			*(value-HAL_20PER_VALUE)/( HAL_40PER_VALUE - HAL_20PER_VALUE);
	}
	else if(value > HAL_40PER_VALUE && value <= HAL_60PER_VALUE)
	{
		next = RT9396BL_40PER_BRIGHTNESS + (RT9396BL_60PER_BRIGHTNESS - RT9396BL_40PER_BRIGHTNESS)
			*(value-HAL_40PER_VALUE)/( HAL_60PER_VALUE - HAL_40PER_VALUE);
	}
	else if(value > HAL_60PER_VALUE && value <= HAL_80PER_VALUE)
	{
		next = RT9396BL_60PER_BRIGHTNESS + (RT9396BL_80PER_BRIGHTNESS - RT9396BL_60PER_BRIGHTNESS)
			*(value-HAL_60PER_VALUE)/( HAL_80PER_VALUE - HAL_60PER_VALUE);
	}
	else if(value > HAL_80PER_VALUE)
	{
		if(value > HAL_MAX_VALUE)
		{
			value = HAL_MAX_VALUE;
		}
	if(value == HAL_MAX_VALUE)
	{
		next = RT9396BL_MAX_BRIGHTNESS;
	}
	else
	{
		next = RT9396BL_80PER_BRIGHTNESS + (RT9396BL_MAX_BRIGHTNESS - RT9396BL_80PER_BRIGHTNESS)
			*(value-HAL_80PER_VALUE)/( HAL_MAX_VALUE - HAL_80PER_VALUE);
	}
	}
	if (brightness != next) {
		rt9396_send_intensity(drvdata, next);
	}
}
static int rt9396_probe(struct i2c_client *i2c_dev, const struct i2c_device_id *i2c_dev_id)
{
	struct lge_backlight_platform_data *pdata;
	struct rt9396_driver_data *drvdata;
	struct backlight_device *bd;
	int err;

	rt9396_powerstate = NORMAL_STATE;
	dprintk("start, client addr=0x%x\n", i2c_dev->addr);

	pdata = i2c_dev->dev.platform_data;
	if(!pdata)
		return -EINVAL;

	drvdata = kzalloc(sizeof(struct rt9396_driver_data), GFP_KERNEL);
	if (!drvdata) {
		dev_err(&i2c_dev->dev, "failed to allocate memory\n");
		return -ENOMEM;
	}

	if (pdata && pdata->platform_init)
		pdata->platform_init();

	drvdata->client = i2c_dev;
	drvdata->gpio = pdata->gpio;
	drvdata->max_intensity = LCD_LED_MAX;
	if (pdata->max_current > 0)
		drvdata->max_intensity = pdata->max_current;
	drvdata->intensity = LCD_LED_MIN;
	drvdata->mode = NORMAL_MODE;
	drvdata->state = UNINIT_STATE;
	drvdata->version = pdata->version;

	if(rt9396_setup_version(drvdata) != 0) {
		eprintk("Error while requesting gpio %d\n", drvdata->gpio);
		kfree(drvdata);
		return -ENODEV;
	}

//[V3][junghoon79.kim][2012.9.10] #if 0 -> #if 1
#if 1 //not use enable pin in rt9396	
	if (drvdata->gpio && gpio_request(drvdata->gpio, "rt9396_en") != 0) {
		eprintk("Error while requesting gpio %d\n", drvdata->gpio);
		kfree(drvdata);
		return -ENODEV;
	}
   gpio_tlmm_config(GPIO_CFG(drvdata->gpio, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
#endif
 //[V3][junghoon79.kim][2012.9.10]- end
 
	bd = backlight_device_register("rt9396-bl", &i2c_dev->dev, NULL, &rt9396_ops, NULL);
	if (bd == NULL) {
		eprintk("entering rt9396 probe function error \n");
		//if (gpio_is_valid(drvdata->gpio))
		//	gpio_free(drvdata->gpio);
		kfree(drvdata);
		return -1;
	}
	bd->props.power = FB_BLANK_UNBLANK;
	bd->props.brightness = drvdata->intensity;
	bd->props.max_brightness = drvdata->max_intensity;
	drvdata->bd = bd;

#ifdef CONFIG_BACKLIGHT_LEDS_CLASS
	if (led_classdev_register(&i2c_dev->dev, &rt9396_led_dev) == 0) {
		eprintk("Registering led class dev successfully.\n");
		drvdata->led = &rt9396_led_dev;
		err = device_create_file(drvdata->led->dev, &dev_attr_alc);
		err = device_create_file(drvdata->led->dev, &dev_attr_reg);
		err = device_create_file(drvdata->led->dev, &dev_attr_drvstat);
		err = device_create_file(drvdata->led->dev, &dev_attr_chargerlogo);
	}
/*2012-09-26 junghoon-kim([email protected]) porting from bu61800 driver [START]*/
#ifdef USE_BUTTON_BACKLIGHT
	/* [email protected] */
	if (led_classdev_register(&i2c_dev->dev, &rt9396_keyled_dev) == 0) {
		eprintk("Registering led class dev successfully.\n");
		drvdata->led = &rt9396_keyled_dev;
	}
	/* [email protected] */
#endif
/*2012-09-26 junghoon-kim([email protected]) porting from bu61800 driver [END]*/
#endif

	i2c_set_clientdata(i2c_dev, drvdata);
	i2c_set_adapdata(i2c_dev->adapter, i2c_dev);

	rt9396_device_init(drvdata);
	rt9396_send_intensity(drvdata, RT9396BL_DEFAULT_BRIGHTNESS);

#ifdef CONFIG_HAS_EARLYSUSPEND
	drvdata->early_suspend.suspend = rt9396_early_suspend;
	drvdata->early_suspend.resume = rt9396_late_resume;
	drvdata->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 40;
	register_early_suspend(&drvdata->early_suspend);
#endif

	rt9396_ref = drvdata;

	eprintk("done\n");
	return 0;
}
static int rt9396_set_brightness(struct backlight_device *bd)
{
	struct rt9396_driver_data *drvdata = dev_get_drvdata(bd->dev.parent);
	return rt9396_send_intensity(drvdata, bd->props.brightness);
}
static void leds_brightness_set(struct led_classdev *led_cdev, enum led_brightness value)
{
	struct rt9396_driver_data *drvdata = dev_get_drvdata(led_cdev->dev->parent);
	int brightness;
	int next;	

	if (!drvdata) {
		eprintk("Error getting drvier data\n");
		return;
	}

	brightness = rt9396_get_intensity(drvdata);	
   #if 1//2012-11-14 junghoon.kim([email protected]) HW brightness tuning.[START]   
   if(!value)
      next = value;
   else if(value !=0 && value < HAL_MIN_VALUE)
      value = HAL_MIN_VALUE;
   
   if(value == HAL_MIN_VALUE)
   {      
      next = RT9396BL_MIN_BRIGHTNESS;
   }
   else if(value > HAL_MIN_VALUE && value <= HAL_20PER_VALUE)
	{				
		next = RT9396BL_MIN_BRIGHTNESS + (RT9396BL_20PER_BRIGHTNESS - RT9396BL_MIN_BRIGHTNESS)
			*(value-HAL_MIN_VALUE)/( HAL_20PER_VALUE - HAL_MIN_VALUE);
	}
	else if(value > HAL_20PER_VALUE && value <= HAL_40PER_VALUE)
	{
		next = RT9396BL_20PER_BRIGHTNESS + (RT9396BL_40PER_BRIGHTNESS - RT9396BL_20PER_BRIGHTNESS)
			*(value-HAL_20PER_VALUE)/( HAL_40PER_VALUE - HAL_20PER_VALUE);
	}
   else if(value > HAL_40PER_VALUE && value <= HAL_60PER_VALUE)
	{
		next = RT9396BL_40PER_BRIGHTNESS + (RT9396BL_60PER_BRIGHTNESS - RT9396BL_40PER_BRIGHTNESS)
			*(value-HAL_40PER_VALUE)/( HAL_60PER_VALUE - HAL_40PER_VALUE);
	}
   else if(value > HAL_60PER_VALUE && value <= HAL_80PER_VALUE)
	{
		next = RT9396BL_60PER_BRIGHTNESS + (RT9396BL_80PER_BRIGHTNESS - RT9396BL_60PER_BRIGHTNESS)
			*(value-HAL_60PER_VALUE)/( HAL_80PER_VALUE - HAL_60PER_VALUE);
	}
	else if(value > HAL_80PER_VALUE)
	{
		if(value > HAL_MAX_VALUE)
		{			
			value = HAL_MAX_VALUE;
		}
      if(value == HAL_MAX_VALUE)
      {
         next = RT9396BL_MAX_BRIGHTNESS;
      }
      else
      {
         next = RT9396BL_80PER_BRIGHTNESS + (RT9396BL_MAX_BRIGHTNESS - RT9396BL_80PER_BRIGHTNESS)
			*(value-HAL_80PER_VALUE)/( HAL_MAX_VALUE - HAL_80PER_VALUE);
      }		
	}
   #else
	if(value < MIN_VALUE)
	{
		if(value<0)
		{
			printk("%s, old value: %d\n", __func__,value );
			value=0;
		}			
		next = value*RT9396BL_MIN_BRIGHTNESS/MIN_VALUE;
	}
	else if(value >= MIN_VALUE && value <= DEFAULT_VALUE)

	{
		next = RT9396BL_MIN_BRIGHTNESS + (RT9396BL_DEFAULT_BRIGHTNESS - RT9396BL_MIN_BRIGHTNESS)
			*(value-MIN_VALUE)/( DEFAULT_VALUE - MIN_VALUE);
	}
	else if(value >DEFAULT_VALUE)
	{
		if(value>MAX_VALUE)
		{
			printk("%s, old value: %d\n", __func__,value );
			value=MAX_VALUE;
		}
		next = RT9396BL_DEFAULT_BRIGHTNESS + (RT9396BL_MAX_BRIGHTNESS  - RT9396BL_DEFAULT_BRIGHTNESS)
			*(value-DEFAULT_VALUE)/(MAX_VALUE - DEFAULT_VALUE);
	}
   #endif//2012-11-14 junghoon.kim([email protected]) HW brightness tuning.[END] 
	
	if (brightness != next) {		
		//printk("%s, value: %d,after tuning next: %d \n", __func__, value, next );
		rt9396_send_intensity(drvdata, next);
	}
}