static void m4pas_remove_iiodev(struct iio_dev *iio) { struct m4pas_driver_data *dd = iio_priv(iio); /* Remember, only call when dd->mutex is locked */ iio_kfifo_free(iio->buffer); iio_buffer_unregister(iio); iio_device_unregister(iio); mutex_destroy(&(dd->mutex)); iio_device_free(iio); /* dd is freed here */ return; }
/** * inv_ak89xx_remove() - remove function. */ static int inv_ak89xx_remove(struct i2c_client *client) { struct iio_dev *indio_dev = i2c_get_clientdata(client); struct inv_ak89xx_state_s *st = iio_priv(indio_dev); cancel_delayed_work_sync(&st->work); iio_device_unregister(indio_dev); inv_ak89xx_remove_trigger(indio_dev); iio_buffer_unregister(indio_dev); inv_ak89xx_unconfigure_ring(indio_dev); iio_free_device(indio_dev); dev_info(&client->adapter->dev, "inv-ak89xx-iio module removed.\n"); return 0; }
static int m4pas_create_iiodev(struct iio_dev *iio) { int err = 0; struct m4pas_driver_data *dd = iio_priv(iio); iio->name = M4PAS_DRIVER_NAME; iio->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_HARDWARE; iio->num_channels = 1; iio->info = &m4pas_iio_info; iio->channels = m4pas_iio_channels; iio->buffer = iio_kfifo_allocate(iio); if (iio->buffer == NULL) { m4pas_err("%s: Failed to allocate IIO buffer.\n", __func__); err = -ENOMEM; goto m4pas_create_iiodev_kfifo_fail; } iio->buffer->scan_timestamp = true; iio->buffer->access->set_bytes_per_datum(iio->buffer, sizeof(dd->iiodat)); err = iio_buffer_register(iio, iio->channels, iio->num_channels); if (err < 0) { m4pas_err("%s: Failed to register IIO buffer.\n", __func__); goto m4pas_create_iiodev_buffer_fail; } err = iio_device_register(iio); if (err < 0) { m4pas_err("%s: Failed to register IIO device.\n", __func__); goto m4pas_create_iiodev_iioreg_fail; } goto m4pas_create_iiodev_exit; m4pas_create_iiodev_iioreg_fail: iio_buffer_unregister(iio); m4pas_create_iiodev_buffer_fail: iio_kfifo_free(iio->buffer); m4pas_create_iiodev_kfifo_fail: iio_device_free(iio); /* dd is freed here */ m4pas_create_iiodev_exit: return err; }
/** * iio_triggered_buffer_cleanup() - Free resources allocated by iio_triggered_buffer_setup() * @indio_dev: IIO device structure */ void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev) { iio_buffer_unregister(indio_dev); iio_dealloc_pollfunc(indio_dev->pollfunc); iio_kfifo_free(indio_dev->buffer); }
void ade7758_uninitialize_ring(struct iio_dev *indio_dev) { iio_buffer_unregister(indio_dev); }
static void yas_remove_buffer(struct iio_dev *indio_dev) { iio_buffer_unregister(indio_dev); iio_sw_rb_free(indio_dev->buffer); };
/** * inv_ak89xx_probe() - probe function. */ static int inv_ak89xx_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct inv_ak89xx_state_s *st; struct iio_dev *indio_dev; int result; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { result = -ENODEV; goto out_no_free; } indio_dev = iio_allocate_device(sizeof(*st)); if (indio_dev == NULL) { result = -ENOMEM; goto out_no_free; } st = iio_priv(indio_dev); st->i2c = client; st->sl_handle = client->adapter; st->plat_data = *(struct mpu_platform_data *)dev_get_platdata(&client->dev); st->i2c_addr = client->addr; st->delay = AK89XX_DEFAULT_DELAY; st->compass_id = id->driver_data; st->compass_scale = 0; i2c_set_clientdata(client, indio_dev); result = ak89xx_init(st); if (result) goto out_free; indio_dev->dev.parent = &client->dev; indio_dev->name = id->name; indio_dev->channels = compass_channels; indio_dev->num_channels = ARRAY_SIZE(compass_channels); indio_dev->info = &ak89xx_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->currentmode = INDIO_DIRECT_MODE; result = inv_ak89xx_configure_ring(indio_dev); if (result) goto out_free; result = iio_buffer_register(indio_dev, indio_dev->channels, indio_dev->num_channels); if (result) goto out_unreg_ring; result = inv_ak89xx_probe_trigger(indio_dev); if (result) goto out_remove_ring; result = iio_device_register(indio_dev); if (result) goto out_remove_trigger; INIT_DELAYED_WORK(&st->work, ak89xx_work_func); pr_info("%s: Probe name %s\n", __func__, id->name); return 0; out_remove_trigger: if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) inv_ak89xx_remove_trigger(indio_dev); out_remove_ring: iio_buffer_unregister(indio_dev); out_unreg_ring: inv_ak89xx_unconfigure_ring(indio_dev); out_free: iio_free_device(indio_dev); out_no_free: dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); return -EIO; }
/** * iio_simple_dummy_unconfigure_buffer() - release buffer resources * @indo_dev: device instance state */ void iio_simple_dummy_unconfigure_buffer(struct iio_dev *indio_dev) { iio_buffer_unregister(indio_dev); iio_dealloc_pollfunc(indio_dev->pollfunc); iio_kfifo_free(indio_dev->buffer); }