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 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; }