mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
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 <tbergstrom@nvidia.com> Signed-off-by: Arto Merilainen <amerilainen@nvidia.com> Reviewed-on: http://git-master/r/374859
This commit is contained in:
committed by
Dan Willemsen
parent
b4f4eca2bb
commit
5515f947a3
@@ -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;
|
||||
|
||||
@@ -217,7 +217,6 @@ struct gk20a {
|
||||
void __iomem *bar1;
|
||||
|
||||
bool power_on;
|
||||
bool irq_requested;
|
||||
|
||||
struct clk_gk20a clk;
|
||||
struct fifo_gk20a fifo;
|
||||
|
||||
Reference in New Issue
Block a user