diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index 2df8ab426..28ade90f3 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c @@ -606,8 +606,8 @@ static int gk20a_do_unidle(void *_g) } #endif -void __iomem *nvgpu_ioremap_resource(struct platform_device *dev, int i, - struct resource **out) +void __iomem *nvgpu_devm_ioremap_resource(struct platform_device *dev, int i, + struct resource **out) { struct resource *r = platform_get_resource(dev, IORESOURCE_MEM, i); @@ -618,6 +618,12 @@ void __iomem *nvgpu_ioremap_resource(struct platform_device *dev, int i, return devm_ioremap_resource(&dev->dev, r); } +void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset, + resource_size_t size) +{ + return devm_ioremap(dev, offset, size); +} + static irqreturn_t gk20a_intr_isr_stall(int irq, void *dev_id) { struct gk20a *g = dev_id; @@ -673,46 +679,41 @@ void gk20a_remove_support(struct gk20a *g) sim_linux->remove_support_linux(g); } - /* free mappings to registers, etc */ - if (l->regs) { - iounmap(l->regs); - l->regs = NULL; - } - if (l->bar1) { - iounmap(l->bar1); - l->bar1 = NULL; - } - nvgpu_remove_usermode_support(g); nvgpu_free_enabled_flags(g); + + gk20a_lockout_registers(g); } -static int gk20a_init_support(struct platform_device *dev) +static int gk20a_init_support(struct platform_device *pdev) { - int err = -ENOMEM; - struct gk20a *g = get_gk20a(&dev->dev); + struct device *dev = &pdev->dev; + struct gk20a *g = get_gk20a(dev); struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); + int err = -ENOMEM; tegra_register_idle_unidle(gk20a_do_idle, gk20a_do_unidle, g); - l->regs = nvgpu_ioremap_resource(dev, GK20A_BAR0_IORESOURCE_MEM, - &l->reg_mem); + l->regs = nvgpu_devm_ioremap_resource(pdev, + GK20A_BAR0_IORESOURCE_MEM, + &l->reg_mem); if (IS_ERR(l->regs)) { nvgpu_err(g, "failed to remap gk20a registers"); err = PTR_ERR(l->regs); goto fail; } - l->bar1 = nvgpu_ioremap_resource(dev, GK20A_BAR1_IORESOURCE_MEM, - &l->bar1_mem); + l->bar1 = nvgpu_devm_ioremap_resource(pdev, + GK20A_BAR1_IORESOURCE_MEM, + &l->bar1_mem); if (IS_ERR(l->bar1)) { nvgpu_err(g, "failed to remap gk20a bar1"); err = PTR_ERR(l->bar1); goto fail; } - err = nvgpu_init_sim_support_linux(g, dev); + err = nvgpu_init_sim_support_linux(g, pdev); if (err) goto fail; err = nvgpu_init_sim_support(g); @@ -725,14 +726,11 @@ static int gk20a_init_support(struct platform_device *dev) fail_sim: nvgpu_remove_sim_support_linux(g); fail: - if (l->regs) { - iounmap(l->regs); + if (l->regs) l->regs = NULL; - } - if (l->bar1) { - iounmap(l->bar1); + + if (l->bar1) l->bar1 = NULL; - } return err; } diff --git a/drivers/gpu/nvgpu/os/linux/module.h b/drivers/gpu/nvgpu/os/linux/module.h index ab4bca03e..da61425d0 100644 --- a/drivers/gpu/nvgpu/os/linux/module.h +++ b/drivers/gpu/nvgpu/os/linux/module.h @@ -25,8 +25,10 @@ int nvgpu_quiesce(struct gk20a *g); int nvgpu_remove(struct device *dev, struct class *class); void nvgpu_free_irq(struct gk20a *g); struct device_node *nvgpu_get_node(struct gk20a *g); -void __iomem *nvgpu_ioremap_resource(struct platform_device *dev, int i, +void __iomem *nvgpu_devm_ioremap_resource(struct platform_device *dev, int i, struct resource **out); +void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset, + resource_size_t size); extern struct class nvgpu_class; #endif diff --git a/drivers/gpu/nvgpu/os/linux/pci.c b/drivers/gpu/nvgpu/os/linux/pci.c index f62dacabc..dba8a5dfc 100644 --- a/drivers/gpu/nvgpu/os/linux/pci.c +++ b/drivers/gpu/nvgpu/os/linux/pci.c @@ -525,17 +525,18 @@ static int nvgpu_pci_init_support(struct pci_dev *pdev) int err = 0; struct gk20a *g = get_gk20a(&pdev->dev); struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); + struct device *dev = &pdev->dev; - l->regs = ioremap(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); + l->regs = nvgpu_devm_ioremap(dev, pci_resource_start(pdev, 0), + pci_resource_len(pdev, 0)); if (IS_ERR(l->regs)) { nvgpu_err(g, "failed to remap gk20a registers"); err = PTR_ERR(l->regs); goto fail; } - l->bar1 = ioremap(pci_resource_start(pdev, 1), - pci_resource_len(pdev, 1)); + l->bar1 = nvgpu_devm_ioremap(dev, pci_resource_start(pdev, 1), + pci_resource_len(pdev, 1)); if (IS_ERR(l->bar1)) { nvgpu_err(g, "failed to remap gk20a bar1"); err = PTR_ERR(l->bar1); @@ -556,14 +557,11 @@ static int nvgpu_pci_init_support(struct pci_dev *pdev) fail_sim: nvgpu_remove_sim_support_linux_pci(g); fail: - if (l->regs) { - iounmap(l->regs); + if (l->regs) l->regs = NULL; - } - if (l->bar1) { - iounmap(l->bar1); + + if (l->bar1) l->bar1 = NULL; - } return err; } diff --git a/drivers/gpu/nvgpu/os/linux/sim.c b/drivers/gpu/nvgpu/os/linux/sim.c index 8e964f399..abef45c78 100644 --- a/drivers/gpu/nvgpu/os/linux/sim.c +++ b/drivers/gpu/nvgpu/os/linux/sim.c @@ -78,9 +78,9 @@ int nvgpu_init_sim_support_linux(struct gk20a *g, return err; g->sim = &sim_linux->sim; g->sim->g = g; - sim_linux->regs = nvgpu_ioremap_resource(dev, - GK20A_SIM_IORESOURCE_MEM, - &sim_linux->reg_mem); + sim_linux->regs = nvgpu_devm_ioremap_resource(dev, + GK20A_SIM_IORESOURCE_MEM, + &sim_linux->reg_mem); if (IS_ERR(sim_linux->regs)) { nvgpu_err(g, "failed to remap gk20a sim regs"); err = PTR_ERR(sim_linux->regs);