2 * Tegra ACONNECT Bus Driver
4 * Copyright (C) 2016, NVIDIA CORPORATION. All rights reserved.
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
11 #include <linux/clk.h>
12 #include <linux/module.h>
13 #include <linux/of_platform.h>
14 #include <linux/platform_device.h>
15 #include <linux/pm_runtime.h>
17 struct tegra_aconnect
{
19 struct clk
*apb2ape_clk
;
22 static int tegra_aconnect_probe(struct platform_device
*pdev
)
24 struct tegra_aconnect
*aconnect
;
26 if (!pdev
->dev
.of_node
)
29 aconnect
= devm_kzalloc(&pdev
->dev
, sizeof(struct tegra_aconnect
),
34 aconnect
->ape_clk
= devm_clk_get(&pdev
->dev
, "ape");
35 if (IS_ERR(aconnect
->ape_clk
)) {
36 dev_err(&pdev
->dev
, "Can't retrieve ape clock\n");
37 return PTR_ERR(aconnect
->ape_clk
);
40 aconnect
->apb2ape_clk
= devm_clk_get(&pdev
->dev
, "apb2ape");
41 if (IS_ERR(aconnect
->apb2ape_clk
)) {
42 dev_err(&pdev
->dev
, "Can't retrieve apb2ape clock\n");
43 return PTR_ERR(aconnect
->apb2ape_clk
);
46 dev_set_drvdata(&pdev
->dev
, aconnect
);
47 pm_runtime_enable(&pdev
->dev
);
49 of_platform_populate(pdev
->dev
.of_node
, NULL
, NULL
, &pdev
->dev
);
51 dev_info(&pdev
->dev
, "Tegra ACONNECT bus registered\n");
56 static int tegra_aconnect_remove(struct platform_device
*pdev
)
58 pm_runtime_disable(&pdev
->dev
);
63 static int tegra_aconnect_runtime_resume(struct device
*dev
)
65 struct tegra_aconnect
*aconnect
= dev_get_drvdata(dev
);
68 ret
= clk_prepare_enable(aconnect
->ape_clk
);
70 dev_err(dev
, "ape clk_enable failed: %d\n", ret
);
74 ret
= clk_prepare_enable(aconnect
->apb2ape_clk
);
76 clk_disable_unprepare(aconnect
->ape_clk
);
77 dev_err(dev
, "apb2ape clk_enable failed: %d\n", ret
);
84 static int tegra_aconnect_runtime_suspend(struct device
*dev
)
86 struct tegra_aconnect
*aconnect
= dev_get_drvdata(dev
);
88 clk_disable_unprepare(aconnect
->ape_clk
);
89 clk_disable_unprepare(aconnect
->apb2ape_clk
);
94 static const struct dev_pm_ops tegra_aconnect_pm_ops
= {
95 SET_RUNTIME_PM_OPS(tegra_aconnect_runtime_suspend
,
96 tegra_aconnect_runtime_resume
, NULL
)
97 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
98 pm_runtime_force_resume
)
101 static const struct of_device_id tegra_aconnect_of_match
[] = {
102 { .compatible
= "nvidia,tegra210-aconnect", },
105 MODULE_DEVICE_TABLE(of
, tegra_aconnect_of_match
);
107 static struct platform_driver tegra_aconnect_driver
= {
108 .probe
= tegra_aconnect_probe
,
109 .remove
= tegra_aconnect_remove
,
111 .name
= "tegra-aconnect",
112 .of_match_table
= tegra_aconnect_of_match
,
113 .pm
= &tegra_aconnect_pm_ops
,
116 module_platform_driver(tegra_aconnect_driver
);
118 MODULE_DESCRIPTION("NVIDIA Tegra ACONNECT Bus Driver");
119 MODULE_AUTHOR("Jon Hunter <jonathanh@nvidia.com>");
120 MODULE_LICENSE("GPL v2");