On Tue, Aug 18, 2015 at 09:32:26AM +0200, Vincent Pelletier wrote:
> On Mon, 17 Aug 2015 23:08:23 +0200, Vincent Pelletier
> <[email protected]> wrote:
> > How can I debug this further ?
>
> I made a bit of progress: disabling all but one cpu (...which, in this
> case, just means disabling the second core) makes the error messages go
> away, and blinking works fine.
>
> There is a lock taken in __request_region, and released around
> schedule() when muxed. I guess this means region request is just pushed
> into a queue when resource is busy, then scheduler is told to let
> whatever else available run.
> I have no idea if the lock should be taken before or after
> remove_wait_queue after schedule call.
For each GPIO operation the f7188x driver calls
superio_enter()/superio_exit().
However, I don't think that is enough to prevent multiple threads
accessing a GPIO at the same time.
One option is to add mutex to the private structure and then do
something like this in each callback:
static int f7188x_gpio_get(...)
{
mutex_lock(&sio->lock);
/* request the resource and touch the hardware */
mutex_unlock(&sio->lock);
...
}
It is a bit weird that it needs to acquire/release the ioport region each
time.
--
To unsubscribe from this list: send the line "unsubscribe linux-leds" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html