From: Lars-Peter Clausen <lars@metafoo.de>
To: Lars-Peter Clausen <lars@metafoo.de>
Cc: Jonathan Cameron <jic23@cam.ac.uk>,
linux-iio@vger.kernel.org, drivers@analog.com
Subject: Re: [PATCH 03/10] staging:iio:ad7476: Avoid alloc/free for each sample in buffered mode
Date: Fri, 07 Sep 2012 18:37:01 +0200 [thread overview]
Message-ID: <504A22AD.2050403@metafoo.de> (raw)
In-Reply-To: <1347021872-7885-3-git-send-email-lars@metafoo.de>
On 09/07/2012 02:44 PM, Lars-Peter Clausen wrote:
> The ad7476 driver has only support for 1 channel ADCs. So the upper limit for
> the buffer size is the size of one sample plus the size of the timestamp.
> Preallocate a buffer large enough to hold this to avoid having to allocate and
> free a new buffer for each sample being captured.
>
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> ---
> drivers/staging/iio/adc/ad7476.h | 5 ++++-
> drivers/staging/iio/adc/ad7476_ring.c | 13 +++----------
> 2 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/staging/iio/adc/ad7476.h b/drivers/staging/iio/adc/ad7476.h
> index 6085fad..c4f1150 100644
> --- a/drivers/staging/iio/adc/ad7476.h
> +++ b/drivers/staging/iio/adc/ad7476.h
> @@ -33,8 +33,11 @@ struct ad7476_state {
> /*
> * DMA (thus cache coherency maintenance) requires the
> * transfer buffers to live in their own cache lines.
> + * Make the buffer large enough for one 16 bit sample and one 64 bit
> + * aligned 64 bit timestamp.
> */
> - unsigned char data[2] ____cacheline_aligned;
> + unsigned char data[ALIGN(2, sizeof(s64)) + sizeof(s64)]
> + ____cacheline_aligned;
> };
>
> enum ad7476_supported_device_ids {
> diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
> index 940681f..185cfde 100644
> --- a/drivers/staging/iio/adc/ad7476_ring.c
> +++ b/drivers/staging/iio/adc/ad7476_ring.c
> @@ -26,14 +26,9 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p)
> struct iio_dev *indio_dev = pf->indio_dev;
> struct ad7476_state *st = iio_priv(indio_dev);
> s64 time_ns;
> - __u8 *rxbuf;
> int b_sent;
>
> - rxbuf = kzalloc(indio_dev->scan_bytes, GFP_KERNEL);
> - if (rxbuf == NULL)
> - goto done;
> -
> - b_sent = spi_read(st->spi, rxbuf,
> + b_sent = spi_read(st->spi, st->data,
> st->chip_info->channel[0].scan_type.storagebits / 8);
I just noticed this can even more be simplified by using the prepared SPI
message. Unfortunately this will require regeneration of a few more patches.
I'll resend the whole series next week, after it had some exposure to review.
> if (b_sent < 0)
> goto done;
> @@ -41,13 +36,11 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p)
> time_ns = iio_get_time_ns();
>
> if (indio_dev->scan_timestamp)
> - memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64),
> - &time_ns, sizeof(time_ns));
> + ((s64 *)st->data)[1] = time_ns;
>
> - iio_push_to_buffer(indio_dev->buffer, rxbuf);
> + iio_push_to_buffer(indio_dev->buffer, st->data);
> done:
> iio_trigger_notify_done(indio_dev->trig);
> - kfree(rxbuf);
>
> return IRQ_HANDLED;
> }
next prev parent reply other threads:[~2012-09-07 16:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-07 12:44 [PATCH 01/10] staging:iio:ad7476: Fix off by one error for channel shift Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 02/10] staging:iio:ad7476: Remove duplicated chip info entries Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 03/10] staging:iio:ad7476: Avoid alloc/free for each sample in buffered mode Lars-Peter Clausen
2012-09-07 16:37 ` Lars-Peter Clausen [this message]
2012-09-08 9:40 ` Jonathan Cameron
2012-09-08 17:20 ` Lars-Peter Clausen
2012-09-08 19:50 ` Jonathan Cameron
2012-09-07 12:44 ` [PATCH 04/10] staging:iio:ad7476: Rework reference voltage handling Lars-Peter Clausen
2012-09-07 14:31 ` [PATCH v2 " Lars-Peter Clausen
2012-09-08 9:45 ` [PATCH " Jonathan Cameron
2012-09-07 12:44 ` [PATCH 05/10] staging:iio:ad7476: Squash driver into a single file Lars-Peter Clausen
2012-09-08 9:47 ` Jonathan Cameron
2012-09-08 9:50 ` Jonathan Cameron
2012-09-07 12:44 ` [PATCH 06/10] staging:iio:ad7476: Use be16_to_cpup instead of open-coding it Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 07/10] iio: Move ad7476 driver out of staging Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 08/10] iio:ad7476: Add ad7910/ad7920 device table entries Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 09/10] iio:ad7476: Add ad7940 support Lars-Peter Clausen
2012-09-07 12:44 ` [PATCH 10/10] iio:ad7476: Add support for ad7274/ad7275/ad7276/ad7277/ad7278 Lars-Peter Clausen
2012-09-08 9:57 ` Jonathan Cameron
2012-09-08 9:36 ` [PATCH 01/10] staging:iio:ad7476: Fix off by one error for channel shift Jonathan Cameron
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=504A22AD.2050403@metafoo.de \
--to=lars@metafoo.de \
--cc=drivers@analog.com \
--cc=jic23@cam.ac.uk \
--cc=linux-iio@vger.kernel.org \
/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.