static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) { struct lp855x *lp; struct lp855x_platform_data *pdata = cl->dev.platform_data; enum lp855x_brightness_ctrl_mode mode; int ret; if (!pdata) { dev_err(&cl->dev, "no platform data supplied\n"); return -EINVAL; } if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) return -EIO; lp = devm_kzalloc(&cl->dev, sizeof(struct lp855x), GFP_KERNEL); if (!lp) return -ENOMEM; mode = pdata->mode; lp->client = cl; lp->dev = &cl->dev; lp->pdata = pdata; lp->chipname = id->name; lp->chip_id = id->driver_data; i2c_set_clientdata(cl, lp); mutex_init(&lp->xfer_lock); ret = lp855x_init_registers(lp); if (ret) { dev_err(lp->dev, "i2c communication err: %d", ret); if (mode == REGISTER_BASED) goto err_dev; } ret = lp855x_backlight_register(lp); if (ret) { dev_err(lp->dev, "failed to register backlight. err: %d\n", ret); goto err_dev; } ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); if (ret) { dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); goto err_sysfs; } backlight_update_status(lp->bl); return 0; err_sysfs: lp855x_backlight_unregister(lp); err_dev: return ret; }
static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) { struct lp855x *lp; struct lp855x_platform_data *pdata = cl->dev.platform_data; int ret; if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) goto err_io; lp = kzalloc(sizeof(struct lp855x), GFP_KERNEL); if (!lp) goto err_mem; lp->client = cl; lp->dev = &cl->dev; lp->pdata = pdata; lp->chipid = id->name; i2c_set_clientdata(cl, lp); mutex_init(&lp->xfer_lock); ret = lp855x_init_registers(lp); if (ret) goto err_i2c; ret = lp855x_backlight_register(lp); if (ret) goto err_bldev; ret = lp855x_led_register(lp); if (ret) goto err_leddev; ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); if (ret) goto err_sysfs; backlight_update_status(lp->bl); return ret; err_io: return -EIO; err_mem: return -ENOMEM; err_i2c: dev_err(lp->dev, "i2c communication err: %d", ret); kfree(lp); return ret; err_bldev: dev_err(lp->dev, "can not register backlight device. err: %d\n", ret); kfree(lp); return ret; err_leddev: lp855x_backlight_unregister(lp); dev_err(lp->dev, "can not register led device. err: %d\n", ret); kfree(lp); return ret; err_sysfs: dev_err(lp->dev, "can not register sysfs. err: %d\n", ret); lp855x_backlight_unregister(lp); lp855x_led_unregister(lp); kfree(lp); return ret; }
static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) { struct lp855x *lp; struct lp855x_platform_data *pdata = cl->dev.platform_data; int ret; if (pdata->setup && pdata->power_on) { ret = pdata->setup(&cl->dev); if (ret) goto err_setup; else { ret = pdata->power_on(&cl->dev); if (ret) goto err_setup; else usleep_range(LP855x_PWR_DELAY_US, LP855x_PWR_DELAY_US + 1000); } } if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { ret = -EIO; goto err_io; } lp = kzalloc(sizeof(struct lp855x), GFP_KERNEL); if (!lp) { ret = -ENOMEM; goto err_mem; } lp->client = cl; lp->dev = &cl->dev; lp->pdata = pdata; lp->chipid = id; i2c_set_clientdata(cl, lp); mutex_init(&lp->xfer_lock); lp855x_init_device(lp); ret = lp855x_write_byte(lp, BRIGHTNESS_CTRL, pdata->initial_brightness); if (ret) { dev_err(lp->dev, "can't set initial brightness (%d)\n" , ret); goto err_dev; } ret = lp855x_backlight_register(lp); if (ret) { dev_err(lp->dev, "can not register backlight device." " errcode = %d\n", ret); goto err_dev; } backlight_update_status(lp->bl); lp855x_create_debugfs(lp); return ret; err_setup: return -ENODEV; err_dev: kfree(lp); err_mem: err_io: return ret; }
static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) { struct lp855x *lp; struct lp855x_platform_data *pdata = cl->dev.platform_data; enum lp855x_brightness_ctrl_mode mode; int ret; if (!pdata) { dev_err(&cl->dev, "no platform data supplied\n"); return -EINVAL; } if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) return -EIO; lp = devm_kzalloc(&cl->dev, sizeof(struct lp855x), GFP_KERNEL); if (!lp) return -ENOMEM; mode = pdata->mode; lp->client = cl; lp->dev = &cl->dev; lp->pdata = pdata; lp->chipname = id->name; lp->chip_id = id->driver_data; i2c_set_clientdata(cl, lp); mutex_init(&lp->xfer_lock); ret = lp855x_init_registers(lp); if (ret) { dev_err(lp->dev, "i2c communication err: %d", ret); if (mode == REGISTER_BASED) goto err_dev; } lp->enabled = 1; #ifdef CONFIG_HAS_EARLYSUSPEND if (lp->pdata->use_gpio_en) { lp->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 2; lp->early_suspend.suspend = lp855x_early_suspend; lp->early_suspend.resume = lp855x_late_resume; register_early_suspend(&lp->early_suspend); } #endif ret = lp855x_backlight_register(lp); if (ret) { dev_err(lp->dev, "failed to register backlight. err: %d\n", ret); goto err_dev; } ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); if (ret) { dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); goto err_sysfs; } backlight_update_status(lp->bl); #if defined(CONFIG_MACH_KONA) lp855x_config(lp); #endif return 0; err_sysfs: lp855x_backlight_unregister(lp); err_dev: return ret; }