Yakir,
On Wed, Jul 13, 2016 at 9:15 PM, Yakir Yang <ykk@xxxxxxxxxxxxxx> wrote:
+static void psr_set_state(struct psr_drv *psr, enum psr_state state)As mentioned in a separate thread, this is probably not OK.
+{
+ 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);
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