Linux-IIO Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data
@ 2019-12-03 11:17 Andy Shevchenko
  2019-12-03 11:17 ` [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API Andy Shevchenko
  2019-12-07 10:50 ` [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Jonathan Cameron
  0 siblings, 2 replies; 4+ messages in thread
From: Andy Shevchenko @ 2019-12-03 11:17 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler
  Cc: Andy Shevchenko

Platform data is a legacy interface to supply device properties
to the driver. In this case we even don't have in-kernel users
for it. Just remove it for good.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/iio/adc/ti-ads1015.c          | 18 ++++++++----------
 include/Kbuild                        |  1 -
 include/linux/platform_data/ads1015.h | 23 -----------------------
 3 files changed, 8 insertions(+), 34 deletions(-)
 delete mode 100644 include/linux/platform_data/ads1015.h

diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index a550b132cfb7..3b123b4f0b99 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -21,8 +21,6 @@
 #include <linux/mutex.h>
 #include <linux/delay.h>
 
-#include <linux/platform_data/ads1015.h>
-
 #include <linux/iio/iio.h>
 #include <linux/iio/types.h>
 #include <linux/iio/sysfs.h>
@@ -33,6 +31,8 @@
 
 #define ADS1015_DRV_NAME "ads1015"
 
+#define ADS1015_CHANNELS 8
+
 #define ADS1015_CONV_REG	0x00
 #define ADS1015_CFG_REG		0x01
 #define ADS1015_LO_THRESH_REG	0x02
@@ -219,6 +219,12 @@ static const struct iio_event_spec ads1015_events[] = {
 	.datasheet_name = "AIN"#_chan"-AIN"#_chan2,		\
 }
 
+struct ads1015_channel_data {
+	bool enabled;
+	unsigned int pga;
+	unsigned int data_rate;
+};
+
 struct ads1015_thresh_data {
 	unsigned int comp_queue;
 	int high_thresh;
@@ -903,14 +909,6 @@ static void ads1015_get_channels_config(struct i2c_client *client)
 
 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
 	struct ads1015_data *data = iio_priv(indio_dev);
-	struct ads1015_platform_data *pdata = dev_get_platdata(&client->dev);
-
-	/* prefer platform data */
-	if (pdata) {
-		memcpy(data->channel_data, pdata->channel_data,
-		       sizeof(data->channel_data));
-		return;
-	}
 
 #ifdef CONFIG_OF
 	if (!ads1015_get_channels_config_of(client))
diff --git a/include/Kbuild b/include/Kbuild
index ffba79483cc5..498821e5d9ed 100644
--- a/include/Kbuild
+++ b/include/Kbuild
@@ -443,7 +443,6 @@ header-test-			+= linux/platform_data/ad7793.h
 header-test-			+= linux/platform_data/ad7887.h
 header-test-			+= linux/platform_data/adau17x1.h
 header-test-			+= linux/platform_data/adp8870.h
-header-test-			+= linux/platform_data/ads1015.h
 header-test-			+= linux/platform_data/ads7828.h
 header-test-			+= linux/platform_data/apds990x.h
 header-test-			+= linux/platform_data/arm-ux500-pm.h
diff --git a/include/linux/platform_data/ads1015.h b/include/linux/platform_data/ads1015.h
deleted file mode 100644
index 4cc9ffcafcbf..000000000000
--- a/include/linux/platform_data/ads1015.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * Platform Data for ADS1015 12-bit 4-input ADC
- * (C) Copyright 2010
- * Dirk Eibach, Guntermann & Drunck GmbH <eibach@gdsys.de>
- */
-
-#ifndef LINUX_ADS1015_H
-#define LINUX_ADS1015_H
-
-#define ADS1015_CHANNELS 8
-
-struct ads1015_channel_data {
-	bool enabled;
-	unsigned int pga;
-	unsigned int data_rate;
-};
-
-struct ads1015_platform_data {
-	struct ads1015_channel_data channel_data[ADS1015_CHANNELS];
-};
-
-#endif /* LINUX_ADS1015_H */
-- 
2.24.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API
  2019-12-03 11:17 [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Andy Shevchenko
@ 2019-12-03 11:17 ` Andy Shevchenko
  2019-12-07 10:51   ` Jonathan Cameron
  2019-12-07 10:50 ` [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Jonathan Cameron
  1 sibling, 1 reply; 4+ messages in thread
From: Andy Shevchenko @ 2019-12-03 11:17 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler
  Cc: Andy Shevchenko

Make use of device property API in this driver so that both OF based
system and ACPI based system can use this driver.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/iio/adc/ti-ads1015.c | 59 +++++++++++++++++-------------------
 1 file changed, 27 insertions(+), 32 deletions(-)

diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 3b123b4f0b99..a128236ec3cc 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -12,10 +12,10 @@
  */
 
 #include <linux/module.h>
-#include <linux/of_device.h>
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/i2c.h>
+#include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/pm_runtime.h>
 #include <linux/mutex.h>
@@ -77,6 +77,7 @@
 #define ADS1015_DEFAULT_CHAN		0
 
 enum chip_ids {
+	ADSXXXX = 0,
 	ADS1015,
 	ADS1115,
 };
@@ -843,65 +844,58 @@ static const struct iio_info ads1115_info = {
 	.attrs          = &ads1115_attribute_group,
 };
 
-#ifdef CONFIG_OF
-static int ads1015_get_channels_config_of(struct i2c_client *client)
+static int ads1015_client_get_channels_config(struct i2c_client *client)
 {
 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
 	struct ads1015_data *data = iio_priv(indio_dev);
-	struct device_node *node;
+	struct device *dev = &client->dev;
+	struct fwnode_handle *fwnode = dev_fwnode(dev), *child;
+	int i = -1;
 
-	if (!client->dev.of_node ||
-	    !of_get_next_child(client->dev.of_node, NULL))
-		return -EINVAL;
-
-	for_each_child_of_node(client->dev.of_node, node) {
+	fwnode_for_each_child_node(fwnode, child) {
 		u32 pval;
 		unsigned int channel;
 		unsigned int pga = ADS1015_DEFAULT_PGA;
 		unsigned int data_rate = ADS1015_DEFAULT_DATA_RATE;
 
-		if (of_property_read_u32(node, "reg", &pval)) {
-			dev_err(&client->dev, "invalid reg on %pOF\n",
-				node);
+		if (fwnode_property_read_u32(child, "reg", &pval)) {
+			dev_err(dev, "invalid reg on %pfw\n", child);
 			continue;
 		}
 
 		channel = pval;
 		if (channel >= ADS1015_CHANNELS) {
-			dev_err(&client->dev,
-				"invalid channel index %d on %pOF\n",
-				channel, node);
+			dev_err(dev, "invalid channel index %d on %pfw\n",
+				channel, child);
 			continue;
 		}
 
-		if (!of_property_read_u32(node, "ti,gain", &pval)) {
+		if (!fwnode_property_read_u32(child, "ti,gain", &pval)) {
 			pga = pval;
 			if (pga > 6) {
-				dev_err(&client->dev, "invalid gain on %pOF\n",
-					node);
-				of_node_put(node);
+				dev_err(dev, "invalid gain on %pfw\n", child);
+				fwnode_handle_put(child);
 				return -EINVAL;
 			}
 		}
 
-		if (!of_property_read_u32(node, "ti,datarate", &pval)) {
+		if (!fwnode_property_read_u32(child, "ti,datarate", &pval)) {
 			data_rate = pval;
 			if (data_rate > 7) {
-				dev_err(&client->dev,
-					"invalid data_rate on %pOF\n",
-					node);
-				of_node_put(node);
+				dev_err(dev, "invalid data_rate on %pfw\n", child);
+				fwnode_handle_put(child);
 				return -EINVAL;
 			}
 		}
 
 		data->channel_data[channel].pga = pga;
 		data->channel_data[channel].data_rate = data_rate;
+
+		i++;
 	}
 
-	return 0;
+	return i < 0 ? -EINVAL : 0;
 }
-#endif
 
 static void ads1015_get_channels_config(struct i2c_client *client)
 {
@@ -910,10 +904,9 @@ static void ads1015_get_channels_config(struct i2c_client *client)
 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
 	struct ads1015_data *data = iio_priv(indio_dev);
 
-#ifdef CONFIG_OF
-	if (!ads1015_get_channels_config_of(client))
+	if (!ads1015_client_get_channels_config(client))
 		return;
-#endif
+
 	/* fallback on default configuration */
 	for (k = 0; k < ADS1015_CHANNELS; ++k) {
 		data->channel_data[k].pga = ADS1015_DEFAULT_PGA;
@@ -951,9 +944,8 @@ static int ads1015_probe(struct i2c_client *client,
 	indio_dev->name = ADS1015_DRV_NAME;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 
-	if (client->dev.of_node)
-		chip = (enum chip_ids)of_device_get_match_data(&client->dev);
-	else
+	chip = (enum chip_ids)device_get_match_data(&client->dev);
+	if (chip == ADSXXXX)
 		chip = id->driver_data;
 	switch (chip) {
 	case ADS1015:
@@ -968,6 +960,9 @@ static int ads1015_probe(struct i2c_client *client,
 		indio_dev->info = &ads1115_info;
 		data->data_rate = (unsigned int *) &ads1115_data_rate;
 		break;
+	default:
+		dev_err(&client->dev, "Unknown chip %d\n", chip);
+		return -EINVAL;
 	}
 
 	data->event_channel = ADS1015_CHANNELS;
-- 
2.24.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data
  2019-12-03 11:17 [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Andy Shevchenko
  2019-12-03 11:17 ` [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API Andy Shevchenko
@ 2019-12-07 10:50 ` Jonathan Cameron
  1 sibling, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2019-12-07 10:50 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: linux-iio, Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler

On Tue,  3 Dec 2019 13:17:52 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> Platform data is a legacy interface to supply device properties
> to the driver. In this case we even don't have in-kernel users
> for it. Just remove it for good.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
In general I'm not in favour of removing platform data support just
for the sake of cleaning that up.  However, here where you are doing
other work on the probe section of the driver fair enough to tidy it up.

Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan

> ---
>  drivers/iio/adc/ti-ads1015.c          | 18 ++++++++----------
>  include/Kbuild                        |  1 -
>  include/linux/platform_data/ads1015.h | 23 -----------------------
>  3 files changed, 8 insertions(+), 34 deletions(-)
>  delete mode 100644 include/linux/platform_data/ads1015.h
> 
> diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
> index a550b132cfb7..3b123b4f0b99 100644
> --- a/drivers/iio/adc/ti-ads1015.c
> +++ b/drivers/iio/adc/ti-ads1015.c
> @@ -21,8 +21,6 @@
>  #include <linux/mutex.h>
>  #include <linux/delay.h>
>  
> -#include <linux/platform_data/ads1015.h>
> -
>  #include <linux/iio/iio.h>
>  #include <linux/iio/types.h>
>  #include <linux/iio/sysfs.h>
> @@ -33,6 +31,8 @@
>  
>  #define ADS1015_DRV_NAME "ads1015"
>  
> +#define ADS1015_CHANNELS 8
> +
>  #define ADS1015_CONV_REG	0x00
>  #define ADS1015_CFG_REG		0x01
>  #define ADS1015_LO_THRESH_REG	0x02
> @@ -219,6 +219,12 @@ static const struct iio_event_spec ads1015_events[] = {
>  	.datasheet_name = "AIN"#_chan"-AIN"#_chan2,		\
>  }
>  
> +struct ads1015_channel_data {
> +	bool enabled;
> +	unsigned int pga;
> +	unsigned int data_rate;
> +};
> +
>  struct ads1015_thresh_data {
>  	unsigned int comp_queue;
>  	int high_thresh;
> @@ -903,14 +909,6 @@ static void ads1015_get_channels_config(struct i2c_client *client)
>  
>  	struct iio_dev *indio_dev = i2c_get_clientdata(client);
>  	struct ads1015_data *data = iio_priv(indio_dev);
> -	struct ads1015_platform_data *pdata = dev_get_platdata(&client->dev);
> -
> -	/* prefer platform data */
> -	if (pdata) {
> -		memcpy(data->channel_data, pdata->channel_data,
> -		       sizeof(data->channel_data));
> -		return;
> -	}
>  
>  #ifdef CONFIG_OF
>  	if (!ads1015_get_channels_config_of(client))
> diff --git a/include/Kbuild b/include/Kbuild
> index ffba79483cc5..498821e5d9ed 100644
> --- a/include/Kbuild
> +++ b/include/Kbuild
> @@ -443,7 +443,6 @@ header-test-			+= linux/platform_data/ad7793.h
>  header-test-			+= linux/platform_data/ad7887.h
>  header-test-			+= linux/platform_data/adau17x1.h
>  header-test-			+= linux/platform_data/adp8870.h
> -header-test-			+= linux/platform_data/ads1015.h
>  header-test-			+= linux/platform_data/ads7828.h
>  header-test-			+= linux/platform_data/apds990x.h
>  header-test-			+= linux/platform_data/arm-ux500-pm.h
> diff --git a/include/linux/platform_data/ads1015.h b/include/linux/platform_data/ads1015.h
> deleted file mode 100644
> index 4cc9ffcafcbf..000000000000
> --- a/include/linux/platform_data/ads1015.h
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * Platform Data for ADS1015 12-bit 4-input ADC
> - * (C) Copyright 2010
> - * Dirk Eibach, Guntermann & Drunck GmbH <eibach@gdsys.de>
> - */
> -
> -#ifndef LINUX_ADS1015_H
> -#define LINUX_ADS1015_H
> -
> -#define ADS1015_CHANNELS 8
> -
> -struct ads1015_channel_data {
> -	bool enabled;
> -	unsigned int pga;
> -	unsigned int data_rate;
> -};
> -
> -struct ads1015_platform_data {
> -	struct ads1015_channel_data channel_data[ADS1015_CHANNELS];
> -};
> -
> -#endif /* LINUX_ADS1015_H */


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API
  2019-12-03 11:17 ` [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API Andy Shevchenko
@ 2019-12-07 10:51   ` Jonathan Cameron
  0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2019-12-07 10:51 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: linux-iio, Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler

On Tue,  3 Dec 2019 13:17:53 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> Make use of device property API in this driver so that both OF based
> system and ACPI based system can use this driver.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Really minor comment...

Using the construction around i = -1, then inc to 0 on first channel
is a bit of a convoluted way of setting what is at heart a boolean flag
to say 1 or more channels had description.

Otherwise seems fine to me and that's minor enough lets just ignore it.

Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.

Thanks,

Jonathan


> ---
>  drivers/iio/adc/ti-ads1015.c | 59 +++++++++++++++++-------------------
>  1 file changed, 27 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
> index 3b123b4f0b99..a128236ec3cc 100644
> --- a/drivers/iio/adc/ti-ads1015.c
> +++ b/drivers/iio/adc/ti-ads1015.c
> @@ -12,10 +12,10 @@
>   */
>  
>  #include <linux/module.h>
> -#include <linux/of_device.h>
>  #include <linux/init.h>
>  #include <linux/irq.h>
>  #include <linux/i2c.h>
> +#include <linux/property.h>
>  #include <linux/regmap.h>
>  #include <linux/pm_runtime.h>
>  #include <linux/mutex.h>
> @@ -77,6 +77,7 @@
>  #define ADS1015_DEFAULT_CHAN		0
>  
>  enum chip_ids {
> +	ADSXXXX = 0,
>  	ADS1015,
>  	ADS1115,
>  };
> @@ -843,65 +844,58 @@ static const struct iio_info ads1115_info = {
>  	.attrs          = &ads1115_attribute_group,
>  };
>  
> -#ifdef CONFIG_OF
> -static int ads1015_get_channels_config_of(struct i2c_client *client)
> +static int ads1015_client_get_channels_config(struct i2c_client *client)
>  {
>  	struct iio_dev *indio_dev = i2c_get_clientdata(client);
>  	struct ads1015_data *data = iio_priv(indio_dev);
> -	struct device_node *node;
> +	struct device *dev = &client->dev;
> +	struct fwnode_handle *fwnode = dev_fwnode(dev), *child;
> +	int i = -1;
>  
> -	if (!client->dev.of_node ||
> -	    !of_get_next_child(client->dev.of_node, NULL))
> -		return -EINVAL;
> -
> -	for_each_child_of_node(client->dev.of_node, node) {
> +	fwnode_for_each_child_node(fwnode, child) {
>  		u32 pval;
>  		unsigned int channel;
>  		unsigned int pga = ADS1015_DEFAULT_PGA;
>  		unsigned int data_rate = ADS1015_DEFAULT_DATA_RATE;
>  
> -		if (of_property_read_u32(node, "reg", &pval)) {
> -			dev_err(&client->dev, "invalid reg on %pOF\n",
> -				node);
> +		if (fwnode_property_read_u32(child, "reg", &pval)) {
> +			dev_err(dev, "invalid reg on %pfw\n", child);
>  			continue;
>  		}
>  
>  		channel = pval;
>  		if (channel >= ADS1015_CHANNELS) {
> -			dev_err(&client->dev,
> -				"invalid channel index %d on %pOF\n",
> -				channel, node);
> +			dev_err(dev, "invalid channel index %d on %pfw\n",
> +				channel, child);
>  			continue;
>  		}
>  
> -		if (!of_property_read_u32(node, "ti,gain", &pval)) {
> +		if (!fwnode_property_read_u32(child, "ti,gain", &pval)) {
>  			pga = pval;
>  			if (pga > 6) {
> -				dev_err(&client->dev, "invalid gain on %pOF\n",
> -					node);
> -				of_node_put(node);
> +				dev_err(dev, "invalid gain on %pfw\n", child);
> +				fwnode_handle_put(child);
>  				return -EINVAL;
>  			}
>  		}
>  
> -		if (!of_property_read_u32(node, "ti,datarate", &pval)) {
> +		if (!fwnode_property_read_u32(child, "ti,datarate", &pval)) {
>  			data_rate = pval;
>  			if (data_rate > 7) {
> -				dev_err(&client->dev,
> -					"invalid data_rate on %pOF\n",
> -					node);
> -				of_node_put(node);
> +				dev_err(dev, "invalid data_rate on %pfw\n", child);
> +				fwnode_handle_put(child);
>  				return -EINVAL;
>  			}
>  		}
>  
>  		data->channel_data[channel].pga = pga;
>  		data->channel_data[channel].data_rate = data_rate;
> +
> +		i++;
>  	}
>  
> -	return 0;
> +	return i < 0 ? -EINVAL : 0;
>  }
> -#endif
>  
>  static void ads1015_get_channels_config(struct i2c_client *client)
>  {
> @@ -910,10 +904,9 @@ static void ads1015_get_channels_config(struct i2c_client *client)
>  	struct iio_dev *indio_dev = i2c_get_clientdata(client);
>  	struct ads1015_data *data = iio_priv(indio_dev);
>  
> -#ifdef CONFIG_OF
> -	if (!ads1015_get_channels_config_of(client))
> +	if (!ads1015_client_get_channels_config(client))
>  		return;
> -#endif
> +
>  	/* fallback on default configuration */
>  	for (k = 0; k < ADS1015_CHANNELS; ++k) {
>  		data->channel_data[k].pga = ADS1015_DEFAULT_PGA;
> @@ -951,9 +944,8 @@ static int ads1015_probe(struct i2c_client *client,
>  	indio_dev->name = ADS1015_DRV_NAME;
>  	indio_dev->modes = INDIO_DIRECT_MODE;
>  
> -	if (client->dev.of_node)
> -		chip = (enum chip_ids)of_device_get_match_data(&client->dev);
> -	else
> +	chip = (enum chip_ids)device_get_match_data(&client->dev);
> +	if (chip == ADSXXXX)
>  		chip = id->driver_data;
>  	switch (chip) {
>  	case ADS1015:
> @@ -968,6 +960,9 @@ static int ads1015_probe(struct i2c_client *client,
>  		indio_dev->info = &ads1115_info;
>  		data->data_rate = (unsigned int *) &ads1115_data_rate;
>  		break;
> +	default:
> +		dev_err(&client->dev, "Unknown chip %d\n", chip);
> +		return -EINVAL;
>  	}
>  
>  	data->event_channel = ADS1015_CHANNELS;


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, back to index

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-03 11:17 [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Andy Shevchenko
2019-12-03 11:17 ` [PATCH v1 2/2] iio: adc: ti-ads1015: Make use of device property API Andy Shevchenko
2019-12-07 10:51   ` Jonathan Cameron
2019-12-07 10:50 ` [PATCH v1 1/2] iio: adc: ti-ads1025: Get rid of legacy platform data Jonathan Cameron

Linux-IIO Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-iio/0 linux-iio/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-iio linux-iio/ https://lore.kernel.org/linux-iio \
		linux-iio@vger.kernel.org
	public-inbox-index linux-iio

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-iio


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git