static int isl29028_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct isl29028_chip *chip; struct iio_dev *indio_dev; int ret; indio_dev = iio_device_alloc(sizeof(*chip)); if (!indio_dev) { dev_err(&client->dev, "iio allocation fails\n"); return -ENOMEM; } chip = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); chip->dev = &client->dev; mutex_init(&chip->lock); chip->regmap = devm_regmap_init_i2c(client, &isl29028_regmap_config); if (IS_ERR(chip->regmap)) { ret = PTR_ERR(chip->regmap); dev_err(chip->dev, "regmap initialization failed: %d\n", ret); goto exit_iio_free; } ret = isl29028_chip_init(chip); if (ret < 0) { dev_err(chip->dev, "chip initialization failed: %d\n", ret); goto exit_iio_free; } indio_dev->info = &isl29028_info; indio_dev->channels = isl29028_channels; indio_dev->num_channels = ARRAY_SIZE(isl29028_channels); indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(indio_dev); if (ret < 0) { dev_err(chip->dev, "iio registration fails with error %d\n", ret); goto exit_iio_free; } return 0; exit_iio_free: iio_device_free(indio_dev); return ret; }
static int __devinit isl29028_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct isl29028_chip *chip; struct iio_dev *indio_dev; struct regulator *isl_reg = regulator_get(&client->dev, "vdd"); int err; dev_dbg(&client->dev, "%s() called\n", __func__); if (IS_ERR_OR_NULL(isl_reg)) { dev_info(&client->dev, "no regulator found," \ "continue without regulator\n"); isl_reg = NULL; } indio_dev = iio_allocate_device(sizeof(*chip)); if (indio_dev == NULL) { dev_err(&client->dev, "iio allocation fails\n"); err = -ENOMEM; goto exit; } chip = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); chip->client = client; chip->irq = client->irq; chip->isl_reg = isl_reg; mutex_init(&chip->lock); err = isl29028_chip_init(client); if (err) goto exit_iio_free; init_completion(&chip->prox_completion); init_completion(&chip->als_completion); if (chip->irq > 0) { err = request_threaded_irq(chip->irq, NULL, threshold_isr, IRQF_SHARED, "ISL29028", chip); if (err) { dev_err(&client->dev, "Unable to register irq %d; " "error %d\n", chip->irq, err); goto exit_iio_free; } chip->is_int_enable = true; } indio_dev->info = &isl29028_info; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; err = iio_device_register(indio_dev); if (err) { dev_err(&client->dev, "iio registration fails\n"); goto exit_irq; } dev_dbg(&client->dev, "%s() success\n", __func__); return 0; exit_irq: if (chip->irq > 0) free_irq(chip->irq, chip); exit_iio_free: if (chip->isl_reg) regulator_put(chip->isl_reg); iio_free_device(indio_dev); exit: return err; }