From 5515f947a385b04001ed73edb46d6e7a27e6b335 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Wed, 26 Feb 2014 13:31:46 +0200 Subject: gpu: nvgpu: Request irq at probe Request irq at probe instead of at poweron. This allows investigating interrupt numbers across rail gating cycles. Change-Id: I6db4b3f1d865c6fbbd9d6a96c3df89617e169891 Signed-off-by: Terje Bergstrom Signed-off-by: Arto Merilainen Reviewed-on: http://git-master/r/374859 --- drivers/gpu/nvgpu/gk20a/gk20a.c | 69 +++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 34 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 3c69a9d0..893fbf28 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -627,11 +627,8 @@ static void gk20a_remove_support(struct platform_device *dev) release_firmware(g->pmu_fw); - if (g->irq_requested) { - free_irq(g->irq_stall, g); - free_irq(g->irq_nonstall, g); - g->irq_requested = false; - } + free_irq(g->irq_stall, g); + free_irq(g->irq_nonstall, g); /* free mappings to registers, etc*/ @@ -667,7 +664,6 @@ static int gk20a_init_support(struct platform_device *dev) } /* Get interrupt numbers */ - g->irq_stall = platform_get_irq(dev, 0); g->irq_nonstall = platform_get_irq(dev, 1); if (g->irq_stall < 0 || g->irq_nonstall < 0) { err = -ENXIO; @@ -759,11 +755,8 @@ static int gk20a_pm_prepare_poweroff(struct device *_dev) * After this point, gk20a interrupts should not get * serviced. */ - if (g->irq_requested) { - free_irq(g->irq_stall, g); - free_irq(g->irq_nonstall, g); - g->irq_requested = false; - } + disable_irq(g->irq_stall); + disable_irq(g->irq_nonstall); /* disable elpg before gr or fifo suspend */ ret |= gk20a_pmu_destroy(g); @@ -810,29 +803,8 @@ static int gk20a_pm_finalize_poweron(struct device *_dev) nice_value = task_nice(current); set_user_nice(current, -20); - if (!g->irq_requested) { - err = request_threaded_irq(g->irq_stall, - gk20a_intr_isr_stall, - gk20a_intr_thread_stall, - 0, "gk20a_stall", g); - if (err) { - dev_err(dev_from_gk20a(g), - "failed to request stall intr irq @ %lld\n", - (u64)g->irq_stall); - goto done; - } - err = request_threaded_irq(g->irq_nonstall, - gk20a_intr_isr_nonstall, - gk20a_intr_thread_nonstall, - 0, "gk20a_nonstall", g); - if (err) { - dev_err(dev_from_gk20a(g), - "failed to request non-stall intr irq @ %lld\n", - (u64)g->irq_nonstall); - goto done; - } - g->irq_requested = true; - } + enable_irq(g->irq_stall); + enable_irq(g->irq_nonstall); g->power_on = true; @@ -1346,6 +1318,35 @@ static int gk20a_probe(struct platform_device *dev) set_gk20a(dev, gk20a); gk20a->dev = dev; + gk20a->irq_stall = platform_get_irq(dev, 0); + gk20a->irq_nonstall = platform_get_irq(dev, 1); + if (gk20a->irq_stall < 0 || gk20a->irq_nonstall < 0) + return -ENXIO; + err = devm_request_threaded_irq(&dev->dev, + gk20a->irq_stall, + gk20a_intr_isr_stall, + gk20a_intr_thread_stall, + 0, "gk20a_stall", gk20a); + if (err) { + dev_err(&dev->dev, + "failed to request stall intr irq @ %d\n", + gk20a->irq_stall); + return err; + } + err = devm_request_threaded_irq(&dev->dev, + gk20a->irq_nonstall, + gk20a_intr_isr_nonstall, + gk20a_intr_thread_nonstall, + 0, "gk20a_nonstall", gk20a); + if (err) { + dev_err(&dev->dev, + "failed to request non-stall intr irq @ %d\n", + gk20a->irq_nonstall); + return err; + } + disable_irq(gk20a->irq_stall); + disable_irq(gk20a->irq_nonstall); + err = gk20a_user_init(dev); if (err) return err; -- cgit v1.2.2