summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorSumit Singh <sumsingh@nvidia.com>2015-08-04 03:13:12 -0400
committerSumit Singh <sumsingh@nvidia.com>2015-08-04 03:13:12 -0400
commit77a816e7bf9495d45494f9e7af999cbee86100d1 (patch)
treea11e2e70ae4123b56a5ad6e5ae48d773d0e8994e /drivers/gpu/nvgpu/gk20a
parentef57db8606ce46d6fac21f4d2cff4ff2b700487f (diff)
parent25f0faeb378a885d2d57f1b667f001edfbea026c (diff)
Merge branch 'power-domain-t186' into 'kernel-3.18'
Add device-tree support for tegra power-domains and power-gating for t186, then perform the related cleanup. Also enable TEGRA_MC_DOMIANS, PM_GENERIC_DOMAINS_OF and TEGRA_POWERGATE for t186. Bug 200105664 Change-Id: I548c6b71a1577afa439a39a0eafc317a1c3cbc68 Signed-off-by: Sumit Singh <sumsingh@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c61
1 files changed, 1 insertions, 60 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 3dfc50e8..cdbe3c09 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -1229,7 +1229,6 @@ static int gk20a_pm_resume(struct device *dev)
1229 return gk20a_pm_finalize_poweron(dev); 1229 return gk20a_pm_finalize_poweron(dev);
1230} 1230}
1231 1231
1232#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
1233static int gk20a_pm_initialise_domain(struct platform_device *pdev) 1232static int gk20a_pm_initialise_domain(struct platform_device *pdev)
1234{ 1233{
1235 struct gk20a_platform *platform = platform_get_drvdata(pdev); 1234 struct gk20a_platform *platform = platform_get_drvdata(pdev);
@@ -1249,50 +1248,6 @@ static int gk20a_pm_initialise_domain(struct platform_device *pdev)
1249 return 0; 1248 return 0;
1250} 1249}
1251 1250
1252#else
1253static int gk20a_pm_initialise_domain(struct platform_device *pdev)
1254{
1255 struct gk20a_platform *platform = platform_get_drvdata(pdev);
1256 struct dev_power_governor *pm_domain_gov = NULL;
1257 struct generic_pm_domain *domain = NULL;
1258 int ret = 0;
1259 struct gk20a_domain_data *gpu_gpd_data = (struct gk20a_domain_data *)
1260 kzalloc(sizeof(struct gk20a_domain_data), GFP_KERNEL);
1261
1262 if (!gpu_gpd_data)
1263 return -ENOMEM;
1264
1265 gpu_gpd_data->gk20a = platform->g;
1266 domain = &gpu_gpd_data->gpd;
1267
1268 domain->name = "gpu";
1269
1270#ifdef CONFIG_PM_RUNTIME
1271 if (!platform->can_railgate)
1272 pm_domain_gov = &pm_domain_always_on_gov;
1273#endif
1274
1275 pm_genpd_init(domain, pm_domain_gov, true);
1276
1277 domain->power_off = gk20a_pm_railgate;
1278 domain->power_on = gk20a_pm_unrailgate;
1279 domain->dev_ops.start = gk20a_pm_enable_clk;
1280 domain->dev_ops.stop = gk20a_pm_disable_clk;
1281 domain->dev_ops.save_state = gk20a_pm_prepare_poweroff;
1282 domain->dev_ops.restore_state = gk20a_pm_finalize_poweron;
1283 domain->dev_ops.suspend = gk20a_pm_suspend;
1284 domain->dev_ops.resume = gk20a_pm_resume;
1285
1286 device_set_wakeup_capable(&pdev->dev, 0);
1287 ret = pm_genpd_add_device(domain, &pdev->dev);
1288
1289 if (platform->railgate_delay)
1290 pm_genpd_set_poweroff_delay(domain, platform->railgate_delay);
1291
1292 return ret;
1293}
1294#endif
1295
1296static int gk20a_pm_init(struct platform_device *dev) 1251static int gk20a_pm_init(struct platform_device *dev)
1297{ 1252{
1298 struct gk20a_platform *platform = platform_get_drvdata(dev); 1253 struct gk20a_platform *platform = platform_get_drvdata(dev);
@@ -1350,6 +1305,7 @@ static int gk20a_secure_page_alloc(struct platform_device *pdev)
1350static struct of_device_id tegra_gpu_domain_match[] = { 1305static struct of_device_id tegra_gpu_domain_match[] = {
1351 {.compatible = "nvidia,tegra132-gpu-pd"}, 1306 {.compatible = "nvidia,tegra132-gpu-pd"},
1352 {.compatible = "nvidia,tegra210-gpu-pd"}, 1307 {.compatible = "nvidia,tegra210-gpu-pd"},
1308 {.compatible = "nvidia,tegra186-gpu-pd"},
1353 {}, 1309 {},
1354}; 1310};
1355 1311
@@ -1358,10 +1314,7 @@ static int gk20a_probe(struct platform_device *dev)
1358 struct gk20a *gk20a; 1314 struct gk20a *gk20a;
1359 int err; 1315 int err;
1360 struct gk20a_platform *platform = NULL; 1316 struct gk20a_platform *platform = NULL;
1361
1362#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
1363 struct gk20a_domain_data *gk20a_domain; 1317 struct gk20a_domain_data *gk20a_domain;
1364#endif
1365 1318
1366 if (dev->dev.of_node) { 1319 if (dev->dev.of_node) {
1367 const struct of_device_id *match; 1320 const struct of_device_id *match;
@@ -1393,11 +1346,9 @@ static int gk20a_probe(struct platform_device *dev)
1393 init_waitqueue_head(&gk20a->sw_irq_stall_last_handled_wq); 1346 init_waitqueue_head(&gk20a->sw_irq_stall_last_handled_wq);
1394 init_waitqueue_head(&gk20a->sw_irq_nonstall_last_handled_wq); 1347 init_waitqueue_head(&gk20a->sw_irq_nonstall_last_handled_wq);
1395 1348
1396#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
1397 gk20a_domain = container_of(dev_to_genpd(&dev->dev), 1349 gk20a_domain = container_of(dev_to_genpd(&dev->dev),
1398 struct gk20a_domain_data, gpd); 1350 struct gk20a_domain_data, gpd);
1399 gk20a_domain->gk20a = gk20a; 1351 gk20a_domain->gk20a = gk20a;
1400#endif
1401 1352
1402 set_gk20a(dev, gk20a); 1353 set_gk20a(dev, gk20a);
1403 gk20a->dev = dev; 1354 gk20a->dev = dev;
@@ -1613,9 +1564,6 @@ static struct platform_driver gk20a_driver = {
1613 } 1564 }
1614}; 1565};
1615 1566
1616#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
1617
1618
1619static int _gk20a_init_domain(struct device_node *np, 1567static int _gk20a_init_domain(struct device_node *np,
1620 struct generic_pm_domain *gpd) 1568 struct generic_pm_domain *gpd)
1621{ 1569{
@@ -1665,13 +1613,6 @@ static int gk20a_domain_init(struct of_device_id *matches)
1665 1613
1666 return ret; 1614 return ret;
1667} 1615}
1668#else
1669static int gk20a_domain_init(struct of_device_id *matches)
1670{
1671 return 0;
1672}
1673#endif
1674
1675 1616
1676static int __init gk20a_init(void) 1617static int __init gk20a_init(void)
1677{ 1618{