diff options
-rw-r--r-- | drivers/hsi/controllers/omap_ssi.h | 2 | ||||
-rw-r--r-- | drivers/hsi/controllers/omap_ssi_core.c | 4 | ||||
-rw-r--r-- | drivers/hsi/controllers/omap_ssi_port.c | 21 |
3 files changed, 8 insertions, 19 deletions
diff --git a/drivers/hsi/controllers/omap_ssi.h b/drivers/hsi/controllers/omap_ssi.h index ba2f92722c09..88a523902a8f 100644 --- a/drivers/hsi/controllers/omap_ssi.h +++ b/drivers/hsi/controllers/omap_ssi.h | |||
@@ -75,7 +75,6 @@ struct omap_ssm_ctx { | |||
75 | * @wake_irq: IRQ number for incoming wake line (-1 if none) | 75 | * @wake_irq: IRQ number for incoming wake line (-1 if none) |
76 | * @wake_gpio: GPIO number for incoming wake line (-1 if none) | 76 | * @wake_gpio: GPIO number for incoming wake line (-1 if none) |
77 | * @pio_tasklet: Bottom half for PIO transfers and events | 77 | * @pio_tasklet: Bottom half for PIO transfers and events |
78 | * @wake_tasklet: Bottom half for incoming wake events | ||
79 | * @wkin_cken: Keep track of clock references due to the incoming wake line | 78 | * @wkin_cken: Keep track of clock references due to the incoming wake line |
80 | * @wk_refcount: Reference count for output wake line | 79 | * @wk_refcount: Reference count for output wake line |
81 | * @sys_mpu_enable: Context for the interrupt enable register for irq 0 | 80 | * @sys_mpu_enable: Context for the interrupt enable register for irq 0 |
@@ -99,7 +98,6 @@ struct omap_ssi_port { | |||
99 | int wake_irq; | 98 | int wake_irq; |
100 | struct gpio_desc *wake_gpio; | 99 | struct gpio_desc *wake_gpio; |
101 | struct tasklet_struct pio_tasklet; | 100 | struct tasklet_struct pio_tasklet; |
102 | struct tasklet_struct wake_tasklet; | ||
103 | bool wktest:1; /* FIXME: HACK to be removed */ | 101 | bool wktest:1; /* FIXME: HACK to be removed */ |
104 | bool wkin_cken:1; /* Workaround */ | 102 | bool wkin_cken:1; /* Workaround */ |
105 | unsigned int wk_refcount; | 103 | unsigned int wk_refcount; |
diff --git a/drivers/hsi/controllers/omap_ssi_core.c b/drivers/hsi/controllers/omap_ssi_core.c index 54943e439488..a463420a0810 100644 --- a/drivers/hsi/controllers/omap_ssi_core.c +++ b/drivers/hsi/controllers/omap_ssi_core.c | |||
@@ -312,7 +312,7 @@ static int ssi_clk_event(struct notifier_block *nb, unsigned long event, | |||
312 | continue; | 312 | continue; |
313 | 313 | ||
314 | /* Workaround for SWBREAK + CAwake down race in CMT */ | 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 | /* stop all ssi communication */ | 317 | /* stop all ssi communication */ |
318 | pinctrl_pm_select_idle_state(omap_port->pdev); | 318 | pinctrl_pm_select_idle_state(omap_port->pdev); |
@@ -338,7 +338,7 @@ static int ssi_clk_event(struct notifier_block *nb, unsigned long event, | |||
338 | 338 | ||
339 | /* resume ssi communication */ | 339 | /* resume ssi communication */ |
340 | pinctrl_pm_select_default_state(omap_port->pdev); | 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 | break; | 344 | break; |
diff --git a/drivers/hsi/controllers/omap_ssi_port.c b/drivers/hsi/controllers/omap_ssi_port.c index 38388442e310..9001b06312c3 100644 --- a/drivers/hsi/controllers/omap_ssi_port.c +++ b/drivers/hsi/controllers/omap_ssi_port.c | |||
@@ -966,7 +966,7 @@ static irqreturn_t ssi_pio_isr(int irq, void *port) | |||
966 | return IRQ_HANDLED; | 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 | struct hsi_port *port = (struct hsi_port *)ssi_port; | 971 | struct hsi_port *port = (struct hsi_port *)ssi_port; |
972 | struct hsi_controller *ssi = to_hsi_controller(port->device.parent); | 972 | struct hsi_controller *ssi = to_hsi_controller(port->device.parent); |
@@ -1007,13 +1007,6 @@ static void ssi_wake_tasklet(unsigned long ssi_port) | |||
1007 | } | 1007 | } |
1008 | spin_unlock(&omap_port->lock); | 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 | return IRQ_HANDLED; | 1011 | return IRQ_HANDLED; |
1019 | } | 1012 | } |
@@ -1051,13 +1044,12 @@ static int ssi_wake_irq(struct hsi_port *port, struct platform_device *pd) | |||
1051 | } | 1044 | } |
1052 | 1045 | ||
1053 | cawake_irq = gpiod_to_irq(omap_port->wake_gpio); | 1046 | cawake_irq = gpiod_to_irq(omap_port->wake_gpio); |
1054 | |||
1055 | omap_port->wake_irq = cawake_irq; | 1047 | omap_port->wake_irq = cawake_irq; |
1056 | tasklet_init(&omap_port->wake_tasklet, ssi_wake_tasklet, | 1048 | |
1057 | (unsigned long)port); | 1049 | err = devm_request_threaded_irq(&port->device, cawake_irq, NULL, |
1058 | err = devm_request_irq(&port->device, cawake_irq, ssi_wake_isr, | 1050 | ssi_wake_thread, |
1059 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 1051 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
1060 | "cawake", port); | 1052 | "SSI cawake", port); |
1061 | if (err < 0) | 1053 | if (err < 0) |
1062 | dev_err(&port->device, "Request Wake in IRQ %d failed %d\n", | 1054 | dev_err(&port->device, "Request Wake in IRQ %d failed %d\n", |
1063 | cawake_irq, err); | 1055 | cawake_irq, err); |
@@ -1234,7 +1226,6 @@ static int ssi_port_remove(struct platform_device *pd) | |||
1234 | 1226 | ||
1235 | hsi_port_unregister_clients(port); | 1227 | hsi_port_unregister_clients(port); |
1236 | 1228 | ||
1237 | tasklet_kill(&omap_port->wake_tasklet); | ||
1238 | tasklet_kill(&omap_port->pio_tasklet); | 1229 | tasklet_kill(&omap_port->pio_tasklet); |
1239 | 1230 | ||
1240 | port->async = hsi_dummy_msg; | 1231 | port->async = hsi_dummy_msg; |