Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1563490 > unrolled thread
| Started by | Jeffy Chen <jeffy.chen@rock-chips.com> |
|---|---|
| First post | 2017-01-20 12:30 +0100 |
| Last post | 2017-01-20 20:30 +0100 |
| Articles | 6 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH 1/3] btmrvl: avoid double-disable_irq() race Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
[PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
Re: [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100
[PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
Re: [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100
Re: [PATCH 1/3] btmrvl: avoid double-disable_irq() race Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100
| From | Jeffy Chen <jeffy.chen@rock-chips.com> |
|---|---|
| Date | 2017-01-20 12:30 +0100 |
| Subject | [PATCH 1/3] btmrvl: avoid double-disable_irq() race |
| Message-ID | <t1Fyh-6Cb-1@gated-at.bofh.it> |
It's much the same as what we did for mwifiex in:
b9da4d2 mwifiex: avoid double-disable_irq() race
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
drivers/bluetooth/btmrvl_sdio.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index d02f2c1..c738bae 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -1682,8 +1682,12 @@ static int btmrvl_sdio_resume(struct device *dev)
/* Disable platform specific wakeup interrupt */
if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
disable_irq_wake(card->plt_wake_cfg->irq_bt);
- if (!card->plt_wake_cfg->wake_by_bt)
- disable_irq(card->plt_wake_cfg->irq_bt);
+ disable_irq(card->plt_wake_cfg->irq_bt);
+ if (card->plt_wake_cfg->wake_by_bt)
+ /* Undo our disable, since interrupt handler already
+ * did this.
+ */
+ enable_irq(card->plt_wake_cfg->irq_bt);
}
return 0;
--
2.1.4
[toc] | [next] | [standalone]
| From | Jeffy Chen <jeffy.chen@rock-chips.com> |
|---|---|
| Date | 2017-01-20 12:30 +0100 |
| Subject | [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin |
| Message-ID | <t1Fyi-6Cb-25@gated-at.bofh.it> |
| In reply to | #1563490 |
Use irqflags parsed from dt.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
drivers/bluetooth/btmrvl_sdio.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 796f719..23711fe 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -101,8 +101,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
} else {
ret = devm_request_irq(dev, cfg->irq_bt,
btmrvl_wake_irq_bt,
- IRQF_TRIGGER_LOW,
- "bt_wake", cfg);
+ 0, "bt_wake", cfg);
if (ret) {
dev_err(dev,
"Failed to request irq_bt %d (%d)\n",
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Brian Norris <briannorris@chromium.org> |
|---|---|
| Date | 2017-01-20 20:30 +0100 |
| Subject | Re: [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin |
| Message-ID | <t1N2O-2Ry-37@gated-at.bofh.it> |
| In reply to | #1563500 |
On Fri, Jan 20, 2017 at 07:14:20PM +0800, Jeffy Chen wrote:
> Use irqflags parsed from dt.
>
> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
> ---
>
> drivers/bluetooth/btmrvl_sdio.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index 796f719..23711fe 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -101,8 +101,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
> } else {
> ret = devm_request_irq(dev, cfg->irq_bt,
> btmrvl_wake_irq_bt,
> - IRQF_TRIGGER_LOW,
IRQF_TRIGGER_LOW is often accurate, since Marvell devices seem to always
physically use an active low signal here. But there could always be some
kind of inverter logic on the board, for instance, so it makes sense to
just let the device tree specify these flags for us.
Also, I don't actually see any in-tree users of this yet (at least, I
see no proper "marvell,sd*-bt" compatible properties), so I don't see
anyone who might have specified this incorrectly yet...
So:
Reviewed-by: Brian Norris <briannorris@chromium.org>
> - "bt_wake", cfg);
> + 0, "bt_wake", cfg);
> if (ret) {
> dev_err(dev,
> "Failed to request irq_bt %d (%d)\n",
> --
> 2.1.4
>
>
[toc] | [prev] | [next] | [standalone]
| From | Jeffy Chen <jeffy.chen@rock-chips.com> |
|---|---|
| Date | 2017-01-20 12:30 +0100 |
| Subject | [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it |
| Message-ID | <t1Fyj-6Cb-41@gated-at.bofh.it> |
| In reply to | #1563490 |
The irq_of_parse_and_map will return 0 as a invalid irq.
Set irq_bt to -1 in this case, so that the btmrvl resume/suspend code
would not get confused.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
drivers/bluetooth/btmrvl_sdio.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index c738bae..796f719 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -97,6 +97,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
cfg->irq_bt = irq_of_parse_and_map(card->plt_of_node, 0);
if (!cfg->irq_bt) {
dev_err(dev, "fail to parse irq_bt from device tree");
+ cfg->irq_bt = -1;
} else {
ret = devm_request_irq(dev, cfg->irq_bt,
btmrvl_wake_irq_bt,
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Brian Norris <briannorris@chromium.org> |
|---|---|
| Date | 2017-01-20 20:30 +0100 |
| Subject | Re: [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it |
| Message-ID | <t1N2N-2Ry-15@gated-at.bofh.it> |
| In reply to | #1563508 |
On Fri, Jan 20, 2017 at 07:14:19PM +0800, Jeffy Chen wrote:
> The irq_of_parse_and_map will return 0 as a invalid irq.
irq_of_parse_and_map() is weird to me. In general, Linux IRQ numbers
*can* be 0, but it looks like the OF framework understands that
device-tree based interrupts will not get mapped to a virtual IRQ number
of 0, so it's fine to use '0' as the error value?
In that case, I guess this is the most sensible solution...
> Set irq_bt to -1 in this case, so that the btmrvl resume/suspend code
> would not get confused.
More specifically: the suspend/resume code would have tried to
enable/disable IRQ 0.
> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Reviewed-by: Brian Norris <briannorris@chromium.org>
> ---
>
> drivers/bluetooth/btmrvl_sdio.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index c738bae..796f719 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -97,6 +97,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
> cfg->irq_bt = irq_of_parse_and_map(card->plt_of_node, 0);
> if (!cfg->irq_bt) {
> dev_err(dev, "fail to parse irq_bt from device tree");
> + cfg->irq_bt = -1;
> } else {
> ret = devm_request_irq(dev, cfg->irq_bt,
> btmrvl_wake_irq_bt,
> --
> 2.1.4
>
>
[toc] | [prev] | [next] | [standalone]
| From | Brian Norris <briannorris@chromium.org> |
|---|---|
| Date | 2017-01-20 20:30 +0100 |
| Message-ID | <t1N2O-2Ry-49@gated-at.bofh.it> |
| In reply to | #1563490 |
On Fri, Jan 20, 2017 at 07:14:18PM +0800, Jeffy Chen wrote:
> It's much the same as what we did for mwifiex in:
> b9da4d2 mwifiex: avoid double-disable_irq() race
You could still stand to borrow some of the explanation for your commit
message here...
> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Fix looks good:
Reviewed-by: Brian Norris <briannorris@chromium.org>
> ---
>
> drivers/bluetooth/btmrvl_sdio.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index d02f2c1..c738bae 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -1682,8 +1682,12 @@ static int btmrvl_sdio_resume(struct device *dev)
> /* Disable platform specific wakeup interrupt */
> if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
> disable_irq_wake(card->plt_wake_cfg->irq_bt);
> - if (!card->plt_wake_cfg->wake_by_bt)
> - disable_irq(card->plt_wake_cfg->irq_bt);
> + disable_irq(card->plt_wake_cfg->irq_bt);
> + if (card->plt_wake_cfg->wake_by_bt)
> + /* Undo our disable, since interrupt handler already
> + * did this.
> + */
> + enable_irq(card->plt_wake_cfg->irq_bt);
> }
>
> return 0;
> --
> 2.1.4
>
>
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web