Skip to content

Commit

Permalink
HSI: omap_ssi: convert cawake irq handler to thread
Browse files Browse the repository at this point in the history
Convert cawake interrupt handler from tasklet to
threaded interrupt handler in preparation of
blocking runtime_pm calls.

Signed-off-by: Sebastian Reichel <sre@kernel.org>
Tested-by: Pavel Machek <pavel@ucw.cz>
  • Loading branch information
Sebastian Reichel committed Jun 27, 2016
1 parent df26d63 commit cb70e4c
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 19 deletions.
2 changes: 0 additions & 2 deletions drivers/hsi/controllers/omap_ssi.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ struct omap_ssm_ctx {
* @wake_irq: IRQ number for incoming wake line (-1 if none)
* @wake_gpio: GPIO number for incoming wake line (-1 if none)
* @pio_tasklet: Bottom half for PIO transfers and events
* @wake_tasklet: Bottom half for incoming wake events
* @wkin_cken: Keep track of clock references due to the incoming wake line
* @wk_refcount: Reference count for output wake line
* @sys_mpu_enable: Context for the interrupt enable register for irq 0
Expand All @@ -99,7 +98,6 @@ struct omap_ssi_port {
int wake_irq;
struct gpio_desc *wake_gpio;
struct tasklet_struct pio_tasklet;
struct tasklet_struct wake_tasklet;
bool wktest:1; /* FIXME: HACK to be removed */
bool wkin_cken:1; /* Workaround */
unsigned int wk_refcount;
Expand Down
4 changes: 2 additions & 2 deletions drivers/hsi/controllers/omap_ssi_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ static int ssi_clk_event(struct notifier_block *nb, unsigned long event,
continue;

/* Workaround for SWBREAK + CAwake down race in CMT */
tasklet_disable(&omap_port->wake_tasklet);
disable_irq(omap_port->wake_irq);

/* stop all ssi communication */
pinctrl_pm_select_idle_state(omap_port->pdev);
Expand All @@ -338,7 +338,7 @@ static int ssi_clk_event(struct notifier_block *nb, unsigned long event,

/* resume ssi communication */
pinctrl_pm_select_default_state(omap_port->pdev);
tasklet_enable(&omap_port->wake_tasklet);
enable_irq(omap_port->wake_irq);
}

break;
Expand Down
21 changes: 6 additions & 15 deletions drivers/hsi/controllers/omap_ssi_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,7 +966,7 @@ static irqreturn_t ssi_pio_isr(int irq, void *port)
return IRQ_HANDLED;
}

static void ssi_wake_tasklet(unsigned long ssi_port)
static irqreturn_t ssi_wake_thread(int irq __maybe_unused, void *ssi_port)
{
struct hsi_port *port = (struct hsi_port *)ssi_port;
struct hsi_controller *ssi = to_hsi_controller(port->device.parent);
Expand Down Expand Up @@ -1007,13 +1007,6 @@ static void ssi_wake_tasklet(unsigned long ssi_port)
}
spin_unlock(&omap_port->lock);
}
}

static irqreturn_t ssi_wake_isr(int irq __maybe_unused, void *ssi_port)
{
struct omap_ssi_port *omap_port = hsi_port_drvdata(ssi_port);

tasklet_hi_schedule(&omap_port->wake_tasklet);

return IRQ_HANDLED;
}
Expand Down Expand Up @@ -1051,13 +1044,12 @@ static int ssi_wake_irq(struct hsi_port *port, struct platform_device *pd)
}

cawake_irq = gpiod_to_irq(omap_port->wake_gpio);

omap_port->wake_irq = cawake_irq;
tasklet_init(&omap_port->wake_tasklet, ssi_wake_tasklet,
(unsigned long)port);
err = devm_request_irq(&port->device, cawake_irq, ssi_wake_isr,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
"cawake", port);

err = devm_request_threaded_irq(&port->device, cawake_irq, NULL,
ssi_wake_thread,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"SSI cawake", port);
if (err < 0)
dev_err(&port->device, "Request Wake in IRQ %d failed %d\n",
cawake_irq, err);
Expand Down Expand Up @@ -1234,7 +1226,6 @@ static int ssi_port_remove(struct platform_device *pd)

hsi_port_unregister_clients(port);

tasklet_kill(&omap_port->wake_tasklet);
tasklet_kill(&omap_port->pio_tasklet);

port->async = hsi_dummy_msg;
Expand Down

0 comments on commit cb70e4c

Please sign in to comment.