lkml.org 
[lkml]   [2016]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH v4 2/4] drm/rockchip: add an common abstracted PSR driver
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

\
 
 \ /
  Last update: 2016-07-23 06:42    [W:0.195 / U:6.512 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site