Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1490659
| From | 陈豪 <jacobchen110@gmail.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set |
| Date | 2016-09-24 16:50 +0200 |
| Message-ID | <skWr7-2dj-1@gated-at.bofh.it> (permalink) |
| References | <skDot-7lF-3@gated-at.bofh.it> <skSnv-8gW-21@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
2016-09-24 18:24 GMT+08:00 Shawn Lin <shawn.lin@rock-chips.com>:
> On 2016/9/24 2:26, Jacob Chen wrote:
>>
>> From: Jacob Chen <jacob2.chen@rock-chips.com>
>>
>> In some drivers, disable_irq() call don't be symmetric with enable_irq()
>> , disable_irq() will be called before call free_irq().
>
>
> Which upstream drivers you refer to?
>
> Shouldn't it be the unbalanced call for these drivers?
>
I met this in bcmdhd driver, it seems upstream brcmfmac driver don't
have this problem.
======================================================================
void bcmsdh_oob_intr_unregister(bcmsdh_info_t *bcmsdh)
{
int err = 0;
bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt;
SDLX_MSG(("%s: Enter\n", __FUNCTION__));
if (!bcmsdh_osinfo->oob_irq_registered) {
SDLX_MSG(("%s: irq is not registered\n", __FUNCTION__));
return;
}
if (bcmsdh_osinfo->oob_irq_wake_enabled) {
err = disable_irq_wake(bcmsdh_osinfo->oob_irq_num);
if (!err)
bcmsdh_osinfo->oob_irq_wake_enabled = FALSE;
}
if (bcmsdh_osinfo->oob_irq_enabled) {
disable_irq(bcmsdh_osinfo->oob_irq_num);
bcmsdh_osinfo->oob_irq_enabled = FALSE;
}
free_irq(bcmsdh_osinfo->oob_irq_num, bcmsdh);
bcmsdh_osinfo->oob_irq_registered = FALSE;
}
======================================================================
In this funciton, it will disable irq before free_irq.
At first, i think that commenting the line
"disable_irq(bcmsdh_osinfo->oob_irq_num);" can slove this problem,
but actually this driver have many hidden calls to disable_irq and
hardlly to correct....
Besides, I think that umask() and mask() aren't supposed to be strict symmetric.
>>
>> But both disable_irq() and free_irq() will call
>> rockchip_irq_gc_mask_set_bit,
>> and clk_disable() will be called more times than clk_enable(), which will
>> cause bugs.
>>
>> I think we can correct that by checking of mask.If mask is already set, do
>> nothing.
>>
>
> Looks like a little hacky to me.
>
Yes, it's pretty hacky, but i think it can work stable since this
condition only take effect when disbale_irq + free_irq was called.
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set Jacob Chen <jacob-chen@iotwrt.com> - 2016-09-23 20:30 +0200
Re: [PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set Shawn Lin <shawn.lin@rock-chips.com> - 2016-09-24 12:30 +0200
Re: [PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set 陈豪 <jacobchen110@gmail.com> - 2016-09-24 16:50 +0200
Re: [PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set Heiko Stuebner <heiko@sntech.de> - 2016-09-27 00:40 +0200
Re: [PATCH] pinctrl: rockchip: don't disable clk when irq mask is already set Shawn Lin <shawn.lin@rock-chips.com> - 2016-09-29 09:40 +0200
csiph-web