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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}