static int vprbrd_adc_probe(struct platform_device *pdev) { struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent); struct vprbrd_adc *adc; struct iio_dev *indio_dev; int ret; /* registering iio */ indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc)); if (!indio_dev) { dev_err(&pdev->dev, "failed allocating iio device\n"); return -ENOMEM; } adc = iio_priv(indio_dev); adc->vb = vb; indio_dev->name = "viperboard adc"; indio_dev->dev.parent = &pdev->dev; indio_dev->info = &vprbrd_adc_iio_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = vprbrd_adc_iio_channels; indio_dev->num_channels = ARRAY_SIZE(vprbrd_adc_iio_channels); ret = iio_device_register(indio_dev); if (ret) { dev_err(&pdev->dev, "could not register iio (adc)"); return ret; } platform_set_drvdata(pdev, indio_dev); return 0; }
static int ad9852_probe(struct spi_device *spi) { struct ad9852_state *st; struct iio_dev *idev; int ret = 0; idev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (!idev) return -ENOMEM; st = iio_priv(idev); spi_set_drvdata(spi, idev); mutex_init(&st->lock); st->sdev = spi; idev->dev.parent = &spi->dev; idev->info = &ad9852_info; idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(idev); if (ret) return ret; spi->max_speed_hz = 2000000; spi->mode = SPI_MODE_3; spi->bits_per_word = 8; spi_setup(spi); ad9852_init(st); return 0; }
static int vcnl4000_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct vcnl4000_data *data; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); data->client = client; ret = i2c_smbus_read_byte_data(data->client, VCNL4000_PROD_REV); if (ret < 0) return ret; dev_info(&client->dev, "VCNL4000 Ambient light/proximity sensor, Prod %02x, Rev: %02x\n", ret >> 4, ret & 0xf); indio_dev->dev.parent = &client->dev; indio_dev->info = &vcnl4000_info; indio_dev->channels = vcnl4000_channels; indio_dev->num_channels = ARRAY_SIZE(vcnl4000_channels); indio_dev->name = VCNL4000_DRV_NAME; indio_dev->modes = INDIO_DIRECT_MODE; return iio_device_register(indio_dev); }
static int st_accel_i2c_probe(struct i2c_client *client) { struct iio_dev *indio_dev; struct st_sensor_data *adata; const char *match; int ret; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adata)); if (!indio_dev) return -ENOMEM; adata = iio_priv(indio_dev); match = device_get_match_data(&client->dev); if (match) strlcpy(client->name, match, sizeof(client->name)); st_sensors_i2c_configure(indio_dev, client, adata); ret = st_accel_common_probe(indio_dev); if (ret < 0) return ret; return 0; }
static int ms5611_spi_probe(struct spi_device *spi) { int ret; struct ms5611_state *st; struct iio_dev *indio_dev; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (!indio_dev) return -ENOMEM; spi_set_drvdata(spi, indio_dev); spi->mode = SPI_MODE_0; spi->max_speed_hz = 20000000; spi->bits_per_word = 8; ret = spi_setup(spi); if (ret < 0) return ret; st = iio_priv(indio_dev); st->reset = ms5611_spi_reset; st->read_prom_word = ms5611_spi_read_prom_word; st->read_adc_temp_and_pressure = ms5611_spi_read_adc_temp_and_pressure; st->client = spi; return ms5611_probe(indio_dev, &spi->dev, spi_get_device_id(spi)->name, spi_get_device_id(spi)->driver_data); }
static int ms5611_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ms5611_state *st; struct iio_dev *indio_dev; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE | I2C_FUNC_SMBUS_READ_WORD_DATA | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) return -EOPNOTSUPP; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st)); if (!indio_dev) return -ENOMEM; st = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); st->reset = ms5611_i2c_reset; st->read_prom_word = ms5611_i2c_read_prom_word; st->read_adc_temp_and_pressure = ms5611_i2c_read_adc_temp_and_pressure; st->client = client; return ms5611_probe(indio_dev, &client->dev, id->name, id->driver_data); }
static int stx104_probe(struct device *dev, unsigned int id) { struct iio_dev *indio_dev; struct stx104_iio *priv; indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); if (!indio_dev) return -ENOMEM; if (!devm_request_region(dev, base[id], STX104_EXTENT, dev_name(dev))) { dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", base[id], base[id] + STX104_EXTENT); return -EBUSY; } indio_dev->info = &stx104_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = stx104_channels; indio_dev->num_channels = STX104_NUM_CHAN; indio_dev->name = dev_name(dev); priv = iio_priv(indio_dev); priv->base = base[id]; /* initialize DAC output to 0V */ outw(0, base[id] + 4); outw(0, base[id] + 6); return devm_iio_device_register(dev, indio_dev); }
static int si7020_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct iio_dev *indio_dev; struct i2c_client **data; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE | I2C_FUNC_SMBUS_READ_WORD_DATA)) return -EOPNOTSUPP; /* Reset device, loads default settings. */ ret = i2c_smbus_write_byte(client, SI7020CMD_RESET); if (ret < 0) return ret; /* Wait the maximum power-up time after software reset. */ msleep(15); indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); *data = client; indio_dev->dev.parent = &client->dev; indio_dev->name = dev_name(&client->dev); indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &si7020_info; indio_dev->channels = si7020_channels; indio_dev->num_channels = ARRAY_SIZE(si7020_channels); return devm_iio_device_register(&client->dev, indio_dev); }
static struct iio_dev * st_lsm6dsx_shub_alloc_iiodev(struct st_lsm6dsx_hw *hw, enum st_lsm6dsx_sensor_id id, const struct st_lsm6dsx_ext_dev_settings *info, u8 i2c_addr, const char *name) { struct iio_chan_spec *ext_channels; struct st_lsm6dsx_sensor *sensor; struct iio_dev *iio_dev; iio_dev = devm_iio_device_alloc(hw->dev, sizeof(*sensor)); if (!iio_dev) return NULL; iio_dev->modes = INDIO_DIRECT_MODE; iio_dev->dev.parent = hw->dev; iio_dev->info = &st_lsm6dsx_ext_info; sensor = iio_priv(iio_dev); sensor->id = id; sensor->hw = hw; sensor->odr = info->odr_table.odr_avl[0].hz; sensor->gain = info->fs_table.fs_avl[0].gain; sensor->ext_info.settings = info; sensor->ext_info.addr = i2c_addr; sensor->watermark = 1; switch (info->id) { case ST_LSM6DSX_ID_MAGN: { const struct iio_chan_spec magn_channels[] = { ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr, IIO_MOD_X, 0), ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr + 2, IIO_MOD_Y, 1), ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr + 4, IIO_MOD_Z, 2), IIO_CHAN_SOFT_TIMESTAMP(3), }; ext_channels = devm_kzalloc(hw->dev, sizeof(magn_channels), GFP_KERNEL); if (!ext_channels) return NULL; memcpy(ext_channels, magn_channels, sizeof(magn_channels)); iio_dev->available_scan_masks = st_lsm6dsx_available_scan_masks; iio_dev->channels = ext_channels; iio_dev->num_channels = ARRAY_SIZE(magn_channels); scnprintf(sensor->name, sizeof(sensor->name), "%s_magn", name); break; } default: return NULL; } iio_dev->name = sensor->name; return iio_dev; }
static int max5487_spi_probe(struct spi_device *spi) { struct iio_dev *indio_dev; struct max5487_data *data; const struct spi_device_id *id = spi_get_device_id(spi); int ret; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; dev_set_drvdata(&spi->dev, indio_dev); data = iio_priv(indio_dev); data->spi = spi; data->kohms = id->driver_data; indio_dev->info = &max5487_info; indio_dev->name = id->name; indio_dev->dev.parent = &spi->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = max5487_channels; indio_dev->num_channels = ARRAY_SIZE(max5487_channels); /* restore both wiper regs from NV regs */ ret = max5487_write_cmd(data->spi, MAX5487_COPY_NV_TO_AB); if (ret < 0) return ret; return iio_device_register(indio_dev); }
static int mma8452_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mma8452_data *data; struct iio_dev *indio_dev; int ret; ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I); if (ret < 0) return ret; if (ret != MMA8452_DEVICE_ID) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); data->client = client; mutex_init(&data->lock); i2c_set_clientdata(client, indio_dev); indio_dev->info = &mma8452_info; indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = mma8452_channels; indio_dev->num_channels = ARRAY_SIZE(mma8452_channels); indio_dev->available_scan_masks = mma8452_scan_masks; data->ctrl_reg1 = MMA8452_CTRL_ACTIVE | (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT); ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1, data->ctrl_reg1); if (ret < 0) return ret; data->data_cfg = MMA8452_DATA_CFG_FS_2G; ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG, data->data_cfg); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, mma8452_trigger_handler, NULL); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); return ret; }
static int mcp3422_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct iio_dev *indio_dev; struct mcp3422 *adc; int err; u8 config; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adc)); if (!indio_dev) return -ENOMEM; adc = iio_priv(indio_dev); adc->i2c = client; adc->id = (u8)(id->driver_data); mutex_init(&adc->lock); indio_dev->dev.parent = &client->dev; indio_dev->name = dev_name(&client->dev); indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &mcp3422_info; switch (adc->id) { case 2: case 3: case 6: case 7: indio_dev->channels = mcp3422_channels; indio_dev->num_channels = ARRAY_SIZE(mcp3422_channels); break; case 4: case 8: indio_dev->channels = mcp3424_channels; indio_dev->num_channels = ARRAY_SIZE(mcp3424_channels); break; } /* meaningful default configuration */ config = (MCP3422_CONT_SAMPLING | MCP3422_CHANNEL_VALUE(1) | MCP3422_PGA_VALUE(MCP3422_PGA_1) | MCP3422_SAMPLE_RATE_VALUE(MCP3422_SRATE_240)); mcp3422_update_config(adc, config); err = devm_iio_device_register(&client->dev, indio_dev); if (err < 0) return err; i2c_set_clientdata(client, indio_dev); return 0; }
static int pa12203001_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct pa12203001_data *data; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(struct pa12203001_data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); data->client = client; data->map = devm_regmap_init_i2c(client, &pa12203001_regmap_config); if (IS_ERR(data->map)) return PTR_ERR(data->map); mutex_init(&data->lock); indio_dev->dev.parent = &client->dev; indio_dev->info = &pa12203001_info; indio_dev->name = PA12203001_DRIVER_NAME; indio_dev->channels = pa12203001_channels; indio_dev->num_channels = ARRAY_SIZE(pa12203001_channels); indio_dev->modes = INDIO_DIRECT_MODE; ret = pa12203001_init(indio_dev); if (ret < 0) return ret; ret = pa12203001_power_chip(indio_dev, PA12203001_CHIP_ENABLE); if (ret < 0) return ret; ret = pm_runtime_set_active(&client->dev); if (ret < 0) goto out_err; pm_runtime_enable(&client->dev); pm_runtime_set_autosuspend_delay(&client->dev, PA12203001_SLEEP_DELAY_MS); pm_runtime_use_autosuspend(&client->dev); ret = iio_device_register(indio_dev); if (ret < 0) goto out_err; return 0; out_err: pa12203001_power_chip(indio_dev, PA12203001_CHIP_DISABLE); return ret; }
static int mag3110_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mag3110_data *data; struct iio_dev *indio_dev; int ret; ret = i2c_smbus_read_byte_data(client, MAG3110_WHO_AM_I); if (ret < 0) return ret; if (ret != MAG3110_DEVICE_ID) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); data->client = client; mutex_init(&data->lock); i2c_set_clientdata(client, indio_dev); indio_dev->info = &mag3110_info; indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = mag3110_channels; indio_dev->num_channels = ARRAY_SIZE(mag3110_channels); indio_dev->available_scan_masks = mag3110_scan_masks; data->ctrl_reg1 = MAG3110_CTRL_DR_DEFAULT; ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG1, data->ctrl_reg1); if (ret < 0) return ret; ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG2, MAG3110_CTRL_AUTO_MRST_EN | MAG3110_CTRL_RAW); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, mag3110_trigger_handler, NULL); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); return ret; }
static int mpl3115_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mpl3115_data *data; struct iio_dev *indio_dev; int ret; ret = i2c_smbus_read_byte_data(client, MPL3115_WHO_AM_I); if (ret < 0) return ret; if (ret != MPL3115_DEVICE_ID) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); data->client = client; mutex_init(&data->lock); i2c_set_clientdata(client, indio_dev); indio_dev->info = &mpl3115_info; indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = mpl3115_channels; indio_dev->num_channels = ARRAY_SIZE(mpl3115_channels); /* software reset, I2C transfer is aborted (fails) */ i2c_smbus_write_byte_data(client, MPL3115_CTRL_REG1, MPL3115_CTRL_RESET); msleep(50); data->ctrl_reg1 = MPL3115_CTRL_OS_258MS; ret = i2c_smbus_write_byte_data(client, MPL3115_CTRL_REG1, data->ctrl_reg1); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, mpl3115_trigger_handler, NULL); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); return ret; }
int mma7455_core_probe(struct device *dev, struct regmap *regmap, const char *name) { struct mma7455_data *mma7455; struct iio_dev *indio_dev; unsigned int reg; int ret; ret = regmap_read(regmap, MMA7455_REG_WHOAMI, ®); if (ret) { dev_err(dev, "unable to read reg\n"); return ret; } if (reg != MMA7455_WHOAMI_ID) { dev_err(dev, "device id mismatch\n"); return -ENODEV; } indio_dev = devm_iio_device_alloc(dev, sizeof(*mma7455)); if (!indio_dev) return -ENOMEM; dev_set_drvdata(dev, indio_dev); mma7455 = iio_priv(indio_dev); mma7455->regmap = regmap; indio_dev->info = &mma7455_info; indio_dev->name = name; indio_dev->dev.parent = dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = mma7455_channels; indio_dev->num_channels = ARRAY_SIZE(mma7455_channels); indio_dev->available_scan_masks = mma7455_scan_masks; regmap_write(mma7455->regmap, MMA7455_REG_MCTL, MMA7455_MCTL_MODE_MEASURE); ret = iio_triggered_buffer_setup(indio_dev, NULL, mma7455_trigger_handler, NULL); if (ret) { dev_err(dev, "unable to setup triggered buffer\n"); return ret; } ret = iio_device_register(indio_dev); if (ret) { dev_err(dev, "unable to register device\n"); iio_triggered_buffer_cleanup(indio_dev); return ret; } return 0; }
static int mlx90614_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct iio_dev *indio_dev; struct mlx90614_data *data; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA)) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); data->client = client; mutex_init(&data->lock); data->wakeup_gpio = mlx90614_probe_wakeup(client); mlx90614_wakeup(data); indio_dev->dev.parent = &client->dev; indio_dev->name = id->name; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &mlx90614_info; ret = mlx90614_probe_num_ir_sensors(client); switch (ret) { case 0: dev_dbg(&client->dev, "Found single sensor"); indio_dev->channels = mlx90614_channels; indio_dev->num_channels = 2; break; case 1: dev_dbg(&client->dev, "Found dual sensor"); indio_dev->channels = mlx90614_channels; indio_dev->num_channels = 3; break; default: return ret; } if (data->wakeup_gpio) { pm_runtime_set_autosuspend_delay(&client->dev, MLX90614_AUTOSLEEP_DELAY); pm_runtime_use_autosuspend(&client->dev); pm_runtime_set_active(&client->dev); pm_runtime_enable(&client->dev); } return iio_device_register(indio_dev); }
static int adis16400_probe(struct spi_device *spi) { struct adis16400_state *st; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (indio_dev == NULL) return -ENOMEM; st = iio_priv(indio_dev); /* this is only used for removal purposes */ spi_set_drvdata(spi, indio_dev); /* setup the industrialio driver allocated elements */ st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data]; indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; indio_dev->channels = st->variant->channels; indio_dev->num_channels = st->variant->num_channels; indio_dev->info = &adis16400_info; indio_dev->modes = INDIO_DIRECT_MODE; if (!(st->variant->flags & ADIS16400_NO_BURST)) { adis16400_setup_chan_mask(st); indio_dev->available_scan_masks = st->avail_scan_mask; } ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data); if (ret) return ret; ret = adis_setup_buffer_and_trigger(&st->adis, indio_dev, adis16400_trigger_handler); if (ret) return ret; /* Get the device into a sane initial state */ ret = adis16400_initial_setup(indio_dev); if (ret) goto error_cleanup_buffer; ret = iio_device_register(indio_dev); if (ret) goto error_cleanup_buffer; adis16400_debugfs_init(indio_dev); return 0; error_cleanup_buffer: adis_cleanup_buffer_and_trigger(&st->adis, indio_dev); return ret; }
static int da280_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; struct iio_dev *indio_dev; struct da280_data *data; enum da280_chipset chip; ret = i2c_smbus_read_byte_data(client, DA280_REG_CHIP_ID); if (ret != DA280_CHIP_ID) return (ret < 0) ? ret : -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); data->client = client; i2c_set_clientdata(client, indio_dev); indio_dev->dev.parent = &client->dev; indio_dev->info = &da280_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = da280_channels; if (ACPI_HANDLE(&client->dev)) { chip = da280_match_acpi_device(&client->dev); } else { chip = id->driver_data; } if (chip == da226) { indio_dev->name = "da226"; indio_dev->num_channels = 2; } else { indio_dev->name = "da280"; indio_dev->num_channels = 3; } ret = da280_enable(client, true); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) { dev_err(&client->dev, "device_register failed\n"); da280_enable(client, false); } return ret; }
static int isl29018_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct isl29018_chip *chip; struct iio_dev *indio_dev; int err; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip)); if (indio_dev == NULL) { 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->lux_scale = 1; chip->lux_uscale = 0; chip->range = 1000; chip->adc_bit = 16; chip->suspended = false; chip->regmap = devm_regmap_init_i2c(client, &isl29018_regmap_config); if (IS_ERR(chip->regmap)) { err = PTR_ERR(chip->regmap); dev_err(chip->dev, "regmap initialization failed: %d\n", err); return err; } err = isl29018_chip_init(chip); if (err) return err; indio_dev->info = &isl29108_info; indio_dev->channels = isl29018_channels; indio_dev->num_channels = ARRAY_SIZE(isl29018_channels); indio_dev->name = id->name; 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"); return err; } return 0; }
static int adis16136_probe(struct spi_device *spi) { const struct spi_device_id *id = spi_get_device_id(spi); struct adis16136 *adis16136; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis16136)); if (indio_dev == NULL) return -ENOMEM; spi_set_drvdata(spi, indio_dev); adis16136 = iio_priv(indio_dev); adis16136->chip_info = &adis16136_chip_info[id->driver_data]; indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; indio_dev->channels = adis16136_channels; indio_dev->num_channels = ARRAY_SIZE(adis16136_channels); indio_dev->info = &adis16136_info; indio_dev->modes = INDIO_DIRECT_MODE; ret = adis_init(&adis16136->adis, indio_dev, spi, &adis16136_data); if (ret) return ret; ret = adis_setup_buffer_and_trigger(&adis16136->adis, indio_dev, NULL); if (ret) return ret; ret = adis16136_initial_setup(indio_dev); if (ret) goto error_cleanup_buffer; ret = iio_device_register(indio_dev); if (ret) goto error_stop_device; adis16136_debugfs_init(indio_dev); return 0; error_stop_device: adis16136_stop_device(indio_dev); error_cleanup_buffer: adis_cleanup_buffer_and_trigger(&adis16136->adis, indio_dev); return ret; }
int hmc5843_common_probe(struct device *dev, struct regmap *regmap, enum hmc5843_ids id, const char *name) { struct hmc5843_data *data; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; dev_set_drvdata(dev, indio_dev); /* default settings at probe */ data = iio_priv(indio_dev); data->dev = dev; data->regmap = regmap; data->variant = &hmc5843_chip_info_tbl[id]; mutex_init(&data->lock); indio_dev->dev.parent = dev; indio_dev->name = name; indio_dev->info = &hmc5843_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = data->variant->channels; indio_dev->num_channels = 4; indio_dev->available_scan_masks = hmc5843_scan_masks; ret = hmc5843_init(data); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, hmc5843_trigger_handler, NULL); if (ret < 0) goto buffer_setup_err; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); buffer_setup_err: hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); return ret; }
static int bma220_probe(struct spi_device *spi) { int ret; struct iio_dev *indio_dev; struct bma220_data *data; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*data)); if (!indio_dev) { dev_err(&spi->dev, "iio allocation failed!\n"); return -ENOMEM; } data = iio_priv(indio_dev); data->spi_device = spi; spi_set_drvdata(spi, indio_dev); mutex_init(&data->lock); indio_dev->dev.parent = &spi->dev; indio_dev->info = &bma220_info; indio_dev->name = BMA220_DEVICE_NAME; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = bma220_channels; indio_dev->num_channels = ARRAY_SIZE(bma220_channels); indio_dev->available_scan_masks = bma220_accel_scan_masks; ret = bma220_init(data->spi_device); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time, bma220_trigger_handler, NULL); if (ret < 0) { dev_err(&spi->dev, "iio triggered buffer setup failed\n"); goto err_suspend; } ret = iio_device_register(indio_dev); if (ret < 0) { dev_err(&spi->dev, "iio_device_register failed\n"); iio_triggered_buffer_cleanup(indio_dev); goto err_suspend; } return 0; err_suspend: return bma220_deinit(spi); }
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 = devm_iio_device_alloc(&client->dev, 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); 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(&client->dev, "regmap initialization failed: %d\n", ret); return ret; } ret = isl29028_chip_init(chip); if (ret < 0) { dev_err(&client->dev, "chip initialization failed: %d\n", ret); return ret; } 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 = devm_iio_device_register(indio_dev->dev.parent, indio_dev); if (ret < 0) { dev_err(&client->dev, "iio registration fails with error %d\n", ret); return ret; } return 0; }
static int dht11_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct dht11 *dht11; struct iio_dev *iio; int ret; iio = devm_iio_device_alloc(dev, sizeof(*dht11)); if (!iio) { dev_err(dev, "Failed to allocate IIO device\n"); return -ENOMEM; } dht11 = iio_priv(iio); dht11->dev = dev; ret = of_get_gpio(node, 0); if (ret < 0) return ret; dht11->gpio = ret; ret = devm_gpio_request_one(dev, dht11->gpio, GPIOF_IN, pdev->name); if (ret) return ret; dht11->irq = gpio_to_irq(dht11->gpio); if (dht11->irq < 0) { dev_err(dev, "GPIO %d has no interrupt\n", dht11->gpio); return -EINVAL; } dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1; dht11->num_edges = -1; platform_set_drvdata(pdev, iio); init_completion(&dht11->completion); mutex_init(&dht11->lock); iio->name = pdev->name; iio->dev.parent = &pdev->dev; iio->info = &dht11_iio_info; iio->modes = INDIO_DIRECT_MODE; iio->channels = dht11_chan_spec; iio->num_channels = ARRAY_SIZE(dht11_chan_spec); return devm_iio_device_register(dev, iio); }
static int tsys02d_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ms_ht_dev *dev_data; struct iio_dev *indio_dev; int ret; u64 serial_number; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA | I2C_FUNC_SMBUS_WRITE_BYTE | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { dev_err(&client->dev, "Adapter does not support some i2c transaction\n"); return -EOPNOTSUPP; } indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*dev_data)); if (!indio_dev) return -ENOMEM; dev_data = iio_priv(indio_dev); dev_data->client = client; dev_data->res_index = 0; mutex_init(&dev_data->lock); indio_dev->info = &tsys02d_info; indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = tsys02d_channels; indio_dev->num_channels = ARRAY_SIZE(tsys02d_channels); i2c_set_clientdata(client, indio_dev); ret = ms_sensors_reset(client, TSYS02D_RESET, 15000); if (ret) return ret; ret = ms_sensors_read_serial(client, &serial_number); if (ret) return ret; dev_info(&client->dev, "Serial number : %llx", serial_number); return devm_iio_device_register(&client->dev, indio_dev); }
static int max517_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max517_data *data; struct iio_dev *indio_dev; struct max517_platform_data *platform_data = client->dev.platform_data; int err; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); data->client = client; /* establish that the iio_dev is a child of the i2c device */ indio_dev->dev.parent = &client->dev; /* reduced channel set for MAX517 */ if (id->driver_data == ID_MAX517) indio_dev->num_channels = 1; else indio_dev->num_channels = 2; indio_dev->channels = max517_channels; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &max517_info; /* * Reference voltage on MAX518 and default is 5V, else take vref_mv * from platform_data */ if (id->driver_data == ID_MAX518 || !platform_data) { data->vref_mv[0] = data->vref_mv[1] = 5000; /* mV */ } else { data->vref_mv[0] = platform_data->vref_mv[0]; data->vref_mv[1] = platform_data->vref_mv[1]; } err = iio_device_register(indio_dev); if (err) return err; dev_info(&client->dev, "DAC registered\n"); return 0; }
static int mc3230_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; struct iio_dev *indio_dev; struct mc3230_data *data; /* First check chip-id and product-id */ ret = i2c_smbus_read_byte_data(client, MC3230_REG_CHIP_ID); if (ret != MC3230_CHIP_ID) return (ret < 0) ? ret : -ENODEV; ret = i2c_smbus_read_byte_data(client, MC3230_REG_PRODUCT_CODE); if (ret != MC3230_PRODUCT_CODE) return (ret < 0) ? ret : -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) { dev_err(&client->dev, "iio allocation failed!\n"); return -ENOMEM; } data = iio_priv(indio_dev); data->client = client; i2c_set_clientdata(client, indio_dev); indio_dev->dev.parent = &client->dev; indio_dev->info = &mc3230_info; indio_dev->name = "mc3230"; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = mc3230_channels; indio_dev->num_channels = ARRAY_SIZE(mc3230_channels); ret = mc3230_set_opcon(data, MC3230_MODE_OPCON_WAKE); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) { dev_err(&client->dev, "device_register failed\n"); mc3230_set_opcon(data, MC3230_MODE_OPCON_STANDBY); } return ret; }
static int srf08_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct iio_dev *indio_dev; struct srf08_data *data; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_WRITE_BYTE_DATA | I2C_FUNC_SMBUS_READ_WORD_DATA)) return -ENODEV; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; data = iio_priv(indio_dev); i2c_set_clientdata(client, indio_dev); data->client = client; indio_dev->name = "srf08"; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &srf08_info; indio_dev->channels = srf08_channels; indio_dev->num_channels = ARRAY_SIZE(srf08_channels); mutex_init(&data->lock); /* * set default values of device here * these register values cannot be read from the hardware * therefore set driver specific default values */ ret = srf08_write_range_mm(data, SRF08_DEFAULT_RANGE); if (ret < 0) return ret; ret = srf08_write_sensitivity(data, SRF08_DEFAULT_GAIN); if (ret < 0) return ret; return devm_iio_device_register(&client->dev, indio_dev); }
static int hmc5843_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct hmc5843_data *data; struct iio_dev *indio_dev; int ret; indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (indio_dev == NULL) return -ENOMEM; /* default settings at probe */ data = iio_priv(indio_dev); data->client = client; data->variant = &hmc5843_chip_info_tbl[id->driver_data]; mutex_init(&data->lock); i2c_set_clientdata(client, indio_dev); indio_dev->info = &hmc5843_info; indio_dev->name = id->name; indio_dev->dev.parent = &client->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = data->variant->channels; indio_dev->num_channels = 4; indio_dev->available_scan_masks = hmc5843_scan_masks; ret = hmc5843_init(data); if (ret < 0) return ret; ret = iio_triggered_buffer_setup(indio_dev, NULL, hmc5843_trigger_handler, NULL); if (ret < 0) return ret; ret = iio_device_register(indio_dev); if (ret < 0) goto buffer_cleanup; return 0; buffer_cleanup: iio_triggered_buffer_cleanup(indio_dev); return ret; }