All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
To: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: linux-arm-kernel@lists.infradead.org, linux-iio@vger.kernel.org,
	Patrice Vilchez <patrice.vilchez@atmel.com>,
	Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
	Nicolas Ferre <nicolas.ferre@atmel.com>
Subject: Re: [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver.
Date: Tue, 8 Nov 2011 14:30:47 +0100	[thread overview]
Message-ID: <20111108143047.25f8fdd6@skate> (raw)
In-Reply-To: <1320682113-23655-3-git-send-email-maxime.ripard@free-electrons.com>

Le Mon,  7 Nov 2011 17:08:32 +0100,
Maxime Ripard <maxime.ripard@free-electrons.com> a =C3=A9crit :

> +static inline u32 at91adc_reg_read(void *base, u8 reg)
> +{
> +	return readl_relaxed(base + reg);
> +}
> +
> +static inline void at91adc_reg_write(void *base, u8 reg, u32 val)
> +{
> +	writel_relaxed(val, base + reg);
> +}

Those could probably be written to take a at91adc_state structure as
argument, in order to simplify the call sites. I.e:

static inline u32 at91adc_reg_read(struct at91adc_state *st, u8 reg)
{
	return readl_relaxed(st->reg_base + reg);
}

static inline void at91adc_reg_write(struct at91adc_state *st, u8 reg, =
u32 val)
{
	writel_relaxed(val, st->reg_base + reg);
}


> +static irqreturn_t at91adc_eoc_trigger(int irq, void *private)
> +{
> +	int chan;
> +	struct iio_dev *idev =3D private;
> +	struct at91adc_state *st =3D iio_priv(idev);
> +	unsigned int status =3D at91adc_reg_read(st->reg_base, AT91_ADC_SR)=
;

would become

+	unsigned int status =3D at91adc_reg_read(st, AT91_ADC_SR);

> +	if (!(status & AT91_ADC_DRDY))
> +		return IRQ_HANDLED;
> +
> +	for (chan =3D 0; chan < idev->num_channels; chan++)
> +		if (status & AT91_ADC_EOC(chan)) {
> +			st->done =3D true;
> +			st->last_value =3D at91adc_reg_read(st->reg_base,
> +							  AT91_ADC_CHR(chan));

would become

+			st->last_value =3D at91adc_reg_read(st, AT91_ADC_CHR(chan));


> +static int at91adc_channel_init(struct iio_dev *idev,
> +				struct at91_adc_data *pdata)
> +{
> +	struct iio_chan_spec *chan_array;
> +	int bit, idx =3D 0;
> +
> +	idev->num_channels =3D bitmap_weight(&(pdata->channels_used),
> +					   pdata->num_channels);
> +	chan_array =3D kcalloc(idev->num_channels, sizeof(struct iio_chan_s=
pec),
> +			     GFP_KERNEL);
> +
> +	if (chan_array =3D=3D NULL)
> +		return -ENOMEM;
> +
> +	for_each_set_bit(bit, &(pdata->channels_used), pdata->num_channels)=
 {
> +		struct iio_chan_spec *chan =3D chan_array + idx;
> +		chan->type =3D IIO_VOLTAGE;
> +		chan->indexed =3D 1;
> +		chan->channel =3D bit;
> +		chan->scan_type.sign =3D 's';

It's an unsigned value that you're reading from the ADC, so maybe this
should be =3D 'u'.

> +static void at91adc_channel_remove(struct iio_dev *idev)
> +{
> +	if (idev->channels =3D=3D NULL)
> +		return;
> +
> +	kfree(idev->channels);

kfree() is fine with having its argument being NULL, so the if test is
useless here. See http://lxr.free-electrons.com/source/mm/slab.c#L3863.

> +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 =3D iio_priv(idev);
> +	unsigned int scale_uv;
> +
> +	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_timeout(st->wq_data_avail, st->done,
> +						 msecs_to_jiffies(10 * 1000));

You forgot to handle the cases where wait_event_interruptible_timeout()
exits because of a signal or because of the timeout, and make the
assumption that the wait_event_interruptible_timeout() is also
successful.


> +	/*
> +	 * Disable all IRQs before setting up the handler
> +	 */
> +	at91adc_reg_write(st->reg_base, AT91_ADC_CR, AT91_ADC_SWRST);
> +	at91adc_reg_write(st->reg_base, AT91_ADC_IDR, 0xFFFFFFFF);
> +	ret =3D request_irq(st->irq,
> +			  at91adc_eoc_trigger, 0, pdev->dev.driver->name, idev);
> +	if (ret) {
> +		dev_err(&pdev->dev, "Failed to allocate IRQ.\n");
> +		goto error_unmap_reg;
> +	}
> +
> +	st->clk =3D clk_get(&pdev->dev, "adc_clk");
> +	if (IS_ERR(st->clk)) {
> +		dev_err(&pdev->dev, "Failed to get the clock.\n");
> +		ret =3D PTR_ERR(st->clk);
> +		goto error_free_irq;
> +	}
> +
> +	clk_enable(st->clk);
> +	mstrclk =3D clk_get_rate(st->clk);

You do a clk_get()/clk_enable() here but nowhere in the ->remove()
function you do a clk_disable()/clk_put().

> +	prsc =3D (mstrclk / (2 * pdata->adc_clock)) - 1;

[...]

> +	ticks =3D round_up((pdata->startup_time * pdata->adc_clock /
> +			  1000000) - 1, 8) / 8;

Both of those computations would be better with a small comment
explaining what's happening.

> +static int __devexit at91adc_remove(struct platform_device *pdev)
> +{
> +	struct iio_dev *idev =3D platform_get_drvdata(pdev);
> +	struct resource *res =3D platform_get_resource(pdev, IORESOURCE_MEM=
, 0);
> +	struct at91adc_state *st =3D iio_priv(idev);
> +
> +	at91adc_channel_remove(idev);
> +	iio_device_unregister(idev);
> +	free_irq(st->irq, idev);
> +	iounmap(st->reg_base);
> +	release_mem_region(res->start, resource_size(res));
> +	iio_device_free(idev);

As said above, clk_disable()/clk_put() is missing.

> +static struct platform_driver at91adc_driver =3D {
> +	.probe =3D at91adc_probe,
> +	.remove =3D __devexit_p(at91adc_remove),
> +	.driver =3D {
> +		   .name =3D "at91adc",
> +		   },

Nitpick: wrongly placed parenthesis.

Regards,

Thomas
--=20
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

WARNING: multiple messages have this Message-ID (diff)
From: thomas.petazzoni@free-electrons.com (Thomas Petazzoni)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3] ARM: AT91: IIO: Add AT91 ADC driver.
Date: Tue, 8 Nov 2011 14:30:47 +0100	[thread overview]
Message-ID: <20111108143047.25f8fdd6@skate> (raw)
In-Reply-To: <1320682113-23655-3-git-send-email-maxime.ripard@free-electrons.com>

Le Mon,  7 Nov 2011 17:08:32 +0100,
Maxime Ripard <maxime.ripard@free-electrons.com> a ?crit :

> +static inline u32 at91adc_reg_read(void *base, u8 reg)
> +{
> +	return readl_relaxed(base + reg);
> +}
> +
> +static inline void at91adc_reg_write(void *base, u8 reg, u32 val)
> +{
> +	writel_relaxed(val, base + reg);
> +}

Those could probably be written to take a at91adc_state structure as
argument, in order to simplify the call sites. I.e:

static inline u32 at91adc_reg_read(struct at91adc_state *st, u8 reg)
{
	return readl_relaxed(st->reg_base + reg);
}

static inline void at91adc_reg_write(struct at91adc_state *st, u8 reg, u32 val)
{
	writel_relaxed(val, st->reg_base + reg);
}


> +static irqreturn_t at91adc_eoc_trigger(int irq, void *private)
> +{
> +	int chan;
> +	struct iio_dev *idev = private;
> +	struct at91adc_state *st = iio_priv(idev);
> +	unsigned int status = at91adc_reg_read(st->reg_base, AT91_ADC_SR);

would become

+	unsigned int status = at91adc_reg_read(st, AT91_ADC_SR);

> +	if (!(status & AT91_ADC_DRDY))
> +		return IRQ_HANDLED;
> +
> +	for (chan = 0; chan < idev->num_channels; chan++)
> +		if (status & AT91_ADC_EOC(chan)) {
> +			st->done = true;
> +			st->last_value = at91adc_reg_read(st->reg_base,
> +							  AT91_ADC_CHR(chan));

would become

+			st->last_value = at91adc_reg_read(st, AT91_ADC_CHR(chan));


> +static int at91adc_channel_init(struct iio_dev *idev,
> +				struct at91_adc_data *pdata)
> +{
> +	struct iio_chan_spec *chan_array;
> +	int bit, idx = 0;
> +
> +	idev->num_channels = bitmap_weight(&(pdata->channels_used),
> +					   pdata->num_channels);
> +	chan_array = kcalloc(idev->num_channels, sizeof(struct iio_chan_spec),
> +			     GFP_KERNEL);
> +
> +	if (chan_array == NULL)
> +		return -ENOMEM;
> +
> +	for_each_set_bit(bit, &(pdata->channels_used), pdata->num_channels) {
> +		struct iio_chan_spec *chan = chan_array + idx;
> +		chan->type = IIO_VOLTAGE;
> +		chan->indexed = 1;
> +		chan->channel = bit;
> +		chan->scan_type.sign = 's';

It's an unsigned value that you're reading from the ADC, so maybe this
should be = 'u'.

> +static void at91adc_channel_remove(struct iio_dev *idev)
> +{
> +	if (idev->channels == NULL)
> +		return;
> +
> +	kfree(idev->channels);

kfree() is fine with having its argument being NULL, so the if test is
useless here. See http://lxr.free-electrons.com/source/mm/slab.c#L3863.

> +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);
> +	unsigned int scale_uv;
> +
> +	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_timeout(st->wq_data_avail, st->done,
> +						 msecs_to_jiffies(10 * 1000));

You forgot to handle the cases where wait_event_interruptible_timeout()
exits because of a signal or because of the timeout, and make the
assumption that the wait_event_interruptible_timeout() is also
successful.


> +	/*
> +	 * Disable all IRQs before setting up the handler
> +	 */
> +	at91adc_reg_write(st->reg_base, AT91_ADC_CR, AT91_ADC_SWRST);
> +	at91adc_reg_write(st->reg_base, AT91_ADC_IDR, 0xFFFFFFFF);
> +	ret = request_irq(st->irq,
> +			  at91adc_eoc_trigger, 0, pdev->dev.driver->name, idev);
> +	if (ret) {
> +		dev_err(&pdev->dev, "Failed to allocate IRQ.\n");
> +		goto error_unmap_reg;
> +	}
> +
> +	st->clk = clk_get(&pdev->dev, "adc_clk");
> +	if (IS_ERR(st->clk)) {
> +		dev_err(&pdev->dev, "Failed to get the clock.\n");
> +		ret = PTR_ERR(st->clk);
> +		goto error_free_irq;
> +	}
> +
> +	clk_enable(st->clk);
> +	mstrclk = clk_get_rate(st->clk);

You do a clk_get()/clk_enable() here but nowhere in the ->remove()
function you do a clk_disable()/clk_put().

> +	prsc = (mstrclk / (2 * pdata->adc_clock)) - 1;

[...]

> +	ticks = round_up((pdata->startup_time * pdata->adc_clock /
> +			  1000000) - 1, 8) / 8;

Both of those computations would be better with a small comment
explaining what's happening.

> +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);
> +
> +	at91adc_channel_remove(idev);
> +	iio_device_unregister(idev);
> +	free_irq(st->irq, idev);
> +	iounmap(st->reg_base);
> +	release_mem_region(res->start, resource_size(res));
> +	iio_device_free(idev);

As said above, clk_disable()/clk_put() is missing.

> +static struct platform_driver at91adc_driver = {
> +	.probe = at91adc_probe,
> +	.remove = __devexit_p(at91adc_remove),
> +	.driver = {
> +		   .name = "at91adc",
> +		   },

Nitpick: wrongly placed parenthesis.

Regards,

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

  reply	other threads:[~2011-11-08 13:31 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
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 [this message]
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=20111108143047.25f8fdd6@skate \
    --to=thomas.petazzoni@free-electrons.com \
    --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 \
    --cc=plagnioj@jcrosoft.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.