Commit 482ae3a9 authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski

net: ipa: register IPA interrupt handlers directly

Declare the microcontroller IPA interrupt handler publicly, and
assign it directly in ipa_interrupt_config().  Make the SUSPEND IPA
interrupt handler public, and rename it ipa_power_suspend_handler().
Assign it directly in ipa_interrupt_config() as well.

This makes it unnecessary to do this in ipa_interrupt_add().  Make
similar changes for removing IPA interrupt handlers.

The next two patches will finish the cleanup, removing the
add/remove functions and the handler array entirely.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d50ed355
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
#include "ipa.h" #include "ipa.h"
#include "ipa_reg.h" #include "ipa_reg.h"
#include "ipa_endpoint.h" #include "ipa_endpoint.h"
#include "ipa_power.h"
#include "ipa_uc.h"
#include "ipa_interrupt.h" #include "ipa_interrupt.h"
/** /**
...@@ -227,20 +229,14 @@ void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt) ...@@ -227,20 +229,14 @@ void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt)
void ipa_interrupt_add(struct ipa_interrupt *interrupt, void ipa_interrupt_add(struct ipa_interrupt *interrupt,
enum ipa_irq_id ipa_irq, ipa_irq_handler_t handler) enum ipa_irq_id ipa_irq, ipa_irq_handler_t handler)
{ {
if (WARN_ON(ipa_irq >= IPA_IRQ_COUNT)) WARN_ON(ipa_irq >= IPA_IRQ_COUNT);
return;
interrupt->handler[ipa_irq] = handler;
} }
/* Remove the handler for an IPA interrupt type */ /* Remove the handler for an IPA interrupt type */
void void
ipa_interrupt_remove(struct ipa_interrupt *interrupt, enum ipa_irq_id ipa_irq) ipa_interrupt_remove(struct ipa_interrupt *interrupt, enum ipa_irq_id ipa_irq)
{ {
if (WARN_ON(ipa_irq >= IPA_IRQ_COUNT)) WARN_ON(ipa_irq >= IPA_IRQ_COUNT);
return;
interrupt->handler[ipa_irq] = NULL;
} }
/* Configure the IPA interrupt framework */ /* Configure the IPA interrupt framework */
...@@ -283,6 +279,10 @@ struct ipa_interrupt *ipa_interrupt_config(struct ipa *ipa) ...@@ -283,6 +279,10 @@ struct ipa_interrupt *ipa_interrupt_config(struct ipa *ipa)
goto err_free_irq; goto err_free_irq;
} }
interrupt->handler[IPA_IRQ_UC_0] = ipa_uc_interrupt_handler;
interrupt->handler[IPA_IRQ_UC_1] = ipa_uc_interrupt_handler;
interrupt->handler[IPA_IRQ_TX_SUSPEND] = ipa_power_suspend_handler;
return interrupt; return interrupt;
err_free_irq: err_free_irq:
......
...@@ -202,17 +202,7 @@ u32 ipa_core_clock_rate(struct ipa *ipa) ...@@ -202,17 +202,7 @@ u32 ipa_core_clock_rate(struct ipa *ipa)
return ipa->power ? (u32)clk_get_rate(ipa->power->core) : 0; return ipa->power ? (u32)clk_get_rate(ipa->power->core) : 0;
} }
/** void ipa_power_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id)
* ipa_suspend_handler() - Handle the suspend IPA interrupt
* @ipa: IPA pointer
* @irq_id: IPA interrupt type (unused)
*
* If an RX endpoint is suspended, and the IPA has a packet destined for
* that endpoint, the IPA generates a SUSPEND interrupt to inform the AP
* that it should resume the endpoint. If we get one of these interrupts
* we just wake up the system.
*/
static void ipa_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id)
{ {
/* To handle an IPA interrupt we will have resumed the hardware /* To handle an IPA interrupt we will have resumed the hardware
* just to handle the interrupt, so we're done. If we are in a * just to handle the interrupt, so we're done. If we are in a
...@@ -336,7 +326,7 @@ int ipa_power_setup(struct ipa *ipa) ...@@ -336,7 +326,7 @@ int ipa_power_setup(struct ipa *ipa)
int ret; int ret;
ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND, ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND,
ipa_suspend_handler); ipa_power_suspend_handler);
ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND); ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND);
ret = device_init_wakeup(&ipa->pdev->dev, true); ret = device_init_wakeup(&ipa->pdev->dev, true);
......
...@@ -10,6 +10,7 @@ struct device; ...@@ -10,6 +10,7 @@ struct device;
struct ipa; struct ipa;
struct ipa_power_data; struct ipa_power_data;
enum ipa_irq_id;
/* IPA device power management function block */ /* IPA device power management function block */
extern const struct dev_pm_ops ipa_pm_ops; extern const struct dev_pm_ops ipa_pm_ops;
...@@ -47,6 +48,17 @@ void ipa_power_modem_queue_active(struct ipa *ipa); ...@@ -47,6 +48,17 @@ void ipa_power_modem_queue_active(struct ipa *ipa);
*/ */
void ipa_power_retention(struct ipa *ipa, bool enable); void ipa_power_retention(struct ipa *ipa, bool enable);
/**
* ipa_power_suspend_handler() - Handler for SUSPEND IPA interrupts
* @ipa: IPA pointer
* @irq_id: IPA interrupt ID (unused)
*
* If an RX endpoint is suspended, and the IPA has a packet destined for
* that endpoint, the IPA generates a SUSPEND interrupt to inform the AP
* that it should resume the endpoint.
*/
void ipa_power_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id);
/** /**
* ipa_power_setup() - Set up IPA power management * ipa_power_setup() - Set up IPA power management
* @ipa: IPA pointer * @ipa: IPA pointer
......
...@@ -170,7 +170,7 @@ static void ipa_uc_response_hdlr(struct ipa *ipa) ...@@ -170,7 +170,7 @@ static void ipa_uc_response_hdlr(struct ipa *ipa)
} }
} }
static void ipa_uc_interrupt_handler(struct ipa *ipa, enum ipa_irq_id irq_id) void ipa_uc_interrupt_handler(struct ipa *ipa, enum ipa_irq_id irq_id)
{ {
/* Silently ignore anything unrecognized */ /* Silently ignore anything unrecognized */
if (irq_id == IPA_IRQ_UC_0) if (irq_id == IPA_IRQ_UC_0)
......
...@@ -7,6 +7,14 @@ ...@@ -7,6 +7,14 @@
#define _IPA_UC_H_ #define _IPA_UC_H_
struct ipa; struct ipa;
enum ipa_irq_id;
/**
* ipa_uc_interrupt_handler() - Handler for microcontroller IPA interrupts
* @ipa: IPA pointer
* @irq_id: IPA interrupt ID
*/
void ipa_uc_interrupt_handler(struct ipa *ipa, enum ipa_irq_id irq_id);
/** /**
* ipa_uc_config() - Configure the IPA microcontroller subsystem * ipa_uc_config() - Configure the IPA microcontroller subsystem
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment