Mokopatches, accelerometers and delaying work
Simon Kagstrom
simon.kagstrom at gmail.com
Tue Oct 7 20:19:43 CEST 2008
Hi!
I saw the mokopatches git tree today, which I guess is the patches
destined for upstream submission. There I saw that the accelerometer
driver once again schedules work in a work queue in the interrupt
handler.
I understand that the implementation in the stable tree is too
moko-specific to be accepted by upstream. Anyhow, as we discussed in an
email thread earlier, there is a race condition also in this
implementation (if an interrupt occurs after enable_irq() in
lis302dl_work).
Thinking that this cannot be a unique problem, I browsed the spi code.
I'm now particularly interested in spi_async(). This is used in
ads7846.c and I think something similar could be used in the lis302dl
interrupt handler, e.g.:
interrupt_handler(..) {
struct spi_message *m = /* get from queue */;
struct spi_transfer *xfer = /* Also get from the same queue */
xfer->len = 1;
xfer->tx_buf = /* Pointer to LIS302DL_REG_OUT_X */
xfer->rx_buf = /* Somewhere to store the result */
/* Same for OUT_Y, OUT_Z, ... */
m->complete = lis302dl_work;
m->context = lis;
spi_message_add_tail(xfer, m);
spi_async(spi_dev, m);
}
void lis320dl_work(void *p) {
struct spi_message *m = /* get from queue */;
struct spi_transfer *xfer = /* get from m */;
u8 *val = xfer->rx_buf;
input_report_rel(REL_X, *val);
...
}
Getting new interrupts while running lis302dl_work() would now just
enqueue another message with spi_async, and should therefore be safe.
Lots of implementation details left, obviously, but do you think this
would be a possible implementation (acceptable by upstream)?
// Simon
More information about the openmoko-kernel
mailing list