All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lars-Peter Clausen <lars@metafoo.de>
To: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: linux-arm-kernel@lists.infradead.org, linux-iio@vger.kernel.org,
	Nicolas Ferre <nicolas.ferre@atmel.com>,
	Patrice Vilchez <patrice.vilchez@atmel.com>
Subject: Re: [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver.
Date: Thu, 20 Oct 2011 09:09:10 +0200	[thread overview]
Message-ID: <4E9FC916.2070800@metafoo.de> (raw)
In-Reply-To: <1319041134-19712-3-git-send-email-maxime.ripard@free-electrons.com>

On 10/19/2011 06:18 PM, Maxime Ripard wrote:
> Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
> Cc: Patrice Vilchez <patrice.vilchez@atmel.com>
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> ---
>  [...]
> +
> +#define at91adc_reg_read(base, reg)        __raw_readl((base) + (reg))
> +#define at91adc_reg_write(base, reg, val)  __raw_writel((val), (base) + (reg))

Shouldn't this rather be {readl,writel}_relaxed?

> +
> +struct at91adc_state {
> +	struct clk *clk;
> +	bool done;
> +	struct mutex lock;
> +	struct iio_chan_spec *channels;
> +	int nb_chan;
> +	int irq;
> +	wait_queue_head_t wq_data_avail;
> +	u16 lcdr;
> +	void __iomem *reg_base;
> +
> +};
> +
> +static irqreturn_t at91adc_eoc_trigger(int irq, void *private)
> +{
> +	int chan;
> +	struct at91adc_state *st = private;
> +	struct iio_dev *idev = iio_priv_to_dev(st);
> +	unsigned int status = at91adc_reg_read(st->reg_base, AT91_ADC_SR);
> +
> +	if (!(status & AT91_ADC_DRDY))
> +		return IRQ_HANDLED;
> +
> +	for (chan = 0; chan < st->nb_chan; chan++) {
> +		if (status & AT91_ADC_EOC(chan)) {
> +			st->done = true;
> +			st->lcdr = at91adc_reg_read(st->reg_base,
> +						    AT91_ADC_CHR(chan));
> +		}
> +	}
> +	wake_up_interruptible(&st->wq_data_avail);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static int at91adc_channel_init(struct at91adc_state *st)
> +{
> +	int ret = 0, i;
> +	st->channels = kzalloc(sizeof(struct iio_chan_spec) * st->nb_chan,
> +			       GFP_KERNEL);

kcalloc

> +	if (st->channels == NULL)
> +		return -ENOMEM;
> +
> +	for (i = 0; i < st->nb_chan; i++) {
> +		struct iio_chan_spec *chan = st->channels + i;
> +		chan->type = IIO_VOLTAGE;
> +		chan->indexed = 1;
> +		chan->channel = i;


It probably makes sense to initialize scan_type as well.

> +		++ret;
> +	}
> +
> +	return ret;

Why do you need ret? Shouldn't this be just st->nb_chan?

> +}
> +
> +static int at91adc_read_raw(struct iio_dev *idev,
> +			    struct iio_chan_spec const *chan,
> +			    int *val, int *val2, long mask)
> +{
> +	struct at91adc_state *st = iio_priv(idev);
> +
> +	switch (mask) {
> +	case 0:
> +		mutex_lock(&st->lock);
> +
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CHER,
> +				  AT91_ADC_CH(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_IER,
> +				  AT91_ADC_EOC(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CR, AT91_ADC_START);
> +
> +		wait_event_interruptible(st->wq_data_avail, st->done);

Its probably a good idea to add a timeout in case there is a problem with
the hardware.

> +		*val = st->lcdr;
> +
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CHDR,
> +				  AT91_ADC_CH(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_IDR,
> +				  AT91_ADC_EOC(chan->channel));
> +
> +		st->lcdr = 0;
> +		st->done = false;
> +		mutex_unlock(&st->lock);
> +		return IIO_VAL_INT;
> +	default:
> +		break;
> +	}
> +	return -EINVAL;
> +}
> +
> +static const struct iio_info at91adc_info = {
> +	.driver_module = THIS_MODULE,
> +	.read_raw = &at91adc_read_raw,
> +};
> +
> +static int __devinit at91adc_probe(struct platform_device *pdev)
> +{
> +	unsigned int prsc, mstrclk, ticks;
> +	int ret;
> +	struct iio_dev *idev;
> +	struct at91adc_state *st;
> +	struct resource *res;
> +	struct at91_adc_data *pdata = pdev->dev.platform_data;
> +
> +	dev_dbg(&pdev->dev, "AT91ADC probed\n");
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "No resource defined\n");
> +		ret = -ENXIO;
> +		goto error_ret;
> +	}
> +
> +	idev = iio_allocate_device(sizeof(*st));
> +	if (idev == NULL) {
> +		dev_err(&pdev->dev, "Failed to allocate memory.\n");
> +		ret = -ENOMEM;
> +		goto error_ret;
> +	}
> +	platform_set_drvdata(pdev, idev);
> +
> +	idev->dev.parent = &pdev->dev;
> +	idev->name = platform_get_device_id(pdev)->name;

You don't use device ids. This should cause a NULL pointer deref? Maybe use
dev_name(&pdev->dev) instead.

> +	idev->modes = INDIO_DIRECT_MODE;
> +	idev->info = &at91adc_info;
> +
> +[...]
> +}
> +
> +static int __devexit at91adc_remove(struct platform_device *pdev)
> +{
> +	struct iio_dev *idev = platform_get_drvdata(pdev);
> +	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	struct at91adc_state *st = iio_priv(idev);
> +
> +	free_irq(st->irq, st);
> +	iounmap(st->reg_base);
> +	release_mem_region(res->start, resource_size(res));
> +	iio_device_unregister(idev);
> +

The iio API changed a bit recently and uses a two stage unregistration now.
You should call iio_device_unregister before freeing resources and
iio_device_free afterwards.

> +	return 0;
> +}
> +
> [...]

WARNING: multiple messages have this Message-ID (diff)
From: lars@metafoo.de (Lars-Peter Clausen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver.
Date: Thu, 20 Oct 2011 09:09:10 +0200	[thread overview]
Message-ID: <4E9FC916.2070800@metafoo.de> (raw)
In-Reply-To: <1319041134-19712-3-git-send-email-maxime.ripard@free-electrons.com>

On 10/19/2011 06:18 PM, Maxime Ripard wrote:
> Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
> Cc: Patrice Vilchez <patrice.vilchez@atmel.com>
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> ---
>  [...]
> +
> +#define at91adc_reg_read(base, reg)        __raw_readl((base) + (reg))
> +#define at91adc_reg_write(base, reg, val)  __raw_writel((val), (base) + (reg))

Shouldn't this rather be {readl,writel}_relaxed?

> +
> +struct at91adc_state {
> +	struct clk *clk;
> +	bool done;
> +	struct mutex lock;
> +	struct iio_chan_spec *channels;
> +	int nb_chan;
> +	int irq;
> +	wait_queue_head_t wq_data_avail;
> +	u16 lcdr;
> +	void __iomem *reg_base;
> +
> +};
> +
> +static irqreturn_t at91adc_eoc_trigger(int irq, void *private)
> +{
> +	int chan;
> +	struct at91adc_state *st = private;
> +	struct iio_dev *idev = iio_priv_to_dev(st);
> +	unsigned int status = at91adc_reg_read(st->reg_base, AT91_ADC_SR);
> +
> +	if (!(status & AT91_ADC_DRDY))
> +		return IRQ_HANDLED;
> +
> +	for (chan = 0; chan < st->nb_chan; chan++) {
> +		if (status & AT91_ADC_EOC(chan)) {
> +			st->done = true;
> +			st->lcdr = at91adc_reg_read(st->reg_base,
> +						    AT91_ADC_CHR(chan));
> +		}
> +	}
> +	wake_up_interruptible(&st->wq_data_avail);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static int at91adc_channel_init(struct at91adc_state *st)
> +{
> +	int ret = 0, i;
> +	st->channels = kzalloc(sizeof(struct iio_chan_spec) * st->nb_chan,
> +			       GFP_KERNEL);

kcalloc

> +	if (st->channels == NULL)
> +		return -ENOMEM;
> +
> +	for (i = 0; i < st->nb_chan; i++) {
> +		struct iio_chan_spec *chan = st->channels + i;
> +		chan->type = IIO_VOLTAGE;
> +		chan->indexed = 1;
> +		chan->channel = i;


It probably makes sense to initialize scan_type as well.

> +		++ret;
> +	}
> +
> +	return ret;

Why do you need ret? Shouldn't this be just st->nb_chan?

> +}
> +
> +static int at91adc_read_raw(struct iio_dev *idev,
> +			    struct iio_chan_spec const *chan,
> +			    int *val, int *val2, long mask)
> +{
> +	struct at91adc_state *st = iio_priv(idev);
> +
> +	switch (mask) {
> +	case 0:
> +		mutex_lock(&st->lock);
> +
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CHER,
> +				  AT91_ADC_CH(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_IER,
> +				  AT91_ADC_EOC(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CR, AT91_ADC_START);
> +
> +		wait_event_interruptible(st->wq_data_avail, st->done);

Its probably a good idea to add a timeout in case there is a problem with
the hardware.

> +		*val = st->lcdr;
> +
> +		at91adc_reg_write(st->reg_base, AT91_ADC_CHDR,
> +				  AT91_ADC_CH(chan->channel));
> +		at91adc_reg_write(st->reg_base, AT91_ADC_IDR,
> +				  AT91_ADC_EOC(chan->channel));
> +
> +		st->lcdr = 0;
> +		st->done = false;
> +		mutex_unlock(&st->lock);
> +		return IIO_VAL_INT;
> +	default:
> +		break;
> +	}
> +	return -EINVAL;
> +}
> +
> +static const struct iio_info at91adc_info = {
> +	.driver_module = THIS_MODULE,
> +	.read_raw = &at91adc_read_raw,
> +};
> +
> +static int __devinit at91adc_probe(struct platform_device *pdev)
> +{
> +	unsigned int prsc, mstrclk, ticks;
> +	int ret;
> +	struct iio_dev *idev;
> +	struct at91adc_state *st;
> +	struct resource *res;
> +	struct at91_adc_data *pdata = pdev->dev.platform_data;
> +
> +	dev_dbg(&pdev->dev, "AT91ADC probed\n");
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "No resource defined\n");
> +		ret = -ENXIO;
> +		goto error_ret;
> +	}
> +
> +	idev = iio_allocate_device(sizeof(*st));
> +	if (idev == NULL) {
> +		dev_err(&pdev->dev, "Failed to allocate memory.\n");
> +		ret = -ENOMEM;
> +		goto error_ret;
> +	}
> +	platform_set_drvdata(pdev, idev);
> +
> +	idev->dev.parent = &pdev->dev;
> +	idev->name = platform_get_device_id(pdev)->name;

You don't use device ids. This should cause a NULL pointer deref? Maybe use
dev_name(&pdev->dev) instead.

> +	idev->modes = INDIO_DIRECT_MODE;
> +	idev->info = &at91adc_info;
> +
> +[...]
> +}
> +
> +static int __devexit at91adc_remove(struct platform_device *pdev)
> +{
> +	struct iio_dev *idev = platform_get_drvdata(pdev);
> +	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	struct at91adc_state *st = iio_priv(idev);
> +
> +	free_irq(st->irq, st);
> +	iounmap(st->reg_base);
> +	release_mem_region(res->start, resource_size(res));
> +	iio_device_unregister(idev);
> +

The iio API changed a bit recently and uses a two stage unregistration now.
You should call iio_device_unregister before freeing resources and
iio_device_free afterwards.

> +	return 0;
> +}
> +
> [...]

  parent reply	other threads:[~2011-10-20  7:08 UTC|newest]

Thread overview: 143+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-19 16:18 [PATCH] AT91: Add a driver for the ADC Maxime Ripard
2011-10-19 16:18 ` Maxime Ripard
2011-10-19 16:18 ` [PATCH 1/3] ARM: AT91: Add platform data for the ADCs Maxime Ripard
2011-10-19 16:18   ` Maxime Ripard
2011-10-19 16:18 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-10-19 16:18   ` Maxime Ripard
2011-10-19 16:42   ` Jonathan Cameron
2011-10-19 16:42     ` Jonathan Cameron
2011-10-19 18:23     ` Maxime Ripard
2011-10-19 18:23       ` Maxime Ripard
2011-10-20  7:05       ` Thomas Petazzoni
2011-10-20  7:05         ` Thomas Petazzoni
2011-10-20  8:33         ` Jonathan Cameron
2011-10-20  8:33           ` Jonathan Cameron
2011-10-20  8:49           ` Thomas Petazzoni
2011-10-20  8:49             ` Thomas Petazzoni
2011-10-20  9:19             ` Jonathan Cameron
2011-10-20  9:19               ` Jonathan Cameron
2011-10-20  9:52           ` Mark Brown
2011-10-20  9:52             ` Mark Brown
2011-10-20  7:09   ` Lars-Peter Clausen [this message]
2011-10-20  7:09     ` Lars-Peter Clausen
2011-10-21 17:54     ` Maxime Ripard
2011-10-21 17:54       ` Maxime Ripard
2011-10-21 17:55       ` Lars-Peter Clausen
2011-10-21 17:55         ` Lars-Peter Clausen
2011-10-23  9:08   ` Jean-Christophe PLAGNIOL-VILLARD
2011-10-23  9:08     ` Jean-Christophe PLAGNIOL-VILLARD
2011-10-24  8:21     ` Maxime Ripard
2011-10-24  8:21       ` Maxime Ripard
2011-10-19 16:18 ` [PATCH 3/3] ARM: AT91: Add the ADC to the sam9g20ek board Maxime Ripard
2011-10-19 16:18   ` Maxime Ripard
2011-10-20  6:28   ` Alexander Stein
2011-10-20  6:28     ` Alexander Stein
2011-10-21 17:47     ` Maxime Ripard
2011-10-21 17:47       ` Maxime Ripard
2011-10-20  7:14   ` Thomas Petazzoni
2011-10-20  7:14     ` Thomas Petazzoni
2011-11-03 10:11 ` [PATCHv2] AT91: Add a driver for the ADC Maxime Ripard
2011-11-03 10:11   ` Maxime Ripard
2011-11-03 10:11   ` [PATCH 1/3] ARM: AT91: Add platform data for the ADCs Maxime Ripard
2011-11-03 10:11     ` Maxime Ripard
2011-11-03 11:27     ` Linus Walleij
2011-11-03 11:27       ` Linus Walleij
2011-11-03 16:27       ` Maxime Ripard
2011-11-03 16:27         ` Maxime Ripard
2011-11-03 16:38         ` Linus Walleij
2011-11-03 18:05           ` Jean-Christophe PLAGNIOL-VILLARD
2011-11-03 18:05             ` Jean-Christophe PLAGNIOL-VILLARD
2011-11-04 10:27     ` Jonathan Cameron
2011-11-04 10:27       ` Jonathan Cameron
2011-11-04 10:36       ` Jonathan Cameron
2011-11-04 10:36         ` Jonathan Cameron
2011-11-04 10:34     ` Jonathan Cameron
2011-11-04 10:34       ` Jonathan Cameron
2011-11-04 15:22       ` Maxime Ripard
2011-11-04 16:28         ` Jonathan Cameron
2011-11-04 16:28           ` Jonathan Cameron
2011-11-03 10:11   ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-03 10:11     ` Maxime Ripard
2011-11-04 10:27     ` Jonathan Cameron
2011-11-04 10:27       ` Jonathan Cameron
2011-11-04 16:29       ` Maxime Ripard
2011-11-04 16:40         ` Jonathan Cameron
2011-11-03 10:11   ` [PATCH 3/3] ARM: AT91: Add the ADC to the sam9g20ek board Maxime Ripard
2011-11-03 10:11     ` Maxime Ripard
2011-11-04 10:33     ` Jonathan Cameron
2011-11-04 10:33       ` Jonathan Cameron
2011-11-04 11:25       ` Maxime Ripard
2011-11-04 15:52         ` Linus Walleij
2011-11-04 16:32         ` Jonathan Cameron
2011-11-04 16:32           ` Jonathan Cameron
2011-11-07 16:08 ` [PATCHv3] AT91: Add a driver for the ADC Maxime Ripard
2011-11-07 16:08   ` Maxime Ripard
2011-11-07 16:08   ` [PATCH 1/3] ARM: AT91: Add platform data for the ADCs Maxime Ripard
2011-11-07 16:08     ` Maxime Ripard
2011-11-07 16:27     ` Jonathan Cameron
2011-11-07 16:27       ` Jonathan Cameron
2011-11-08 13:19     ` Thomas Petazzoni
2011-11-08 13:19       ` Thomas Petazzoni
2011-11-07 16:08   ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-07 16:08     ` Maxime Ripard
2011-11-08 13:30     ` Thomas Petazzoni
2011-11-08 13:30       ` Thomas Petazzoni
2011-11-07 16:08   ` [PATCH 3/3] ARM: AT91: Add the ADC to the sam9g20ek board Maxime Ripard
2011-11-07 16:08     ` Maxime Ripard
2011-11-09 10:19 ` [PATCHv4] AT91: Add a driver for the ADC Maxime Ripard
2011-11-09 10:19   ` Maxime Ripard
2011-11-09 10:19   ` [PATCH 1/3] ARM: AT91: Add platform data for the ADCs Maxime Ripard
2011-11-09 10:19     ` Maxime Ripard
2011-11-09 10:19   ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-09 10:19     ` Maxime Ripard
2011-11-10 17:35     ` Jonathan Cameron
2011-11-10 17:35       ` Jonathan Cameron
2011-11-11 12:34       ` Jonathan Cameron
2011-11-11 12:34         ` Jonathan Cameron
2011-11-14  9:59         ` Maxime Ripard
2011-11-14  9:59           ` Maxime Ripard
2011-11-14  9:06       ` Maxime Ripard
2011-11-14  9:06         ` Maxime Ripard
2011-11-09 10:19   ` [PATCH 3/3] ARM: AT91: Add the ADC to the sam9g20ek board Maxime Ripard
2011-11-09 10:19     ` Maxime Ripard
2011-11-10 17:37     ` Jonathan Cameron
2011-11-10 17:37       ` Jonathan Cameron
  -- strict thread matches above, loose matches on Subject: below --
2011-11-14 10:06 [PATCHv5] AT91: Add a driver for the ADC Maxime Ripard
2011-11-14 10:06 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-14 10:06   ` Maxime Ripard
2011-11-14 11:30   ` Nicolas Ferre
2011-11-14 11:30     ` Nicolas Ferre
2011-11-14 11:37   ` Marek Vasut
2011-11-14 11:37     ` Marek Vasut
2011-11-14 14:23     ` Maxime Ripard
2011-11-14 14:23       ` Maxime Ripard
2011-11-14 17:30 [PATCH v6] AT91: Add a driver for the ADC Maxime Ripard
2011-11-14 17:30 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-14 17:30   ` Maxime Ripard
2011-11-14 21:32   ` Jonathan Cameron
2011-11-14 21:32     ` Jonathan Cameron
2011-11-15 10:23     ` Maxime Ripard
2011-11-15 10:23       ` Maxime Ripard
2011-11-15 10:54 [PATCH v7] AT91: Add a driver for the ADC Maxime Ripard
2011-11-15 10:54 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-15 10:54   ` Maxime Ripard
2011-11-16 15:39   ` Maxime Ripard
2011-11-16 15:39     ` Maxime Ripard
2011-11-18 10:12 [PATCH v8] AT91: Add a driver for the ADC Maxime Ripard
2011-11-18 10:12 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-18 10:12   ` Maxime Ripard
2011-11-24 11:27 [PATCH v9] AT91: Add a driver for the ADC Maxime Ripard
2011-11-24 11:27 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-24 11:27   ` Maxime Ripard
2011-11-24 14:28   ` Jean-Christophe PLAGNIOL-VILLARD
2011-11-24 14:28     ` Jean-Christophe PLAGNIOL-VILLARD
2011-11-30  9:14 [PATCH v11] AT91: Add a driver for the ADC Maxime Ripard
2011-11-30  9:15 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-11-30  9:15   ` Maxime Ripard
2011-11-30 17:40   ` Arnd Bergmann
2011-11-30 17:40     ` Arnd Bergmann
2011-12-02 13:17 [PATCH v12] AT91: Add a driver for the ADC Maxime Ripard
2011-12-02 13:17 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2011-12-02 13:17   ` Maxime Ripard
2011-12-14 10:01 [PATCH v13] AT91: Add a driver for the ADC Maxime Ripard
2011-12-14 10:01 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2012-01-16 21:36 [PATCH RESEND v13] AT91: Add a driver for the ADC Maxime Ripard
2012-01-16 21:36 ` [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver Maxime Ripard
2012-01-16 21:36   ` Maxime Ripard
2012-01-17 17:35   ` Arnd Bergmann
2012-01-17 17:35     ` Arnd Bergmann
2012-01-17 19:08     ` Maxime Ripard
2012-01-17 19:08       ` Maxime Ripard
2012-01-18 10:27   ` Nicolas Ferre
2012-01-18 10:27     ` Nicolas Ferre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E9FC916.2070800@metafoo.de \
    --to=lars@metafoo.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=maxime.ripard@free-electrons.com \
    --cc=nicolas.ferre@atmel.com \
    --cc=patrice.vilchez@atmel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.