mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +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);
|
release_firmware(g->pmu_fw);
|
||||||
|
|
||||||
if (g->irq_requested) {
|
|
||||||
free_irq(g->irq_stall, g);
|
free_irq(g->irq_stall, g);
|
||||||
free_irq(g->irq_nonstall, g);
|
free_irq(g->irq_nonstall, g);
|
||||||
g->irq_requested = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free mappings to registers, etc*/
|
/* free mappings to registers, etc*/
|
||||||
|
|
||||||
@@ -667,7 +664,6 @@ static int gk20a_init_support(struct platform_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get interrupt numbers */
|
/* Get interrupt numbers */
|
||||||
g->irq_stall = platform_get_irq(dev, 0);
|
|
||||||
g->irq_nonstall = platform_get_irq(dev, 1);
|
g->irq_nonstall = platform_get_irq(dev, 1);
|
||||||
if (g->irq_stall < 0 || g->irq_nonstall < 0) {
|
if (g->irq_stall < 0 || g->irq_nonstall < 0) {
|
||||||
err = -ENXIO;
|
err = -ENXIO;
|
||||||
@@ -759,11 +755,8 @@ static int gk20a_pm_prepare_poweroff(struct device *_dev)
|
|||||||
* After this point, gk20a interrupts should not get
|
* After this point, gk20a interrupts should not get
|
||||||
* serviced.
|
* serviced.
|
||||||
*/
|
*/
|
||||||
if (g->irq_requested) {
|
disable_irq(g->irq_stall);
|
||||||
free_irq(g->irq_stall, g);
|
disable_irq(g->irq_nonstall);
|
||||||
free_irq(g->irq_nonstall, g);
|
|
||||||
g->irq_requested = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* disable elpg before gr or fifo suspend */
|
/* disable elpg before gr or fifo suspend */
|
||||||
ret |= gk20a_pmu_destroy(g);
|
ret |= gk20a_pmu_destroy(g);
|
||||||
@@ -810,29 +803,8 @@ static int gk20a_pm_finalize_poweron(struct device *_dev)
|
|||||||
nice_value = task_nice(current);
|
nice_value = task_nice(current);
|
||||||
set_user_nice(current, -20);
|
set_user_nice(current, -20);
|
||||||
|
|
||||||
if (!g->irq_requested) {
|
enable_irq(g->irq_stall);
|
||||||
err = request_threaded_irq(g->irq_stall,
|
enable_irq(g->irq_nonstall);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
g->power_on = true;
|
g->power_on = true;
|
||||||
|
|
||||||
@@ -1346,6 +1318,35 @@ static int gk20a_probe(struct platform_device *dev)
|
|||||||
set_gk20a(dev, gk20a);
|
set_gk20a(dev, gk20a);
|
||||||
gk20a->dev = dev;
|
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);
|
err = gk20a_user_init(dev);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
@@ -217,7 +217,6 @@ struct gk20a {
|
|||||||
void __iomem *bar1;
|
void __iomem *bar1;
|
||||||
|
|
||||||
bool power_on;
|
bool power_on;
|
||||||
bool irq_requested;
|
|
||||||
|
|
||||||
struct clk_gk20a clk;
|
struct clk_gk20a clk;
|
||||||
struct fifo_gk20a fifo;
|
struct fifo_gk20a fifo;
|
||||||
|
|||||||
Reference in New Issue
Block a user