Re: [PATCH v4 2/4] drm/rockchip: add an common abstracted PSR driver

Yakir Yang
2016-07-24T07:08:59Z

Doug,

On 07/23/2016 12:04 PM, Doug Anderson wrote:
> 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.

Thanks for your reported, i have wrote a patch[0] to fix this problem in
my v5. If you're happy to review, that would be great ;)

[0]: https://patchwork.kernel.org/patch/9244805/

- Yakir

>
> -Doug
>
>
>