Commit 1aa04278 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman

staging: iio: push the main buffer chrdev down to the top level.

Sorry all, this one is very invasive, though the driver changes are
just trivial interface fixes. Not all done yet.

V2 - bring the sca3000 with us.
V3 - fix ade7758 bugs in conversion.
V4 - add ad5933
Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Acked-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 6356463c
......@@ -173,7 +173,7 @@ int main(int argc, char **argv)
return -1;
/* Find the device requested */
dev_num = find_type_by_name(device_name, "device");
dev_num = find_type_by_name(device_name, "iio:device");
if (dev_num < 0) {
printf("Failed to find the %s\n", device_name);
ret = -ENODEV;
......@@ -181,7 +181,7 @@ int main(int argc, char **argv)
}
printf("iio device number being used is %d\n", dev_num);
asprintf(&dev_dir_name, "%sdevice%d", iio_dir, dev_num);
asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
if (trigger_name == NULL) {
/*
* Build the trigger name. If it is device associated it's
......@@ -212,6 +212,7 @@ int main(int argc, char **argv)
ret = build_channel_array(dev_dir_name, &infoarray, &num_channels);
if (ret) {
printf("Problem reading scan element information\n");
printf("diag %s\n", dev_dir_name);
goto error_free_triggername;
}
......@@ -220,7 +221,8 @@ int main(int argc, char **argv)
* As we know that the lis3l02dq has only one buffer this may
* be built rather than found.
*/
ret = asprintf(&buf_dir_name, "%sdevice%d:buffer0", iio_dir, dev_num);
ret = asprintf(&buf_dir_name,
"%siio:device%d/buffer", iio_dir, dev_num);
if (ret < 0) {
ret = -ENOMEM;
goto error_free_triggername;
......@@ -251,9 +253,7 @@ int main(int argc, char **argv)
goto error_free_buf_dir_name;
}
ret = asprintf(&buffer_access,
"/dev/device%d:buffer0",
dev_num);
ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num);
if (ret < 0) {
ret = -ENOMEM;
goto error_free_data;
......
......@@ -16,7 +16,7 @@
#define IIO_MAX_NAME_LENGTH 30
#define FORMAT_SCAN_ELEMENTS_DIR "%s:buffer0/scan_elements"
#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
#define FORMAT_TYPE_FILE "%s_type"
const char *iio_dir = "/sys/bus/iio/devices/";
......
......@@ -497,7 +497,7 @@ static int __devinit adis16201_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
adis16201_channels,
ARRAY_SIZE(adis16201_channels));
if (ret) {
......@@ -520,7 +520,7 @@ static int __devinit adis16201_probe(struct spi_device *spi)
error_remove_trigger:
adis16201_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16201_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -537,7 +537,7 @@ static int adis16201_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
adis16201_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16201_unconfigure_ring(indio_dev);
......
......@@ -451,7 +451,7 @@ static int __devinit adis16203_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
adis16203_channels,
ARRAY_SIZE(adis16203_channels));
if (ret) {
......@@ -474,7 +474,7 @@ static int __devinit adis16203_probe(struct spi_device *spi)
error_remove_trigger:
adis16203_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16203_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -491,7 +491,7 @@ static int adis16203_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
adis16203_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16203_unconfigure_ring(indio_dev);
......
......@@ -526,7 +526,7 @@ static int __devinit adis16204_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
adis16204_channels,
ARRAY_SIZE(adis16204_channels));
if (ret) {
......@@ -549,7 +549,7 @@ static int __devinit adis16204_probe(struct spi_device *spi)
error_remove_trigger:
adis16204_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16204_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -566,7 +566,7 @@ static int adis16204_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
adis16204_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16204_unconfigure_ring(indio_dev);
......
......@@ -499,7 +499,7 @@ static int __devinit adis16209_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
adis16209_channels,
ARRAY_SIZE(adis16209_channels));
if (ret) {
......@@ -522,7 +522,7 @@ static int __devinit adis16209_probe(struct spi_device *spi)
error_remove_trigger:
adis16209_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16209_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -541,7 +541,7 @@ static int adis16209_remove(struct spi_device *spi)
flush_scheduled_work();
adis16209_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16209_unconfigure_ring(indio_dev);
......
......@@ -552,7 +552,7 @@ static int __devinit adis16240_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
adis16240_channels,
ARRAY_SIZE(adis16240_channels));
if (ret) {
......@@ -575,7 +575,7 @@ static int __devinit adis16240_probe(struct spi_device *spi)
error_remove_trigger:
adis16240_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16240_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -595,7 +595,7 @@ static int adis16240_remove(struct spi_device *spi)
flush_scheduled_work();
adis16240_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16240_unconfigure_ring(indio_dev);
......
......@@ -696,7 +696,7 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
lis3l02dq_channels,
ARRAY_SIZE(lis3l02dq_channels));
if (ret) {
......@@ -732,7 +732,7 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi)
if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
free_irq(st->us->irq, indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
lis3l02dq_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -789,7 +789,7 @@ static int lis3l02dq_remove(struct spi_device *spi)
free_irq(st->us->irq, indio_dev);
lis3l02dq_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
lis3l02dq_unconfigure_ring(indio_dev);
iio_device_unregister(indio_dev);
......
......@@ -1157,7 +1157,7 @@ static int __devinit sca3000_probe(struct spi_device *spi)
if (ret < 0)
goto error_free_dev;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
sca3000_channels,
ARRAY_SIZE(sca3000_channels));
if (ret < 0)
......@@ -1182,7 +1182,7 @@ static int __devinit sca3000_probe(struct spi_device *spi)
if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
free_irq(spi->irq, indio_dev);
error_unregister_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unregister_dev:
error_free_dev:
if (regdone)
......@@ -1223,7 +1223,7 @@ static int sca3000_remove(struct spi_device *spi)
return ret;
if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
free_irq(spi->irq, indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
sca3000_unconfigure_ring(indio_dev);
iio_device_unregister(indio_dev);
......
......@@ -144,11 +144,6 @@ static int sca3000_ring_get_bytes_per_datum(struct iio_ring_buffer *r)
{
return 6;
}
static void sca3000_ring_release(struct device *dev)
{
struct iio_ring_buffer *r = to_iio_ring_buffer(dev);
kfree(iio_to_hw_ring_buf(r));
}
static IIO_RING_ENABLE_ATTR;
static IIO_RING_BYTES_PER_DATUM_ATTR;
......@@ -258,16 +253,7 @@ static struct attribute *sca3000_ring_attributes[] = {
static struct attribute_group sca3000_ring_attr = {
.attrs = sca3000_ring_attributes,
};
static const struct attribute_group *sca3000_ring_attr_groups[] = {
&sca3000_ring_attr,
NULL
};
static struct device_type sca3000_ring_type = {
.release = sca3000_ring_release,
.groups = sca3000_ring_attr_groups,
.name = "buffer",
};
static struct iio_ring_buffer *sca3000_rb_allocate(struct iio_dev *indio_dev)
......@@ -282,18 +268,15 @@ static struct iio_ring_buffer *sca3000_rb_allocate(struct iio_dev *indio_dev)
ring->private = indio_dev;
buf = &ring->buf;
buf->stufftoread = 0;
buf->attrs = &sca3000_ring_attr;
iio_ring_buffer_init(buf, indio_dev);
buf->dev.type = &sca3000_ring_type;
buf->dev.parent = &indio_dev->dev;
dev_set_drvdata(&buf->dev, (void *)buf);
return buf;
}
static inline void sca3000_rb_free(struct iio_ring_buffer *r)
{
if (r)
iio_put_ring_buffer(r);
kfree(iio_to_hw_ring_buf(r));
}
static const struct iio_ring_access_funcs sca3000_ring_access_funcs = {
......
......@@ -1098,7 +1098,7 @@ static int __devinit ad7192_probe(struct spi_device *spi)
if (ret)
goto error_unreg_ring;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
......@@ -1111,7 +1111,7 @@ static int __devinit ad7192_probe(struct spi_device *spi)
return 0;
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_remove_trigger:
ad7192_remove_trigger(indio_dev);
error_unreg_ring:
......@@ -1136,7 +1136,7 @@ static int ad7192_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct ad7192_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7192_remove_trigger(indio_dev);
ad7192_ring_cleanup(indio_dev);
......
......@@ -223,7 +223,7 @@ static int __devinit ad7298_probe(struct spi_device *spi)
goto error_disable_reg;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
&ad7298_channels[1], /* skip temp0 */
ARRAY_SIZE(ad7298_channels) - 1);
if (ret)
......@@ -253,7 +253,7 @@ static int __devexit ad7298_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct ad7298_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7298_ring_cleanup(indio_dev);
iio_device_unregister(indio_dev);
if (!IS_ERR(st->reg)) {
......
......@@ -186,7 +186,7 @@ static int __devinit ad7476_probe(struct spi_device *spi)
if (ret)
goto error_disable_reg;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
st->chip_info->channel,
ARRAY_SIZE(st->chip_info->channel));
if (ret)
......@@ -215,7 +215,7 @@ static int ad7476_remove(struct spi_device *spi)
/* copy needed as st will have been freed */
struct regulator *reg = st->reg;
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7476_ring_cleanup(indio_dev);
iio_device_unregister(indio_dev);
if (!IS_ERR(reg)) {
......
......@@ -506,7 +506,7 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq,
goto error_free_irq;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
......@@ -541,7 +541,7 @@ int ad7606_remove(struct iio_dev *indio_dev)
{
struct ad7606_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7606_ring_cleanup(indio_dev);
free_irq(st->irq, indio_dev);
......
......@@ -895,7 +895,7 @@ static int __devinit ad7793_probe(struct spi_device *spi)
if (ret)
goto error_unreg_ring;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
......@@ -908,7 +908,7 @@ static int __devinit ad7793_probe(struct spi_device *spi)
return 0;
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_remove_trigger:
ad7793_remove_trigger(indio_dev);
error_unreg_ring:
......@@ -933,7 +933,7 @@ static int ad7793_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct ad7793_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7793_remove_trigger(indio_dev);
ad7793_ring_cleanup(indio_dev);
......
......@@ -194,7 +194,7 @@ static int __devinit ad7887_probe(struct spi_device *spi)
goto error_disable_reg;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
......@@ -222,7 +222,7 @@ static int ad7887_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct ad7887_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad7887_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
......
......@@ -708,7 +708,7 @@ static int __devinit ad799x_probe(struct i2c_client *client,
goto error_cleanup_ring;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
......@@ -752,7 +752,7 @@ static __devexit int ad799x_remove(struct i2c_client *client)
if (client->irq > 0)
free_irq(client->irq, indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
ad799x_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
......
......@@ -1315,7 +1315,7 @@ static int __devinit max1363_probe(struct i2c_client *client,
if (ret)
goto error_cleanup_ring;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
st->chip_info->channels,
st->chip_info->num_channels);
if (ret)
......@@ -1336,7 +1336,7 @@ static int __devinit max1363_probe(struct i2c_client *client,
return 0;
error_uninit_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_cleanup_ring:
max1363_ring_cleanup(indio_dev);
error_free_available_scan_masks:
......@@ -1362,7 +1362,7 @@ static int max1363_remove(struct i2c_client *client)
if (client->irq)
free_irq(st->client->irq, indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
max1363_ring_cleanup(indio_dev);
kfree(indio_dev->available_scan_masks);
if (!IS_ERR(reg)) {
......
......@@ -629,7 +629,7 @@ static int __devinit adis16260_probe(struct spi_device *spi)
if (ret)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
indio_dev->channels,
ARRAY_SIZE(adis16260_channels_x));
if (ret) {
......@@ -652,7 +652,7 @@ static int __devinit adis16260_probe(struct spi_device *spi)
error_remove_trigger:
adis16260_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16260_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -676,7 +676,7 @@ static int adis16260_remove(struct spi_device *spi)
flush_scheduled_work();
adis16260_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_device_unregister(indio_dev);
adis16260_unconfigure_ring(indio_dev);
......
......@@ -245,7 +245,6 @@ struct iio_info {
};
int iio_event_getfd(struct iio_dev *indio_dev);
/**
* struct iio_dev - industrial I/O device
* @id: [INTERN] used to identify device internally
......@@ -288,6 +287,7 @@ struct iio_dev {
struct list_head channel_attr_list;
const char *name;
const struct iio_info *info;
struct cdev chrdev;
};
/**
......
......@@ -10,6 +10,9 @@
* drivers.
*/
#ifndef _IIO_CORE_H_
#define _IIO_CORE_H_
/**
* iio_device_get_chrdev_minor() - get an unused minor number
**/
......@@ -46,3 +49,32 @@ int __iio_add_chan_devattr(const char *postfix,
/* Event interface flags */
#define IIO_BUSY_BIT_POS 1
#ifdef CONFIG_IIO_RING_BUFFER
struct poll_table_struct;
void iio_chrdev_ring_open(struct iio_dev *indio_dev);
void iio_chrdev_ring_release(struct iio_dev *indio_dev);
unsigned int iio_ring_poll(struct file *filp,
struct poll_table_struct *wait);
ssize_t iio_ring_read_first_n_outer(struct file *filp, char __user *buf,
size_t n, loff_t *f_ps);
#define iio_ring_poll_addr (&iio_ring_poll)
#define iio_ring_read_first_n_outer_addr (&iio_ring_read_first_n_outer)
#else
static inline void iio_chrdev_ring_open(struct iio_dev *indio_dev)
{}
static inline void iio_chrdev_ring_release(struct iio_dev *indio_dev)
{}
#define iio_ring_poll_addr NULL
#define iio_ring_read_first_n_outer_addr NULL
#endif
#endif
......@@ -733,9 +733,7 @@ static int __devinit ad5933_probe(struct i2c_client *client,
regdone = 1;
/* skip temp0_input, register in0_(real|imag)_raw */
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
&ad5933_channels[1],
2);
ret = iio_ring_buffer_register_ex(indio_dev, 0, &ad5933_channels[1], 2);
if (ret)
goto error_unreg_ring;
......@@ -750,7 +748,7 @@ static int __devinit ad5933_probe(struct i2c_client *client,
return 0;
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring:
iio_sw_rb_free(indio_dev->ring);
error_disable_reg:
......@@ -773,7 +771,7 @@ static __devexit int ad5933_remove(struct i2c_client *client)
struct iio_dev *indio_dev = i2c_get_clientdata(client);
struct ad5933_state *st = iio_priv(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
iio_sw_rb_free(indio_dev->ring);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
......
......@@ -853,7 +853,7 @@ static int __devinit adis16400_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
st->variant->channels,
st->variant->num_channels);
if (ret) {
......@@ -877,7 +877,7 @@ static int __devinit adis16400_probe(struct spi_device *spi)
if (indio_dev->modes & INDIO_RING_TRIGGERED)
adis16400_remove_trigger(indio_dev);
error_uninitialize_ring:
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
error_unreg_ring_funcs:
adis16400_unconfigure_ring(indio_dev);
error_free_dev:
......@@ -900,7 +900,7 @@ static int adis16400_remove(struct spi_device *spi)
goto err_ret;
adis16400_remove_trigger(indio_dev);
iio_ring_buffer_unregister(indio_dev->ring);
iio_ring_buffer_unregister(indio_dev);
adis16400_unconfigure_ring(indio_dev);
iio_device_unregister(indio_dev);
......
......@@ -292,7 +292,7 @@ void iio_device_free_chrdev_minor(int val)
iio_free_ida_val(&iio_chrdev_ida, val);
}
int iio_event_getfd(struct iio_dev *indio_dev)
static int iio_event_getfd(struct iio_dev *indio_dev)
{
if (indio_dev->event_interfaces == NULL)
return -ENODEV;
......@@ -1079,6 +1079,8 @@ static void iio_device_unregister_eventset(struct iio_dev *dev_info)
static void iio_dev_release(struct device *device)
{
struct iio_dev *dev_info = container_of(device, struct iio_dev, dev);
cdev_del(&dev_info->chrdev);
iio_device_free_chrdev_minor(MINOR(device->devt));
iio_put();
kfree(dev_info);
}
......@@ -1118,11 +1120,63 @@ EXPORT_SYMBOL(iio_allocate_device);
void iio_free_device(struct iio_dev *dev)
{
if (dev)
iio_put_device(dev);
if (dev) {
iio_put();
kfree(dev);
}
}
EXPORT_SYMBOL(iio_free_device);
/**
* iio_chrdev_open() - chrdev file open for ring buffer access and ioctls
**/
static int iio_chrdev_open(struct inode *inode, struct file *filp)
{
struct iio_dev *dev_info = container_of(inode->i_cdev,
struct iio_dev, chrdev);
filp->private_data = dev_info;
iio_chrdev_ring_open(dev_info);
return 0;
}
/**
* iio_chrdev_release() - chrdev file close ring buffer access and ioctls
**/
static int iio_chrdev_release(struct inode *inode, struct file *filp)
{
iio_chrdev_ring_release(container_of(inode->i_cdev,
struct iio_dev, chrdev));
return 0;
}
/* Somewhat of a cross file organization violation - ioctls here are actually
* event related */
static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct iio_dev *indio_dev = filp->private_data;
int __user *ip = (int __user *)arg;
int fd;
if (cmd == IIO_GET_EVENT_FD_IOCTL) {
fd = iio_event_getfd(indio_dev);
if (copy_to_user(ip, &fd, sizeof(fd)))
return -EFAULT;
return 0;
}
return -EINVAL;
}
static const struct file_operations iio_ring_fileops = {
.read = iio_ring_read_first_n_outer_addr,
.release = iio_chrdev_release,
.open = iio_chrdev_open,
.poll = iio_ring_poll_addr,
.owner = THIS_MODULE,
.llseek = noop_llseek,
.unlocked_ioctl = iio_ioctl,
.compat_ioctl = iio_ioctl,
};
int iio_device_register(struct iio_dev *dev_info)
{
int ret;
......@@ -1133,7 +1187,13 @@ int iio_device_register(struct iio_dev *dev_info)
dev_err(&dev_info->dev, "Failed to get id\n");
goto error_ret;
}
dev_set_name(&dev_info->dev, "device%d", dev_info->id);
dev_set_name(&dev_info->dev, "iio:device%d", dev_info->id);
ret = iio_device_get_chrdev_minor();
if (ret < 0)
goto error_free_ida;
/* configure elements for the chrdev */
dev_info->dev.devt = MKDEV(MAJOR(iio_devt), ret);
ret = device_add(&dev_info->dev);
if (ret)
......@@ -1153,6 +1213,9 @@ int iio_device_register(struct iio_dev *dev_info)
if (dev_info->modes & INDIO_RING_TRIGGERED)
iio_device_register_trigger_consumer(dev_info);
cdev_init(&dev_info->chrdev, &iio_ring_fileops);
dev_info->chrdev.owner = dev_info->info->driver_module;
ret = cdev_add(&dev_info->chrdev, dev_info->dev.devt, 1);
return 0;
error_free_sysfs:
......
This diff is collapsed.
......@@ -87,24 +87,7 @@ static struct attribute *iio_kfifo_attributes[] = {
static struct attribute_group iio_kfifo_attribute_group = {
.attrs = iio_kfifo_attributes,
};
static const struct attribute_group *iio_kfifo_attribute_groups[] = {
&iio_kfifo_attribute_group,
NULL
};
static void iio_kfifo_release(struct device *dev)
{
struct iio_ring_buffer *r = to_iio_ring_buffer(dev);
struct iio_kfifo *kf = iio_to_kfifo(r);
kfifo_free(&kf->kf);
kfree(kf);
}
static struct device_type iio_kfifo_type = {
.release = iio_kfifo_release,
.groups = iio_kfifo_attribute_groups,
.name = "buffer",
};
struct iio_ring_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev)
......@@ -116,10 +99,8 @@ struct iio_ring_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev)
return NULL;
kf->update_needed = true;
iio_ring_buffer_init(&kf->ring, indio_dev);
kf->ring.attrs = &iio_kfifo_attribute_group;
__iio_init_kfifo(kf);
kf->ring.dev.type = &iio_kfifo_type;
kf->ring.dev.parent = &indio_dev->dev;
dev_set_drvdata(&kf->ring.dev, (void *)&(kf->ring));
return &kf->ring;
}
......@@ -159,8 +140,7 @@ static int iio_set_length_kfifo(struct iio_ring_buffer *r, int length)
void iio_kfifo_free(struct iio_ring_buffer *r)
{
if (r)
iio_put_ring_buffer(r);
kfree(iio_to_kfifo(r));
}
EXPORT_SYMBOL(iio_kfifo_free);
......
......@@ -150,8 +150,7 @@ ssize_t ade7758_read_data_from_ring(struct device *dev,
int ade7758_configure_ring(struct iio_dev *indio_dev);
void ade7758_unconfigure_ring(struct iio_dev *indio_dev);
int ade7758_initialize_ring(struct iio_ring_buffer *ring);
void ade7758_uninitialize_ring(struct iio_ring_buffer *ring);
void ade7758_uninitialize_ring(struct iio_dev *indio_dev);
int ade7758_set_irq(struct device *dev, bool enable);
int ade7758_spi_write_reg_8(struct device *dev,
......@@ -180,7 +179,7 @@ static inline int ade7758_initialize_ring(struct iio_ring_buffer *ring)
{
return 0;
}
static inline void ade7758_uninitialize_ring(struct iio_ring_buffer *ring)
static inline void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
{
}
#endif /* CONFIG_IIO_RING_BUFFER */
......
......@@ -780,7 +780,7 @@ static int __devinit ade7758_probe(struct spi_device *spi)
goto error_unreg_ring_funcs;
regdone = 1;
ret = iio_ring_buffer_register_ex(indio_dev->ring, 0,
ret = iio_ring_buffer_register_ex(indio_dev, 0,
&ade7758_channels[0],
ARRAY_SIZE(ade7758_channels));
if (ret) {
......@@ -805,7 +805,7 @@ static int __devinit ade7758_probe(struct spi_device *spi)
if (indio_dev->modes & INDIO_RING_TRIGGERED)
ade7758_remove_trigger(indio_dev);
error_uninitialize_ring:
ade7758_uninitialize_ring(indio_dev->ring);
ade7758_uninitialize_ring(indio_dev);
error_unreg_ring_funcs:
ade7758_unconfigure_ring(indio_dev);
error_free_tx:
......@@ -832,7 +832,7 @@ static int ade7758_remove(struct spi_device *spi)
goto err_ret;
ade7758_remove_trigger(indio_dev);
ade7758_uninitialize_ring(indio_dev->ring);
ade7758_uninitialize_ring(indio_dev);
ade7758_unconfigure_ring(indio_dev);
kfree(st->tx);
kfree(st->rx);
......
......@@ -200,7 +200,7 @@ int ade7758_configure_ring(struct iio_dev *indio_dev)
return ret;
}
void ade7758_uninitialize_ring(struct iio_ring_buffer *ring)
void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
{
iio_ring_buffer_unregister(ring);
iio_ring_buffer_unregister(indio_dev);
}
......@@ -94,7 +94,6 @@ struct iio_ring_setup_ops {
* @flags: [INTERN] file ops related flags including busy flag.
**/
struct iio_ring_buffer {
struct device dev;
struct iio_dev *indio_dev;
struct module *owner;
int length;
......@@ -111,7 +110,7 @@ struct iio_ring_buffer {
wait_queue_head_t pollq;
bool stufftoread;
unsigned long flags;
struct cdev chrdev;
const struct attribute_group *attrs;
};
/**
......@@ -200,24 +199,15 @@ static inline int iio_scan_mask_set(struct iio_ring_buffer *ring, int bit)
return 0;
};
/**
* iio_put_ring_buffer() - notify done with buffer
* @ring: the buffer we are done with.
**/
static inline void iio_put_ring_buffer(struct iio_ring_buffer *ring)
{
put_device(&ring->dev);
};
#define to_iio_ring_buffer(d) \
container_of(d, struct iio_ring_buffer, dev)
/**
* iio_ring_buffer_register_ex() - register the buffer with IIO core
* @ring: the buffer to be registered
* @indio_dev: device with the buffer to be registered
* @id: the id of the buffer (typically 0)
**/
int iio_ring_buffer_register_ex(struct iio_ring_buffer *ring, int id,
int iio_ring_buffer_register_ex(struct iio_dev *indio_dev, int id,
const struct iio_chan_spec *channels,
int num_channels);
......@@ -225,9 +215,9 @@ void iio_ring_access_release(struct device *dev);
/**
* iio_ring_buffer_unregister() - unregister the buffer from IIO core
* @ring: the buffer to be unregistered
* @indio_dev: the device with the buffer to be unregistered
**/
void iio_ring_buffer_unregister(struct iio_ring_buffer *ring);
void iio_ring_buffer_unregister(struct iio_dev *indio_dev);
/**
* iio_read_ring_length() - attr func to get number of datums in the buffer
......@@ -274,7 +264,7 @@ int iio_sw_ring_preenable(struct iio_dev *indio_dev);
#else /* CONFIG_IIO_RING_BUFFER */
static inline int iio_ring_buffer_register_ex(struct iio_ring_buffer *ring,
static inline int iio_ring_buffer_register_ex(struct iio_dev *indio_dev,
int id,
struct iio_chan_spec *channels,
int num_channels)
......@@ -282,7 +272,7 @@ static inline int iio_ring_buffer_register_ex(struct iio_ring_buffer *ring,
return 0;
}
static inline void iio_ring_buffer_unregister(struct iio_ring_buffer *ring)
static inline void iio_ring_buffer_unregister(struct iio_dev *indio_dev)
{};
#endif /* CONFIG_IIO_RING_BUFFER */
......
......@@ -392,13 +392,6 @@ static int iio_mark_update_needed_sw_rb(struct iio_ring_buffer *r)
return 0;
}
static void iio_sw_rb_release(struct device *dev)
{
struct iio_ring_buffer *r = to_iio_ring_buffer(dev);
iio_ring_access_release(&r->dev);
kfree(iio_to_sw_ring(r));
}
static IIO_RING_ENABLE_ATTR;
static IIO_RING_BYTES_PER_DATUM_ATTR;
static IIO_RING_LENGTH_ATTR;
......@@ -413,16 +406,7 @@ static struct attribute *iio_ring_attributes[] = {
static struct attribute_group iio_ring_attribute_group = {
.attrs = iio_ring_attributes,
};
static const struct attribute_group *iio_ring_attribute_groups[] = {
&iio_ring_attribute_group,
NULL
};
static struct device_type iio_sw_ring_type = {
.release = iio_sw_rb_release,
.groups = iio_ring_attribute_groups,
.name = "buffer",
};
struct iio_ring_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev)
......@@ -437,9 +421,7 @@ struct iio_ring_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev)
buf = &ring->buf;
iio_ring_buffer_init(buf, indio_dev);
__iio_init_sw_ring_buffer(ring);
buf->dev.type = &iio_sw_ring_type;
buf->dev.parent = &indio_dev->dev;
dev_set_drvdata(&buf->dev, (void *)buf);
buf->attrs = &iio_ring_attribute_group;
return buf;
}
......@@ -447,8 +429,7 @@ EXPORT_SYMBOL(iio_sw_rb_allocate);
void iio_sw_rb_free(struct iio_ring_buffer *r)
{
if (r)
iio_put_ring_buffer(r);
kfree(iio_to_sw_ring(r));
}
EXPORT_SYMBOL(iio_sw_rb_free);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment