Yakir,
On Wed, Jul 13, 2016 at 9:15 PM, Yakir Yang ykk@rock-chips.com wrote:
+static void psr_set_state(struct psr_drv *psr, enum psr_state state) +{
mutex_lock(&psr->state_mutex);
if (psr->state == state) {
mutex_unlock(&psr->state_mutex);
return;
}
psr->state = state;
switch (state) {
case PSR_ENABLE:
psr->set(psr->encoder, true);
break;
case PSR_DISABLE:
case PSR_FLUSH:
psr->set(psr->encoder, false);
break;
};
mutex_unlock(&psr->state_mutex);
+}
+static void psr_flush_handler(unsigned long data) +{
struct psr_drv *psr = (struct psr_drv *)data;
if (!psr || psr->state != PSR_FLUSH)
return;
psr_set_state(psr, PSR_ENABLE);
As mentioned in a separate thread, this is probably not OK. psr_set_state() grabs a mutex and that might sleep. ...but psr_flush_handler() is a timer. I'm nearly certain that timers can't sleep.
I believe this is the source of "sleeping function called from invalid context" that I've seen at times.
-Doug