Пример #1
0
static int lm3630a_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
{
	struct lm3630a_platform_data *pdata = dev_get_platdata(&client->dev);
	struct lm3630a_chip *pchip;
	int rval;

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		dev_err(&client->dev, "fail : i2c functionality check\n");
		return -EOPNOTSUPP;
	}

	pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630a_chip),
			     GFP_KERNEL);
	if (!pchip)
		return -ENOMEM;
	pchip->dev = &client->dev;

	pchip->regmap = devm_regmap_init_i2c(client, &lm3630a_regmap);
	if (IS_ERR(pchip->regmap)) {
		rval = PTR_ERR(pchip->regmap);
		dev_err(&client->dev, "fail : allocate reg. map: %d\n", rval);
		return rval;
	}

	i2c_set_clientdata(client, pchip);
	if (pdata == NULL) {
		pdata = devm_kzalloc(pchip->dev,
				     sizeof(struct lm3630a_platform_data),
				     GFP_KERNEL);
		if (pdata == NULL)
			return -ENOMEM;
		/* default values */
		pdata->leda_ctrl = LM3630A_LEDA_ENABLE;
		pdata->ledb_ctrl = LM3630A_LEDB_ENABLE;
		pdata->leda_max_brt = LM3630A_MAX_BRIGHTNESS;
		pdata->ledb_max_brt = LM3630A_MAX_BRIGHTNESS;
		pdata->leda_init_brt = LM3630A_MAX_BRIGHTNESS;
		pdata->ledb_init_brt = LM3630A_MAX_BRIGHTNESS;
	}
	pchip->pdata = pdata;

	/* chip initialize */
	rval = lm3630a_chip_init(pchip);
	if (rval < 0) {
		dev_err(&client->dev, "fail : init chip\n");
		return rval;
	}
	/* backlight register */
	rval = lm3630a_backlight_register(pchip);
	if (rval < 0) {
		dev_err(&client->dev, "fail : backlight register.\n");
		return rval;
	}
	/* pwm */
	if (pdata->pwm_ctrl != LM3630A_PWM_DISABLE) {
		pchip->pwmd = devm_pwm_get(pchip->dev, "lm3630a-pwm");
		if (IS_ERR(pchip->pwmd)) {
			dev_err(&client->dev, "fail : get pwm device\n");
			return PTR_ERR(pchip->pwmd);
		}
	}
	pchip->pwmd->period = pdata->pwm_period;

	/* interrupt enable  : irq 0 is not allowed */
	pchip->irq = client->irq;
	if (pchip->irq) {
		rval = lm3630a_intr_config(pchip);
		if (rval < 0)
			return rval;
	}
	dev_info(&client->dev, "LM3630A backlight register OK.\n");
	return 0;
}
Пример #2
0
static int lm3630a_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
{
	struct lm3630a_platform_data *pdata = dev_get_platdata(&client->dev);
	struct lm3630a_chip *pchip;
	struct device_node *np = client->dev.of_node;
	int rval;

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		dev_err(&client->dev, "fail : i2c functionality check\n");
		return -EOPNOTSUPP;
	}

	pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630a_chip),
			     GFP_KERNEL);
	if (!pchip)
		return -ENOMEM;
	pchip->dev = &client->dev;

	pchip->regmap = devm_regmap_init_i2c(client, &lm3630a_regmap);
	if (IS_ERR(pchip->regmap)) {
		rval = PTR_ERR(pchip->regmap);
		dev_err(&client->dev, "fail : allocate reg. map: %d\n", rval);
		return rval;
	}

	i2c_set_clientdata(client, pchip);
	if (pdata == NULL) {
		pdata = devm_kzalloc(pchip->dev,
				     sizeof(struct lm3630a_platform_data),
				     GFP_KERNEL);
		if (pdata == NULL)
			return -ENOMEM;
		pchip->pdata = pdata;
		if (lm3630a_parse_dt(np, pchip))
			return -EINVAL;
	} else
		pchip->pdata = pdata;

	/* chip initialize */
	rval = lm3630a_chip_init(pchip);
	if (rval < 0) {
		dev_err(&client->dev, "fail : init chip\n");
		return rval;
	}

	/* backlight register */
	if (is_fb_backlight) {
		rval = lm3630a_backlight_register(pchip);
		if (rval < 0) {
			dev_err(&client->dev, "fail : backlight register.\n");
			goto err1;
		}
	} else {
		pchip->ledcdev = lm3630a_led_cdev;
		INIT_WORK(&pchip->ledwork, lm3630a_led_set_func);
		rval = led_classdev_register(pchip->dev, &pchip->ledcdev);
		if (rval) {
			dev_err(pchip->dev, "unable to register %s,rc=%d\n",
				lm3630a_led_cdev.name, rval);
			return rval;
		}
		pchip->ledwq = create_singlethread_workqueue("lm3630a-led-wq");
		if (!pchip->ledwq) {
			dev_err(pchip->dev, "fail to create led thread\n");
			rval = -ENOMEM;
			goto err1;
		}
	}

	/* pwm */
	if (pdata->pwm_ctrl != LM3630A_PWM_DISABLE) {
		pchip->pwmd = pwm_request(pdata->pwm_gpio, "lm3630a-pwm");
		if (IS_ERR(pchip->pwmd)) {
			dev_err(&client->dev, "fail : get pwm device\n");
			rval = PTR_ERR(pchip->pwmd);
			goto err1;
		}
	}

	/* interrupt enable  : irq 0 is not allowed */
	if (pchip->irq) {
		rval = lm3630a_intr_config(pchip);
		if (rval < 0)
			goto err2;
	}

	dev_info(&client->dev, "LM3630A backlight register OK.\n");
	return 0;

err2:
	if (!IS_ERR_OR_NULL(pchip->pwmd))
		pwm_free(pchip->pwmd);
	if (pchip->irq)
		free_irq(pchip->irq, pchip);
	if (pchip->irqthread) {
		flush_workqueue(pchip->irqthread);
		destroy_workqueue(pchip->irqthread);
	}
err1:
	if (is_fb_backlight) {
		if (!IS_ERR_OR_NULL(pchip->bleda))
			backlight_device_unregister(pchip->bleda);
		if (!IS_ERR_OR_NULL(pchip->bledb))
			backlight_device_unregister(pchip->bledb);
	} else
		led_classdev_unregister(&pchip->ledcdev);

	return rval;
}