All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lo <dm81xx@gmail.com>
To: linux-iio@vger.kernel.org
Subject: continuous  mode driver for spi device with interrupt
Date: Tue, 30 Jul 2013 21:55:09 +0200	[thread overview]
Message-ID: <51F81A1D.7000003@gmail.com> (raw)

Hello,

using the iio driver framework I wrote a driver for an eight channel 
ADC, connected via SPI and a interrupt line.
In polling mode (reading /sys/bus/iio/..../in_voltageX_raw) everything 
works fine, but this access is obviously not way I'd want to use to read 
lots of data.
Looking at other drivers (in staging/ kernel v3.2) I think the most 
appropriate way is to use the provided sw ring buffer ring_sw.c
I'm not sure if my ring setup is correct, can someone please comment on 
this?

My _probe function does the basic setup, inits a waitqueue and requests 
the irq line (a gpio):
iio->buffer = iio_sw_rb_allocate(iio);
iio->buffer->access = &ring_sw_access_funcs;
iio->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
	&my_poll_handler,
	IRQF_ONESHOT, //<-not sure about this flag
	iio,
	"my_consumer%d",//<-where is this for?
	iio->id);
iio->buffer->setup_ops = &my_ring_setup_ops;
iio->modes |= INDIO_BUFFER_TRIGGERED;//<-correct mode?

Where my access funcs are:
	.preenable = &my_buffer_preenable,
	.postenable = &iio_triggered_buffer_postenable,
	.predisable = &iio_triggered_buffer_predisable,
	.postdisable = &my_buffer_postdisable
where:
preenable just sets 
iio->buffer->access->set_bytes_per_datum(iio->buffer, 19);
and enables the irq
postenable disables the irq

My irq handler does basically this:
	disable_irq_nosync(irq);
	iio_trigger_poll(adc->trig, iio_get_time_ns());
	return IRQ_HANDLED;

My poll handler does this:
	ring->access->store_to(ring, (u8 *)data, pf->timestamp);
	iio_trigger_notify_done(iio->trig);
	enable_irq(adc->spi->irq);
	return IRQ_HANDLED;

Is the approach of using the sw ring and the interrupt & poll_func more 
or less correct?
I've read ring.txt but still I get most of my kernel panics somewhere in 
ring of buffer management, so I must be doing something wrong there.
Is any (simple) driver recommended as reference? I see different 
approaches in different drivers and I can't test them.

--Lo

             reply	other threads:[~2013-07-30 19:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-30 19:55 Lo [this message]
2013-07-30 22:28 ` continuous mode driver for spi device with interrupt Jonathan Cameron
2013-07-31 11:22   ` Lo

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=51F81A1D.7000003@gmail.com \
    --to=dm81xx@gmail.com \
    --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.