Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1383522 > unrolled thread

[RFC PATCH 2/3] iio: dummy: Convert IIO dummy to configfs

Started byDaniel Baluta <daniel.baluta@intel.com>
First post2016-04-20 17:50 +0200
Last post2016-04-24 13:40 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [RFC PATCH 2/3] iio: dummy: Convert IIO dummy to configfs Daniel Baluta <daniel.baluta@intel.com> - 2016-04-20 17:50 +0200
    Re: [RFC PATCH 2/3] iio: dummy: Convert IIO dummy to configfs Jonathan Cameron <jic23@kernel.org> - 2016-04-24 13:40 +0200

#1383522 — [RFC PATCH 2/3] iio: dummy: Convert IIO dummy to configfs

FromDaniel Baluta <daniel.baluta@intel.com>
Date2016-04-20 17:50 +0200
Subject[RFC PATCH 2/3] iio: dummy: Convert IIO dummy to configfs
Message-ID<rq2y8-1Fp-35@gated-at.bofh.it>
We register a new device type named "dummy", this will create a
configfs entry under:
	* /config/iio/devices/dummy.

Creating dummy devices is now as simple as:

$ mkdir /config/iio/devices/dummy/my_dummy_device

Signed-off-by: Daniel Baluta <daniel.baluta@intel.com>
---
 drivers/iio/dummy/iio_simple_dummy.c | 98 ++++++++++++------------------------
 1 file changed, 33 insertions(+), 65 deletions(-)

diff --git a/drivers/iio/dummy/iio_simple_dummy.c b/drivers/iio/dummy/iio_simple_dummy.c
index 43fe4ba..65f92f8 100644
--- a/drivers/iio/dummy/iio_simple_dummy.c
+++ b/drivers/iio/dummy/iio_simple_dummy.c
@@ -22,21 +22,12 @@
 #include <linux/iio/sysfs.h>
 #include <linux/iio/events.h>
 #include <linux/iio/buffer.h>
+#include <linux/iio/sw_device.h>
 #include "iio_simple_dummy.h"
 
-/*
- * A few elements needed to fake a bus for this driver
- * Note instances parameter controls how many of these
- * dummy devices are registered.
- */
-static unsigned instances = 1;
-module_param(instances, uint, 0);
-
-/* Pointer array used to fake bus elements */
-static struct iio_dev **iio_dummy_devs;
-
-/* Fake a name for the part number, usually obtained from the id table */
-static const char *iio_dummy_part_number = "iio_dummy_part_no";
+static struct config_item_type iio_dummy_type = {
+	.ct_owner = THIS_MODULE,
+};
 
 /**
  * struct iio_dummy_accel_calibscale - realworld to register mapping
@@ -572,12 +563,18 @@ static int iio_dummy_init_device(struct iio_dev *indio_dev)
  *                      const struct i2c_device_id *id)
  * SPI: iio_dummy_probe(struct spi_device *spi)
  */
-static int iio_dummy_probe(int index)
+static struct iio_sw_device *iio_dummy_probe(const char *name)
 {
 	int ret;
 	struct iio_dev *indio_dev;
 	struct iio_dummy_state *st;
+	struct iio_sw_device *swd;
 
+	swd = kzalloc(sizeof(*swd), GFP_KERNEL);
+	if (!swd) {
+		ret = -ENOMEM;
+		goto error_kzalloc;
+	}
 	/*
 	 * Allocate an IIO device.
 	 *
@@ -608,7 +605,7 @@ static int iio_dummy_probe(int index)
 	 * i2c_set_clientdata(client, indio_dev);
 	 * spi_set_drvdata(spi, indio_dev);
 	 */
-	iio_dummy_devs[index] = indio_dev;
+	swd->device = indio_dev;
 
 	/*
 	 * Set the device name.
@@ -619,7 +616,7 @@ static int iio_dummy_probe(int index)
 	 *    indio_dev->name = id->name;
 	 *    indio_dev->name = spi_get_device_id(spi)->name;
 	 */
-	indio_dev->name = iio_dummy_part_number;
+	indio_dev->name = name;
 
 	/* Provide description of available channels */
 	indio_dev->channels = iio_dummy_channels;
@@ -646,7 +643,8 @@ static int iio_dummy_probe(int index)
 	if (ret < 0)
 		goto error_unconfigure_buffer;
 
-	return 0;
+	iio_swd_group_init_type_name(swd, name, &iio_dummy_type);
+	return swd;
 error_unconfigure_buffer:
 	iio_simple_dummy_unconfigure_buffer(indio_dev);
 error_unregister_events:
@@ -654,16 +652,18 @@ error_unregister_events:
 error_free_device:
 	iio_device_free(indio_dev);
 error_ret:
-	return ret;
+	kfree(swd);
+error_kzalloc:
+	return ERR_PTR(ret);
 }
 
 /**
  * iio_dummy_remove() - device instance removal function
- * @index: device index.
+ * @swd: pointer to software IIO device abstraction
  *
  * Parameters follow those of iio_dummy_probe for buses.
  */
-static void iio_dummy_remove(int index)
+static int iio_dummy_remove(struct iio_sw_device *swd)
 {
 	/*
 	 * Get a pointer to the device instance iio_dev structure
@@ -671,7 +671,7 @@ static void iio_dummy_remove(int index)
 	 * struct iio_dev *indio_dev = i2c_get_clientdata(client);
 	 * struct iio_dev *indio_dev = spi_get_drvdata(spi);
 	 */
-	struct iio_dev *indio_dev = iio_dummy_devs[index];
+	struct iio_dev *indio_dev = swd->device;
 
 	/* Unregister the device */
 	iio_device_unregister(indio_dev);
@@ -685,10 +685,10 @@ static void iio_dummy_remove(int index)
 
 	/* Free all structures */
 	iio_device_free(indio_dev);
+	return 0;
 }
-
 /**
- * iio_dummy_init() -  device driver registration
+ * module_iio_sw_device_driver() -  device driver registration
  *
  * Varies depending on bus type of the device. As there is no device
  * here, call probe directly. For information on device registration
@@ -697,50 +697,18 @@ static void iio_dummy_remove(int index)
  * spi:
  * Documentation/spi/spi-summary
  */
-static __init int iio_dummy_init(void)
-{
-	int i, ret;
-
-	if (instances > 10) {
-		instances = 1;
-		return -EINVAL;
-	}
-
-	/* Fake a bus */
-	iio_dummy_devs = kcalloc(instances, sizeof(*iio_dummy_devs),
-				 GFP_KERNEL);
-	/* Here we have no actual device so call probe */
-	for (i = 0; i < instances; i++) {
-		ret = iio_dummy_probe(i);
-		if (ret < 0)
-			goto error_remove_devs;
-	}
-	return 0;
-
-error_remove_devs:
-	while (i--)
-		iio_dummy_remove(i);
-
-	kfree(iio_dummy_devs);
-	return ret;
-}
-module_init(iio_dummy_init);
+static const struct iio_sw_device_ops iio_dummy_device_ops = {
+	.probe = iio_dummy_probe,
+	.remove = iio_dummy_remove,
+};
 
-/**
- * iio_dummy_exit() - device driver removal
- *
- * Varies depending on bus type of the device.
- * As there is no device here, call remove directly.
- */
-static __exit void iio_dummy_exit(void)
-{
-	int i;
+static struct iio_sw_device_type iio_dummy_device = {
+	.name = "dummy",
+	.owner = THIS_MODULE,
+	.ops = &iio_dummy_device_ops,
+};
 
-	for (i = 0; i < instances; i++)
-		iio_dummy_remove(i);
-	kfree(iio_dummy_devs);
-}
-module_exit(iio_dummy_exit);
+module_iio_sw_device_driver(iio_dummy_device);
 
 MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
 MODULE_DESCRIPTION("IIO dummy driver");
-- 
2.5.0

[toc] | [next] | [standalone]


#1385810

FromJonathan Cameron <jic23@kernel.org>
Date2016-04-24 13:40 +0200
Message-ID<rrqyl-3EV-11@gated-at.bofh.it>
In reply to#1383522
On 20/04/16 16:45, Daniel Baluta wrote:
> We register a new device type named "dummy", this will create a
> configfs entry under:
> 	* /config/iio/devices/dummy.
> 
> Creating dummy devices is now as simple as:
> 
> $ mkdir /config/iio/devices/dummy/my_dummy_device
> 
> Signed-off-by: Daniel Baluta <daniel.baluta@intel.com>
Looks very nice.

I don't think it is unreasonable to demand people have configfs for
the dummy driver so very happy to have this cleaned up.

Now to try it with a few thousand devices and see what breaks ;)

1 trivial point inline.

Jonathan
> ---
>  drivers/iio/dummy/iio_simple_dummy.c | 98 ++++++++++++------------------------
>  1 file changed, 33 insertions(+), 65 deletions(-)
> 
> diff --git a/drivers/iio/dummy/iio_simple_dummy.c b/drivers/iio/dummy/iio_simple_dummy.c
> index 43fe4ba..65f92f8 100644
> --- a/drivers/iio/dummy/iio_simple_dummy.c
> +++ b/drivers/iio/dummy/iio_simple_dummy.c
> @@ -22,21 +22,12 @@
>  #include <linux/iio/sysfs.h>
>  #include <linux/iio/events.h>
>  #include <linux/iio/buffer.h>
> +#include <linux/iio/sw_device.h>
>  #include "iio_simple_dummy.h"
>  
> -/*
> - * A few elements needed to fake a bus for this driver
> - * Note instances parameter controls how many of these
> - * dummy devices are registered.
> - */
> -static unsigned instances = 1;
> -module_param(instances, uint, 0);
> -
> -/* Pointer array used to fake bus elements */
> -static struct iio_dev **iio_dummy_devs;
> -
> -/* Fake a name for the part number, usually obtained from the id table */
> -static const char *iio_dummy_part_number = "iio_dummy_part_no";
> +static struct config_item_type iio_dummy_type = {
> +	.ct_owner = THIS_MODULE,
> +};
>  
>  /**
>   * struct iio_dummy_accel_calibscale - realworld to register mapping
> @@ -572,12 +563,18 @@ static int iio_dummy_init_device(struct iio_dev *indio_dev)
>   *                      const struct i2c_device_id *id)
>   * SPI: iio_dummy_probe(struct spi_device *spi)
>   */
> -static int iio_dummy_probe(int index)
> +static struct iio_sw_device *iio_dummy_probe(const char *name)
>  {
>  	int ret;
>  	struct iio_dev *indio_dev;
>  	struct iio_dummy_state *st;
> +	struct iio_sw_device *swd;
>  
> +	swd = kzalloc(sizeof(*swd), GFP_KERNEL);
> +	if (!swd) {
> +		ret = -ENOMEM;
> +		goto error_kzalloc;
> +	}
>  	/*
>  	 * Allocate an IIO device.
>  	 *
> @@ -608,7 +605,7 @@ static int iio_dummy_probe(int index)
>  	 * i2c_set_clientdata(client, indio_dev);
>  	 * spi_set_drvdata(spi, indio_dev);
>  	 */
> -	iio_dummy_devs[index] = indio_dev;
> +	swd->device = indio_dev;
>  
>  	/*
>  	 * Set the device name.
> @@ -619,7 +616,7 @@ static int iio_dummy_probe(int index)
>  	 *    indio_dev->name = id->name;
>  	 *    indio_dev->name = spi_get_device_id(spi)->name;
>  	 */
> -	indio_dev->name = iio_dummy_part_number;
> +	indio_dev->name = name;
>  
>  	/* Provide description of available channels */
>  	indio_dev->channels = iio_dummy_channels;
> @@ -646,7 +643,8 @@ static int iio_dummy_probe(int index)
>  	if (ret < 0)
>  		goto error_unconfigure_buffer;
>  
> -	return 0;
> +	iio_swd_group_init_type_name(swd, name, &iio_dummy_type);
> +	return swd;
>  error_unconfigure_buffer:
>  	iio_simple_dummy_unconfigure_buffer(indio_dev);
>  error_unregister_events:
> @@ -654,16 +652,18 @@ error_unregister_events:
>  error_free_device:
>  	iio_device_free(indio_dev);
>  error_ret:
> -	return ret;
> +	kfree(swd);
> +error_kzalloc:
> +	return ERR_PTR(ret);
>  }
>  
>  /**
>   * iio_dummy_remove() - device instance removal function
> - * @index: device index.
> + * @swd: pointer to software IIO device abstraction
>   *
>   * Parameters follow those of iio_dummy_probe for buses.
>   */
> -static void iio_dummy_remove(int index)
> +static int iio_dummy_remove(struct iio_sw_device *swd)
>  {
>  	/*
>  	 * Get a pointer to the device instance iio_dev structure
> @@ -671,7 +671,7 @@ static void iio_dummy_remove(int index)
>  	 * struct iio_dev *indio_dev = i2c_get_clientdata(client);
>  	 * struct iio_dev *indio_dev = spi_get_drvdata(spi);
>  	 */
> -	struct iio_dev *indio_dev = iio_dummy_devs[index];
> +	struct iio_dev *indio_dev = swd->device;
>  
>  	/* Unregister the device */
>  	iio_device_unregister(indio_dev);
> @@ -685,10 +685,10 @@ static void iio_dummy_remove(int index)
>  
>  	/* Free all structures */
>  	iio_device_free(indio_dev);
blank line here (nitpick of the day ;)
> +	return 0;
>  }
> -
>  /**
> - * iio_dummy_init() -  device driver registration
> + * module_iio_sw_device_driver() -  device driver registration
>   *
>   * Varies depending on bus type of the device. As there is no device
>   * here, call probe directly. For information on device registration
> @@ -697,50 +697,18 @@ static void iio_dummy_remove(int index)
>   * spi:
>   * Documentation/spi/spi-summary
>   */
> -static __init int iio_dummy_init(void)
> -{
> -	int i, ret;
> -
> -	if (instances > 10) {
> -		instances = 1;
> -		return -EINVAL;
> -	}
> -
> -	/* Fake a bus */
> -	iio_dummy_devs = kcalloc(instances, sizeof(*iio_dummy_devs),
> -				 GFP_KERNEL);
> -	/* Here we have no actual device so call probe */
> -	for (i = 0; i < instances; i++) {
> -		ret = iio_dummy_probe(i);
> -		if (ret < 0)
> -			goto error_remove_devs;
> -	}
> -	return 0;
> -
> -error_remove_devs:
> -	while (i--)
> -		iio_dummy_remove(i);
> -
> -	kfree(iio_dummy_devs);
> -	return ret;
> -}
> -module_init(iio_dummy_init);
> +static const struct iio_sw_device_ops iio_dummy_device_ops = {
> +	.probe = iio_dummy_probe,
> +	.remove = iio_dummy_remove,
> +};
>  
> -/**
> - * iio_dummy_exit() - device driver removal
> - *
> - * Varies depending on bus type of the device.
> - * As there is no device here, call remove directly.
> - */
> -static __exit void iio_dummy_exit(void)
> -{
> -	int i;
> +static struct iio_sw_device_type iio_dummy_device = {
> +	.name = "dummy",
> +	.owner = THIS_MODULE,
> +	.ops = &iio_dummy_device_ops,
> +};
>  
> -	for (i = 0; i < instances; i++)
> -		iio_dummy_remove(i);
> -	kfree(iio_dummy_devs);
> -}
> -module_exit(iio_dummy_exit);
> +module_iio_sw_device_driver(iio_dummy_device);
>  
>  MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
>  MODULE_DESCRIPTION("IIO dummy driver");
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web