From f6c921ec97323c1eab7d3b8a0cda73abf041a00f Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Mon, 5 Jun 2017 16:22:30 +0300 Subject: gpu: nvgpu: bring back tegra idle registration To make do_idle work when nvgpu is built as a module, reverse the order of call dependencies for do_idle. Don't provide visible gk20a_do_{idle,unidle}() functions for the kernel but instead call the kernel for registering and unregistering pointers to them when the driver loads and unloads. Refactor the internal __gk20a_do_{idle,unidle} functions to take a struct gk20a * instead of struct device *, and use the callback api for providing that g instead of retrieving the plat device from device tree. Bug 200290850 Change-Id: Ibef8b069302e547b298069cbb97734f461a10cc3 Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1493774 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/module.c | 36 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 22 deletions(-) (limited to 'drivers/gpu/nvgpu/common') diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index cbad3993..80c516a6 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -288,9 +288,9 @@ static struct of_device_id tegra_gk20a_of_match[] = { * In success, we hold these locks and return * In failure, we release these locks and return */ -int __gk20a_do_idle(struct device *dev, bool force_reset) +int __gk20a_do_idle(struct gk20a *g, bool force_reset) { - struct gk20a *g = get_gk20a(dev); + struct device *dev = g->dev; struct gk20a_platform *platform = dev_get_drvdata(dev); struct nvgpu_timeout timeout; int ref_cnt; @@ -419,25 +419,19 @@ fail_timeout: * * In success, this call MUST be balanced by caller with gk20a_do_unidle() */ -int gk20a_do_idle(void) +static int gk20a_do_idle(void *_g) { - struct device_node *node = - of_find_matching_node(NULL, tegra_gk20a_of_match); - struct platform_device *pdev = of_find_device_by_node(node); - - int ret = __gk20a_do_idle(&pdev->dev, true); - - of_node_put(node); + struct gk20a *g = (struct gk20a *)_g; - return ret; + return __gk20a_do_idle(g, true); } /** * __gk20a_do_unidle() - unblock all the tasks blocked by __gk20a_do_idle() */ -int __gk20a_do_unidle(struct device *dev) +int __gk20a_do_unidle(struct gk20a *g) { - struct gk20a *g = get_gk20a(dev); + struct device *dev = g->dev; struct gk20a_platform *platform = dev_get_drvdata(dev); int err; @@ -471,17 +465,11 @@ int __gk20a_do_unidle(struct device *dev) /** * gk20a_do_unidle() - wrap up for __gk20a_do_unidle() */ -int gk20a_do_unidle(void) +static int gk20a_do_unidle(void *_g) { - struct device_node *node = - of_find_matching_node(NULL, tegra_gk20a_of_match); - struct platform_device *pdev = of_find_device_by_node(node); + struct gk20a *g = (struct gk20a *)_g; - int ret = __gk20a_do_unidle(&pdev->dev); - - of_node_put(node); - - return ret; + return __gk20a_do_unidle(g); } #endif @@ -520,6 +508,8 @@ static irqreturn_t gk20a_intr_thread_stall(int irq, void *dev_id) void gk20a_remove_support(struct gk20a *g) { + tegra_unregister_idle_unidle(gk20a_do_idle); + nvgpu_kfree(g, g->dbg_regops_tmp_buf); if (g->pmu.remove_support) @@ -557,6 +547,8 @@ static int gk20a_init_support(struct platform_device *dev) int err = 0; struct gk20a *g = get_gk20a(&dev->dev); + tegra_register_idle_unidle(gk20a_do_idle, gk20a_do_unidle, g); + g->regs = gk20a_ioremap_resource(dev, GK20A_BAR0_IORESOURCE_MEM, &g->reg_mem); if (IS_ERR(g->regs)) { -- cgit v1.2.2