Skip to content

Commit

Permalink
net: ipa: enable IPA interrupt handlers separate from registration
Browse files Browse the repository at this point in the history
Expose ipa_interrupt_enable() and have functions that register
IPA interrupt handlers enable them directly, rather than having the
registration process do that.  Do the same for disabling IPA
interrupt handlers.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Alex Elder authored and Jakub Kicinski committed Jan 6, 2023
1 parent 8e461e1 commit d50ed35
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 7 deletions.
8 changes: 2 additions & 6 deletions drivers/net/ipa/ipa_interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,15 @@ static void ipa_interrupt_enabled_update(struct ipa *ipa)
}

/* Enable an IPA interrupt type */
static void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq)
void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq)
{
/* Update the IPA interrupt mask to enable it */
ipa->interrupt->enabled |= BIT(ipa_irq);
ipa_interrupt_enabled_update(ipa);
}

/* Disable an IPA interrupt type */
static void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq)
void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq)
{
/* Update the IPA interrupt mask to disable it */
ipa->interrupt->enabled &= ~BIT(ipa_irq);
Expand Down Expand Up @@ -231,8 +231,6 @@ void ipa_interrupt_add(struct ipa_interrupt *interrupt,
return;

interrupt->handler[ipa_irq] = handler;

ipa_interrupt_enable(interrupt->ipa, ipa_irq);
}

/* Remove the handler for an IPA interrupt type */
Expand All @@ -242,8 +240,6 @@ ipa_interrupt_remove(struct ipa_interrupt *interrupt, enum ipa_irq_id ipa_irq)
if (WARN_ON(ipa_irq >= IPA_IRQ_COUNT))
return;

ipa_interrupt_disable(interrupt->ipa, ipa_irq);

interrupt->handler[ipa_irq] = NULL;
}

Expand Down
15 changes: 15 additions & 0 deletions drivers/net/ipa/ipa_interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

struct ipa;
struct ipa_interrupt;
enum ipa_irq_id;

/**
* typedef ipa_irq_handler_t - IPA interrupt handler function type
Expand Down Expand Up @@ -85,6 +86,20 @@ void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt);
*/
void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt);

/**
* ipa_interrupt_enable() - Enable an IPA interrupt type
* @ipa: IPA pointer
* @ipa_irq: IPA interrupt ID
*/
void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq);

/**
* ipa_interrupt_disable() - Disable an IPA interrupt type
* @ipa: IPA pointer
* @ipa_irq: IPA interrupt ID
*/
void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq);

/**
* ipa_interrupt_config() - Configure the IPA interrupt framework
* @ipa: IPA pointer
Expand Down
6 changes: 5 additions & 1 deletion drivers/net/ipa/ipa_power.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,17 +337,21 @@ int ipa_power_setup(struct ipa *ipa)

ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND,
ipa_suspend_handler);
ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND);

ret = device_init_wakeup(&ipa->pdev->dev, true);
if (ret)
if (ret) {
ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND);
ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND);
}

return ret;
}

void ipa_power_teardown(struct ipa *ipa)
{
(void)device_init_wakeup(&ipa->pdev->dev, false);
ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND);
ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND);
}

Expand Down
4 changes: 4 additions & 0 deletions drivers/net/ipa/ipa_uc.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,15 +187,19 @@ void ipa_uc_config(struct ipa *ipa)
ipa->uc_powered = false;
ipa->uc_loaded = false;
ipa_interrupt_add(interrupt, IPA_IRQ_UC_0, ipa_uc_interrupt_handler);
ipa_interrupt_enable(ipa, IPA_IRQ_UC_0);
ipa_interrupt_add(interrupt, IPA_IRQ_UC_1, ipa_uc_interrupt_handler);
ipa_interrupt_enable(ipa, IPA_IRQ_UC_1);
}

/* Inverse of ipa_uc_config() */
void ipa_uc_deconfig(struct ipa *ipa)
{
struct device *dev = &ipa->pdev->dev;

ipa_interrupt_disable(ipa, IPA_IRQ_UC_1);
ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_1);
ipa_interrupt_disable(ipa, IPA_IRQ_UC_0);
ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_0);
if (ipa->uc_loaded)
ipa_power_retention(ipa, false);
Expand Down

0 comments on commit d50ed35

Please sign in to comment.