Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

HSI: omap_ssi: convert cawake irq handler to thread

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>

+8 -19
-2
drivers/hsi/controllers/omap_ssi.h
··· 75 75 * @wake_irq: IRQ number for incoming wake line (-1 if none) 76 76 * @wake_gpio: GPIO number for incoming wake line (-1 if none) 77 77 * @pio_tasklet: Bottom half for PIO transfers and events 78 - * @wake_tasklet: Bottom half for incoming wake events 79 78 * @wkin_cken: Keep track of clock references due to the incoming wake line 80 79 * @wk_refcount: Reference count for output wake line 81 80 * @sys_mpu_enable: Context for the interrupt enable register for irq 0 ··· 98 99 int wake_irq; 99 100 struct gpio_desc *wake_gpio; 100 101 struct tasklet_struct pio_tasklet; 101 - struct tasklet_struct wake_tasklet; 102 102 bool wktest:1; /* FIXME: HACK to be removed */ 103 103 bool wkin_cken:1; /* Workaround */ 104 104 unsigned int wk_refcount;
+2 -2
drivers/hsi/controllers/omap_ssi_core.c
··· 312 312 continue; 313 313 314 314 /* Workaround for SWBREAK + CAwake down race in CMT */ 315 - tasklet_disable(&omap_port->wake_tasklet); 315 + disable_irq(omap_port->wake_irq); 316 316 317 317 /* stop all ssi communication */ 318 318 pinctrl_pm_select_idle_state(omap_port->pdev); ··· 338 338 339 339 /* resume ssi communication */ 340 340 pinctrl_pm_select_default_state(omap_port->pdev); 341 - tasklet_enable(&omap_port->wake_tasklet); 341 + enable_irq(omap_port->wake_irq); 342 342 } 343 343 344 344 break;
+6 -15
drivers/hsi/controllers/omap_ssi_port.c
··· 966 966 return IRQ_HANDLED; 967 967 } 968 968 969 - static void ssi_wake_tasklet(unsigned long ssi_port) 969 + static irqreturn_t ssi_wake_thread(int irq __maybe_unused, void *ssi_port) 970 970 { 971 971 struct hsi_port *port = (struct hsi_port *)ssi_port; 972 972 struct hsi_controller *ssi = to_hsi_controller(port->device.parent); ··· 1007 1007 } 1008 1008 spin_unlock(&omap_port->lock); 1009 1009 } 1010 - } 1011 - 1012 - static irqreturn_t ssi_wake_isr(int irq __maybe_unused, void *ssi_port) 1013 - { 1014 - struct omap_ssi_port *omap_port = hsi_port_drvdata(ssi_port); 1015 - 1016 - tasklet_hi_schedule(&omap_port->wake_tasklet); 1017 1010 1018 1011 return IRQ_HANDLED; 1019 1012 } ··· 1044 1051 } 1045 1052 1046 1053 cawake_irq = gpiod_to_irq(omap_port->wake_gpio); 1047 - 1048 1054 omap_port->wake_irq = cawake_irq; 1049 - tasklet_init(&omap_port->wake_tasklet, ssi_wake_tasklet, 1050 - (unsigned long)port); 1051 - err = devm_request_irq(&port->device, cawake_irq, ssi_wake_isr, 1052 - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 1053 - "cawake", port); 1055 + 1056 + err = devm_request_threaded_irq(&port->device, cawake_irq, NULL, 1057 + ssi_wake_thread, 1058 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 1059 + "SSI cawake", port); 1054 1060 if (err < 0) 1055 1061 dev_err(&port->device, "Request Wake in IRQ %d failed %d\n", 1056 1062 cawake_irq, err); ··· 1226 1234 1227 1235 hsi_port_unregister_clients(port); 1228 1236 1229 - tasklet_kill(&omap_port->wake_tasklet); 1230 1237 tasklet_kill(&omap_port->pio_tasklet); 1231 1238 1232 1239 port->async = hsi_dummy_msg;